@quillsql/react 2.14.16 → 2.15.0

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 (253) 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 +112 -18
  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 +160 -33
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +99 -19
  13. package/dist/cjs/QuillProvider.d.ts +38 -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 +7 -2
  17. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  18. package/dist/cjs/ReportBuilder.js +104 -1271
  19. package/dist/cjs/SQLEditor.d.ts +9 -2
  20. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  21. package/dist/cjs/SQLEditor.js +67 -10
  22. package/dist/cjs/Table.d.ts.map +1 -1
  23. package/dist/cjs/Table.js +12 -0
  24. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
  25. package/dist/cjs/components/Chart/InternalChart.js +24 -1
  26. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  27. package/dist/cjs/components/Dashboard/DashboardTemplate.js +2 -1
  28. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  29. package/dist/cjs/components/Dashboard/DataLoader.js +73 -2
  30. package/dist/cjs/components/Dashboard/util.d.ts +2 -1
  31. package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
  32. package/dist/cjs/components/Dashboard/util.js +12 -1
  33. package/dist/cjs/components/QuillTable.d.ts +2 -1
  34. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  35. package/dist/cjs/components/QuillTable.js +2 -2
  36. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +2 -1
  37. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  38. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +28 -3
  39. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts +49 -0
  40. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts.map +1 -0
  41. package/dist/cjs/components/ReportBuilder/ColumnComponent.js +46 -0
  42. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts +65 -0
  43. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts.map +1 -0
  44. package/dist/cjs/components/ReportBuilder/FilterComponent.js +51 -0
  45. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts +42 -0
  46. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/LimitComponent.js +50 -0
  48. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts +66 -0
  49. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts.map +1 -0
  50. package/dist/cjs/components/ReportBuilder/PivotComponent.js +47 -0
  51. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts +162 -0
  52. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts.map +1 -0
  53. package/dist/cjs/components/ReportBuilder/SaveReport.js +31 -0
  54. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts +42 -0
  55. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts.map +1 -0
  56. package/dist/cjs/components/ReportBuilder/SortComponent.js +50 -0
  57. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts +28 -0
  58. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts.map +1 -0
  59. package/dist/cjs/components/ReportBuilder/TableComponent.js +24 -0
  60. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  61. package/dist/cjs/components/ReportBuilder/ui.js +3 -1
  62. package/dist/cjs/components/UiComponents.d.ts +5 -2
  63. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  64. package/dist/cjs/components/UiComponents.js +7 -5
  65. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  66. package/dist/cjs/hooks/useAskQuill.js +38 -0
  67. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  68. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  69. package/dist/cjs/hooks/useDashboard.js +62 -6
  70. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  71. package/dist/cjs/hooks/useExport.js +5 -2
  72. package/dist/cjs/hooks/useLongLoading.d.ts +13 -0
  73. package/dist/cjs/hooks/useLongLoading.d.ts.map +1 -0
  74. package/dist/cjs/hooks/useLongLoading.js +67 -0
  75. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  76. package/dist/cjs/hooks/useQuill.js +25 -1
  77. package/dist/cjs/hooks/useReportBuilder.d.ts +178 -0
  78. package/dist/cjs/hooks/useReportBuilder.d.ts.map +1 -0
  79. package/dist/cjs/hooks/useReportBuilder.js +1495 -0
  80. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  81. package/dist/cjs/hooks/useVirtualTables.js +27 -2
  82. package/dist/cjs/index.d.ts +11 -0
  83. package/dist/cjs/index.d.ts.map +1 -1
  84. package/dist/cjs/index.js +17 -1
  85. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +14 -1
  86. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  87. package/dist/cjs/internals/ReportBuilder/PivotForm.js +86 -3
  88. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  89. package/dist/cjs/internals/ReportBuilder/PivotList.js +3 -3
  90. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +18 -2
  91. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  92. package/dist/cjs/internals/ReportBuilder/PivotModal.js +438 -147
  93. package/dist/cjs/models/Filter.d.ts +1 -1
  94. package/dist/cjs/models/Filter.d.ts.map +1 -1
  95. package/dist/cjs/models/Filter.js +3 -3
  96. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
  97. package/dist/cjs/utils/astFilterProcessing.js +25 -4
  98. package/dist/cjs/utils/astProcessing.d.ts +4 -2
  99. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  100. package/dist/cjs/utils/astProcessing.js +25 -2
  101. package/dist/cjs/utils/client.d.ts +2 -1
  102. package/dist/cjs/utils/client.d.ts.map +1 -1
  103. package/dist/cjs/utils/client.js +12 -1
  104. package/dist/cjs/utils/dashboard.d.ts +3 -1
  105. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  106. package/dist/cjs/utils/dashboard.js +44 -3
  107. package/dist/cjs/utils/filterProcessing.d.ts +2 -1
  108. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  109. package/dist/cjs/utils/filterProcessing.js +12 -1
  110. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  111. package/dist/cjs/utils/pivotConstructor.js +15 -10
  112. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  113. package/dist/cjs/utils/pivotProcessing.js +13 -3
  114. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  115. package/dist/cjs/utils/queryConstructor.js +30 -16
  116. package/dist/cjs/utils/report.d.ts +10 -5
  117. package/dist/cjs/utils/report.d.ts.map +1 -1
  118. package/dist/cjs/utils/report.js +55 -7
  119. package/dist/cjs/utils/reportBuilder.d.ts.map +1 -1
  120. package/dist/cjs/utils/reportBuilder.js +5 -2
  121. package/dist/cjs/utils/schema.d.ts +5 -2
  122. package/dist/cjs/utils/schema.d.ts.map +1 -1
  123. package/dist/cjs/utils/schema.js +14 -2
  124. package/dist/cjs/utils/tableProcessing.d.ts +17 -10
  125. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  126. package/dist/cjs/utils/tableProcessing.js +99 -17
  127. package/dist/esm/Chart.d.ts.map +1 -1
  128. package/dist/esm/Chart.js +13 -1
  129. package/dist/esm/ChartBuilder.d.ts +3 -2
  130. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  131. package/dist/esm/ChartBuilder.js +114 -20
  132. package/dist/esm/ChartEditor.d.ts.map +1 -1
  133. package/dist/esm/ChartEditor.js +3 -1
  134. package/dist/esm/Context.d.ts +6 -2
  135. package/dist/esm/Context.d.ts.map +1 -1
  136. package/dist/esm/Context.js +159 -32
  137. package/dist/esm/Dashboard.d.ts.map +1 -1
  138. package/dist/esm/Dashboard.js +100 -20
  139. package/dist/esm/QuillProvider.d.ts +38 -1
  140. package/dist/esm/QuillProvider.d.ts.map +1 -1
  141. package/dist/esm/QuillProvider.js +2 -2
  142. package/dist/esm/ReportBuilder.d.ts +7 -2
  143. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  144. package/dist/esm/ReportBuilder.js +107 -1271
  145. package/dist/esm/SQLEditor.d.ts +9 -2
  146. package/dist/esm/SQLEditor.d.ts.map +1 -1
  147. package/dist/esm/SQLEditor.js +68 -11
  148. package/dist/esm/Table.d.ts.map +1 -1
  149. package/dist/esm/Table.js +13 -1
  150. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  151. package/dist/esm/components/Chart/InternalChart.js +25 -2
  152. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  153. package/dist/esm/components/Dashboard/DashboardTemplate.js +3 -2
  154. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  155. package/dist/esm/components/Dashboard/DataLoader.js +74 -3
  156. package/dist/esm/components/Dashboard/util.d.ts +2 -1
  157. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  158. package/dist/esm/components/Dashboard/util.js +12 -1
  159. package/dist/esm/components/QuillTable.d.ts +2 -1
  160. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  161. package/dist/esm/components/QuillTable.js +2 -2
  162. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +2 -1
  163. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  164. package/dist/esm/components/ReportBuilder/AddColumnModal.js +29 -4
  165. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts +49 -0
  166. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts.map +1 -0
  167. package/dist/esm/components/ReportBuilder/ColumnComponent.js +39 -0
  168. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts +65 -0
  169. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts.map +1 -0
  170. package/dist/esm/components/ReportBuilder/FilterComponent.js +44 -0
  171. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts +42 -0
  172. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts.map +1 -0
  173. package/dist/esm/components/ReportBuilder/LimitComponent.js +46 -0
  174. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts +66 -0
  175. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts.map +1 -0
  176. package/dist/esm/components/ReportBuilder/PivotComponent.js +40 -0
  177. package/dist/esm/components/ReportBuilder/SaveReport.d.ts +162 -0
  178. package/dist/esm/components/ReportBuilder/SaveReport.d.ts.map +1 -0
  179. package/dist/esm/components/ReportBuilder/SaveReport.js +31 -0
  180. package/dist/esm/components/ReportBuilder/SortComponent.d.ts +42 -0
  181. package/dist/esm/components/ReportBuilder/SortComponent.d.ts.map +1 -0
  182. package/dist/esm/components/ReportBuilder/SortComponent.js +46 -0
  183. package/dist/esm/components/ReportBuilder/TableComponent.d.ts +28 -0
  184. package/dist/esm/components/ReportBuilder/TableComponent.d.ts.map +1 -0
  185. package/dist/esm/components/ReportBuilder/TableComponent.js +20 -0
  186. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  187. package/dist/esm/components/ReportBuilder/ui.js +4 -2
  188. package/dist/esm/components/UiComponents.d.ts +5 -2
  189. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  190. package/dist/esm/components/UiComponents.js +7 -5
  191. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  192. package/dist/esm/hooks/useAskQuill.js +39 -1
  193. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  194. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  195. package/dist/esm/hooks/useDashboard.js +63 -7
  196. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  197. package/dist/esm/hooks/useExport.js +6 -3
  198. package/dist/esm/hooks/useLongLoading.d.ts +13 -0
  199. package/dist/esm/hooks/useLongLoading.d.ts.map +1 -0
  200. package/dist/esm/hooks/useLongLoading.js +64 -0
  201. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  202. package/dist/esm/hooks/useQuill.js +26 -2
  203. package/dist/esm/hooks/useReportBuilder.d.ts +178 -0
  204. package/dist/esm/hooks/useReportBuilder.d.ts.map +1 -0
  205. package/dist/esm/hooks/useReportBuilder.js +1490 -0
  206. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  207. package/dist/esm/hooks/useVirtualTables.js +28 -3
  208. package/dist/esm/index.d.ts +11 -0
  209. package/dist/esm/index.d.ts.map +1 -1
  210. package/dist/esm/index.js +8 -0
  211. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +14 -1
  212. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  213. package/dist/esm/internals/ReportBuilder/PivotForm.js +87 -4
  214. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  215. package/dist/esm/internals/ReportBuilder/PivotList.js +3 -3
  216. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +18 -2
  217. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  218. package/dist/esm/internals/ReportBuilder/PivotModal.js +440 -149
  219. package/dist/esm/models/Filter.d.ts +1 -1
  220. package/dist/esm/models/Filter.d.ts.map +1 -1
  221. package/dist/esm/models/Filter.js +3 -3
  222. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
  223. package/dist/esm/utils/astFilterProcessing.js +25 -4
  224. package/dist/esm/utils/astProcessing.d.ts +4 -2
  225. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  226. package/dist/esm/utils/astProcessing.js +25 -2
  227. package/dist/esm/utils/client.d.ts +2 -1
  228. package/dist/esm/utils/client.d.ts.map +1 -1
  229. package/dist/esm/utils/client.js +12 -1
  230. package/dist/esm/utils/dashboard.d.ts +3 -1
  231. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  232. package/dist/esm/utils/dashboard.js +44 -3
  233. package/dist/esm/utils/filterProcessing.d.ts +2 -1
  234. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  235. package/dist/esm/utils/filterProcessing.js +12 -1
  236. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  237. package/dist/esm/utils/pivotConstructor.js +15 -10
  238. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  239. package/dist/esm/utils/pivotProcessing.js +13 -3
  240. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  241. package/dist/esm/utils/queryConstructor.js +30 -16
  242. package/dist/esm/utils/report.d.ts +10 -5
  243. package/dist/esm/utils/report.d.ts.map +1 -1
  244. package/dist/esm/utils/report.js +55 -7
  245. package/dist/esm/utils/reportBuilder.d.ts.map +1 -1
  246. package/dist/esm/utils/reportBuilder.js +5 -2
  247. package/dist/esm/utils/schema.d.ts +5 -2
  248. package/dist/esm/utils/schema.d.ts.map +1 -1
  249. package/dist/esm/utils/schema.js +14 -2
  250. package/dist/esm/utils/tableProcessing.d.ts +17 -10
  251. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  252. package/dist/esm/utils/tableProcessing.js +99 -17
  253. 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;
