@quillsql/react 2.13.7 → 2.13.9

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 (368) hide show
  1. package/dist/cjs/Chart.d.ts +5 -5
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +19 -8
  4. package/dist/cjs/ChartBuilder.d.ts +1 -1
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +58 -93
  7. package/dist/cjs/ChartEditor.js +1 -1
  8. package/dist/cjs/Context.d.ts +9 -8
  9. package/dist/cjs/Context.d.ts.map +1 -1
  10. package/dist/cjs/Context.js +119 -34
  11. package/dist/cjs/Dashboard.d.ts +20 -8
  12. package/dist/cjs/Dashboard.d.ts.map +1 -1
  13. package/dist/cjs/Dashboard.js +68 -58
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -2
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  16. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +1 -2
  17. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +20 -20
  18. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  19. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +64 -52
  20. package/dist/cjs/ReportBuilder.d.ts +2 -1
  21. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  22. package/dist/cjs/ReportBuilder.js +339 -339
  23. package/dist/cjs/SQLEditor.d.ts +1 -1
  24. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  25. package/dist/cjs/SQLEditor.js +30 -18
  26. package/dist/cjs/components/Banner/index.d.ts +0 -1
  27. package/dist/cjs/components/Banner/index.d.ts.map +1 -1
  28. package/dist/cjs/components/Banner/index.js +1 -1
  29. package/dist/cjs/components/Chart/BarChart.d.ts +0 -1
  30. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  31. package/dist/cjs/components/Chart/BarChart.js +1 -1
  32. package/dist/cjs/components/Chart/BarList.js +1 -2
  33. package/dist/cjs/components/Chart/ChartError.js +2 -3
  34. package/dist/cjs/components/Chart/ChartSkeleton.js +1 -1
  35. package/dist/cjs/components/Chart/ChartTooltip.js +1 -1
  36. package/dist/cjs/components/Chart/ChartTooltipFrame.d.ts +0 -1
  37. package/dist/cjs/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
  38. package/dist/cjs/components/Chart/ChartTooltipFrame.js +1 -1
  39. package/dist/cjs/components/Chart/ChartTooltipGroup.js +1 -1
  40. package/dist/cjs/components/Chart/ChartTooltipRow.js +1 -1
  41. package/dist/cjs/components/Chart/LineChart.d.ts +0 -1
  42. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  43. package/dist/cjs/components/Chart/LineChart.js +1 -1
  44. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
  45. package/dist/cjs/components/Chart/PieChart.js +18 -9
  46. package/dist/cjs/components/Dashboard/ChartComponent.d.ts +0 -1
  47. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  48. package/dist/cjs/components/Dashboard/ChartComponent.js +1 -1
  49. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +10 -2
  50. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  51. package/dist/cjs/components/Dashboard/DashboardFilter.js +9 -23
  52. package/dist/cjs/components/Dashboard/DashboardSection.d.ts +0 -1
  53. package/dist/cjs/components/Dashboard/DashboardSection.d.ts.map +1 -1
  54. package/dist/cjs/components/Dashboard/DashboardSection.js +1 -1
  55. package/dist/cjs/components/Dashboard/DashboardSectionContainer.d.ts +0 -1
  56. package/dist/cjs/components/Dashboard/DashboardSectionContainer.d.ts.map +1 -1
  57. package/dist/cjs/components/Dashboard/DashboardSectionContainer.js +1 -1
  58. package/dist/cjs/components/Dashboard/DashboardTemplate.js +1 -1
  59. package/dist/cjs/components/Dashboard/DataLoader.d.ts +9 -7
  60. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  61. package/dist/cjs/components/Dashboard/DataLoader.js +104 -61
  62. package/dist/cjs/components/Dashboard/MetricComponent.d.ts +0 -1
  63. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  64. package/dist/cjs/components/Dashboard/MetricComponent.js +3 -3
  65. package/dist/cjs/components/Dashboard/TableComponent.d.ts +0 -1
  66. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  67. package/dist/cjs/components/Dashboard/TableComponent.js +1 -1
  68. package/dist/cjs/components/Dashboard/TemplateChartComponent.d.ts +0 -1
  69. package/dist/cjs/components/Dashboard/TemplateChartComponent.d.ts.map +1 -1
  70. package/dist/cjs/components/Dashboard/TemplateChartComponent.js +1 -1
  71. package/dist/cjs/components/Dashboard/TemplateMetricComponent.d.ts +0 -1
  72. package/dist/cjs/components/Dashboard/TemplateMetricComponent.d.ts.map +1 -1
  73. package/dist/cjs/components/Dashboard/TemplateMetricComponent.js +1 -1
  74. package/dist/cjs/components/Dashboard/TemplateTableComponent.d.ts +0 -1
  75. package/dist/cjs/components/Dashboard/TemplateTableComponent.d.ts.map +1 -1
  76. package/dist/cjs/components/Dashboard/TemplateTableComponent.js +1 -1
  77. package/dist/cjs/components/Dashboard/util.js +2 -3
  78. package/dist/cjs/components/QuillCard.js +1 -2
  79. package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
  80. package/dist/cjs/components/QuillMultiSelect.js +21 -20
  81. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  82. package/dist/cjs/components/QuillMultiSelectWithCombo.js +172 -70
  83. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  84. package/dist/cjs/components/QuillSelect.js +9 -8
  85. package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
  86. package/dist/cjs/components/QuillSelectWithCombo.js +26 -12
  87. package/dist/cjs/components/QuillTable.d.ts +5 -1
  88. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  89. package/dist/cjs/components/QuillTable.js +5 -3
  90. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +1 -1
  91. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +2 -3
  92. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  93. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +5 -6
  94. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  95. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +3 -4
  96. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  97. package/dist/cjs/components/ReportBuilder/FilterModal.js +45 -39
  98. package/dist/cjs/components/ReportBuilder/FilterStack.js +1 -1
  99. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  100. package/dist/cjs/components/ReportBuilder/ast.js +2 -2
  101. package/dist/cjs/components/ReportBuilder/convert.js +11 -12
  102. package/dist/cjs/components/ReportBuilder/postgres.js +4 -4
  103. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -3
  104. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  105. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  106. package/dist/cjs/components/ReportBuilder/util.js +21 -23
  107. package/dist/cjs/components/UiComponents.d.ts +14 -12
  108. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  109. package/dist/cjs/components/UiComponents.js +41 -17
  110. package/dist/cjs/components/selectUtils.js +3 -3
  111. package/dist/cjs/contexts/BaseColorContext.d.ts +0 -1
  112. package/dist/cjs/contexts/BaseColorContext.d.ts.map +1 -1
  113. package/dist/cjs/contexts/RootStylesContext.d.ts +0 -1
  114. package/dist/cjs/contexts/RootStylesContext.d.ts.map +1 -1
  115. package/dist/cjs/contexts/SelectedValueContext.d.ts +0 -1
  116. package/dist/cjs/contexts/SelectedValueContext.d.ts.map +1 -1
  117. package/dist/cjs/hooks/useAskQuill.d.ts +2 -2
  118. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  119. package/dist/cjs/hooks/useAskQuill.js +11 -11
  120. package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
  121. package/dist/cjs/hooks/useDashboard.d.ts +8 -7
  122. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  123. package/dist/cjs/hooks/useDashboard.js +47 -31
  124. package/dist/cjs/hooks/useExport.d.ts +3 -4
  125. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  126. package/dist/cjs/hooks/useExport.js +6 -2
  127. package/dist/cjs/hooks/useInternalState.d.ts +1 -2
  128. package/dist/cjs/hooks/useInternalState.d.ts.map +1 -1
  129. package/dist/cjs/hooks/useOnClickOutside.d.ts +3 -1
  130. package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -1
  131. package/dist/cjs/hooks/useQuill.d.ts +0 -14
  132. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  133. package/dist/cjs/hooks/useQuill.js +17 -55
  134. package/dist/cjs/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  135. package/dist/cjs/index.d.ts +2 -1
  136. package/dist/cjs/index.d.ts.map +1 -1
  137. package/dist/cjs/index.js +7 -2
  138. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +4 -1
  139. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  140. package/dist/cjs/internals/ReportBuilder/PivotForm.js +32 -7
  141. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +17 -13
  142. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  143. package/dist/cjs/internals/ReportBuilder/PivotModal.js +368 -162
  144. package/dist/cjs/lib/utils.d.ts +0 -1
  145. package/dist/cjs/lib/utils.d.ts.map +1 -1
  146. package/dist/cjs/lib/utils.js +2 -2
  147. package/dist/cjs/models/Filter.d.ts +49 -30
  148. package/dist/cjs/models/Filter.d.ts.map +1 -1
  149. package/dist/cjs/models/Filter.js +125 -52
  150. package/dist/cjs/models/Pivot.d.ts +3 -1
  151. package/dist/cjs/models/Pivot.d.ts.map +1 -1
  152. package/dist/cjs/models/Report.d.ts +2 -2
  153. package/dist/cjs/models/Report.d.ts.map +1 -1
  154. package/dist/cjs/utils/astFilterProcessing.d.ts +4 -4
  155. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
  156. package/dist/cjs/utils/astFilterProcessing.js +3839 -3427
  157. package/dist/cjs/utils/astProcessing.d.ts +12 -3
  158. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  159. package/dist/cjs/utils/astProcessing.js +76 -11
  160. package/dist/cjs/utils/client.js +2 -2
  161. package/dist/cjs/utils/color.js +5 -6
  162. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  163. package/dist/cjs/utils/columnProcessing.js +7 -7
  164. package/dist/cjs/utils/crypto.js +1 -2
  165. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  166. package/dist/cjs/utils/dashboard.js +34 -30
  167. package/dist/cjs/utils/dataFetcher.js +3 -4
  168. package/dist/cjs/utils/dataProcessing.js +2 -2
  169. package/dist/cjs/utils/dates.d.ts +4 -1
  170. package/dist/cjs/utils/dates.d.ts.map +1 -1
  171. package/dist/cjs/utils/dates.js +12 -10
  172. package/dist/cjs/utils/errorProcessing.js +1 -2
  173. package/dist/cjs/utils/filterProcessing.d.ts +3 -3
  174. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  175. package/dist/cjs/utils/filterProcessing.js +30 -27
  176. package/dist/cjs/utils/getDomain.js +1 -1
  177. package/dist/cjs/utils/logging.js +1 -2
  178. package/dist/cjs/utils/merge.d.ts +1 -1
  179. package/dist/cjs/utils/merge.d.ts.map +1 -1
  180. package/dist/cjs/utils/merge.js +15 -11
  181. package/dist/cjs/utils/monacoConfig.js +3 -3
  182. package/dist/cjs/utils/paginationProcessing.js +3 -3
  183. package/dist/cjs/utils/pivotConstructor.d.ts +4 -4
  184. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  185. package/dist/cjs/utils/pivotConstructor.js +104 -127
  186. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  187. package/dist/cjs/utils/pivotProcessing.js +14 -16
  188. package/dist/cjs/utils/queryConstructor.d.ts +2 -2
  189. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  190. package/dist/cjs/utils/queryConstructor.js +344 -78
  191. package/dist/cjs/utils/report.d.ts.map +1 -1
  192. package/dist/cjs/utils/report.js +22 -12
  193. package/dist/cjs/utils/schema.d.ts.map +1 -1
  194. package/dist/cjs/utils/styles.js +1 -2
  195. package/dist/cjs/utils/tableProcessing.d.ts +12 -12
  196. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  197. package/dist/cjs/utils/tableProcessing.js +69 -26
  198. package/dist/cjs/utils/textProcessing.js +5 -6
  199. package/dist/cjs/utils/validation.d.ts.map +1 -1
  200. package/dist/cjs/utils/validation.js +3 -1
  201. package/dist/cjs/utils/valueFormatter.d.ts +1 -0
  202. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  203. package/dist/cjs/utils/valueFormatter.js +2 -0
  204. package/dist/cjs/utils/width.d.ts.map +1 -1
  205. package/dist/esm/Chart.d.ts +5 -5
  206. package/dist/esm/Chart.d.ts.map +1 -1
  207. package/dist/esm/Chart.js +15 -4
  208. package/dist/esm/ChartBuilder.d.ts +1 -1
  209. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  210. package/dist/esm/ChartBuilder.js +52 -87
  211. package/dist/esm/Context.d.ts +9 -8
  212. package/dist/esm/Context.d.ts.map +1 -1
  213. package/dist/esm/Context.js +119 -34
  214. package/dist/esm/Dashboard.d.ts +20 -8
  215. package/dist/esm/Dashboard.d.ts.map +1 -1
  216. package/dist/esm/Dashboard.js +68 -58
  217. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -2
  218. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  219. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +20 -20
  220. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  221. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +64 -52
  222. package/dist/esm/ReportBuilder.d.ts +2 -1
  223. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  224. package/dist/esm/ReportBuilder.js +343 -343
  225. package/dist/esm/SQLEditor.d.ts +1 -1
  226. package/dist/esm/SQLEditor.d.ts.map +1 -1
  227. package/dist/esm/SQLEditor.js +29 -17
  228. package/dist/esm/components/Banner/index.d.ts +0 -1
  229. package/dist/esm/components/Banner/index.d.ts.map +1 -1
  230. package/dist/esm/components/Chart/BarChart.d.ts +0 -1
  231. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  232. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts +0 -1
  233. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
  234. package/dist/esm/components/Chart/LineChart.d.ts +0 -1
  235. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  236. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
  237. package/dist/esm/components/Chart/PieChart.js +18 -9
  238. package/dist/esm/components/Dashboard/ChartComponent.d.ts +0 -1
  239. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  240. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +10 -2
  241. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  242. package/dist/esm/components/Dashboard/DashboardFilter.js +8 -21
  243. package/dist/esm/components/Dashboard/DashboardSection.d.ts +0 -1
  244. package/dist/esm/components/Dashboard/DashboardSection.d.ts.map +1 -1
  245. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts +0 -1
  246. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts.map +1 -1
  247. package/dist/esm/components/Dashboard/DataLoader.d.ts +9 -7
  248. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  249. package/dist/esm/components/Dashboard/DataLoader.js +102 -62
  250. package/dist/esm/components/Dashboard/MetricComponent.d.ts +0 -1
  251. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  252. package/dist/esm/components/Dashboard/MetricComponent.js +2 -2
  253. package/dist/esm/components/Dashboard/TableComponent.d.ts +0 -1
  254. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  255. package/dist/esm/components/Dashboard/TemplateChartComponent.d.ts +0 -1
  256. package/dist/esm/components/Dashboard/TemplateChartComponent.d.ts.map +1 -1
  257. package/dist/esm/components/Dashboard/TemplateMetricComponent.d.ts +0 -1
  258. package/dist/esm/components/Dashboard/TemplateMetricComponent.d.ts.map +1 -1
  259. package/dist/esm/components/Dashboard/TemplateTableComponent.d.ts +0 -1
  260. package/dist/esm/components/Dashboard/TemplateTableComponent.d.ts.map +1 -1
  261. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
  262. package/dist/esm/components/QuillMultiSelect.js +19 -18
  263. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  264. package/dist/esm/components/QuillMultiSelectWithCombo.js +171 -69
  265. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  266. package/dist/esm/components/QuillSelect.js +8 -6
  267. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
  268. package/dist/esm/components/QuillSelectWithCombo.js +25 -10
  269. package/dist/esm/components/QuillTable.d.ts +5 -1
  270. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  271. package/dist/esm/components/QuillTable.js +4 -2
  272. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +2 -3
  273. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  274. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +5 -6
  275. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  276. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +3 -4
  277. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  278. package/dist/esm/components/ReportBuilder/FilterModal.js +46 -40
  279. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  280. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -3
  281. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  282. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  283. package/dist/esm/components/ReportBuilder/util.js +0 -2
  284. package/dist/esm/components/UiComponents.d.ts +14 -12
  285. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  286. package/dist/esm/components/UiComponents.js +37 -14
  287. package/dist/esm/contexts/BaseColorContext.d.ts +0 -1
  288. package/dist/esm/contexts/BaseColorContext.d.ts.map +1 -1
  289. package/dist/esm/contexts/RootStylesContext.d.ts +0 -1
  290. package/dist/esm/contexts/RootStylesContext.d.ts.map +1 -1
  291. package/dist/esm/contexts/SelectedValueContext.d.ts +0 -1
  292. package/dist/esm/contexts/SelectedValueContext.d.ts.map +1 -1
  293. package/dist/esm/hooks/useAskQuill.d.ts +2 -2
  294. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  295. package/dist/esm/hooks/useAskQuill.js +12 -12
  296. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
  297. package/dist/esm/hooks/useDashboard.d.ts +8 -7
  298. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  299. package/dist/esm/hooks/useDashboard.js +48 -32
  300. package/dist/esm/hooks/useExport.d.ts +3 -4
  301. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  302. package/dist/esm/hooks/useExport.js +6 -2
  303. package/dist/esm/hooks/useInternalState.d.ts +1 -2
  304. package/dist/esm/hooks/useInternalState.d.ts.map +1 -1
  305. package/dist/esm/hooks/useOnClickOutside.d.ts +3 -1
  306. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -1
  307. package/dist/esm/hooks/useQuill.d.ts +0 -14
  308. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  309. package/dist/esm/hooks/useQuill.js +16 -53
  310. package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  311. package/dist/esm/index.d.ts +2 -1
  312. package/dist/esm/index.d.ts.map +1 -1
  313. package/dist/esm/index.js +2 -1
  314. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +4 -1
  315. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  316. package/dist/esm/internals/ReportBuilder/PivotForm.js +32 -7
  317. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +17 -13
  318. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  319. package/dist/esm/internals/ReportBuilder/PivotModal.js +364 -158
  320. package/dist/esm/lib/utils.d.ts +0 -1
  321. package/dist/esm/lib/utils.d.ts.map +1 -1
  322. package/dist/esm/models/Filter.d.ts +49 -30
  323. package/dist/esm/models/Filter.d.ts.map +1 -1
  324. package/dist/esm/models/Filter.js +123 -50
  325. package/dist/esm/models/Pivot.d.ts +3 -1
  326. package/dist/esm/models/Pivot.d.ts.map +1 -1
  327. package/dist/esm/models/Report.d.ts +2 -2
  328. package/dist/esm/models/Report.d.ts.map +1 -1
  329. package/dist/esm/utils/astFilterProcessing.d.ts +4 -4
  330. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
  331. package/dist/esm/utils/astFilterProcessing.js +3835 -3423
  332. package/dist/esm/utils/astProcessing.d.ts +12 -3
  333. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  334. package/dist/esm/utils/astProcessing.js +64 -0
  335. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  336. package/dist/esm/utils/columnProcessing.js +1 -1
  337. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  338. package/dist/esm/utils/dashboard.js +31 -26
  339. package/dist/esm/utils/dates.d.ts +4 -1
  340. package/dist/esm/utils/dates.d.ts.map +1 -1
  341. package/dist/esm/utils/dates.js +6 -3
  342. package/dist/esm/utils/filterProcessing.d.ts +3 -3
  343. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  344. package/dist/esm/utils/filterProcessing.js +22 -19
  345. package/dist/esm/utils/merge.d.ts +1 -1
  346. package/dist/esm/utils/merge.d.ts.map +1 -1
  347. package/dist/esm/utils/merge.js +14 -9
  348. package/dist/esm/utils/pivotConstructor.d.ts +4 -4
  349. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  350. package/dist/esm/utils/pivotConstructor.js +103 -125
  351. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  352. package/dist/esm/utils/pivotProcessing.js +9 -11
  353. package/dist/esm/utils/queryConstructor.d.ts +2 -2
  354. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  355. package/dist/esm/utils/queryConstructor.js +338 -71
  356. package/dist/esm/utils/report.d.ts.map +1 -1
  357. package/dist/esm/utils/report.js +18 -8
  358. package/dist/esm/utils/schema.d.ts.map +1 -1
  359. package/dist/esm/utils/tableProcessing.d.ts +12 -12
  360. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  361. package/dist/esm/utils/tableProcessing.js +69 -26
  362. package/dist/esm/utils/validation.d.ts.map +1 -1
  363. package/dist/esm/utils/validation.js +3 -1
  364. package/dist/esm/utils/valueFormatter.d.ts +1 -0
  365. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  366. package/dist/esm/utils/valueFormatter.js +2 -1
  367. package/dist/esm/utils/width.d.ts.map +1 -1
  368. package/package.json +4 -4
