@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,7 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generatePivotTableInMemory = exports.generatePivotTable = exports.isDateField = exports.getDateString = exports.getDateBuckets = exports.getDateRange = exports.generatePivotTitle = exports.generatePivotTableYAxis = exports.PivotModal = void 0;
6
+ exports.PivotModal = void 0;
7
+ exports.generatePivotTableYAxis = generatePivotTableYAxis;
8
+ exports.generatePivotTitle = generatePivotTitle;
9
+ exports.getDateRange = getDateRange;
10
+ exports.getDateBuckets = getDateBuckets;
11
+ exports.getDateString = getDateString;
12
+ exports.isDateField = isDateField;
13
+ exports.generatePivotTable = generatePivotTable;
14
+ exports.generatePivotTableInMemory = generatePivotTableInMemory;
7
15
  const jsx_runtime_1 = require("react/jsx-runtime");
8
16
  const react_1 = require("react");
9
17
  const Context_1 = require("../../Context");
@@ -22,8 +30,11 @@ const tableProcessing_1 = require("../../utils/tableProcessing");
22
30
  const pivotConstructor_1 = require("../../utils/pivotConstructor");
23
31
  const dates_1 = require("../../utils/dates");
24
32
  const big_js_1 = __importDefault(require("big.js"));
25
- const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, CardComponent = QuillCard_1.QuillCard, HeaderComponent, 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, }) => {
33
+ const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
34
+ const filterProcessing_1 = require("../../utils/filterProcessing");
35
+ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivotColumnField, pivotValueField, setPivotValueField, pivotValueField2, setPivotValueField2, pivotAggregation, setPivotAggregation, popUpTitle, setPopUpTitle, selectedTable, SelectComponent, ButtonComponent, SecondaryButtonComponent, PopoverComponent, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, CardComponent = QuillCard_1.QuillCard, HeaderComponent, 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, }) => {
26
36
  const [isLoading, setIsLoading] = (0, react_1.useState)(false);
37
+ const [previewLoading, setPreviewLoading] = (0, react_1.useState)(false);
27
38
  const [selectedPivotType, setSelectedPivotType] = (0, react_1.useState)('recommended');
28
39
  const [errors, setErrors] = (0, react_1.useState)([]);
29
40
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
@@ -32,12 +43,16 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
32
43
  const colFieldRef = (0, react_1.useRef)(null);
33
44
  const [pivotCardWidth, setPivotCardWidth] = (0, react_1.useState)(420);
34
45
  const [samplePivotTable, setSamplePivotTable] = (0, react_1.useState)(null);
46
+ const [hasNoRecommendedPivots, sethasNoRecommendedPivots] = (0, react_1.useState)(false);
47
+ const [isFetchingPivots, setIsFetchingPivots] = (0, react_1.useState)(false);
35
48
  const [allowedColumnFields, setAllowedColumnFields] = (0, react_1.useState)([]);
36
49
  const [allowedRowFields, setAllowedRowFields] = (0, react_1.useState)([]);
37
50
  const [allowedValueFields, setAllowedValueFields] = (0, react_1.useState)([]);
38
51
  const [uniqueValues, setUniqueValues] = (0, react_1.useState)(initialUniqueValues);
52
+ const buttonRef = (0, react_1.useRef)(null);
39
53
  const [dateRanges, setDateRanges] = (0, react_1.useState)({});
40
- const getDistinctValues = async () => {
54
+ const [pivotError, setPivotError] = (0, react_1.useState)('');
55
+ const getDistinctValues = async (fetchDistinct) => {
41
56
  if (!client) {
42
57
  return {
43
58
  possibleColumns: { rowFields: [], columnFields: [], valueFields: [] },
@@ -55,8 +70,11 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
55
70
  setAllowedValueFields(possibleColumns.valueFields);
56
71
  return { possibleColumns, uniqueValues: {} };
57
72
  }
58
- const { filteredColumns: smallStringColumns } = await (0, tableProcessing_1.getCountsByColumns)(stringColumns, query || '', client, schemaData.customFields ?? []);
59
- const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(smallStringColumns, query || '', data.rows || [], client, schemaData.customFields ?? []);
73
+ let newUniqueValues = uniqueValues;
74
+ if (fetchDistinct || !uniqueValues) {
75
+ const { filteredColumns: smallStringColumns } = await (0, tableProcessing_1.getCountsByColumns)(stringColumns, query || '', client, schemaData.customFields ?? []);
76
+ newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(smallStringColumns, query || '', data.rows || [], client, schemaData.customFields ?? []);
77
+ }
60
78
  if (!uniqueValues ||
61
79
  (0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
62
80
  const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, newUniqueValues || {});
@@ -81,7 +99,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
81
99
  if (dateColumns.length === 0) {
82
100
  return;
83
101
  }
84
- const dateRangeByColumn = await (0, tableProcessing_1.getDateRangeByColumns)(dateColumns, query || '', client, schemaData.customFields ?? []);
102
+ const dateRangeByColumn = await (0, tableProcessing_1.getQueryDateRangeByColumns)(dateColumns, query || '', client, schemaData.customFields ?? []);
85
103
  setDateRanges(dateRangeByColumn || {});
86
104
  }
87
105
  };
@@ -119,9 +137,23 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
119
137
  columnFieldType: columnsToShow[pivotColumnField || ''],
120
138
  valueField: pivotValueField || '',
121
139
  aggregationType: pivotAggregation || '',
140
+ valueField2: pivotValueField2 || '',
122
141
  };
123
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
124
- setSamplePivotTable({ pivot: pivot, rows, columns });
142
+ try {
143
+ const { rows, columns } = await generatePivotTable({
144
+ pivot,
145
+ report,
146
+ client,
147
+ uniqueValues,
148
+ });
149
+ setSamplePivotTable({ pivot: pivot, rows, columns });
150
+ }
151
+ catch (e) {
152
+ if (e instanceof Error) {
153
+ setPivotError(e.message);
154
+ return;
155
+ }
156
+ }
125
157
  }
126
158
  if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
127
159
  getDistinctValues();
@@ -141,6 +173,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
141
173
  columnFieldType: columnsToShow[pivotColumnField || ''],
142
174
  valueField: pivotValueField || '',
143
175
  aggregationType: pivotAggregation || '',
176
+ valueField2: pivotValueField2 || '',
144
177
  };