@@ -361,8 +408,10 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
361
408
  if ((pivotAggregations?.length ?? 0) === 0) {
362
409
  errors.push('You must have at least one aggregation');
363
410
  }
364
- if (pivotAggregations.some((p) => !p.valueField && p.aggregationType !== 'count')) {
365
- errors.push("Value field cannot be empty when aggregation is not 'count'");
411
+ if (pivotAggregations.some((p) => !p.valueField &&
412
+ p.aggregationType !== 'count' &&
413
+ p.aggregationType !== 'percentage')) {
414
+ errors.push("Value field cannot be empty when aggregation is not 'count' or 'percentage'");
366
415
  }
367
416
  if (pivotAggregations.some((p) => !p.aggregationType)) {
368
417
  errors.push('Aggregation cannot be empty');
@@ -373,8 +422,18 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
373
422
  if (pivotColumnField && !columnsToShow[pivotColumnField]) {
374
423
  errors.push('Error in column field: undefined type');
375
424
  }
425
+ if (showLimitInput && limitInput && !Number.isInteger(Number(limitInput))) {
426
+ errors.push('Limit must be an integer');
427
+ }
376
428
  if (errors.length === 0 &&
377
- pivotAggregations?.every((p) => p.aggregationType && (p.valueField || p.aggregationType === 'count'))) {
429
+ pivotAggregations?.every((p) => p.aggregationType &&
430
+ (p.valueField ||
431
+ p.aggregationType === 'count' ||
432
+ p.aggregationType === 'percentage'))) {
433
+ const sort = showSortInput && !!sortFieldInput && !!sortDirectionInput;
434
+ const sortField = sort ? sortFieldInput : undefined;
435
+ const sortDirection = sort ? sortDirectionInput : undefined;
436
+ const rowLimit = showLimitInput && limitInput ? Number(limitInput) : undefined;
378
437
  const pivot = {
379
438
  rowField: pivotRowField,
380
439
  rowFieldType: columnTypes[pivotRowField ?? ''],
@@ -387,6 +446,10 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
387
446
  valueField2Type: columnTypes[p.valueField2 ?? ''],
388
447
  aggregationType: p.aggregationType,
389
448
  })),
449
+ sort,
450
+ sortField,
451
+ sortDirection,
452
+ rowLimit,
390
453
  // For backwards compatibility
391
454
  valueField: pivotAggregations?.[0]?.valueField,
392
455
  valueFieldType: columnTypes[pivotAggregations?.[0]?.valueField ?? ''],
@@ -407,7 +470,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
407
470
  }
