@quillsql/react 2.14.17 → 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 (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 +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 -1273
  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/PivotModal.d.ts +18 -2
  89. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  90. package/dist/cjs/internals/ReportBuilder/PivotModal.js +421 -142
  91. package/dist/cjs/models/Filter.d.ts +1 -1
  92. package/dist/cjs/models/Filter.d.ts.map +1 -1
  93. package/dist/cjs/models/Filter.js +3 -3
  94. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
  95. package/dist/cjs/utils/astFilterProcessing.js +25 -4
  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 +12 -1
  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 +10 -5
  111. package/dist/cjs/utils/report.d.ts.map +1 -1
  112. package/dist/cjs/utils/report.js +55 -7
  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 +114 -20
  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 +159 -32
  131. package/dist/esm/Dashboard.d.ts.map +1 -1
  132. package/dist/esm/Dashboard.js +100 -20
  133. package/dist/esm/QuillProvider.d.ts +38 -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 +7 -2
  137. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  138. package/dist/esm/ReportBuilder.js +107 -1273
  139. package/dist/esm/SQLEditor.d.ts +9 -2
  140. package/dist/esm/SQLEditor.d.ts.map +1 -1
  141. package/dist/esm/SQLEditor.js +68 -11
  142. package/dist/esm/Table.d.ts.map +1 -1
  143. package/dist/esm/Table.js +13 -1
  144. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  145. package/dist/esm/components/Chart/InternalChart.js +25 -2
  146. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  147. package/dist/esm/components/Dashboard/DashboardTemplate.js +3 -2
  148. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  149. package/dist/esm/components/Dashboard/DataLoader.js +74 -3
  150. package/dist/esm/components/Dashboard/util.d.ts +2 -1
  151. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  152. package/dist/esm/components/Dashboard/util.js +12 -1
  153. package/dist/esm/components/QuillTable.d.ts +2 -1
  154. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  155. package/dist/esm/components/QuillTable.js +2 -2
  156. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +2 -1
  157. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  158. package/dist/esm/components/ReportBuilder/AddColumnModal.js +29 -4
  159. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts +49 -0
  160. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts.map +1 -0
  161. package/dist/esm/components/ReportBuilder/ColumnComponent.js +39 -0
  162. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts +65 -0
  163. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts.map +1 -0
  164. package/dist/esm/components/ReportBuilder/FilterComponent.js +44 -0
  165. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts +42 -0
  166. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts.map +1 -0
  167. package/dist/esm/components/ReportBuilder/LimitComponent.js +46 -0
  168. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts +66 -0
  169. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts.map +1 -0
  170. package/dist/esm/components/ReportBuilder/PivotComponent.js +40 -0
  171. package/dist/esm/components/ReportBuilder/SaveReport.d.ts +162 -0
  172. package/dist/esm/components/ReportBuilder/SaveReport.d.ts.map +1 -0
  173. package/dist/esm/components/ReportBuilder/SaveReport.js +31 -0
  174. package/dist/esm/components/ReportBuilder/SortComponent.d.ts +42 -0
  175. package/dist/esm/components/ReportBuilder/SortComponent.d.ts.map +1 -0
  176. package/dist/esm/components/ReportBuilder/SortComponent.js +46 -0
  177. package/dist/esm/components/ReportBuilder/TableComponent.d.ts +28 -0
  178. package/dist/esm/components/ReportBuilder/TableComponent.d.ts.map +1 -0
  179. package/dist/esm/components/ReportBuilder/TableComponent.js +20 -0
  180. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  181. package/dist/esm/components/ReportBuilder/ui.js +4 -2
  182. package/dist/esm/components/UiComponents.d.ts +5 -2
  183. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  184. package/dist/esm/components/UiComponents.js +7 -5
  185. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  186. package/dist/esm/hooks/useAskQuill.js +39 -1
  187. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  188. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  189. package/dist/esm/hooks/useDashboard.js +63 -7
  190. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  191. package/dist/esm/hooks/useExport.js +6 -3
  192. package/dist/esm/hooks/useLongLoading.d.ts +13 -0
  193. package/dist/esm/hooks/useLongLoading.d.ts.map +1 -0
  194. package/dist/esm/hooks/useLongLoading.js +64 -0
  195. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  196. package/dist/esm/hooks/useQuill.js +26 -2
  197. package/dist/esm/hooks/useReportBuilder.d.ts +178 -0
  198. package/dist/esm/hooks/useReportBuilder.d.ts.map +1 -0
  199. package/dist/esm/hooks/useReportBuilder.js +1490 -0
  200. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  201. package/dist/esm/hooks/useVirtualTables.js +28 -3
  202. package/dist/esm/index.d.ts +11 -0
  203. package/dist/esm/index.d.ts.map +1 -1
  204. package/dist/esm/index.js +8 -0
  205. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +14 -1
  206. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  207. package/dist/esm/internals/ReportBuilder/PivotForm.js +87 -4
  208. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +18 -2
  209. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  210. package/dist/esm/internals/ReportBuilder/PivotModal.js +423 -144
  211. package/dist/esm/models/Filter.d.ts +1 -1
  212. package/dist/esm/models/Filter.d.ts.map +1 -1
  213. package/dist/esm/models/Filter.js +3 -3
  214. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
  215. package/dist/esm/utils/astFilterProcessing.js +25 -4
  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 +12 -1
  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 +10 -5
  231. package/dist/esm/utils/report.d.ts.map +1 -1
  232. package/dist/esm/utils/report.js +55 -7
  233. package/dist/esm/utils/reportBuilder.d.ts.map +1 -1
  234. package/dist/esm/utils/reportBuilder.js +5 -2
  235. package/dist/esm/utils/schema.d.ts +5 -2
  236. package/dist/esm/utils/schema.d.ts.map +1 -1
  237. package/dist/esm/utils/schema.js +14 -2
  238. package/dist/esm/utils/tableProcessing.d.ts +17 -10
  239. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  240. package/dist/esm/utils/tableProcessing.js +99 -17
  241. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from 'react';
3
- import { ClientContext, FetchContext, SchemaDataContext, TenantContext, } from '../../Context';
3
+ import { ClientContext, EventTrackingContext, FetchContext, SchemaDataContext, TenantContext, } from '../../Context';
4
4
  import { PivotList, PivotCard } from './PivotList';
5
5
  import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval,
6
6
  // endOfDay,
@@ -14,7 +14,7 @@ import {
14
14
  // getValidDate,
15
15
  valueFormatter, } from '../../utils/valueFormatter';
16
16
  import { snakeAndCamelCaseToTitleCase } from '../../utils/textProcessing';
17
- import { MemoizedDeleteButton, MemoizedSubHeader, QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
17
+ import { MemoizedDeleteButton, MemoizedSubHeader, OverflowContainer, QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
18
18
  import { QuillCard } from '../../components/QuillCard';
19
19
  import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
20
20
  import { hashCode } from '../../utils/crypto';
@@ -23,7 +23,7 @@ import { generatePivotWithSQL } from '../../utils/pivotConstructor';
23
23
  import { getDateBucketFromRange } from '../../utils/dates';
24
24
  import equal from 'fast-deep-equal';
25
25
  import { isStringType } from '../../utils/columnProcessing';
26
- export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotAggregations, setPivotAggregations, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, SubheaderComponent = MemoizedSubHeader, DeleteButtonComponent = MemoizedDeleteButton, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, showTrigger = true, pivotCountRequest = 6, query, initialUniqueValues, uniqueValuesIsLoading, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, dashboardName, dateFilter, }) => {
26
+ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotAggregations, setPivotAggregations, pivotSort, setPivotSort, pivotLimit, setPivotLimit, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, TextInputComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, SubheaderComponent = MemoizedSubHeader, DeleteButtonComponent = MemoizedDeleteButton, LabelComponent, TextComponent, selectedPivotIndex, setSelectedPivotIndex, removePivot, selectPivot, showUpdatePivot, setShowUpdatePivot, data, columns, theme, isOpen, setIsOpen, dateRange, createdPivots, setCreatedPivots, recommendedPivots, setRecommendedPivots, triggerButtonText = 'Pivot', showPivotEditButton = false, showEditOnPivotClick = true, showTrigger = true, pivotCountRequest = 6, query, initialUniqueValues, uniqueValuesIsLoading, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, dashboardName, dateFilter, parentRef, heightAdjustment = 0, }) => {
27
27
  const { getToken, quillFetchWithToken } = useContext(FetchContext);
28
28
  const [isLoading, setIsLoading] = useState(false);
29
29
  const [previewLoading, setPreviewLoading] = useState(false);
@@ -33,6 +33,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
33
33
  const [client] = useContext(ClientContext);
34
34
  const [schemaData] = useContext(SchemaDataContext);
35
35
  const { tenants } = useContext(TenantContext);
36
+ const { eventTracking } = useContext(EventTrackingContext);
36
37
  const rowFieldRef = useRef(null);
37
38
  const colFieldRef = useRef(null);
38
39
  const [pivotCardWidth, setPivotCardWidth] = useState(420);
@@ -47,6 +48,15 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
47
48
  // const percentageAggButtonRef = useRef<HTMLDivElement>(null);
48
49
  const [dateRanges, setDateRanges] = useState({});
49
50
  const [pivotError, setPivotError] = useState('');
51
+ const [limitInput, setLimitInput] = useState(pivotLimit?.toString() ?? '100');
52
+ const [sortFieldInput, setSortFieldInput] = useState(pivotSort?.sortField ?? '');
53
+ const [sortDirectionInput, setSortDirectionInput] = useState(pivotSort?.sortDirection ?? 'ASC');
54
+ const [showLimitInput, setShowLimitInput] = useState(!!pivotLimit);
55
+ const [showSortInput, setShowSortInput] = useState(!!pivotSort);
56
+ const [availableHeight, setAvailableHeight] = useState(0);
57
+ const [pivotModalTopHeight, setPivotModalTopHeight] = useState(450);
58
+ const [popoverPosition, setPopoverPosition] = useState('bottom');
59
+ const popoverRef = useRef(null);
50
60
  const getDistinctValues = async (fetchDistinct) => {
51
61
  if (!client) {
52
62
  return {
@@ -67,7 +77,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
67
77
  }
68
78
  let newUniqueValues = uniqueValues ?? null;
69
79
  if (fetchDistinct || !uniqueValues) {
70
- const { filteredColumns: smallStringColumns, exceededColumns } = await getCountsByColumns(stringColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, dashboardName);
80
+ const { filteredColumns: smallStringColumns, exceededColumns } = await getCountsByColumns(stringColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, eventTracking, dashboardName);
71
81
  newUniqueValues = await getUniqueValuesByQuery({
72
82
  columns: smallStringColumns,
73
83
  query: query || '',
@@ -76,6 +86,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
76
86
  tenants,
77
87
  customFields: schemaData.customFields ?? {},
78
88
  dashboardName,
89
+ eventTracking,
79
90
  });
80
91
  exceededColumns?.forEach((column) => {
81
92
  if (newUniqueValues) {
@@ -107,7 +118,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
107
118
  if (dateColumns.length === 0) {
108
119
  return;
109
120
  }
110
- const dateRangeByColumn = await getQueryDateRangeByColumns(dateColumns, query || '', client, getToken, tenants, schemaData.customFields ?? {}, dashboardName);
121
+ const dateRangeByColumn = await getQueryDateRangeByColumns(dateColumns, query || '', client, getToken, tenants, eventTracking, schemaData.customFields ?? {}, dashboardName);
111
122
  setDateRanges(dateRangeByColumn || {});
112
123
  }
113
124
  };
@@ -173,10 +184,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
173
184
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
174
185
  }, // limit preview
175
186
  getToken,
187
+ eventTracking,
176
188
  });
177
189
  setSamplePivotTable({ pivot: pivot, rows, columns });
178
190
  }
179
191
  catch (e) {
192
+ eventTracking?.logError?.({
193
+ type: 'bug', // TODO: determine type
194
+ severity: 'high',
195
+ message: 'Error fetching pivot data',
196
+ errorMessage: e.message,
197
+ errorStack: e.stack,
198
+ errorData: {
199
+ caller: 'PivotModal',
200
+ function: 'fetchPivotData',
201
+ },
202
+ });
180
203
  if (e instanceof Error) {
181
204
  setPivotError(e.message);
182
205
  return;
@@ -234,10 +257,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
234
257
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
235
258
  }, // limit preview
236
259
  getToken,
260
+ eventTracking,
237
261
  });