145
178
  if (initialSelectedPivotTable) {
146
179
  setSamplePivotTable({
@@ -150,8 +183,21 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
150
183
  });
151
184
  }
152
185
  else {
153
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
154
- setSamplePivotTable({ pivot: pivot, rows, columns });
186
+ try {
187
+ const { rows, columns } = await generatePivotTable({
188
+ pivot,
189
+ report,
190
+ client,
191
+ uniqueValues,
192
+ });
193
+ setSamplePivotTable({ pivot: pivot, rows, columns });
194
+ }
195
+ catch (e) {
196
+ if (e instanceof Error) {
197
+ setPivotError(e.message);
198
+ return;
199
+ }
200
+ }
155
201
  }
156
202
  }
157
203
  };
@@ -167,15 +213,16 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
167
213
  }
168
214
  }, [initialSelectedPivotTable, columns, data, pivotRowField]);
169
215
  (0, react_1.useEffect)(() => {
170
- if (!initialUniqueValues) {
171
- return;
172
- }
173
- const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, initialUniqueValues);
216
+ setAllowedFields(initialUniqueValues || {});
217
+ setUniqueValues(initialUniqueValues);
218
+ }, [initialUniqueValues, columns]);
219
+ const setAllowedFields = (uniqueValues) => {
220
+ const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(columns, uniqueValues);
174
221
  setAllowedRowFields(possibleColumns.rowFields);
175
222
  setAllowedColumnFields(possibleColumns.columnFields);
176
223
  setAllowedValueFields(possibleColumns.valueFields);
177
- setUniqueValues(initialUniqueValues);
178
- }, [initialUniqueValues, columns]);
224
+ return possibleColumns;
225
+ };
179
226
  const columnsToShow = (0, react_1.useMemo)(() => {
180
227
  return (columns || []).reduce((map, col) => {
181
228
  // only use columns shown in the report builder's table
@@ -194,15 +241,41 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
194
241
  return null;
195
242
  }
196
243
  const pivot = createdPivots[selectedPivotIndex];
197
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
198
- setSelectedPivotTable({
199
- pivot: pivot,
200
- rows: rows,
201
- columns: columns,
202
- });
244
+ try {
245
+ const { rows, columns } = await generatePivotTable({
246
+ pivot,
247
+ report,
248
+ client,
249
+ uniqueValues,
250
+ });
251
+ setSelectedPivotTable({
252
+ pivot: pivot,
253
+ rows: rows,
254
+ columns: columns,
255
+ });
256
+ }
257
+ catch (e) {
258
+ if (e instanceof Error) {
259
+ setPivotError(e.message);
260
+ return;
261
+ }
262
+ }
203
263
  };
204
264
  fetchPivotTables();
205
265
  }, [selectedPivotIndex, data, dateRange, createdPivots]);
266
+ const previousUniqueValuesRef = (0, react_1.useRef)();
267
+ (0, react_1.useEffect)(() => {
268
+ if (!uniqueValuesIsLoading &&
269
+ !(0, fast_deep_equal_1.default)(uniqueValues, previousUniqueValuesRef.current)) {
270
+ previousUniqueValuesRef.current = uniqueValues;
271
+ setRecommendedPivotTables([]);
272
+ setRecommendedPivots([]);
273
+ setCreatedPivotTables([]);
274
+ setCreatedPivots([]);
275
+ sethasNoRecommendedPivots(false);
276
+ refreshPivots();
277
+ }
278
+ }, [uniqueValuesIsLoading, uniqueValues]);
206
279
  const onSelectRecommendedPivot = (pivot, index) => {
207
280
  if (showEditOnPivotClick) {
208
281
  onEditPivot(pivot, index, 'recommended');
@@ -218,7 +291,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
218
291
  setIsOpen(false);
219
292
  };
220
293
  const onSelectCreatedPivot = (pivot) => {
221
- selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField || '']?.dateRange, samplePivotTable);
294
+ selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField || '']?.dateRange);
222
295
  setSelectedPivotType('created');
223
296
  setIsOpen(false);
224
297
  setPopUpTitle('Add pivot');
@@ -228,6 +301,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
228
301
  setPivotRowField(pivot.rowField);
229
302
  setPivotColumnField(pivot.columnField);
230
303
  setPivotValueField(pivot.valueField);
304
+ setPivotValueField2(pivot.valueField2);
231
305
  setPivotAggregation(pivot.aggregationType);
232
306
  setShowUpdatePivot(true);
233
307
  if (pivotType === 'recommended' &&
@@ -241,9 +315,24 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
241
315
  if (pivotRowField && dateRanges[pivotRowField]) {
242
316
  dateBucket = (0, dates_1.getDateBucketFromRange)(dateRanges[pivotRowField].dateRange);
243
317
  }
244
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
245
- setSamplePivotTable({ pivot, rows, columns });
246
- return;
318
+ try {
319
+ const { rows, columns } = await generatePivotTable({
320
+ pivot,
321
+ dateBucket,
322
+ report,
323
+ client,
324
+ uniqueValues,
325
+ });
326
+ setSamplePivotTable({ pivot, rows, columns });
327
+ return;
328
+ }
329
+ catch (e) {
330
+ if (e instanceof Error) {
331
+ setPivotError(e.message);
332
+ setSamplePivotTable(null);
333
+ return;
334
+ }
335
+ }
247
336
  }
248
337
  setSamplePivotTable(null);
249
338
  };
@@ -254,26 +343,33 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
254
343
  if (!client) {
255
344
  return;
256
345
  }