@@ -3,21 +3,24 @@ import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from '
3
3
  import { ClientContext, SchemaDataContext } from '../../Context';
4
4
  import { getDataFromCloud } from '../../utils/dataFetcher';
5
5
  import { PivotList, PivotCard } from './PivotList';
6
- import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isWithinInterval, subMilliseconds, } from 'date-fns';
7
- import { valueFormatter } from '../../utils/valueFormatter';
8
- import { numberFormatOptions, dateFormatOptions } from '../../ChartBuilder';
6
+ import { differenceInDays, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, eachYearOfInterval, endOfDay, isValid, isWithinInterval, parseISO, subMilliseconds, } from 'date-fns';
7
+ import { compareValues, getValidDate, valueFormatter, } from '../../utils/valueFormatter';
8
+ import { numberFormatOptions } from '../../ChartBuilder';
9
9
  import { snakeAndCamelCaseToTitleCase } from '../../utils/textProcessing';
10
10
  import { QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
11
- import { isNumericColumnType, isTextColumnType, } from '../../components/ReportBuilder/ast';
11
+ import { isTextColumnType } from '../../components/ReportBuilder/ast';
12
12
  import { QuillCard } from '../../components/QuillCard';
13
13
  import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
14
14
  import { hashCode } from '../../utils/crypto';
15
- import { getCountsByColumns, getDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
15
+ import { getCountsByColumns, getQueryDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
16
16
  import { generatePivotWithSQL } from '../../utils/pivotConstructor';
17
17
  import { getDateBucketFromRange } from '../../utils/dates';
18
18
  import Big from 'big.js';
19
- export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, 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, }) => {
19
+ import equal from 'fast-deep-equal';
20
+ import { uniqueValuesToStringMap } from '../../utils/filterProcessing';
21
+ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotValueField2, setPivotValueField2, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = QuillErrorMessageComponent, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, CardComponent = QuillCard, HeaderComponent, 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, }) => {
20
22
  const [isLoading, setIsLoading] = useState(false);
23
+ const [previewLoading, setPreviewLoading] = useState(false);
21
24
  const [selectedPivotType, setSelectedPivotType] = useState('recommended');
22
25
  const [errors, setErrors] = useState([]);
23
26
  const [client] = useContext(ClientContext);
@@ -26,12 +29,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
26
29
  const colFieldRef = useRef(null);
27
30
  const [pivotCardWidth, setPivotCardWidth] = useState(420);
28
31
  const [samplePivotTable, setSamplePivotTable] = useState(null);
32
+ const [hasNoRecommendedPivots, sethasNoRecommendedPivots] = useState(false);
33
+ const [isFetchingPivots, setIsFetchingPivots] = useState(false);
29
34
  const [allowedColumnFields, setAllowedColumnFields] = useState([]);
30
35
  const [allowedRowFields, setAllowedRowFields] = useState([]);
31
36
  const [allowedValueFields, setAllowedValueFields] = useState([]);
32
37
  const [uniqueValues, setUniqueValues] = useState(initialUniqueValues);
38
+ const buttonRef = useRef(null);
33
39
  const [dateRanges, setDateRanges] = useState({});
34
- const getDistinctValues = async () => {
40
+ const [pivotError, setPivotError] = useState('');
41
+ const getDistinctValues = async (fetchDistinct) => {
35
42
  if (!client) {
36
43
  return {
37
44
  possibleColumns: { rowFields: [], columnFields: [], valueFields: [] },
@@ -49,8 +56,11 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
49
56
  setAllowedValueFields(possibleColumns.valueFields);
50
57
  return { possibleColumns, uniqueValues: {} };
51
58
  }
52
- const { filteredColumns: smallStringColumns } = await getCountsByColumns(stringColumns, query || '', client, schemaData.customFields ?? []);
53
- const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, query || '', data.rows || [], client, schemaData.customFields ?? []);
59
+ let newUniqueValues = uniqueValues;
60
+ if (fetchDistinct || !uniqueValues) {
61
+ const { filteredColumns: smallStringColumns } = await getCountsByColumns(stringColumns, query || '', client, schemaData.customFields ?? []);
62
+ newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, query || '', data.rows || [], client, schemaData.customFields ?? []);
63
+ }
54
64
  if (!uniqueValues ||
55
65
  hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
56
66
  const possibleColumns = getPossiblePivotFieldOptions(columns, newUniqueValues || {});
@@ -75,7 +85,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
75
85
  if (dateColumns.length === 0) {
76
86
  return;
77
87
  }
78
- const dateRangeByColumn = await getDateRangeByColumns(dateColumns, query || '', client, schemaData.customFields ?? []);
88
+ const dateRangeByColumn = await getQueryDateRangeByColumns(dateColumns, query || '', client, schemaData.customFields ?? []);
79
89
  setDateRanges(dateRangeByColumn || {});
80
90
  }
81
91
  };
@@ -113,9 +123,23 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
113
123
  columnFieldType: columnsToShow[pivotColumnField || ''],
114
124
  valueField: pivotValueField || '',
115
125
  aggregationType: pivotAggregation || '',
126
+ valueField2: pivotValueField2 || '',
116
127
  };