238
262
  setSamplePivotTable({ pivot: pivot, rows, columns });
239
263
  }
240
264
  catch (e) {
265
+ eventTracking?.logError?.({
266
+ type: 'bug', // TODO: determine type
267
+ severity: 'high',
268
+ message: 'Error fetching pivot data',
269
+ errorMessage: e.message,
270
+ errorStack: e.stack,
271
+ errorData: {
272
+ caller: 'PivotModal',
273
+ function: 'fetchPivotData',
274
+ },
275
+ });
241
276
  if (e instanceof Error) {
242
277
  setPivotError(e.message);
243
278
  return;
@@ -305,6 +340,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
305
340
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
306
341
  }, // limit preview
307
342
  getToken,
343
+ eventTracking,
308
344
  });
309
345
  setSelectedPivotTable({
310
346
  pivot: pivot,
@@ -313,6 +349,17 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
313
349
  });
314
350
  }
315
351
  catch (e) {
352
+ eventTracking?.logError?.({
353
+ type: 'bug', // TODO: determine type
354
+ severity: 'high',
355
+ message: 'Error fetching pivot tables',
356
+ errorMessage: e.message,
357
+ errorStack: e.stack,
358
+ errorData: {
359
+ caller: 'PivotModal',
360
+ function: 'fetchPivotTables',
361
+ },
362
+ });
316
363
  if (e instanceof Error) {
317
364
  setPivotError(e.message);
318
365
  return;
@@ -375,11 +422,18 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
375
422
  if (pivotColumnField && !columnsToShow[pivotColumnField]) {
376
423
  errors.push('Error in column field: undefined type');
377
424
  }
425
+ if (showLimitInput && limitInput && !Number.isInteger(Number(limitInput))) {
426
+ errors.push('Limit must be an integer');
427
+ }
378
428
  if (errors.length === 0 &&
379
429
  pivotAggregations?.every((p) => p.aggregationType &&
380
430
  (p.valueField ||
381
431
  p.aggregationType === 'count' ||
382
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;
383
437
  const pivot = {
384
438
  rowField: pivotRowField,
385
439
  rowFieldType: columnTypes[pivotRowField ?? ''],
@@ -392,6 +446,10 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
392
446
  valueField2Type: columnTypes[p.valueField2 ?? ''],
393
447
  aggregationType: p.aggregationType,
394
448
  })),
449
+ sort,
450
+ sortField,
451
+ sortDirection,
452
+ rowLimit,
395
453
  // For backwards compatibility
396
454
  valueField: pivotAggregations?.[0]?.valueField,
397
455
  valueFieldType: columnTypes[pivotAggregations?.[0]?.valueField ?? ''],
@@ -412,7 +470,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
412
470
  }
413
471
  }
414
472
  setErrors(errors);
415
- }, [pivotRowField, pivotColumnField, pivotAggregations]);
473
+ }, [
474
+ pivotRowField,
475
+ pivotColumnField,
476
+ pivotAggregations,
477
+ sortFieldInput,
478
+ sortDirectionInput,
479
+ showSortInput,
480
+ showLimitInput,
481
+ limitInput,
482
+ ]);
416
483
  const onEditPivot = async (pivot, index, pivotType) => {
417
484
  setIsLoading(false);
418
485
  setErrors([]);
@@ -445,11 +512,23 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
445
512
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
446
513
  }, // limit preview