257
- if (isLoading ||
346
+ // don't fetch unique values separately if they are already being fetched
347
+ if (uniqueValuesIsLoading) {
348
+ setIsLoading(true);
349
+ return;
350
+ }
351
+ if (isFetchingPivots ||
258
352
  Object.keys(columnsToShow).length === 0 ||
259
353
  !pivotRecommendationsEnabled) {
260
354
  return;
261
355
  }
356
+ setIsFetchingPivots(true);
357
+ setPivotError('');
262
358
  setIsLoading(true);
263
- let tempUniqueValues = uniqueValues;
359
+ let tempUniqueValues = uniqueValues || initialUniqueValues;
264
360
  let possibleColumns = {
265
361
  rowFields: allowedRowFields,
266
362
  columnFields: allowedColumnFields,
267
363
  valueFields: allowedValueFields,
268
364
  };
269
- if ((allowedRowFields.length === 0 &&
270
- allowedColumnFields.length === 0 &&
271
- allowedValueFields.length === 0) ||
272
- !uniqueValues) {
273
- const distinctValues = await getDistinctValues();
365
+ if (!uniqueValues && !initialUniqueValues) {
366
+ const distinctValues = await getDistinctValues(true);
274
367
  possibleColumns = distinctValues.possibleColumns;
275
368
  tempUniqueValues = distinctValues.uniqueValues;
276
369
  }
370
+ else {
371
+ possibleColumns = setAllowedFields(uniqueValues || initialUniqueValues);
372
+ }
277
373
  const cloudBody = {
278
374
  pivotCountRequest,
279
375
  allowedRowFields: possibleColumns?.rowFields || [],
@@ -292,8 +388,12 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
292
388
  try {
293
389
  const resp = await (0, dataFetcher_1.getDataFromCloud)(client, 'pivotai', cloudBody);
294
390
  const recommendedPivots = resp?.data?.pivotTables.map((pivot) => (0, pivotProcessing_1.cleanPivot)(pivot, possibleColumns)) || [];
295
- const cleanedPivots = recommendedPivots.map((pivot) => {
296
- if (pivot.columnField && columnsToShow[pivot.columnField] === 'date') {
391
+ const cleanedPivots = recommendedPivots
392
+ .filter((pivot) => (0, pivotProcessing_1.isValidPivot)(pivot) &&
393
+ (!pivot.columnField || pivot.columnField !== pivot.rowField)) // only recommend valid pivots
394
+ .map((pivot) => {
395
+ if (pivot.columnField &&
396
+ columnsToShow[pivot.columnField] === 'date') {
297
397
  const columnField = pivot.columnField;
298
398
  pivot.columnField = pivot.rowField;
299
399
  pivot.rowField = columnField;
@@ -307,17 +407,42 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
307
407
  title: generatePivotTitle(pivot),
308
408
  };
309
409
  });
310
- setRecommendedPivots(cleanedPivots);
311
- const pts = await Promise.all(cleanedPivots.map(async (p) => {
312
- const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, tempUniqueValues);
313
- return { pivot: p, rows, columns };
410
+ const deduplicatedPivots = cleanedPivots
411
+ .filter((pivot, index, self) => index ===
412
+ self.findIndex((p) => p.rowField === pivot.rowField &&
413
+ p.columnField === pivot.columnField &&
414
+ p.valueField === pivot.valueField &&
415
+ p.aggregationType === pivot.aggregationType))
416
+ .filter((pivot) => !createdPivots.some((created) => created.rowField === pivot.rowField &&
417
+ created.columnField === pivot.columnField &&
418
+ created.valueField === pivot.valueField &&
419
+ created.aggregationType === pivot.aggregationType));
420
+ setRecommendedPivots(deduplicatedPivots);
421
+ sethasNoRecommendedPivots(deduplicatedPivots.length === 0);
422
+ const trimmedUniqueValues = trimUniqueValues(tempUniqueValues, 6);
423
+ const pts = await Promise.all(deduplicatedPivots.map(async (p) => {
424
+ try {
425
+ const { rows, columns } = await generatePivotTable({
426
+ pivot: p,
427
+ rowLimit: 6,
428
+ report,
429
+ client,
430
+ uniqueValues: trimmedUniqueValues,
431
+ });
432
+ return { pivot: p, rows, columns };
433
+ }
434
+ catch (e) {
435
+ return undefined;
436
+ }
314
437
  }));
315
- setRecommendedPivotTables(pts);
438
+ setRecommendedPivotTables(pts.filter((pt) => pt !== undefined));
316
439
  setSelectedPivotIndex(-1);
317
440
  }
318
441
  catch (e) {
442
+ setPivotError('Failed to fetch pivot recommendations');
319
443
  console.error('Failed parsing pivotai response', e);
320
444
  }
445
+ setIsFetchingPivots(false);
321
446
  setIsLoading(false);
322
447
  }, [
323
448
  selectedTable,
@@ -328,16 +453,17 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
328
453
  allowedColumnFields,
329
454
  allowedRowFields,
330
455
  allowedValueFields,
456
+ uniqueValuesIsLoading,
331
457
  columns,
332
458
  ]);
333
459
  const pivotFieldChange = async (field, value) => {
334
460
  setErrors([]);
335
- setIsLoading(true);
336
461
  const pivot = {
337
462
  rowField: pivotRowField,
338
463
  rowFieldType: columnsToShow[pivotRowField],
339
464
  columnField: pivotColumnField,
340
465
  valueField: pivotValueField,
466
+ valueField2: pivotValueField2,
341
467
  aggregationType: pivotAggregation,
342
468
  };
343
469
  // @ts-ignore
@@ -350,52 +476,59 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
350
476
  pivot.columnFieldType = columnsToShow[value];
351
477
  }
352
478
  if (!(0, pivotProcessing_1.isValidPivot)(pivot)) {
353
- setIsLoading(false);
354
479
  setSamplePivotTable(null);
355
480
  return;
356
481
  }
482
+ setPreviewLoading(true);
357
483
  let dateBucket = undefined;
358
484
  if (pivotRowField && dateRanges[pivotRowField]) {
359
485
  dateBucket = (0, dates_1.getDateBucketFromRange)(dateRanges[pivotRowField].dateRange);
360
486
  }
361
487
  setTimeout(async () => {
362
- const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
363
- setSamplePivotTable({ pivot, rows, columns });
364
- setIsLoading(false);
488
+ try {
489
+ console.log('HELP: ', pivot);
490
+ const { rows, columns } = await generatePivotTable({
491
+ pivot,
492
+ rowLimit: 6, // limit previews
493
+ dateBucket,
494
+ report,
495
+ client,
496
+ uniqueValues,
497
+ });
498
+ setSamplePivotTable({ pivot, rows, columns });
499
+ }
500
+ catch (e) {
501
+ if (e instanceof Error) {
502
+ setPivotError(e.message);
503
+ setSamplePivotTable(null);
504
+ return;
505
+ }
506
+ }
507
+ finally {
508
+ setPreviewLoading(false);
509
+ }
365
510
  }, 500);
366
511
  };
367
512
  const [recommendedPivotTables, setRecommendedPivotTables] = (0, react_1.useState)([]);
368
- // useEffect(() => {
369
- // const fetchPivotTables = async () => {
370
- // const pts = await Promise.all(
371
- // recommendedPivots.map(async (p: Pivot) => {
372
- // const { rows, columns } = await generatePivotTable(
373
- // p,
374
- // data,
375
- // dateRange,
376
- // false,
377
- // 6,
378
- // undefined,
379
- // undefined,
380
- // report,
381
- // client,
382
- // uniqueValues,
383
- // );
384
- // return { pivot: p, rows, columns };
385
- // }),
386
- // );
387
- // setRecommendedPivotTables(pts);
388
- // };
389
- // fetchPivotTables();
390
- // }, [recommendedPivots, dateRange]);
391
513
  const [createdPivotTables, setCreatedPivotTables] = (0, react_1.useState)([]);
392
514
  (0, react_1.useEffect)(() => {
393
515
  const fetchPivotTables = async () => {
394
516
  const pts = await Promise.all(createdPivots.map(async (p) => {
395
- const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, uniqueValues);
396
- return { pivot: p, rows, columns };
517
+ try {
518
+ const { rows, columns } = await generatePivotTable({
519
+ pivot: p,
520
+ rowLimit: 6,
521
+ report,
522
+ client,
523
+ uniqueValues,
524
+ });
525
+ return { pivot: p, rows, columns };
526
+ }
527
+ catch (e) {
528
+ return undefined;
529
+ }
397
530
  }));
398
- setCreatedPivotTables(pts);
531
+ setCreatedPivotTables(pts.filter((pt) => pt !== undefined));
399
532
  };
400
533
  fetchPivotTables();
401
534
  }, [createdPivots, dateRange]);
@@ -415,22 +548,24 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
415
548
  position: 'absolute',
416
549
  top: -2,
417
550
  right: -2,
418
- } })) }), showTrigger && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
419
- if (columns.length === 0) {
420
- setIsOpen(false);
421
- }
422
- // table is not loaded yet, so pivot button is not clickable
423
- if (Object.keys(columnsToShow).length === 0) {
424
- return;
425
- }
426
- if (!isOpen &&
427
- (recommendedPivots.length === 0 ||
428
- recommendedPivotTables.length === 0)) {
429
- refreshPivots();
430
- }
431
- setIsOpen(!isOpen);
432
- setShowUpdatePivot(false);
433
- }, label: triggerButtonText })), (0, jsx_runtime_1.jsx)("div", { style: {
551
+ } })) }), showTrigger && ((0, jsx_runtime_1.jsx)("div", { ref: buttonRef, children: (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
552
+ if (columns.length === 0) {
553
+ setIsOpen(false);
554
+ }
555
+ // table is not loaded yet, so pivot button is not clickable
556
+ if (Object.keys(columnsToShow).length === 0) {
557
+ return;
558
+ }
559
+ if (!isOpen &&
560
+ pivotRecommendationsEnabled &&
561
+ !hasNoRecommendedPivots &&
562
+ (recommendedPivots.length === 0 ||
563
+ recommendedPivotTables.length === 0)) {
564
+ refreshPivots();
565
+ }
566
+ setIsOpen(!isOpen);
567
+ setShowUpdatePivot(false);
568
+ }, label: triggerButtonText }) })), (0, jsx_runtime_1.jsx)("div", { style: {
434
569
  position: 'relative',
435
570
  ...(isOpen && showTrigger && { top: 12 }),
436
571
  }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
@@ -439,7 +574,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
439
574
  setPopUpTitle('Add pivot');
440
575
  }
441
576
  setIsOpen(isOpen);
442
- }, popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
577
+ }, ignoredRefs: [buttonRef], popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
443
578
  ? popUpTitle