408
471
  }
409
472
  setErrors(errors);
410
- }, [pivotRowField, pivotColumnField, pivotAggregations]);
473
+ }, [
474
+ pivotRowField,
475
+ pivotColumnField,
476
+ pivotAggregations,
477
+ sortFieldInput,
478
+ sortDirectionInput,
479
+ showSortInput,
480
+ showLimitInput,
481
+ limitInput,
482
+ ]);
411
483
  const onEditPivot = async (pivot, index, pivotType) => {
412
484
  setIsLoading(false);
413
485
  setErrors([]);
@@ -440,11 +512,23 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
440
512
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
441
513
  }, // limit preview
442
514
  getToken,
515
+ eventTracking,
443
516
  });
444
517
  setSamplePivotTable({ pivot, rows, columns });
445
518
  return;
446
519
  }
447
520
  catch (e) {
521
+ eventTracking?.logError?.({
522
+ type: 'bug', // TODO: determine type
523
+ severity: 'high',
524
+ message: 'Error fetching pivot data',
525
+ errorMessage: e.message,
526
+ errorStack: e.stack,
527
+ errorData: {
528
+ caller: 'PivotModal',
529
+ function: 'onEditPivot',
530
+ },
531
+ });
448
532
  if (e instanceof Error) {
449
533
  setPivotError(e.message);
450
534
  setSamplePivotTable(null);
@@ -554,10 +638,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
554
638
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
555
639
  }, // limit preview
556
640
  getToken,
641
+ eventTracking,
557
642
  });