117
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
118
- setSamplePivotTable({ pivot: pivot, rows, columns });
128
+ try {
129
+ const { rows, columns } = await generatePivotTable({
130
+ pivot,
131
+ report,
132
+ client,
133
+ uniqueValues,
134
+ });
135
+ setSamplePivotTable({ pivot: pivot, rows, columns });
136
+ }
137
+ catch (e) {
138
+ if (e instanceof Error) {
139
+ setPivotError(e.message);
140
+ return;
141
+ }
142
+ }
119
143
  }
120
144
  if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
121
145
  getDistinctValues();
@@ -135,6 +159,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
135
159
  columnFieldType: columnsToShow[pivotColumnField || ''],
136
160
  valueField: pivotValueField || '',
137
161
  aggregationType: pivotAggregation || '',
162
+ valueField2: pivotValueField2 || '',
138
163
  };
139
164
  if (initialSelectedPivotTable) {
140
165
  setSamplePivotTable({
@@ -144,8 +169,21 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
144
169
  });
145
170
  }
146
171
  else {
147
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
148
- setSamplePivotTable({ pivot: pivot, rows, columns });
172
+ try {
173
+ const { rows, columns } = await generatePivotTable({
174
+ pivot,
175
+ report,
176
+ client,
177
+ uniqueValues,
178
+ });
179
+ setSamplePivotTable({ pivot: pivot, rows, columns });
180
+ }
181
+ catch (e) {
182
+ if (e instanceof Error) {
183
+ setPivotError(e.message);
184
+ return;
185
+ }
186
+ }
149
187
  }