444
579
  : 'Recommended pivots', popoverChildren: (0, jsx_runtime_1.jsx)("div", { style: {
445
580
  paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
@@ -449,13 +584,14 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
449
584
  display: 'flex',
450
585
  flexDirection: 'column',
451
586
  gap: 20,
452
- }, children: [isLoading && (0, jsx_runtime_1.jsx)(LoadingComponent, {}), samplePivotTable && !isLoading && ((0, jsx_runtime_1.jsx)("div", { style: {
587
+ }, children: [previewLoading && (0, jsx_runtime_1.jsx)(LoadingComponent, {}), samplePivotTable && !previewLoading && ((0, jsx_runtime_1.jsx)("div", { style: {
453
588
  width: pivotCardWidth,
454
589
  minHeight: 160,
455
590
  }, children: (0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: samplePivotTable, theme: theme, index: 0, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, clickable: false, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent, onSelectPivot: () => { }, onClose: () => {
456
591
  setPivotAggregation(null);
457
592
  setPivotRowField(null);
458
593
  setPivotValueField(null);
594
+ setPivotValueField2(null);
459
595
  setPivotColumnField(null);
460
596
  setSamplePivotTable(null);
461
597
  } }) })), (0, jsx_runtime_1.jsxs)(PivotColumnContainer, { children: [(0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)("div", { ref: rowFieldRef, children: (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Row field", value: pivotRowField, onChange: (e) => {
@@ -463,7 +599,9 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
463
599
  setPivotRowField(e.target.value === ''
464
600
  ? undefined
465
601
  : e.target.value);
466
- }, options: allowedRowFields.map((field) => {
602
+ }, options: allowedRowFields
603
+ .filter((field) => field !== pivotColumnField)
604
+ .map((field) => {
467
605
  return {
468
606
  label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
469
607
  value: field,
@@ -473,22 +611,14 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
473
611
  setPivotColumnField(e.target.value === ''
474
612
  ? undefined
475
613
  : e.target.value);
476
- }, options: allowedColumnFields.map((field) => {
614
+ }, options: allowedColumnFields
615
+ .filter((field) => field !== pivotRowField)
616
+ .map((field) => {
477
617
  return {
478
618
  label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
479
619
  value: field,
480
620
  };
481
- }), isLoading: uniqueValuesIsLoading, width: 200 }) })] }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Value field", value: pivotValueField, onChange: (e) => {
482
- pivotFieldChange('valueField', e.target.value);
483
- setPivotValueField(e.target.value === ''
484
- ? undefined
485
- : e.target.value);
486
- }, options: allowedValueFields.map((field) => {
487
- return {
488
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
489
- value: field,
490
- };
491
- }), isLoading: uniqueValuesIsLoading, width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
621
+ }), isLoading: uniqueValuesIsLoading, width: 200 }) })] }), (0, jsx_runtime_1.jsxs)(PivotRowContainer, { children: [(0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
492
622
  if (e.target.value !== 'count' &&
493
623
  pivotValueField &&
494
624
  !ChartBuilder_1.numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField).format)) {
@@ -499,10 +629,49 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
499
629
  ? undefined
500
630
  : e.target.value);
501
631
  }, options: [
502
- ...['sum', 'average', 'count', 'max', 'min'].map((option) => {
632
+ ...[
633
+ 'sum',
634
+ 'average',
635
+ 'count',
636
+ 'max',
637
+ 'min',
638
+ 'percentage',
639
+ ].map((option) => {
503
640
  return { label: option, value: option };
504
641
  }),
505
- ], width: 200 })] })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: () => {
642
+ ], width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Value field", value: pivotValueField, onChange: (e) => {
643
+ pivotFieldChange('valueField', e.target.value);
644
+ setPivotValueField(e.target.value === ''
645
+ ? undefined
646
+ : e.target.value);
647
+ }, options: allowedValueFields
648
+ .map((field) => {
649
+ return {
650
+ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
651
+ value: field,
652
+ };
653
+ })
654
+ .filter((option) => {
655
+ return (pivotAggregation !== 'percentage' ||
656
+ pivotColumnField ||
657
+ option.value !== pivotValueField2);
658
+ }), isLoading: uniqueValuesIsLoading, width: 200 }), pivotAggregation === 'percentage' ? ((0, jsx_runtime_1.jsx)(SelectComponent, { id: "pivot-row-field", label: "Total field", value: pivotValueField2, onChange: (e) => {
659
+ pivotFieldChange('valueField2', e.target.value);
660
+ setPivotValueField2(e.target.value === ''
661
+ ? undefined
662
+ : e.target.value);
663
+ }, options: allowedValueFields
664
+ .map((field) => {
665
+ return {
666
+ label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(field),
667
+ value: field,
668
+ };
669
+ })
670
+ .filter((option) => {
671
+ return (pivotAggregation !== 'percentage' ||
672
+ pivotColumnField ||
673
+ option.value !== pivotValueField);
674
+ }), isLoading: uniqueValuesIsLoading, width: 200 })) : null] })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(ButtonComponent, { id: "custom-button", onClick: () => {
506
675
  const errors = [];
507
676
  if (!pivotValueField &&
508
677
  pivotAggregation !== 'count') {
@@ -525,6 +694,7 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
525
694
  columnField: pivotColumnField,
526
695
  columnFieldType: columnsToShow[pivotColumnField || ''],
527
696
  valueField: pivotValueField || '',
697
+ valueField2: pivotValueField2 || '',
528
698
  aggregationType: pivotAggregation || '',
529
699
  };
530
700
  if ((0, pivotProcessing_1.isValidPivot)(pivot)) {
@@ -571,7 +741,27 @@ const PivotModal = ({ pivotRowField, setPivotRowField, pivotColumnField, setPivo
571
741
  display: 'flex',
572
742
  flexDirection: 'row',
573
743
  gap: 8,
574
- }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Regenerate", onClick: refreshPivots, icon: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", d: "M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z", clipRule: "evenodd" }) }) }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Create pivot +", onClick: () => onEditPivot({}, null) })] }), isLoading ? ((0, jsx_runtime_1.jsx)(LoadingComponent, {})) : ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(PivotList_1.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 }) }))] })) })) }) }) })] }) }));
744
+ }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Regenerate", onClick: refreshPivots, icon: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", style: { width: 16, height: 16 }, children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", d: "M9 4.5a.75.75 0 0 1 .721.544l.813 2.846a3.75 3.75 0 0 0 2.576 2.576l2.846.813a.75.75 0 0 1 0 1.442l-2.846.813a3.75 3.75 0 0 0-2.576 2.576l-.813 2.846a.75.75 0 0 1-1.442 0l-.813-2.846a3.75 3.75 0 0 0-2.576-2.576l-2.846-.813a.75.75 0 0 1 0-1.442l2.846-.813A3.75 3.75 0 0 0 7.466 7.89l.813-2.846A.75.75 0 0 1 9 4.5ZM18 1.5a.75.75 0 0 1 .728.568l.258 1.036c.236.94.97 1.674 1.91 1.91l1.036.258a.75.75 0 0 1 0 1.456l-1.036.258c-.94.236-1.674.97-1.91 1.91l-.258 1.036a.75.75 0 0 1-1.456 0l-.258-1.036a2.625 2.625 0 0 0-1.91-1.91l-1.036-.258a.75.75 0 0 1 0-1.456l1.036-.258a2.625 2.625 0 0 0 1.91-1.91l.258-1.036A.75.75 0 0 1 18 1.5ZM16.5 15a.75.75 0 0 1 .712.513l.394 1.183c.15.447.5.799.948.948l1.183.395a.75.75 0 0 1 0 1.422l-1.183.395c-.447.15-.799.5-.948.948l-.395 1.183a.75.75 0 0 1-1.422 0l-.395-1.183a1.5 1.5 0 0 0-.948-.948l-1.183-.395a.75.75 0 0 1 0-1.422l1.183-.395c.447-.15.799-.5.948-.948l.395-1.183A.75.75 0 0 1 16.5 15Z", clipRule: "evenodd" }) }) }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: "Create pivot +", onClick: () => onEditPivot({}, null) })] }), isLoading || uniqueValuesIsLoading ? ((0, jsx_runtime_1.jsx)(LoadingComponent, {})) : pivotError ? ((0, jsx_runtime_1.jsx)("div", { style: {
745
+ width: '100%',
746
+ height: '140px',
747
+ display: 'flex',
748
+ justifyContent: 'center',
749
+ alignItems: 'center',
750
+ }, children: pivotError })) : ((0, jsx_runtime_1.jsx)("div", { children: !hasNoRecommendedPivots ||
751
+ createdPivotTables.length > 0 ? ((0, jsx_runtime_1.jsx)(PivotList_1.PivotList, { recommendedPivotTables: recommendedPivotTables.filter((pivotTable) => !createdPivots.some((created) => created.rowField ===
752
+ pivotTable.pivot.rowField &&
753
+ created.columnField ===
754
+ pivotTable.pivot.columnField &&
755
+ created.valueField ===
756
+ pivotTable.pivot.valueField &&
757
+ created.aggregationType ===
758
+ 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 })) : ((0, jsx_runtime_1.jsx)("div", { style: {
759
+ width: '100%',
760
+ height: '140px',
761
+ display: 'flex',
762
+ justifyContent: 'center',
763
+ alignItems: 'center',
764
+ }, children: "No valid pivots returned" })) }))] })) })) }) }) })] }) }));
575
765
  };