447
514
  getToken,
515
+ eventTracking,
448
516
  });
449
517
  setSamplePivotTable({ pivot, rows, columns });
450
518
  return;
451
519
  }
452
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
+ });
453
532
  if (e instanceof Error) {
454
533
  setPivotError(e.message);
455
534
  setSamplePivotTable(null);
@@ -559,10 +638,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
559
638
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
560
639
  }, // limit preview
561
640
  getToken,
641
+ eventTracking,
562
642
  });
563
643
  return { pivot: p, rows, columns };
564
644
  }
565
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
+ });
566
657
  return undefined;
567
658
  }
568
659
  }));
@@ -586,6 +677,17 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
586
677
  setSelectedPivotIndex(-1);
587
678
  }
588
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
+ });
589
691
  setPivotError('Failed to fetch pivot recommendations');
590
692
  console.error('Failed parsing pivotai response', e);
591
693
  }
@@ -702,10 +804,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
702
804
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
703
805
  }, // limit preview
704
806
  getToken,
807
+ eventTracking,
705
808
  });
706
809
  setSamplePivotTable({ pivot, rows, columns });
707
810
  }
708
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
+ });
709
823
  if (e instanceof Error) {
710
824
  console.log('error', e);
711
825
  setPivotError(e.message);
@@ -736,10 +850,22 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
736
850
  page: { rowsPerPage: 6, rowsPerRequest: 6, page: 0 },
737
851
  },