558
643
  return { pivot: p, rows, columns };
559
644
  }
560
645
  catch (e) {
646
+ eventTracking?.logError?.({
647
+ type: 'bug', // TODO: determine type
648
+ severity: 'high',
649
+ message: 'Error fetching pivot data',
650
+ errorMessage: e.message,
651
+ errorStack: e.stack,
652
+ errorData: {
653
+ caller: 'PivotModal',
654
+ function: 'refreshPivots',
655
+ },
656
+ });
561
657
  return undefined;
562
658
  }
563
659
  }));
@@ -581,6 +677,17 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
581
677
  setSelectedPivotIndex(-1);
582
678
  }
583
679
  catch (e) {
680
+ eventTracking?.logError?.({
681
+ type: 'bug', // TODO: determine type
682
+ severity: 'high',
683
+ message: 'Error fetching pivot recommendations',
684
+ errorMessage: e.message,
685
+ errorStack: e.stack,
686
+ errorData: {
687
+ caller: 'PivotModal',
688
+ function: 'refreshPivots',
689
+ },
690
+ });
584
691
  setPivotError('Failed to fetch pivot recommendations');
585
692
  console.error('Failed parsing pivotai response', e);
586
693
  }
@@ -604,7 +711,11 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
604
711
  return;
605
712
  }
606
713
  if (typeof value !== 'string' &&
607
- value.some((p) => !p?.valueField && (p?.aggregationType !== 'count' || !pivotRowField))) {
714
+ value.some((p) => !p?.valueField &&
715
+ ((p?.aggregationType !== 'count' &&
716
+ p?.aggregationType !== 'percentage') ||
717
+ (p?.aggregationType === 'percentage' &&
718
+ (!pivotRowField || pivotColumnField))))) {
608
719
  return;
609
720
  }
610
721
  setErrors([]);
@@ -693,10 +804,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
693
804
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
694
805
  }, // limit preview
695
806
  getToken,
807
+ eventTracking,
696
808
  });
697
809
  setSamplePivotTable({ pivot, rows, columns });
698
810
  }
699
811
  catch (e) {
812
+ eventTracking?.logError?.({
813
+ type: 'bug', // TODO: determine type
814
+ severity: 'high',
815
+ message: 'Error fetching pivot data',
816
+ errorMessage: e.message,
817
+ errorStack: e.stack,
818
+ errorData: {
819
+ caller: 'PivotModal',
820
+ function: 'pivotFieldChange',
821
+ },
822
+ });
700
823
  if (e instanceof Error) {
701
824
  console.log('error', e);
702
825
  setPivotError(e.message);
@@ -727,10 +850,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
727
850
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
728
851
  },
729
852
  getToken,
853
+ eventTracking,
730
854
  });