150
188
  }
151
189
  };
@@ -161,15 +199,16 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
161
199
  }
162
200
  }, [initialSelectedPivotTable, columns, data, pivotRowField]);
163
201
  useEffect(() => {
164
- if (!initialUniqueValues) {
165
- return;
166
- }
167
- const possibleColumns = getPossiblePivotFieldOptions(columns, initialUniqueValues);
202
+ setAllowedFields(initialUniqueValues || {});
203
+ setUniqueValues(initialUniqueValues);
204
+ }, [initialUniqueValues, columns]);
205
+ const setAllowedFields = (uniqueValues) => {
206
+ const possibleColumns = getPossiblePivotFieldOptions(columns, uniqueValues);
168
207
  setAllowedRowFields(possibleColumns.rowFields);
169
208
  setAllowedColumnFields(possibleColumns.columnFields);
170
209
  setAllowedValueFields(possibleColumns.valueFields);
171
- setUniqueValues(initialUniqueValues);
172
- }, [initialUniqueValues, columns]);
210
+ return possibleColumns;
211
+ };
173
212
  const columnsToShow = useMemo(() => {
174
213
  return (columns || []).reduce((map, col) => {
175
214
  // only use columns shown in the report builder's table
@@ -188,15 +227,41 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
188
227
  return null;
189
228
  }
190
229
  const pivot = createdPivots[selectedPivotIndex];
191
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
192
- setSelectedPivotTable({
193
- pivot: pivot,
194
- rows: rows,
195
- columns: columns,
196
- });
230
+ try {
231
+ const { rows, columns } = await generatePivotTable({
232
+ pivot,
233
+ report,
234
+ client,
235
+ uniqueValues,
236
+ });
237
+ setSelectedPivotTable({
238
+ pivot: pivot,
239
+ rows: rows,
240
+ columns: columns,
241
+ });
242
+ }
243
+ catch (e) {
244
+ if (e instanceof Error) {
245
+ setPivotError(e.message);
246
+ return;
247
+ }
248
+ }
197
249
  };
198
250
  fetchPivotTables();
199
251
  }, [selectedPivotIndex, data, dateRange, createdPivots]);
252
+ const previousUniqueValuesRef = useRef();
253
+ useEffect(() => {
254
+ if (!uniqueValuesIsLoading &&
255
+ !equal(uniqueValues, previousUniqueValuesRef.current)) {
256
+ previousUniqueValuesRef.current = uniqueValues;
257
+ setRecommendedPivotTables([]);
258
+ setRecommendedPivots([]);
259
+ setCreatedPivotTables([]);
260
+ setCreatedPivots([]);
261
+ sethasNoRecommendedPivots(false);
262
+ refreshPivots();
263
+ }
264
+ }, [uniqueValuesIsLoading, uniqueValues]);
200
265
  const onSelectRecommendedPivot = (pivot, index) => {
201
266
  if (showEditOnPivotClick) {
202
267
  onEditPivot(pivot, index, 'recommended');
@@ -212,7 +277,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
212
277
  setIsOpen(false);
213
278
  };
214
279
  const onSelectCreatedPivot = (pivot) => {
215
- selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField || '']?.dateRange, samplePivotTable);
280
+ selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField || '']?.dateRange);
216
281
  setSelectedPivotType('created');
217
282
  setIsOpen(false);
218
283
  setPopUpTitle('Add pivot');
@@ -222,6 +287,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
222
287
  setPivotRowField(pivot.rowField);
223
288
  setPivotColumnField(pivot.columnField);
224
289
  setPivotValueField(pivot.valueField);
290
+ setPivotValueField2(pivot.valueField2);
225
291
  setPivotAggregation(pivot.aggregationType);
226
292
  setShowUpdatePivot(true);
227
293
  if (pivotType === 'recommended' &&
@@ -235,9 +301,24 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
235
301
  if (pivotRowField && dateRanges[pivotRowField]) {
236
302
  dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
237
303
  }
238
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
239
- setSamplePivotTable({ pivot, rows, columns });
240
- return;
304
+ try {
305
+ const { rows, columns } = await generatePivotTable({
306
+ pivot,
307
+ dateBucket,
308
+ report,
309
+ client,
310
+ uniqueValues,
311
+ });
312
+ setSamplePivotTable({ pivot, rows, columns });
313
+ return;
314
+ }
315
+ catch (e) {
316
+ if (e instanceof Error) {
317
+ setPivotError(e.message);
318
+ setSamplePivotTable(null);
319
+ return;
320
+ }
321
+ }
241
322
  }
242
323
  setSamplePivotTable(null);
243
324
  };
@@ -248,26 +329,33 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
248
329
  if (!client) {
249
330
  return;
250
331
  }