738
852
  getToken,
853
+ eventTracking,
739
854
  });
740
855
  return { pivot: p, rows, columns };
741
856
  }
742
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
+ });
743
869
  return undefined;
744
870
  }
745
871
  }));
@@ -747,6 +873,58 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
747
873
  };
748
874
  fetchPivotTables();
749
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
+ ]);
750
928
  return (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsxs("div", { style: {
751
929
  position: 'relative',
752
930
  display: 'inline-block',
@@ -781,9 +959,15 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
781
959
  }
782
960
  setIsOpen(!isOpen);
783
961
  setShowUpdatePivot(false);
784
- }, label: triggerButtonText }) })), _jsx("div", { style: {
785
- position: 'relative',
786
- ...(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
+ }),
787
971
  }, children: _jsx(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
788
972
  if (!isOpen) {
789
973
  setShowUpdatePivot(false);
@@ -792,7 +976,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
792
976
  setIsOpen(isOpen);
793
977
  }, ignoredRefs: [buttonRef], popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
794
978
  ? popUpTitle
795
- : 'Recommended pivots', popoverChildren: _jsx("div", { style: {
979
+ : 'Recommended pivots', horizontalPadding: 0, titlePaddingLeft: 20, popoverChildren: _jsx("div", { style: {
796
980
  paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
797
981
  position: 'relative',
798
982
  }, children: showUpdatePivot || !pivotRecommendationsEnabled ? (_jsxs("div", { style: {
@@ -800,145 +984,223 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
800
984
  display: 'flex',
801
985
  flexDirection: 'column',
802
986
  gap: 20,
803
- }, children: [previewLoading && _jsx(LoadingComponent, {}), samplePivotTable && !previewLoading && (_jsx("div", { style: {
804
- width: pivotCardWidth,
805
- minHeight: 160,
806
- }, 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: () => {
807
- setPivotAggregations([
808
- {
809
- valueField: undefined,
810
- valueField2: undefined,
811
- aggregationType: undefined,
812
- },
813
- ]);
814
- setPivotRowField(undefined);
815
- setPivotColumnField(undefined);
816
- setSamplePivotTable(undefined);
817
- } }) })), _jsxs(PivotColumnContainer, { children: [_jsxs("div", { style: {
818
- display: 'flex',
819
- flexDirection: 'column',
820
- gap: 4,
821
- }, 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) => {
822
- pivotFieldChange('rowField', e.target.value);
823
- setPivotRowField(e.target.value === ''
824
- ? undefined
825
- : e.target.value);
826
- }, options: allowedRowFields
827
- .filter((field) => field !== pivotColumnField)
828
- .map((field) => {
829
- return {
830
- label: snakeAndCamelCaseToTitleCase(field),
831
- value: field,
832
- };
833
- }), isLoading: uniqueValuesIsLoading, width: 200 }) }), _jsx("div", { ref: colFieldRef, children: _jsx(SelectComponent, { id: "pivot-column-field", label: "Group columns by", value: pivotColumnField, onChange: (e) => {
834
- pivotFieldChange('columnField', e.target.value);
835
- setPivotColumnField(e.target.value === ''
836
- ? undefined
837
- : e.target.value);
838
- }, options: allowedColumnFields
839
- .filter((field) => field !== pivotRowField)
840
- .map((field) => {
841
- return {
842
- label: snakeAndCamelCaseToTitleCase(field),
843
- value: field,
844
- };
845
- }), isLoading: uniqueValuesIsLoading, width: 200, disabled: pivotRowField === undefined }) })] })] }), _jsxs("div", { style: {
846
- display: 'flex',
847
- flexDirection: 'column',
848
- gap: 4,
849
- }, 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) => {
850
- // if (
851
- // e.target.value !== 'count' &&
852
- // agg.valueField &&
853
- // !numberFormatOptions.includes(
854
- // columns.find(
855
- // (col: Column) =>
856
- // col.field === agg.valueField,
857
- // )!.format,
858
- // )
859
- // ) {
860
- // setPivotValueField(undefined);
861
- // }
862
- const newAgg = [
863
- ...pivotAggregations.slice(0, index),
864
- {
865
- ...agg,
866
- aggregationType: e.target.value === ''
867
- ? undefined
868
- : e.target.value,
869
- },
870
- ...pivotAggregations.slice(index + 1),
871
- ];
872
- pivotFieldChange('aggregations', newAgg);
873
- setPivotAggregations(newAgg);
874
- }, options: [
875
- ...[
876
- 'sum',
877
- 'average',
878
- 'count',
879
- 'max',
880
- 'min',
881
- 'percentage',
882
- ].map((option) => {
883
- return { label: option, value: option };
884
- }),
885
- ], width: 200 }), _jsx(SelectComponent, { id: "pivot-value-field", value: agg.valueField, onChange: (e) => {
886
- const newAgg = [
887
- ...pivotAggregations.slice(0, index),
888
- {
889
- ...agg,
890
- valueField: e.target.value === ''
891
- ? undefined
892
- : e.target.value,
893
- },
894
- ...pivotAggregations.slice(index + 1),
895
- ];
896
- pivotFieldChange('aggregations', newAgg);
897
- setPivotAggregations(newAgg);
898
- }, options: allowedValueFields.map((field) => {
899
- return {
900
- label: snakeAndCamelCaseToTitleCase(field),
901
- value: field,
902
- };
903
- }), isLoading: uniqueValuesIsLoading, width: 200 }), _jsx("div", { style: {
904
- marginLeft: -16,
905
- marginRight: -16,
906
- visibility: index > 0 ? 'visible' : 'hidden',
907
- }, children: _jsx(DeleteButtonComponent, { onClick: () => {
908
- setPivotAggregations([
909
- ...pivotAggregations.slice(0, index),
910
- ...pivotAggregations.slice(index + 1),
911
- ]);
912
- } }) })] }, index)))] })] }), _jsx("div", { style: {
913
- display: 'flex',
914
- flexDirection: 'row',
915
- marginRight: 'auto',
916
- }, children: _jsx(SecondaryButtonComponent, { label: "Add Aggregation", onClick: () => {
917
- setPivotAggregations([
918
- ...pivotAggregations,
919
- {
920
- aggregationType: undefined,
921
- valueField: undefined,
922
- valueField2: undefined,
923
- },
924
- ]);
925
- } }) }), errors.length > 0 && (_jsx("div", { style: {
926
- display: 'flex',
927
- flexDirection: 'column',
928
- gap: 8,
929
- paddingTop: 8,
930
- width: pivotCardWidth,
931
- maxWidth: pivotCardWidth,
932
- }, 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',
933
1185
  display: 'flex',
934
1186
  flexDirection: 'row',
1187
+ justifyContent: 'flex-end',
935
1188
  marginLeft: 'auto',
936
1189
  gap: 8,
1190
+ bottom: 0,
1191
+ right: 0,
1192
+ backgroundColor: 'white',
1193
+ width: '100%',
1194
+ paddingRight: 20,
937
1195
  }, children: [_jsx(SecondaryButtonComponent, { onClick: () => {
938
1196
  setPivotError('');
939
1197
  setIsOpen(false);
940
1198
  setPopUpTitle('Add pivot');
941
- }, 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) ||
942
1204
  pivotAggregations.some((agg) => !agg.aggregationType ||
943
1205
  (!agg.valueField &&
944
1206
  agg.aggregationType !== 'count' &&
@@ -950,8 +1212,13 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
950
1212
  fontFamily: theme?.fontFamily,
951
1213
  color: theme?.primaryTextColor,
952
1214
  width: selectedPivotTable ? 500 : 600,
953
- maxHeight: 600,
1215
+ minHeight: pivotModalTopHeight - 100,
1216
+ maxHeight: popoverPosition === 'bottom'
1217
+ ? 600
1218
+ : pivotModalTopHeight - 100,
954
1219
  overflowY: 'scroll',
1220
+ paddingRight: 20,
1221
+ paddingLeft: 20,
955
1222
  }, children: selectedPivotIndex >= 0 ? (_jsx("div", { children: _jsx("div", { onClick: () => {
956
1223
  setPopUpTitle('Edit pivot');
957
1224
  onEditPivot(createdPivots[0], 0);
@@ -965,6 +1232,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
965
1232
  display: 'flex',
966
1233
  flexDirection: 'row',
967
1234
  gap: 8,
1235
+ paddingRight: 20,
968
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: {
969
1237
  width: '100%',
970
1238
  height: '140px',
@@ -1016,7 +1284,7 @@ export function generatePivotTitle(pivot) {
1016
1284
  return snakeAndCamelCaseToTitleCase(`${pivot.aggregations[0].aggregationType} of ${pivot.aggregations[0].valueField}
1017
1285
  `);
1018
1286
  }
1019
- 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}` : ''}`);
1020
1288
  }
1021
1289
  function castValueToDate(value) {
1022
1290
  if (!value) {
@@ -1257,7 +1525,7 @@ export function isDateField(fieldType) {
1257
1525
  // }
1258
1526
  // return newData;
1259
1527
  // };
1260
- 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, }) {
1261
1529
  try {
1262
1530
  if (report && client) {
1263
1531
  const pivotTable = await generatePivotWithSQL({
@@ -1280,6 +1548,17 @@ export async function generatePivotTable({ pivot, dateBucket, dateFilter, report
1280
1548
  }
1281
1549
  }
1282
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
+ });
1283
1562
  throw Error(`Failed to generate pivot table with SQL: ${e}`);
1284
1563
  }
1285
1564
  throw Error('Failed to generate pivot table: invalid report');