576
766
  exports.PivotModal = PivotModal;
577
767
  function generatePivotTableYAxis(pivot, cols, yAxisField) {
@@ -594,7 +784,6 @@ function generatePivotTableYAxis(pivot, cols, yAxisField) {
594
784
  },
595
785
  ];
596
786
  }
597
- exports.generatePivotTableYAxis = generatePivotTableYAxis;
598
787
  function generatePivotTitle(pivot) {
599
788
  if (pivot.rowField && !pivot.valueField) {
600
789
  return (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(`${pivot.aggregationType} of ${pivot.rowField}
@@ -606,15 +795,22 @@ function generatePivotTitle(pivot) {
606
795
  }
607
796
  return (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(`${pivot.aggregationType} of ${pivot.valueField} by ${pivot.rowField}${pivot.columnField ? ` and ${pivot.columnField}` : ''}`);
608
797
  }
609
- exports.generatePivotTitle = generatePivotTitle;
610
798
  function castValueToDate(value) {
611
799
  if (!value) {
612
800
  return null;
613
801
  }
802
+ let dateStr = value;
614
803
  if (typeof value === 'object' && value.value) {
615
- return new Date(value.value);
804
+ dateStr = value.value;
805
+ }
806
+ if (dateStr instanceof Date) {
807
+ return dateStr;
808
+ }
809
+ const parsed = (0, date_fns_1.parseISO)(dateStr);
810
+ if ((0, date_fns_1.isValid)(parsed)) {
811
+ return parsed;
616
812
  }
617
- return new Date(value);
813
+ return new Date(dateStr);
618
814
  }
619
815
  function getLatestDate(a, b) {
620
816
  return a > b ? a : b;
@@ -628,11 +824,11 @@ function getDateRange(dateRange, column, data) {
628
824
  const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
629
825
  const minDate = new Date(0);
630
826
  if (!dateRange) {
631
- if (data.length == 0 || !data[0][column]) {
827
+ if (data.length == 0) {
632
828
  return { start: new Date(), end: new Date() };
633
829
  }
634
- const firstDate = castValueToDate(data[0][column]);
635
830
  if (data.length == 1) {
831
+ const firstDate = castValueToDate(data[0][column]);
636
832
  return {
637
833
  start: firstDate || new Date(),
638
834
  end: firstDate || new Date(),
@@ -641,12 +837,19 @@ function getDateRange(dateRange, column, data) {
641
837
  let earliestDate = undefined;
642
838
  let latestDate = undefined;
643
839
  for (let i = 0; i < data.length; i++) {
644
- if (earliestDate && latestDate) {
645
- break;
646
- }
647
840
  const value = castValueToDate(data[i][column]);
648
- earliestDate = value && value > minDate ? value : null;
649
- latestDate = value && value < maxDate ? value : null;
841
+ earliestDate =
842
+ value && value > minDate
843
+ ? earliestDate
844
+ ? getEarliestDate(earliestDate, value)
845
+ : value
846
+ : earliestDate;
847
+ latestDate =
848
+ value && value < maxDate
849
+ ? latestDate
850
+ ? getLatestDate(latestDate, value)
851
+ : value
852
+ : latestDate;
650
853
  }
651
854
  if (!earliestDate || !latestDate) {
652
855
  return {
@@ -678,7 +881,6 @@ function getDateRange(dateRange, column, data) {
678
881
  return dateRange;
679
882
  }
680
883
  }
681
- exports.getDateRange = getDateRange;
682
884
  function determineIntervalThroughOverride(dateBucket, dateRange) {
683
885
  switch (dateBucket) {
684
886
  case 'day':
@@ -693,6 +895,19 @@ function determineIntervalThroughOverride(dateBucket, dateRange) {
693
895
  return (0, date_fns_1.eachMonthOfInterval)(dateRange);
694
896
  }
695
897
  }
898
+ // function to that takes in a uniqueValues obj and trims the number of unique values per column
899
+ function trimUniqueValues(obj, limit) {
900
+ const trimmedObj = {};
901
+ Object.keys(obj).forEach((key) => {
902
+ const values = obj[key] ? Object.keys(obj[key]) : [];
903
+ const limitedValues = values.slice(0, limit);
904
+ trimmedObj[key] = limitedValues.reduce((acc, curr) => {
905
+ acc[curr] = obj[key] ? (obj[key][curr] ?? false) : false;
906
+ return acc;
907
+ }, {});
908
+ });
909
+ return trimmedObj;
910
+ }
696
911
  function getDateBuckets(dateRange, column, data, dateBucket) {
697
912
  if (!dateRange) {
698
913
  if (dateBucket) {
@@ -706,7 +921,6 @@ function getDateBuckets(dateRange, column, data, dateBucket) {
706
921
  const dayDifference = (0, date_fns_1.differenceInDays)(dateRange.end, dateRange.start);
707
922
  return dayDifferenceToInterval(dayDifference, dateRange);
708
923
  }
709
- exports.getDateBuckets = getDateBuckets;
710
924
  function getCompDateBuckets(dateRange, compDateRange, column, data) {
711
925
  if (!dateRange) {
712
926
  return (0, date_fns_1.eachMonthOfInterval)(getDateRange(undefined, column, data));
@@ -776,7 +990,6 @@ function getDateString(value, dateRange, dateBucket) {
776
990
  fields: [{ field: 'date', format }],
777
991
  });
778
992
  }
779
- exports.getDateString = getDateString;
780
993
  function isDateField(fieldType) {
781
994
  return (fieldType === 'date' ||
782
995
  fieldType === 'datetime' ||
@@ -788,7 +1001,6 @@ function isDateField(fieldType) {
788
1001
  fieldType === 'MMM_dd_hh:mm_ap_pm' ||
789
1002
  fieldType === 'hh_ap_pm');
790
1003
  }
791
- exports.isDateField = isDateField;
792
1004
  const isNullUndefinedOrInvalidDate = (date) => date === null || date === undefined || isNaN(date.getTime());
793
1005
  // If the value is an object with key value (ie. a BigQuery date) we will
794
1006
  // return the inner value, otherwise return passed param as-is.
@@ -813,27 +1025,25 @@ const fixBigQueryData = (data = []) => {
813
1025
  }
814
1026
  return newData;
815
1027
  };
816
- async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
1028
+ async function generatePivotTable({ pivot, rowLimit = -1, dateBucket, report, client, uniqueValues, }) {
817
1029
  try {
818
- if (report && report.rowCount && report.rowCount !== data.length) {
1030
+ if (report && report.rowCount != null) {
1031
+ // rowCount can be 0 (could mean still loading in), loose equality check for undefined as well
819
1032
  const dateFilter = report
820
1033
  ? report.filtersApplied.find((f) => f.filterType === 'date_range')
821
1034
  : undefined;
822
1035
  const pivotTable = await (0, pivotConstructor_1.generatePivotWithSQL)(pivot, report, client, dateBucket, dateFilter, pivot.columnField && uniqueValues
823
1036
  ? Object.keys(uniqueValues[pivot.columnField])
824
- : undefined);
825
- if (pivotTable) {
826
- return pivotTable;
827
- }
1037
+ : undefined, rowLimit === -1 ? undefined : rowLimit);
1038
+ return pivotTable;
828
1039
  }
829
1040
  }
830
1041
  catch (e) {
831
- console.error('Error generating pivot table with SQL, using in memory process', e);
1042
+ throw Error(`Failed to generate pivot table with SQL: ${e}`);
832
1043
  }
833
- return generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit, compRange);
1044
+ throw Error('Failed to generate pivot table: invalid report');
834
1045
  }
835
- exports.generatePivotTable = generatePivotTable;
836
- function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
1046
+ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, uniqueValues) {
837
1047
  // If there is no rowField, aggregate on the valueField
838
1048
  if (!pivot.rowField) {
839
1049
  return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
@@ -851,9 +1061,15 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
851
1061
  compRange = undefined;
852
1062
  }
853
1063
  const pivotRows = [];
1064
+ const uniqueValuesMap = (0, filterProcessing_1.uniqueValuesToStringMap)(uniqueValues || {});
854
1065
  const uniqueRows = (isDateField(pivot.rowFieldType || '')
855
1066
  ? getDateBuckets(dateRange, pivot.rowField, data, dateBucket)
856
- : [...new Set(data.map((item) => item[pivot.rowField || '']))]).filter((row) => Boolean(row));
1067
+ : uniqueValuesMap[pivot.rowField] &&
1068
+ uniqueValuesMap[pivot.rowField]?.[0] !== 'EXCEEDS_LIMIT'
1069
+ ? uniqueValuesMap[pivot.rowField]
1070
+ : [...new Set(data.map((item) => item[pivot.rowField || '']))])
1071
+ .filter((col) => col !== null && col !== '')
1072
+ .map((col) => isDateField(pivot.rowFieldType || '') ? castValueToDate(col) : col);
857
1073
  const rowDateRange = getDateRange(dateRange, pivot.rowField, data);
858
1074
  const compRowDateRange = getDateRange(compRange ?? dateRange, pivot.rowField, data);
859
1075
  // If columnField is not provided, we will not be using uniqueColumns
@@ -861,8 +1077,10 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
861
1077
  const uniqueColumns = (pivot.columnField
862
1078
  ? isDateField(pivot.columnFieldType || '')
863
1079
  ? getDateBuckets(dateRange, pivot.columnField, data, dateBucket)
864
- : [...new Set(data.map((item) => item[pivot.columnField || '']))]
865
- : [pivot.valueField]).filter((col) => Boolean(col));
1080
+ : uniqueValues && pivot.columnField
1081
+ ? uniqueValuesMap[pivot.columnField]
1082
+ : [...new Set(data.map((item) => item[pivot.columnField || '']))]
1083
+ : [pivot.valueField]).filter((col) => col !== null && col !== '' && col !== undefined);
866
1084
  // Map from new dates to their corresponding prior dates
867
1085
  const COL_DATE_MAP = {};
868
1086
  const ROW_DATE_MAP = {};
@@ -895,7 +1113,9 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
895
1113
  }
896
1114
  compUniqueRows = (isDateField(pivot.rowFieldType || '')
897
1115
  ? getCompDateBuckets(dateRange, compRange ?? dateRange, pivot.rowField, data)
898
- : [...new Set(data.map((item) => item[pivot.rowField || '']))]).filter((row) => Boolean(row));
1116
+ : (uniqueValuesMap[pivot.rowField] ?? [
1117
+ ...new Set(data.map((item) => item[pivot.rowField || ''])),
1118
+ ])).filter((col) => col !== null && col !== '');
899
1119
  }
900
1120
  // Special corner case for count with only rowField pivot
901
1121
  if (!pivot.valueField &&
@@ -907,7 +1127,7 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
907
1127
  }
908
1128
  }
909
1129
  const rowsToGenerate = rowLimit !== -1 && rowLimit <= uniqueRows.length
910
- ? uniqueRows.slice(0, rowLimit + 1)
1130
+ ? uniqueRows.slice(0, rowLimit)
911
1131
  : uniqueRows;
912
1132
  rowsToGenerate.forEach((rowValue, rowIndex) => {
913
1133
  const row = {
@@ -943,22 +1163,22 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
943
1163
  if (isDateField(pivot.columnFieldType || '') &&
944
1164
  isDateField(pivot.rowFieldType || '')) {
945
1165
  filteredData = data.filter((item) => {
946
- return ((0, date_fns_1.isWithinInterval)(new Date(item[pivot.rowField || '']), {
1166
+ return ((0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.rowField || '']) ?? 0, {
947
1167
  start: rowValue,
948
1168
  end: (0, date_fns_1.subMilliseconds)(nextRowValue, 1),
949
1169
  }) &&
950
- (0, date_fns_1.isWithinInterval)(new Date(item[pivot.columnField]), {
1170
+ (0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.columnField || '']) ?? 0, {
951
1171
  start: colValue,
952
1172
  end: (0, date_fns_1.subMilliseconds)(nextColumnValue, 1),
953
1173
  }));
954
1174
  });
955
1175
  if (isComparison) {
956
1176
  comparisonFilteredData = data.filter((item) => {
957
- return ((0, date_fns_1.isWithinInterval)(new Date(item[pivot.rowField || '']), {
1177
+ return ((0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.rowField || '']) ?? 0, {
958
1178
  start: rowValue,
959
1179
  end: (0, date_fns_1.subMilliseconds)(nextRowValue, 1),
960
1180
  }) &&
961
- (0, date_fns_1.isWithinInterval)(new Date(item[pivot.columnField]), {
1181
+ (0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.columnField || '']) ?? 0, {
962
1182
  start: colValue,
963
1183
  end: (0, date_fns_1.subMilliseconds)(nextColumnValue, 1),
964
1184
  }));
@@ -969,7 +1189,7 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
969
1189
  !isDateField(pivot.rowFieldType || '')) {
970
1190
  filteredData = data.filter((item) => {
971
1191
  return (item[pivot.rowField || ''] === rowValue &&
972
- (0, date_fns_1.isWithinInterval)(new Date(item[pivot.columnField]), {
1192
+ (0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.columnField || '']) ?? 0, {
973
1193
  start: colValue,
974
1194
  end: (0, date_fns_1.subMilliseconds)(nextColumnValue, 1),
975
1195
  }));
@@ -977,7 +1197,7 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
977
1197
  if (isComparison) {
978
1198
  comparisonFilteredData = data.filter((item) => {
979
1199
  return (item[`comparison_${pivot.rowField}`] === rowValue &&
980
- (0, date_fns_1.isWithinInterval)(new Date(item[pivot.columnField]), {
1200
+ (0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.columnField || '']) ?? 0, {
981
1201
  start: colValue,
982
1202
  end: (0, date_fns_1.subMilliseconds)(nextColumnValue, 1),
983
1203
  }));
@@ -987,14 +1207,14 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
987
1207
  else if (!isDateField(pivot.columnFieldType || '') &&
988
1208
  isDateField(pivot.rowFieldType || '')) {
989
1209
  filteredData = data.filter((item) => {
990
- return ((0, date_fns_1.isWithinInterval)(new Date(item[pivot.rowField || '']), {
1210
+ return ((0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.rowField || '']) ?? 0, {
991
1211
  start: rowValue,
992
1212
  end: (0, date_fns_1.subMilliseconds)(nextRowValue, 1),
993
1213
  }) && item[pivot.columnField || ''] === colValue);
994
1214
  });
995
1215
  if (isComparison) {
996
1216
  comparisonFilteredData = data.filter((item) => {
997
- return ((0, date_fns_1.isWithinInterval)(new Date(item[pivot.rowField || '']), {
1217
+ return ((0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.rowField || '']) ?? 0, {
998
1218
  start: rowValue,
999
1219
  end: (0, date_fns_1.subMilliseconds)(nextRowValue, 1),
1000
1220
  }) &&
@@ -1023,7 +1243,7 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
1023
1243
  filteredData = isDateField(pivot.rowFieldType || '')
1024
1244
  ? data.filter((item) => {
1025
1245
  return (compRowValue &&
1026
- (0, date_fns_1.isWithinInterval)(new Date(item[`comparison_${pivot.rowField}`]), {
1246
+ (0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[`comparison_${pivot.rowField}`]) ?? 0, {
1027
1247
  start: compRowValue,
1028
1248
  end: (0, date_fns_1.subMilliseconds)(compNextRowValue, 1),
1029
1249
  }));
@@ -1033,7 +1253,7 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
1033
1253
  else {
1034
1254
  filteredData = isDateField(pivot.rowFieldType || '')
1035
1255
  ? data.filter((item) => {
1036
- return (0, date_fns_1.isWithinInterval)(new Date(item[pivot.rowField || '']), {
1256
+ return (0, date_fns_1.isWithinInterval)((0, valueFormatter_1.getValidDate)(item[pivot.rowField || '']) ?? 0, {
1037
1257
  start: rowValue,
1038
1258
  end: (0, date_fns_1.subMilliseconds)(nextRowValue, 1),
1039
1259
  });
@@ -1159,31 +1379,17 @@ function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLim
1159
1379
  ];
1160
1380
  if (pivot.sort) {
1161
1381
  pivotRows.sort((a, b) => {
1162
- if (pivot.sortDirection === 'ASC') {
1163
- if (ChartBuilder_1.dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1164
- // @ts-ignore
1165
- return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
1166
- }
1167
- else if ((0, ast_1.isNumericColumnType)(pivot.sortFieldType)) {
1168
- return a[pivot.sortField] - b[pivot.sortField];
1169
- }
1170
- return a[pivot.sortField].localeCompare(b[pivot.sortField]);
1382
+ if (pivot.sortField) {
1383
+ const result = (0, valueFormatter_1.compareValues)(a, b, pivot.sortField);
1384
+ return pivot.sortDirection === 'ASC' ? result : -result;
1171
1385
  }
1172
1386
  else {
1173
- if (ChartBuilder_1.dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1174
- // @ts-ignore
1175
- return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
1176
- }
1177
- else if ((0, ast_1.isNumericColumnType)(pivot.sortFieldType)) {
1178
- return b[pivot.sortField] - a[pivot.sortField];
1179
- }
1180
1387
  return b[pivot.sortField].localeCompare(a[pivot.sortField]);
1181
1388
  }
1182
1389
  });
1183
1390
  }
1184
1391
  return { rows: pivotRows, columns };
1185
1392
  }
1186
- exports.generatePivotTableInMemory = generatePivotTableInMemory;
1187
1393
  function valueFieldAggregation(data, valueField, aggregationType, isComparison) {
1188
1394
  if (!data || data.length === 0) {
1189
1395
  return {