251
- if (isLoading ||
332
+ // don't fetch unique values separately if they are already being fetched
333
+ if (uniqueValuesIsLoading) {
334
+ setIsLoading(true);
335
+ return;
336
+ }
337
+ if (isFetchingPivots ||
252
338
  Object.keys(columnsToShow).length === 0 ||
253
339
  !pivotRecommendationsEnabled) {
254
340
  return;
255
341
  }
342
+ setIsFetchingPivots(true);
343
+ setPivotError('');
256
344
  setIsLoading(true);
257
- let tempUniqueValues = uniqueValues;
345
+ let tempUniqueValues = uniqueValues || initialUniqueValues;
258
346
  let possibleColumns = {
259
347
  rowFields: allowedRowFields,
260
348
  columnFields: allowedColumnFields,
261
349
  valueFields: allowedValueFields,
262
350
  };
263
- if ((allowedRowFields.length === 0 &&
264
- allowedColumnFields.length === 0 &&
265
- allowedValueFields.length === 0) ||
266
- !uniqueValues) {
267
- const distinctValues = await getDistinctValues();
351
+ if (!uniqueValues && !initialUniqueValues) {
352
+ const distinctValues = await getDistinctValues(true);
268
353
  possibleColumns = distinctValues.possibleColumns;
269
354
  tempUniqueValues = distinctValues.uniqueValues;
270
355
  }
356
+ else {
357
+ possibleColumns = setAllowedFields(uniqueValues || initialUniqueValues);
358
+ }
271
359
  const cloudBody = {
272
360
  pivotCountRequest,
273
361
  allowedRowFields: possibleColumns?.rowFields || [],
@@ -286,8 +374,12 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
286
374
  try {
287
375
  const resp = await getDataFromCloud(client, 'pivotai', cloudBody);
288
376
  const recommendedPivots = resp?.data?.pivotTables.map((pivot) => cleanPivot(pivot, possibleColumns)) || [];
289
- const cleanedPivots = recommendedPivots.map((pivot) => {
290
- if (pivot.columnField && columnsToShow[pivot.columnField] === 'date') {
377
+ const cleanedPivots = recommendedPivots
378
+ .filter((pivot) => isValidPivot(pivot) &&
379
+ (!pivot.columnField || pivot.columnField !== pivot.rowField)) // only recommend valid pivots
380
+ .map((pivot) => {
381
+ if (pivot.columnField &&
382
+ columnsToShow[pivot.columnField] === 'date') {
291
383
  const columnField = pivot.columnField;
292
384
  pivot.columnField = pivot.rowField;
293
385
  pivot.rowField = columnField;
@@ -301,17 +393,42 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
301
393
  title: generatePivotTitle(pivot),
302
394
  };
303
395
  });
304
- setRecommendedPivots(cleanedPivots);
305
- const pts = await Promise.all(cleanedPivots.map(async (p) => {
306
- const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, tempUniqueValues);
307
- return { pivot: p, rows, columns };
396
+ const deduplicatedPivots = cleanedPivots
397
+ .filter((pivot, index, self) => index ===
398
+ self.findIndex((p) => p.rowField === pivot.rowField &&
399
+ p.columnField === pivot.columnField &&
400
+ p.valueField === pivot.valueField &&
401
+ p.aggregationType === pivot.aggregationType))
402
+ .filter((pivot) => !createdPivots.some((created) => created.rowField === pivot.rowField &&
403
+ created.columnField === pivot.columnField &&
404
+ created.valueField === pivot.valueField &&
405
+ created.aggregationType === pivot.aggregationType));
406
+ setRecommendedPivots(deduplicatedPivots);
407
+ sethasNoRecommendedPivots(deduplicatedPivots.length === 0);
408
+ const trimmedUniqueValues = trimUniqueValues(tempUniqueValues, 6);
409
+ const pts = await Promise.all(deduplicatedPivots.map(async (p) => {
410
+ try {
411
+ const { rows, columns } = await generatePivotTable({
412
+ pivot: p,
413
+ rowLimit: 6,
414
+ report,
415
+ client,
416
+ uniqueValues: trimmedUniqueValues,
417
+ });
418
+ return { pivot: p, rows, columns };
419
+ }
420
+ catch (e) {
421
+ return undefined;
422
+ }
308
423
  }));
309
- setRecommendedPivotTables(pts);
424
+ setRecommendedPivotTables(pts.filter((pt) => pt !== undefined));
310
425
  setSelectedPivotIndex(-1);
311
426
  }
312
427
  catch (e) {
428
+ setPivotError('Failed to fetch pivot recommendations');
313
429
  console.error('Failed parsing pivotai response', e);
314
430
  }
431
+ setIsFetchingPivots(false);
315
432
  setIsLoading(false);
316
433
  }, [
317
434
  selectedTable,
@@ -322,16 +439,17 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
322
439
  allowedColumnFields,
323
440
  allowedRowFields,
324
441
  allowedValueFields,
442
+ uniqueValuesIsLoading,
325
443
  columns,
326
444
  ]);
327
445
  const pivotFieldChange = async (field, value) => {
328
446
  setErrors([]);
329
- setIsLoading(true);
330
447
  const pivot = {
331
448
  rowField: pivotRowField,
332
449
  rowFieldType: columnsToShow[pivotRowField],
333
450
  columnField: pivotColumnField,
334
451
  valueField: pivotValueField,
452
+ valueField2: pivotValueField2,
335
453
  aggregationType: pivotAggregation,
336
454
  };
337
455
  // @ts-ignore
@@ -344,52 +462,59 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
344
462
  pivot.columnFieldType = columnsToShow[value];
345
463
  }
346
464
  if (!isValidPivot(pivot)) {
347
- setIsLoading(false);
348
465
  setSamplePivotTable(null);
349
466
  return;
350
467
  }
468
+ setPreviewLoading(true);
351
469
  let dateBucket = undefined;
352
470
  if (pivotRowField && dateRanges[pivotRowField]) {
353
471
  dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
354
472
  }
355
473
  setTimeout(async () => {
356
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
357
- setSamplePivotTable({ pivot, rows, columns });
358
- setIsLoading(false);
474
+ try {
475
+ console.log('HELP: ', pivot);
476
+ const { rows, columns } = await generatePivotTable({
477
+ pivot,
478
+ rowLimit: 6, // limit previews
479
+ dateBucket,
480
+ report,
481
+ client,
482
+ uniqueValues,
483
+ });
484
+ setSamplePivotTable({ pivot, rows, columns });
485
+ }
486
+ catch (e) {
487
+ if (e instanceof Error) {
488
+ setPivotError(e.message);
489
+ setSamplePivotTable(null);
490
+ return;
491
+ }
492
+ }
493
+ finally {
494
+ setPreviewLoading(false);
495
+ }
359
496
  }, 500);
360
497
  };
361
498
  const [recommendedPivotTables, setRecommendedPivotTables] = useState([]);
362
- // useEffect(() => {
363
- // const fetchPivotTables = async () => {
364
- // const pts = await Promise.all(
365
- // recommendedPivots.map(async (p: Pivot) => {
366
- // const { rows, columns } = await generatePivotTable(
367
- // p,
368
- // data,
369
- // dateRange,
370
- // false,
371
- // 6,
372
- // undefined,
373
- // undefined,
374
- // report,
375
- // client,
376
- // uniqueValues,
377
- // );
378
- // return { pivot: p, rows, columns };
379
- // }),
380
- // );
381
- // setRecommendedPivotTables(pts);
382
- // };
383
- // fetchPivotTables();
384
- // }, [recommendedPivots, dateRange]);
385
499
  const [createdPivotTables, setCreatedPivotTables] = useState([]);
386
500
  useEffect(() => {
387
501
  const fetchPivotTables = async () => {
388
502
  const pts = await Promise.all(createdPivots.map(async (p) => {
389
- const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, uniqueValues);
390
- return { pivot: p, rows, columns };
503
+ try {
504
+ const { rows, columns } = await generatePivotTable({
505
+ pivot: p,
506
+ rowLimit: 6,
507
+ report,
508
+ client,
509
+ uniqueValues,
510
+ });
511
+ return { pivot: p, rows, columns };
512
+ }
513
+ catch (e) {
514
+ return undefined;
515
+ }
391
516
  }));
392
- setCreatedPivotTables(pts);
517
+ setCreatedPivotTables(pts.filter((pt) => pt !== undefined));
393
518
  };
394
519
  fetchPivotTables();
395
520
  }, [createdPivots, dateRange]);
@@ -409,22 +534,24 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
409
534
  position: 'absolute',
410
535
  top: -2,
411
536
  right: -2,
412
- } })) }), showTrigger && (_jsx(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
413
- if (columns.length === 0) {
414
- setIsOpen(false);
415
- }
416
- // table is not loaded yet, so pivot button is not clickable
417
- if (Object.keys(columnsToShow).length === 0) {
418
- return;
419
- }
420
- if (!isOpen &&
421
- (recommendedPivots.length === 0 ||
422
- recommendedPivotTables.length === 0)) {
423
- refreshPivots();
424
- }
425
- setIsOpen(!isOpen);
426
- setShowUpdatePivot(false);
427
- }, label: triggerButtonText })), _jsx("div", { style: {
537
+ } })) }), showTrigger && (_jsx("div", { ref: buttonRef, children: _jsx(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
538
+ if (columns.length === 0) {
539
+ setIsOpen(false);
540
+ }
541
+ // table is not loaded yet, so pivot button is not clickable
542
+ if (Object.keys(columnsToShow).length === 0) {
543
+ return;
544
+ }
545
+ if (!isOpen &&
546
+ pivotRecommendationsEnabled &&
547
+ !hasNoRecommendedPivots &&
548
+ (recommendedPivots.length === 0 ||
549
+ recommendedPivotTables.length === 0)) {
550
+ refreshPivots();
551
+ }
552
+ setIsOpen(!isOpen);
553
+ setShowUpdatePivot(false);
554
+ }, label: triggerButtonText }) })), _jsx("div", { style: {
428
555
  position: 'relative',
429
556
  ...(isOpen && showTrigger && { top: 12 }),
430
557
  }, children: _jsx(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
@@ -433,7 +560,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
433
560
  setPopUpTitle('Add pivot');
434
561
  }
435
562
  setIsOpen(isOpen);
436
- }, popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
563
+ }, ignoredRefs: [buttonRef], popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
437
564
  ? popUpTitle