731
855
  return { pivot: p, rows, columns };
732
856
  }
733
857
  catch (e) {
858
+ eventTracking?.logError?.({
859
+ type: 'bug', // TODO: determine type
860
+ severity: 'high',
861
+ message: 'Error fetching pivot data',
862
+ errorMessage: e.message,
863
+ errorStack: e.stack,
864
+ errorData: {
865
+ caller: 'PivotModal',
866
+ function: 'fetchPivotTables',
867
+ },
868
+ });
734
869
  return undefined;
735
870
  }
736
871
  }));
@@ -738,6 +873,58 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
738
873
  };
739
874
  fetchPivotTables();
740
875
  }, [createdPivots, dateRange]);
876
+ const handleResize = () => {
877
+ const parentRefElement = parentRef?.current;
878
+ const popoverRefElement = popoverRef?.current;
879
+ if (parentRefElement && popoverRefElement) {
880
+ const parentRect = parentRefElement.getBoundingClientRect();
881
+ const popoverRect = popoverRefElement.getBoundingClientRect();
882
+ const topOffset = popoverRect.top - parentRect.top;
883
+ const availableHeight = parentRect.height - topOffset;
884
+ setAvailableHeight(availableHeight);
885
+ calculatePopoverPosition();
886
+ }
887
+ };
888
+ const calculatePopoverPosition = () => {
889
+ if (!buttonRef.current)
890
+ return;
891
+ const buttonRect = buttonRef.current.getBoundingClientRect();
892
+ const parentRefElement = parentRef?.current;
893
+ if (!parentRefElement)
894
+ return;
895
+ const parentRect = parentRefElement.getBoundingClientRect();
896
+ // Calculate available space above and below
897
+ const spaceBelow = parentRect.bottom - buttonRect.bottom;
898
+ const spaceAbove = buttonRect.top - parentRect.top;
899
+ const desiredHeight = Math.max(450, spaceAbove - 20);
900
+ setPivotModalTopHeight(desiredHeight);
901
+ // If there's not enough space below but more space above, position above
902
+ if (spaceBelow < desiredHeight && spaceAbove > desiredHeight) {
903
+ setPopoverPosition('top');
904
+ }
905
+ else {
906
+ setPopoverPosition('bottom');
907
+ }
908
+ };
909
+ useEffect(() => {
910
+ handleResize();
911
+ window.addEventListener('resize', handleResize);
912
+ // Add scroll listener to the parent element if it exists
913
+ const parentElement = parentRef?.current;
914
+ if (parentElement) {
915
+ parentElement.addEventListener('scroll', handleResize);
916
+ }
917
+ return () => {
918
+ window.removeEventListener('resize', handleResize);
919
+ if (parentElement) {
920
+ parentElement.removeEventListener('scroll', handleResize);
921
+ }
922
+ };
923
+ }, [
924
+ parentRef?.current,
925
+ popoverRef?.current,
926
+ buttonRef?.current?.getBoundingClientRect().top,
927
+ ]);
741
928
  return (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsxs("div", { style: {
742
929
  position: 'relative',
743
930
  display: 'inline-block',
@@ -772,9 +959,15 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
772
959
  }
773
960
  setIsOpen(!isOpen);
774
961
  setShowUpdatePivot(false);
775
- }, label: triggerButtonText }) })), _jsx("div", { style: {
776
- position: 'relative',
777
- ...(isOpen && showTrigger && { top: 12 }),
962
+ }, label: triggerButtonText }) })), _jsx("div", { ref: popoverRef, style: {
963
+ position: 'absolute', // Change from 'relative' to 'absolute'
964
+ ...(isOpen &&
965
+ showTrigger && {
966
+ top: popoverPosition === 'bottom' ? '100%' : 'auto',
967
+ bottom: popoverPosition === 'top' ? '100%' : 'auto',
968
+ marginBottom: popoverPosition === 'top' ? pivotModalTopHeight : 0,
969
+ marginTop: popoverPosition === 'bottom' ? 8 : 0,
970
+ }),
778
971
  }, children: _jsx(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
779
972
  if (!isOpen) {
780
973
  setShowUpdatePivot(false);
@@ -783,7 +976,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
783
976
  setIsOpen(isOpen);
784
977
  }, ignoredRefs: [buttonRef], popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
785
978
  ? popUpTitle
786
- : 'Recommended pivots', popoverChildren: _jsx("div", { style: {
979
+ : 'Recommended pivots', horizontalPadding: 0, titlePaddingLeft: 20, popoverChildren: _jsx("div", { style: {
787
980
  paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
788
981
  position: 'relative',
789
982
  }, children: showUpdatePivot || !pivotRecommendationsEnabled ? (_jsxs("div", { style: {
@@ -791,155 +984,241 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
791
984
  display: 'flex',
792
985
  flexDirection: 'column',
793
986
  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: {
987
+ position: 'relative',
988
+ height: '100%',
989
+ overflow: 'auto',
990
+ }, children: [_jsx(OverflowContainer, { style: {
991
+ height: popoverPosition === 'bottom'
992
+ ? Math.max(availableHeight - heightAdjustment, 250)
993
+ : pivotModalTopHeight - 140,
994
+ }, children: _jsxs("div", { style: {
995
+ display: 'flex',
996
+ flexDirection: 'column',
997
+ paddingLeft: 20,
998
+ paddingRight: 20,
999
+ }, children: [previewLoading && _jsx(LoadingComponent, {}), samplePivotTable && !previewLoading && (_jsx("div", { style: {
1000
+ width: pivotCardWidth,
1001
+ // minHeight: 160,
1002
+ paddingBottom: 20,
1003
+ }, 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: () => {
1004
+ setPivotAggregations([
1005
+ {
1006
+ valueField: undefined,
1007
+ valueField2: undefined,
1008
+ aggregationType: undefined,
1009
+ },
1010
+ ]);
1011
+ setPivotRowField(undefined);
1012
+ setPivotColumnField(undefined);
1013
+ setSamplePivotTable(undefined);
1014
+ setPivotSort(undefined);
1015
+ setPivotLimit(undefined);
1016
+ } }) })), _jsxs(PivotColumnContainer, { children: [_jsxs("div", { style: {
1017
+ display: 'flex',
1018
+ flexDirection: 'column',
1019
+ gap: 4,
1020
+ }, 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) => {
1021
+ pivotFieldChange('rowField', e.target.value);
1022
+ setPivotRowField(e.target.value === ''
1023
+ ? undefined
1024
+ : e.target.value);
1025
+ }, options: allowedRowFields
1026
+ .filter((field) => field !== pivotColumnField)
1027
+ .map((field) => {
1028
+ return {
1029
+ label: snakeAndCamelCaseToTitleCase(field),
1030
+ value: field,
1031
+ };
1032
+ }), isLoading: uniqueValuesIsLoading, width: 200 }) }), _jsx("div", { ref: colFieldRef, children: _jsx(SelectComponent, { id: "pivot-column-field", label: "Group columns by", value: pivotColumnField, onChange: (e) => {
1033
+ pivotFieldChange('columnField', e.target.value);
1034
+ setPivotColumnField(e.target.value === ''
1035
+ ? undefined
1036
+ : e.target.value);
1037
+ }, options: allowedColumnFields
1038
+ .filter((field) => field !== pivotRowField)
1039
+ .map((field) => {
1040
+ return {
1041
+ label: snakeAndCamelCaseToTitleCase(field),
1042
+ value: field,
1043
+ };
1044
+ }), isLoading: uniqueValuesIsLoading, width: 200, disabled: pivotRowField === undefined }) })] })] }), _jsxs("div", { style: {
1045
+ display: 'flex',
1046
+ flexDirection: 'column',
1047
+ gap: 4,
1048
+ paddingBottom: 20,
1049
+ }, 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) => {
1050
+ const newAgg = [
1051
+ ...pivotAggregations.slice(0, index),
1052
+ {
1053
+ ...agg,
1054
+ aggregationType: e.target.value === ''
1055
+ ? undefined
1056
+ : e.target.value,
1057
+ },
1058
+ ...pivotAggregations.slice(index + 1),
1059
+ ];
1060
+ pivotFieldChange('aggregations', newAgg);
1061
+ setPivotAggregations(newAgg);
1062
+ }, options: [
1063
+ ...[
1064
+ 'sum',
1065
+ 'average',
1066
+ 'count',
1067
+ 'max',
1068
+ 'min',
1069
+ 'percentage',
1070
+ ].map((option) => {
1071
+ return { label: option, value: option };
1072
+ }),
1073
+ ], width: 200 }), _jsx(SelectComponent, { id: "pivot-value-field", value: agg.valueField, onChange: (e) => {
1074
+ const newAgg = [
1075
+ ...pivotAggregations.slice(0, index),
1076
+ {
1077
+ ...agg,
1078
+ valueField: e.target.value === ''
1079
+ ? undefined
1080
+ : e.target.value,
1081
+ },
1082
+ ...pivotAggregations.slice(index + 1),
1083
+ ];
1084
+ pivotFieldChange('aggregations', newAgg);
1085
+ setPivotAggregations(newAgg);
1086
+ }, options: allowedValueFields.map((field) => {
1087
+ return {
1088
+ label: snakeAndCamelCaseToTitleCase(field),
1089
+ value: field,
1090
+ };
1091
+ }), isLoading: uniqueValuesIsLoading, width: 200 }), _jsx("div", { style: {
1092
+ marginLeft: -16,
1093
+ marginRight: -16,
1094
+ visibility: index > 0 ? 'visible' : 'hidden',
1095
+ }, children: _jsx(DeleteButtonComponent, { onClick: () => {
1096
+ setPivotAggregations([
1097
+ ...pivotAggregations.slice(0, index),
1098
+ ...pivotAggregations.slice(index + 1),
1099
+ ]);
1100
+ } }) })] }, index)))] })] }), _jsx("div", { style: {
1101
+ display: 'flex',
1102
+ flexDirection: 'row',
1103
+ marginRight: 'auto',
1104
+ paddingBottom: 20,
1105
+ }, children: _jsx(SecondaryButtonComponent, { label: "Add Aggregation", onClick: () => {
1106
+ setPivotAggregations([
1107
+ ...pivotAggregations,
1108
+ {
1109
+ aggregationType: undefined,
1110
+ valueField: undefined,
1111
+ valueField2: undefined,
1112
+ },
1113
+ ]);
1114
+ } }) }), _jsx(PivotColumnContainer, { children: _jsxs("div", { style: {
1115
+ display: 'flex',
1116
+ flexDirection: 'column',
1117
+ gap: 4,
1118
+ paddingBottom: 20,
1119
+ }, 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) => {
1120
+ setSortFieldInput(e.target.value);
1121
+ if (e.target.value &&
1122
+ sortDirectionInput) {
1123
+ setPivotSort({
1124
+ sortField: e.target.value,
1125
+ sortDirection: sortDirectionInput,
1126
+ });
1127
+ }
1128
+ }, options: (samplePivotTable?.columns ?? []).map((column) => ({
1129
+ label: snakeAndCamelCaseToTitleCase(column.field),
1130
+ value: column.field,
1131
+ })), width: 200 }), _jsx(SelectComponent, { id: "pivot-sort-direction", value: sortDirectionInput, onChange: (e) => {
1132
+ setSortDirectionInput(e.target.value);
1133
+ if (sortFieldInput && e.target.value) {
1134
+ setPivotSort({
1135
+ sortField: sortFieldInput,
1136
+ sortDirection: e.target.value,
1137
+ });
1138
+ }
1139
+ }, options: [
1140
+ { label: 'Ascending', value: 'ASC' },
1141
+ { label: 'Descending', value: 'DESC' },
1142
+ ], hideEmptyOption: true, width: 200 }), _jsx("div", { style: {
1143
+ marginLeft: -16,
1144
+ marginRight: -16,
1145
+ }, children: _jsx(DeleteButtonComponent, { onClick: () => {
1146
+ if (pivotSort !== undefined) {
1147
+ setPivotSort(undefined);
1148
+ }
1149
+ setShowSortInput(false);
1150
+ setSortFieldInput('');
1151
+ setSortDirectionInput('ASC');
1152
+ } }) })] })] }))] }) }), _jsx(PivotColumnContainer, { children: _jsxs("div", { style: {
1153
+ display: 'flex',
1154
+ flexDirection: 'column',
1155
+ gap: 4,
1156
+ paddingBottom: 20,
1157
+ }, 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) => {
1158
+ setLimitInput(e.target.value);
1159
+ const limit = parseInt(e.target.value);
1160
+ if (limit) {
1161
+ setPivotLimit(limit);
1162
+ }
1163
+ else {
1164
+ setPivotLimit(undefined);
1165
+ }
1166
+ } }), _jsx("div", { style: {
1167
+ marginLeft: -16,
1168
+ marginRight: -16,
1169
+ }, children: _jsx(DeleteButtonComponent, { onClick: () => {
1170
+ if (pivotLimit !== undefined) {
1171
+ setPivotLimit(undefined);
1172
+ }
1173
+ setShowLimitInput(false);
1174
+ setLimitInput('100');
1175
+ } }) })] })] }))] }) }), errors.length > 0 && (_jsx("div", { style: {
1176
+ display: 'flex',
1177
+ flexDirection: 'column',
1178
+ gap: 8,
1179
+ paddingTop: 8,
1180
+ width: pivotCardWidth,
1181
+ maxWidth: pivotCardWidth,
1182
+ paddingBottom: 20,
1183
+ }, children: errors.map((error, index) => (_jsx(ErrorMessageComponent, { errorMessage: error }, `error_message_${index}`))) }))] }) }), _jsxs("div", { style: {
1184
+ position: 'sticky',
924
1185
  display: 'flex',
925
1186
  flexDirection: 'row',
1187
+ justifyContent: 'flex-end',
926
1188
  marginLeft: 'auto',
927
1189
  gap: 8,
1190
+ bottom: 0,
1191
+ right: 0,
1192
+ backgroundColor: 'white',
1193
+ width: '100%',
1194
+ paddingRight: 20,
928
1195
  }, children: [_jsx(SecondaryButtonComponent, { onClick: () => {
929
1196
  setPivotError('');
930
1197
  setIsOpen(false);
931
1198
  setPopUpTitle('Add pivot');
932
- }, label: "Cancel" }), _jsx(ButtonComponent, { id: "custom-button", onClick: onCommitPivot, label: 'Save', disabled: !(pivotAggregations?.length > 0) ||
1199
+ }, label: "Cancel" }), _jsx(ButtonComponent, { id: "custom-button", onClick: onCommitPivot, label: 'Save', disabled: (showSortInput &&
1200
+ (!sortFieldInput ||
1201
+ !(samplePivotTable?.columns ?? []).some((c) => c.field === sortFieldInput) ||
1202
+ !sortDirectionInput)) ||
1203
+ !(pivotAggregations?.length > 0) ||
933
1204
  pivotAggregations.some((agg) => !agg.aggregationType ||
934
1205
  (!agg.valueField &&
935
- agg.aggregationType !== 'count')) })] })] })) : (_jsx("div", { style: {
1206
+ agg.aggregationType !== 'count' &&
1207
+ (agg.aggregationType !== 'percentage' ||
1208
+ !pivotRowField ||
1209
+ pivotColumnField))) })] })] })) : (_jsx("div", { style: {
936
1210
  display: 'flex',
937
1211
  flexDirection: 'column',
938
1212
  fontFamily: theme?.fontFamily,
939
1213
  color: theme?.primaryTextColor,
940
1214
  width: selectedPivotTable ? 500 : 600,
941
- maxHeight: 600,
1215
+ minHeight: pivotModalTopHeight - 100,
1216
+ maxHeight: popoverPosition === 'bottom'
1217
+ ? 600
1218
+ : pivotModalTopHeight - 100,
942
1219
  overflowY: 'scroll',
1220
+ paddingRight: 20,
1221
+ paddingLeft: 20,
943
1222
  }, children: selectedPivotIndex >= 0 ? (_jsx("div", { children: _jsx("div", { onClick: () => {
944
1223
  setPopUpTitle('Edit pivot');
945
1224
  onEditPivot(createdPivots[0], 0);
@@ -953,6 +1232,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
953
1232
  display: 'flex',
954
1233
  flexDirection: 'row',
955
1234
  gap: 8,
1235
+ paddingRight: 20,
956
1236
  }, 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
1237
  width: '100%',
958
1238
  height: '140px',
@@ -1004,7 +1284,7 @@ export function generatePivotTitle(pivot) {
1004
1284
  return snakeAndCamelCaseToTitleCase(`${pivot.aggregations[0].aggregationType} of ${pivot.aggregations[0].valueField}
1005
1285
  `);
1006
1286
  }
1007
- return snakeAndCamelCaseToTitleCase(`${pivot.aggregations?.[0]?.aggregationType ?? 'Aggregation'} of ${pivot.aggregations?.[0]?.valueField ?? 'value'} by ${pivot.rowField}${pivot.columnField ? ` and ${pivot.columnField}` : ''}`);
1287
+ return snakeAndCamelCaseToTitleCase(`${pivot.aggregations?.[0]?.aggregationType ?? 'Aggregation'} of ${pivot.aggregations?.[0]?.valueField ?? 'value'}${pivot.rowField ? ` by ${pivot.rowField}` : ''}${pivot.columnField ? ` and ${pivot.columnField}` : ''}`);
1008
1288
  }
1009
1289
  function castValueToDate(value) {
1010
1290
  if (!value) {
@@ -1245,7 +1525,7 @@ export function isDateField(fieldType) {
1245
1525
  // }
1246
1526
  // return newData;
1247
1527
  // };
1248
- export async function generatePivotTable({ pivot, dateBucket, dateFilter, report, client, getToken, uniqueValues, dashboardName, tenants, additionalProcessing, caller, pivotQuery, }) {
1528
+ export async function generatePivotTable({ pivot, dateBucket, dateFilter, report, client, getToken, eventTracking, uniqueValues, dashboardName, tenants, additionalProcessing, caller, pivotQuery, }) {
1249
1529
  try {
1250
1530
  if (report && client) {
1251
1531
  const pivotTable = await generatePivotWithSQL({
@@ -1268,6 +1548,17 @@ export async function generatePivotTable({ pivot, dateBucket, dateFilter, report
1268
1548
  }
1269
1549
  }
1270
1550
  catch (e) {
1551
+ eventTracking?.logError?.({
1552
+ type: 'bug', // TODO: determine type
1553
+ severity: 'high',
1554
+ message: 'Error generating pivot table',
1555
+ errorMessage: e.message,
1556
+ errorStack: e.stack,
1557
+ errorData: {
1558
+ caller: 'PivotModal',
1559
+ function: 'generatePivotTable',
1560
+ },
1561
+ });
1271
1562
  throw Error(`Failed to generate pivot table with SQL: ${e}`);
1272
1563
  }
1273
1564
  throw Error('Failed to generate pivot table: invalid report');