438
565
  : 'Recommended pivots', popoverChildren: _jsx("div", { style: {
439
566
  paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
@@ -443,13 +570,14 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
443
570
  display: 'flex',
444
571
  flexDirection: 'column',
445
572
  gap: 20,
446
- }, children: [isLoading && _jsx(LoadingComponent, {}), samplePivotTable && !isLoading && (_jsx("div", { style: {
573
+ }, children: [previewLoading && _jsx(LoadingComponent, {}), samplePivotTable && !previewLoading && (_jsx("div", { style: {
447
574
  width: pivotCardWidth,
448
575
  minHeight: 160,
449
576
  }, 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: () => {
450
577
  setPivotAggregation(null);
451
578
  setPivotRowField(null);
452
579
  setPivotValueField(null);
580
+ setPivotValueField2(null);
453
581
  setPivotColumnField(null);
454
582
  setSamplePivotTable(null);
455
583
  } }) })), _jsxs(PivotColumnContainer, { children: [_jsxs(PivotRowContainer, { children: [_jsx("div", { ref: rowFieldRef, children: _jsx(SelectComponent, { id: "pivot-row-field", label: "Row field", value: pivotRowField, onChange: (e) => {
@@ -457,7 +585,9 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
457
585
  setPivotRowField(e.target.value === ''
458
586
  ? undefined
459
587
  : e.target.value);
460
- }, options: allowedRowFields.map((field) => {
588
+ }, options: allowedRowFields
589
+ .filter((field) => field !== pivotColumnField)
590
+ .map((field) => {
461
591
  return {
462
592
  label: snakeAndCamelCaseToTitleCase(field),
463
593
  value: field,
@@ -467,22 +597,14 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
467
597
  setPivotColumnField(e.target.value === ''
468
598
  ? undefined
469
599
  : e.target.value);
470
- }, options: allowedColumnFields.map((field) => {
600
+ }, options: allowedColumnFields
601
+ .filter((field) => field !== pivotRowField)
602
+ .map((field) => {
471
603
  return {
472
604
  label: snakeAndCamelCaseToTitleCase(field),
473
605
  value: field,
474
606
  };
475
- }), isLoading: uniqueValuesIsLoading, width: 200 }) })] }), _jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-row-field", label: "Value field", value: pivotValueField, onChange: (e) => {
476
- pivotFieldChange('valueField', e.target.value);
477
- setPivotValueField(e.target.value === ''
478
- ? undefined
479
- : e.target.value);
480
- }, options: allowedValueFields.map((field) => {
481
- return {
482
- label: snakeAndCamelCaseToTitleCase(field),
483
- value: field,
484
- };
485
- }), isLoading: uniqueValuesIsLoading, width: 200 }), _jsx(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
607
+ }), isLoading: uniqueValuesIsLoading, width: 200 }) })] }), _jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
486
608
  if (e.target.value !== 'count' &&
487
609
  pivotValueField &&
488
610
  !numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField).format)) {
@@ -493,10 +615,49 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
493
615
  ? undefined
494
616
  : e.target.value);
495
617
  }, options: [
496
- ...['sum', 'average', 'count', 'max', 'min'].map((option) => {
618
+ ...[
619
+ 'sum',
620
+ 'average',
621
+ 'count',
622
+ 'max',
623
+ 'min',
624
+ 'percentage',
625
+ ].map((option) => {
497
626
  return { label: option, value: option };
498
627
  }),
499
- ], width: 200 })] })] }), _jsxs("div", { children: [_jsx(ButtonComponent, { id: "custom-button", onClick: () => {
628
+ ], width: 200 }), _jsx(SelectComponent, { id: "pivot-row-field", label: "Value field", value: pivotValueField, onChange: (e) => {
629
+ pivotFieldChange('valueField', e.target.value);
630
+ setPivotValueField(e.target.value === ''
631
+ ? undefined
632
+ : e.target.value);
633
+ }, options: allowedValueFields
634
+ .map((field) => {
635
+ return {
636
+ label: snakeAndCamelCaseToTitleCase(field),
637
+ value: field,
638
+ };
639
+ })
640
+ .filter((option) => {
641
+ return (pivotAggregation !== 'percentage' ||
642
+ pivotColumnField ||
643
+ option.value !== pivotValueField2);
644
+ }), isLoading: uniqueValuesIsLoading, width: 200 }), pivotAggregation === 'percentage' ? (_jsx(SelectComponent, { id: "pivot-row-field", label: "Total field", value: pivotValueField2, onChange: (e) => {
645
+ pivotFieldChange('valueField2', e.target.value);
646
+ setPivotValueField2(e.target.value === ''
647
+ ? undefined
648
+ : e.target.value);
649
+ }, options: allowedValueFields
650
+ .map((field) => {
651
+ return {
652
+ label: snakeAndCamelCaseToTitleCase(field),
653
+ value: field,
654
+ };
655
+ })
656
+ .filter((option) => {
657
+ return (pivotAggregation !== 'percentage' ||
658
+ pivotColumnField ||
659
+ option.value !== pivotValueField);
660
+ }), isLoading: uniqueValuesIsLoading, width: 200 })) : null] })] }), _jsxs("div", { children: [_jsx(ButtonComponent, { id: "custom-button", onClick: () => {
500
661
  const errors = [];
501
662
  if (!pivotValueField &&
502
663
  pivotAggregation !== 'count') {
@@ -519,6 +680,7 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
519
680
  columnField: pivotColumnField,
520
681
  columnFieldType: columnsToShow[pivotColumnField || ''],
521
682
  valueField: pivotValueField || '',
683
+ valueField2: pivotValueField2 || '',
522
684
  aggregationType: pivotAggregation || '',
523
685
  };
524
686
  if (isValidPivot(pivot)) {
@@ -565,7 +727,27 @@ export const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField,
565
727
  display: 'flex',
566
728
  flexDirection: 'row',
567
729
  gap: 8,
568
- }, 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({}, null) })] }), isLoading ? (_jsx(LoadingComponent, {})) : (_jsx("div", { children: _jsx(PivotList, { recommendedPivotTables: recommendedPivotTables, createdPivotTables: createdPivotTables, theme: theme, onSelectRecommendedPivot: onSelectRecommendedPivot, onSelectCreatedPivot: onSelectCreatedPivot, selectedPivotIndex: selectedPivotIndex, selectedPivotType: selectedPivotType, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, onEditRecommendedPivot: onEditRecommendedPivot, onEditCreatedPivot: onEditPivot, showPivotEditButton: showPivotEditButton, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent }) }))] })) })) }) }) })] }) }));
730
+ }, 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({}, null) })] }), isLoading || uniqueValuesIsLoading ? (_jsx(LoadingComponent, {})) : pivotError ? (_jsx("div", { style: {
731
+ width: '100%',
732
+ height: '140px',
733
+ display: 'flex',
734
+ justifyContent: 'center',
735
+ alignItems: 'center',
736
+ }, children: pivotError })) : (_jsx("div", { children: !hasNoRecommendedPivots ||
737
+ createdPivotTables.length > 0 ? (_jsx(PivotList, { recommendedPivotTables: recommendedPivotTables.filter((pivotTable) => !createdPivots.some((created) => created.rowField ===
738
+ pivotTable.pivot.rowField &&
739
+ created.columnField ===
740
+ pivotTable.pivot.columnField &&
741
+ created.valueField ===
742
+ pivotTable.pivot.valueField &&
743
+ created.aggregationType ===
744
+ pivotTable.pivot.aggregationType)), createdPivotTables: createdPivotTables, theme: theme, onSelectRecommendedPivot: onSelectRecommendedPivot, onSelectCreatedPivot: onSelectCreatedPivot, selectedPivotIndex: selectedPivotIndex, selectedPivotType: selectedPivotType, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, onEditRecommendedPivot: onEditRecommendedPivot, onEditCreatedPivot: onEditPivot, showPivotEditButton: showPivotEditButton, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent })) : (_jsx("div", { style: {
745
+ width: '100%',
746
+ height: '140px',
747
+ display: 'flex',
748
+ justifyContent: 'center',
749
+ alignItems: 'center',
750
+ }, children: "No valid pivots returned" })) }))] })) })) }) }) })] }) }));
569
751
  };
570
752
  export function generatePivotTableYAxis(pivot, cols, yAxisField) {
571
753
  // For count aggregations, use 'count' for the label
@@ -602,10 +784,18 @@ function castValueToDate(value) {
602
784
  if (!value) {
603
785
  return null;
604
786
  }
787
+ let dateStr = value;
605
788
  if (typeof value === 'object' && value.value) {
606
- return new Date(value.value);
789
+ dateStr = value.value;
790
+ }
791
+ if (dateStr instanceof Date) {
792
+ return dateStr;
607
793
  }
608
- return new Date(value);
794
+ const parsed = parseISO(dateStr);
795
+ if (isValid(parsed)) {
796
+ return parsed;
797
+ }
798
+ return new Date(dateStr);
609
799
  }
610
800
  function getLatestDate(a, b) {
611
801
  return a > b ? a : b;
@@ -619,11 +809,11 @@ export function getDateRange(dateRange, column, data) {
619
809
  const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
620
810
  const minDate = new Date(0);
621
811
  if (!dateRange) {
622
- if (data.length == 0 || !data[0][column]) {
812
+ if (data.length == 0) {
623
813
  return { start: new Date(), end: new Date() };
624
814
  }
625
- const firstDate = castValueToDate(data[0][column]);
626
815
  if (data.length == 1) {
816
+ const firstDate = castValueToDate(data[0][column]);
627
817
  return {
628
818
  start: firstDate || new Date(),
629
819
  end: firstDate || new Date(),
@@ -632,12 +822,19 @@ export function getDateRange(dateRange, column, data) {
632
822
  let earliestDate = undefined;
633
823
  let latestDate = undefined;
634
824
  for (let i = 0; i < data.length; i++) {
635
- if (earliestDate && latestDate) {
636
- break;
637
- }
638
825
  const value = castValueToDate(data[i][column]);
639
- earliestDate = value && value > minDate ? value : null;
640
- latestDate = value && value < maxDate ? value : null;
826
+ earliestDate =
827
+ value && value > minDate
828
+ ? earliestDate
829
+ ? getEarliestDate(earliestDate, value)
830
+ : value
831
+ : earliestDate;
832
+ latestDate =
833
+ value && value < maxDate
834
+ ? latestDate
835
+ ? getLatestDate(latestDate, value)
836
+ : value
837
+ : latestDate;
641
838
  }
642
839
  if (!earliestDate || !latestDate) {
643
840
  return {
@@ -683,6 +880,19 @@ function determineIntervalThroughOverride(dateBucket, dateRange) {
683
880
  return eachMonthOfInterval(dateRange);
684
881
  }
685
882
  }
883
+ // function to that takes in a uniqueValues obj and trims the number of unique values per column
884
+ function trimUniqueValues(obj, limit) {
885
+ const trimmedObj = {};
886
+ Object.keys(obj).forEach((key) => {
887
+ const values = obj[key] ? Object.keys(obj[key]) : [];
888
+ const limitedValues = values.slice(0, limit);
889
+ trimmedObj[key] = limitedValues.reduce((acc, curr) => {
890
+ acc[curr] = obj[key] ? (obj[key][curr] ?? false) : false;
891
+ return acc;
892
+ }, {});
893
+ });
894
+ return trimmedObj;
895
+ }
686
896
  export function getDateBuckets(dateRange, column, data, dateBucket) {
687
897
  if (!dateRange) {
688
898
  if (dateBucket) {
@@ -800,26 +1010,25 @@ const fixBigQueryData = (data = []) => {
800
1010
  }
801
1011
  return newData;
802
1012
  };
803
- export async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
1013
+ export async function generatePivotTable({ pivot, rowLimit = -1, dateBucket, report, client, uniqueValues, }) {
804
1014
  try {
805
- if (report && report.rowCount && report.rowCount !== data.length) {
1015
+ if (report && report.rowCount != null) {
1016
+ // rowCount can be 0 (could mean still loading in), loose equality check for undefined as well
806
1017
  const dateFilter = report
807
1018
  ? report.filtersApplied.find((f) => f.filterType === 'date_range')
808
1019
  : undefined;
809
1020
  const pivotTable = await generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, pivot.columnField && uniqueValues
810
1021
  ? Object.keys(uniqueValues[pivot.columnField])
811
- : undefined);
812
- if (pivotTable) {
813
- return pivotTable;
814
- }
1022
+ : undefined, rowLimit === -1 ? undefined : rowLimit);
1023
+ return pivotTable;
815
1024
  }
816
1025
  }
817
1026
  catch (e) {
818
- console.error('Error generating pivot table with SQL, using in memory process', e);
1027
+ throw Error(`Failed to generate pivot table with SQL: ${e}`);
819
1028
  }
820
- return generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit, compRange);
1029
+ throw Error('Failed to generate pivot table: invalid report');
821
1030
  }
822
- export function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
1031
+ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, uniqueValues) {
823
1032
  // If there is no rowField, aggregate on the valueField
824
1033
  if (!pivot.rowField) {
825
1034
  return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
@@ -837,9 +1046,15 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
837
1046
  compRange = undefined;
838
1047
  }
839
1048
  const pivotRows = [];
1049
+ const uniqueValuesMap = uniqueValuesToStringMap(uniqueValues || {});
840
1050
  const uniqueRows = (isDateField(pivot.rowFieldType || '')
841
1051
  ? getDateBuckets(dateRange, pivot.rowField, data, dateBucket)
842
- : [...new Set(data.map((item) => item[pivot.rowField || '']))]).filter((row) => Boolean(row));
1052
+ : uniqueValuesMap[pivot.rowField] &&
1053
+ uniqueValuesMap[pivot.rowField]?.[0] !== 'EXCEEDS_LIMIT'
1054
+ ? uniqueValuesMap[pivot.rowField]
1055
+ : [...new Set(data.map((item) => item[pivot.rowField || '']))])
1056
+ .filter((col) => col !== null && col !== '')
1057
+ .map((col) => isDateField(pivot.rowFieldType || '') ? castValueToDate(col) : col);
843
1058
  const rowDateRange = getDateRange(dateRange, pivot.rowField, data);
844
1059
  const compRowDateRange = getDateRange(compRange ?? dateRange, pivot.rowField, data);
845
1060
  // If columnField is not provided, we will not be using uniqueColumns
@@ -847,8 +1062,10 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
847
1062
  const uniqueColumns = (pivot.columnField
848
1063
  ? isDateField(pivot.columnFieldType || '')
849
1064
  ? getDateBuckets(dateRange, pivot.columnField, data, dateBucket)
850
- : [...new Set(data.map((item) => item[pivot.columnField || '']))]
851
- : [pivot.valueField]).filter((col) => Boolean(col));
1065
+ : uniqueValues && pivot.columnField
1066
+ ? uniqueValuesMap[pivot.columnField]
1067
+ : [...new Set(data.map((item) => item[pivot.columnField || '']))]
1068
+ : [pivot.valueField]).filter((col) => col !== null && col !== '' && col !== undefined);
852
1069
  // Map from new dates to their corresponding prior dates
853
1070
  const COL_DATE_MAP = {};
854
1071
  const ROW_DATE_MAP = {};
@@ -881,7 +1098,9 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
881
1098
  }
882
1099
  compUniqueRows = (isDateField(pivot.rowFieldType || '')
883
1100
  ? getCompDateBuckets(dateRange, compRange ?? dateRange, pivot.rowField, data)
884
- : [...new Set(data.map((item) => item[pivot.rowField || '']))]).filter((row) => Boolean(row));
1101
+ : (uniqueValuesMap[pivot.rowField] ?? [
1102
+ ...new Set(data.map((item) => item[pivot.rowField || ''])),
1103
+ ])).filter((col) => col !== null && col !== '');
885
1104
  }
886
1105
  // Special corner case for count with only rowField pivot
887
1106
  if (!pivot.valueField &&
@@ -893,7 +1112,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
893
1112
  }
894
1113
  }
895
1114
  const rowsToGenerate = rowLimit !== -1 && rowLimit <= uniqueRows.length
896
- ? uniqueRows.slice(0, rowLimit + 1)
1115
+ ? uniqueRows.slice(0, rowLimit)
897
1116
  : uniqueRows;
898
1117
  rowsToGenerate.forEach((rowValue, rowIndex) => {
899
1118
  const row = {
@@ -929,22 +1148,22 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
929
1148
  if (isDateField(pivot.columnFieldType || '') &&
930
1149
  isDateField(pivot.rowFieldType || '')) {
931
1150
  filteredData = data.filter((item) => {
932
- return (isWithinInterval(new Date(item[pivot.rowField || '']), {
1151
+ return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
933
1152
  start: rowValue,
934
1153
  end: subMilliseconds(nextRowValue, 1),
935
1154
  }) &&
936
- isWithinInterval(new Date(item[pivot.columnField]), {
1155
+ isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
937
1156
  start: colValue,
938
1157
  end: subMilliseconds(nextColumnValue, 1),
939
1158
  }));
940
1159
  });
941
1160
  if (isComparison) {
942
1161
  comparisonFilteredData = data.filter((item) => {
943
- return (isWithinInterval(new Date(item[pivot.rowField || '']), {
1162
+ return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
944
1163
  start: rowValue,
945
1164
  end: subMilliseconds(nextRowValue, 1),
946
1165
  }) &&
947
- isWithinInterval(new Date(item[pivot.columnField]), {
1166
+ isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
948
1167
  start: colValue,
949
1168
  end: subMilliseconds(nextColumnValue, 1),
950
1169
  }));
@@ -955,7 +1174,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
955
1174
  !isDateField(pivot.rowFieldType || '')) {
956
1175
  filteredData = data.filter((item) => {
957
1176
  return (item[pivot.rowField || ''] === rowValue &&
958
- isWithinInterval(new Date(item[pivot.columnField]), {
1177
+ isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
959
1178
  start: colValue,
960
1179
  end: subMilliseconds(nextColumnValue, 1),
961
1180
  }));
@@ -963,7 +1182,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
963
1182
  if (isComparison) {
964
1183
  comparisonFilteredData = data.filter((item) => {
965
1184
  return (item[`comparison_${pivot.rowField}`] === rowValue &&
966
- isWithinInterval(new Date(item[pivot.columnField]), {
1185
+ isWithinInterval(getValidDate(item[pivot.columnField || '']) ?? 0, {
967
1186
  start: colValue,
968
1187
  end: subMilliseconds(nextColumnValue, 1),
969
1188
  }));
@@ -973,14 +1192,14 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
973
1192
  else if (!isDateField(pivot.columnFieldType || '') &&
974
1193
  isDateField(pivot.rowFieldType || '')) {
975
1194
  filteredData = data.filter((item) => {
976
- return (isWithinInterval(new Date(item[pivot.rowField || '']), {
1195
+ return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
977
1196
  start: rowValue,
978
1197
  end: subMilliseconds(nextRowValue, 1),
979
1198
  }) && item[pivot.columnField || ''] === colValue);
980
1199
  });
981
1200
  if (isComparison) {
982
1201
  comparisonFilteredData = data.filter((item) => {
983
- return (isWithinInterval(new Date(item[pivot.rowField || '']), {
1202
+ return (isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
984
1203
  start: rowValue,
985
1204
  end: subMilliseconds(nextRowValue, 1),
986
1205
  }) &&
@@ -1009,7 +1228,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
1009
1228
  filteredData = isDateField(pivot.rowFieldType || '')
1010
1229
  ? data.filter((item) => {
1011
1230
  return (compRowValue &&
1012
- isWithinInterval(new Date(item[`comparison_${pivot.rowField}`]), {
1231
+ isWithinInterval(getValidDate(item[`comparison_${pivot.rowField}`]) ?? 0, {
1013
1232
  start: compRowValue,
1014
1233
  end: subMilliseconds(compNextRowValue, 1),
1015
1234
  }));
@@ -1019,7 +1238,7 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
1019
1238
  else {
1020
1239
  filteredData = isDateField(pivot.rowFieldType || '')
1021
1240
  ? data.filter((item) => {
1022
- return isWithinInterval(new Date(item[pivot.rowField || '']), {
1241
+ return isWithinInterval(getValidDate(item[pivot.rowField || '']) ?? 0, {
1023
1242
  start: rowValue,
1024
1243
  end: subMilliseconds(nextRowValue, 1),
1025
1244
  });
@@ -1145,24 +1364,11 @@ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison,
1145
1364
  ];
1146
1365
  if (pivot.sort) {
1147
1366
  pivotRows.sort((a, b) => {
1148
- if (pivot.sortDirection === 'ASC') {
1149
- if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1150
- // @ts-ignore
1151
- return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
1152
- }
1153
- else if (isNumericColumnType(pivot.sortFieldType)) {
1154
- return a[pivot.sortField] - b[pivot.sortField];
1155
- }
1156
- return a[pivot.sortField].localeCompare(b[pivot.sortField]);
1367
+ if (pivot.sortField) {
1368
+ const result = compareValues(a, b, pivot.sortField);
1369
+ return pivot.sortDirection === 'ASC' ? result : -result;
1157
1370
  }
1158
1371
  else {
1159
- if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1160
- // @ts-ignore
1161
- return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
1162
- }
1163
- else if (isNumericColumnType(pivot.sortFieldType)) {
1164
- return b[pivot.sortField] - a[pivot.sortField];
1165
- }
1166
1372
  return b[pivot.sortField].localeCompare(a[pivot.sortField]);
1167
1373
  }
1168
1374
  });