@quillsql/react 2.12.37 → 2.12.39

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 (463) hide show
  1. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  2. package/dist/cjs/ChartBuilder.js +2 -2
  3. package/dist/cjs/Context.d.ts.map +1 -1
  4. package/dist/cjs/Context.js +2 -0
  5. package/dist/cjs/Dashboard.d.ts.map +1 -1
  6. package/dist/cjs/Dashboard.js +3 -1
  7. package/dist/cjs/utils/constants.d.ts +1 -0
  8. package/dist/cjs/utils/constants.d.ts.map +1 -1
  9. package/dist/cjs/utils/constants.js +2 -1
  10. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  11. package/dist/cjs/utils/pivotProcessing.js +5 -2
  12. package/dist/cjs/utils/schema.d.ts.map +1 -1
  13. package/dist/cjs/utils/schema.js +5 -2
  14. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  15. package/dist/cjs/utils/tableProcessing.js +2 -1
  16. package/dist/esm/Chart.d.ts +204 -0
  17. package/dist/esm/Chart.d.ts.map +1 -0
  18. package/dist/esm/Chart.js +431 -0
  19. package/dist/esm/ChartBuilder.d.ts +339 -0
  20. package/dist/esm/ChartBuilder.d.ts.map +1 -0
  21. package/dist/esm/ChartBuilder.js +1312 -0
  22. package/dist/esm/ChartEditor.d.ts +209 -0
  23. package/dist/esm/ChartEditor.d.ts.map +1 -0
  24. package/dist/esm/ChartEditor.js +182 -0
  25. package/dist/esm/Context.d.ts +14 -0
  26. package/dist/esm/Context.d.ts.map +1 -0
  27. package/dist/esm/Context.js +271 -0
  28. package/dist/esm/Dashboard.d.ts +279 -0
  29. package/dist/esm/Dashboard.d.ts.map +1 -0
  30. package/dist/esm/Dashboard.js +662 -0
  31. package/dist/esm/DateRangePicker/Calendar.d.ts +17 -0
  32. package/dist/esm/DateRangePicker/Calendar.d.ts.map +1 -0
  33. package/dist/esm/DateRangePicker/Calendar.js +164 -0
  34. package/dist/esm/DateRangePicker/DateRangePicker.d.ts +39 -0
  35. package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -0
  36. package/dist/esm/DateRangePicker/DateRangePicker.js +95 -0
  37. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +22 -0
  38. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +1 -0
  39. package/dist/esm/DateRangePicker/DateRangePickerButton.js +134 -0
  40. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +25 -0
  41. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -0
  42. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +260 -0
  43. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +80 -0
  44. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -0
  45. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +521 -0
  46. package/dist/esm/DateRangePicker/index.d.ts +3 -0
  47. package/dist/esm/DateRangePicker/index.d.ts.map +1 -0
  48. package/dist/esm/DateRangePicker/index.js +2 -0
  49. package/dist/esm/QuillProvider.d.ts +163 -0
  50. package/dist/esm/QuillProvider.d.ts.map +1 -0
  51. package/dist/esm/QuillProvider.js +104 -0
  52. package/dist/esm/ReportBuilder.d.ts +318 -0
  53. package/dist/esm/ReportBuilder.d.ts.map +1 -0
  54. package/dist/esm/ReportBuilder.js +3279 -0
  55. package/dist/esm/SQLEditor.d.ts +272 -0
  56. package/dist/esm/SQLEditor.d.ts.map +1 -0
  57. package/dist/esm/SQLEditor.js +510 -0
  58. package/dist/esm/Table.d.ts +167 -0
  59. package/dist/esm/Table.d.ts.map +1 -0
  60. package/dist/esm/Table.js +215 -0
  61. package/dist/esm/TableChart.d.ts +15 -0
  62. package/dist/esm/TableChart.d.ts.map +1 -0
  63. package/dist/esm/TableChart.js +95 -0
  64. package/dist/esm/assets/ArrowDownHeadIcon.d.ts +5 -0
  65. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -0
  66. package/dist/esm/assets/ArrowDownHeadIcon.js +3 -0
  67. package/dist/esm/assets/ArrowDownIcon.d.ts +5 -0
  68. package/dist/esm/assets/ArrowDownIcon.d.ts.map +1 -0
  69. package/dist/esm/assets/ArrowDownIcon.js +3 -0
  70. package/dist/esm/assets/ArrowDownRightIcon.d.ts +5 -0
  71. package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +1 -0
  72. package/dist/esm/assets/ArrowDownRightIcon.js +3 -0
  73. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts +5 -0
  74. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +1 -0
  75. package/dist/esm/assets/ArrowLeftHeadIcon.js +3 -0
  76. package/dist/esm/assets/ArrowRightHeadIcon.d.ts +5 -0
  77. package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +1 -0
  78. package/dist/esm/assets/ArrowRightHeadIcon.js +3 -0
  79. package/dist/esm/assets/ArrowRightIcon.d.ts +5 -0
  80. package/dist/esm/assets/ArrowRightIcon.d.ts.map +1 -0
  81. package/dist/esm/assets/ArrowRightIcon.js +3 -0
  82. package/dist/esm/assets/ArrowUpHeadIcon.d.ts +5 -0
  83. package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +1 -0
  84. package/dist/esm/assets/ArrowUpHeadIcon.js +3 -0
  85. package/dist/esm/assets/ArrowUpIcon.d.ts +5 -0
  86. package/dist/esm/assets/ArrowUpIcon.d.ts.map +1 -0
  87. package/dist/esm/assets/ArrowUpIcon.js +3 -0
  88. package/dist/esm/assets/ArrowUpRightIcon.d.ts +5 -0
  89. package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +1 -0
  90. package/dist/esm/assets/ArrowUpRightIcon.js +3 -0
  91. package/dist/esm/assets/CalendarIcon.d.ts +5 -0
  92. package/dist/esm/assets/CalendarIcon.d.ts.map +1 -0
  93. package/dist/esm/assets/CalendarIcon.js +3 -0
  94. package/dist/esm/assets/CalendarNormalIcon.d.ts +5 -0
  95. package/dist/esm/assets/CalendarNormalIcon.d.ts.map +1 -0
  96. package/dist/esm/assets/CalendarNormalIcon.js +3 -0
  97. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts +5 -0
  98. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -0
  99. package/dist/esm/assets/DoubleArrowLeftHeadIcon.js +3 -0
  100. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts +5 -0
  101. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -0
  102. package/dist/esm/assets/DoubleArrowRightHeadIcon.js +3 -0
  103. package/dist/esm/assets/ExclamationFilledIcon.d.ts +5 -0
  104. package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -0
  105. package/dist/esm/assets/ExclamationFilledIcon.js +3 -0
  106. package/dist/esm/assets/FilterIcon.d.ts +5 -0
  107. package/dist/esm/assets/FilterIcon.d.ts.map +1 -0
  108. package/dist/esm/assets/FilterIcon.js +3 -0
  109. package/dist/esm/assets/LoadingSpinner.d.ts +5 -0
  110. package/dist/esm/assets/LoadingSpinner.d.ts.map +1 -0
  111. package/dist/esm/assets/LoadingSpinner.js +3 -0
  112. package/dist/esm/assets/RefreshIcon.d.ts +5 -0
  113. package/dist/esm/assets/RefreshIcon.d.ts.map +1 -0
  114. package/dist/esm/assets/RefreshIcon.js +3 -0
  115. package/dist/esm/assets/SearchIcon.d.ts +5 -0
  116. package/dist/esm/assets/SearchIcon.d.ts.map +1 -0
  117. package/dist/esm/assets/SearchIcon.js +3 -0
  118. package/dist/esm/assets/UpLeftArrowsIcon.d.ts +5 -0
  119. package/dist/esm/assets/UpLeftArrowsIcon.d.ts.map +1 -0
  120. package/dist/esm/assets/UpLeftArrowsIcon.js +3 -0
  121. package/dist/esm/assets/XCircleIcon.d.ts +5 -0
  122. package/dist/esm/assets/XCircleIcon.d.ts.map +1 -0
  123. package/dist/esm/assets/XCircleIcon.js +3 -0
  124. package/dist/esm/assets/XIcon.d.ts +5 -0
  125. package/dist/esm/assets/XIcon.d.ts.map +1 -0
  126. package/dist/esm/assets/XIcon.js +3 -0
  127. package/dist/esm/assets/index.d.ts +22 -0
  128. package/dist/esm/assets/index.d.ts.map +1 -0
  129. package/dist/esm/assets/index.js +21 -0
  130. package/dist/esm/components/Banner/index.d.ts +3 -0
  131. package/dist/esm/components/Banner/index.d.ts.map +1 -0
  132. package/dist/esm/components/Banner/index.js +24 -0
  133. package/dist/esm/components/BigModal/BigModal.d.ts +15 -0
  134. package/dist/esm/components/BigModal/BigModal.d.ts.map +1 -0
  135. package/dist/esm/components/BigModal/BigModal.js +56 -0
  136. package/dist/esm/components/Chart/BarChart.d.ts +23 -0
  137. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -0
  138. package/dist/esm/components/Chart/BarChart.js +110 -0
  139. package/dist/esm/components/Chart/BarList.d.ts +27 -0
  140. package/dist/esm/components/Chart/BarList.d.ts.map +1 -0
  141. package/dist/esm/components/Chart/BarList.js +148 -0
  142. package/dist/esm/components/Chart/ChartError.d.ts +10 -0
  143. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -0
  144. package/dist/esm/components/Chart/ChartError.js +65 -0
  145. package/dist/esm/components/Chart/ChartSkeleton.d.ts +8 -0
  146. package/dist/esm/components/Chart/ChartSkeleton.d.ts.map +1 -0
  147. package/dist/esm/components/Chart/ChartSkeleton.js +19 -0
  148. package/dist/esm/components/Chart/ChartTooltip.d.ts +31 -0
  149. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -0
  150. package/dist/esm/components/Chart/ChartTooltip.js +234 -0
  151. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts +6 -0
  152. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts.map +1 -0
  153. package/dist/esm/components/Chart/ChartTooltipFrame.js +14 -0
  154. package/dist/esm/components/Chart/ChartTooltipGroup.d.ts +11 -0
  155. package/dist/esm/components/Chart/ChartTooltipGroup.d.ts.map +1 -0
  156. package/dist/esm/components/Chart/ChartTooltipGroup.js +23 -0
  157. package/dist/esm/components/Chart/ChartTooltipRow.d.ts +8 -0
  158. package/dist/esm/components/Chart/ChartTooltipRow.d.ts.map +1 -0
  159. package/dist/esm/components/Chart/ChartTooltipRow.js +41 -0
  160. package/dist/esm/components/Chart/LineChart.d.ts +29 -0
  161. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -0
  162. package/dist/esm/components/Chart/LineChart.js +163 -0
  163. package/dist/esm/components/Chart/PieChart.d.ts +62 -0
  164. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -0
  165. package/dist/esm/components/Chart/PieChart.js +195 -0
  166. package/dist/esm/components/Dashboard/ChartComponent.d.ts +4 -0
  167. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -0
  168. package/dist/esm/components/Dashboard/ChartComponent.js +60 -0
  169. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +38 -0
  170. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -0
  171. package/dist/esm/components/Dashboard/DashboardFilter.js +89 -0
  172. package/dist/esm/components/Dashboard/DashboardSection.d.ts +7 -0
  173. package/dist/esm/components/Dashboard/DashboardSection.d.ts.map +1 -0
  174. package/dist/esm/components/Dashboard/DashboardSection.js +22 -0
  175. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts +3 -0
  176. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts.map +1 -0
  177. package/dist/esm/components/Dashboard/DashboardSectionContainer.js +10 -0
  178. package/dist/esm/components/Dashboard/DataLoader.d.ts +44 -0
  179. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -0
  180. package/dist/esm/components/Dashboard/DataLoader.js +190 -0
  181. package/dist/esm/components/Dashboard/MetricComponent.d.ts +4 -0
  182. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -0
  183. package/dist/esm/components/Dashboard/MetricComponent.js +133 -0
  184. package/dist/esm/components/Dashboard/TableComponent.d.ts +15 -0
  185. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -0
  186. package/dist/esm/components/Dashboard/TableComponent.js +62 -0
  187. package/dist/esm/components/Dropdown/Dropdown.d.ts +14 -0
  188. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -0
  189. package/dist/esm/components/Dropdown/Dropdown.js +69 -0
  190. package/dist/esm/components/Dropdown/DropdownItem.d.ts +11 -0
  191. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -0
  192. package/dist/esm/components/Dropdown/DropdownItem.js +37 -0
  193. package/dist/esm/components/Dropdown/index.d.ts +3 -0
  194. package/dist/esm/components/Dropdown/index.d.ts.map +1 -0
  195. package/dist/esm/components/Dropdown/index.js +2 -0
  196. package/dist/esm/components/Modal/Modal.d.ts +15 -0
  197. package/dist/esm/components/Modal/Modal.d.ts.map +1 -0
  198. package/dist/esm/components/Modal/Modal.js +64 -0
  199. package/dist/esm/components/Modal/index.d.ts +2 -0
  200. package/dist/esm/components/Modal/index.d.ts.map +1 -0
  201. package/dist/esm/components/Modal/index.js +1 -0
  202. package/dist/esm/components/QuillCard.d.ts +9 -0
  203. package/dist/esm/components/QuillCard.d.ts.map +1 -0
  204. package/dist/esm/components/QuillCard.js +56 -0
  205. package/dist/esm/components/QuillMultiSelect.d.ts +11 -0
  206. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -0
  207. package/dist/esm/components/QuillMultiSelect.js +193 -0
  208. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts +11 -0
  209. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -0
  210. package/dist/esm/components/QuillMultiSelectWithCombo.js +215 -0
  211. package/dist/esm/components/QuillSelect.d.ts +6 -0
  212. package/dist/esm/components/QuillSelect.d.ts.map +1 -0
  213. package/dist/esm/components/QuillSelect.js +136 -0
  214. package/dist/esm/components/QuillSelectWithCombo.d.ts +6 -0
  215. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -0
  216. package/dist/esm/components/QuillSelectWithCombo.js +163 -0
  217. package/dist/esm/components/QuillTable.d.ts +31 -0
  218. package/dist/esm/components/QuillTable.d.ts.map +1 -0
  219. package/dist/esm/components/QuillTable.js +261 -0
  220. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +34 -0
  221. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  222. package/dist/esm/components/ReportBuilder/AddColumnModal.js +145 -0
  223. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +26 -0
  224. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -0
  225. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +36 -0
  226. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +23 -0
  227. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -0
  228. package/dist/esm/components/ReportBuilder/AddSortPopover.js +73 -0
  229. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +30 -0
  230. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  231. package/dist/esm/components/ReportBuilder/FilterModal.js +576 -0
  232. package/dist/esm/components/ReportBuilder/ast.d.ts +523 -0
  233. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -0
  234. package/dist/esm/components/ReportBuilder/ast.js +230 -0
  235. package/dist/esm/components/ReportBuilder/bigDateMap.d.ts +7 -0
  236. package/dist/esm/components/ReportBuilder/bigDateMap.d.ts.map +1 -0
  237. package/dist/esm/components/ReportBuilder/bigDateMap.js +687 -0
  238. package/dist/esm/components/ReportBuilder/constants.d.ts +117 -0
  239. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -0
  240. package/dist/esm/components/ReportBuilder/constants.js +161 -0
  241. package/dist/esm/components/ReportBuilder/convert.d.ts +65 -0
  242. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -0
  243. package/dist/esm/components/ReportBuilder/convert.js +717 -0
  244. package/dist/esm/components/ReportBuilder/operators.d.ts +462 -0
  245. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -0
  246. package/dist/esm/components/ReportBuilder/operators.js +581 -0
  247. package/dist/esm/components/ReportBuilder/pivot.d.ts +16 -0
  248. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -0
  249. package/dist/esm/components/ReportBuilder/pivot.js +1 -0
  250. package/dist/esm/components/ReportBuilder/postgres.d.ts +150 -0
  251. package/dist/esm/components/ReportBuilder/postgres.d.ts.map +1 -0
  252. package/dist/esm/components/ReportBuilder/postgres.js +355 -0
  253. package/dist/esm/components/ReportBuilder/schema.d.ts +23 -0
  254. package/dist/esm/components/ReportBuilder/schema.d.ts.map +1 -0
  255. package/dist/esm/components/ReportBuilder/schema.js +1 -0
  256. package/dist/esm/components/ReportBuilder/ui.d.ts +119 -0
  257. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -0
  258. package/dist/esm/components/ReportBuilder/ui.js +382 -0
  259. package/dist/esm/components/ReportBuilder/util.d.ts +76 -0
  260. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -0
  261. package/dist/esm/components/ReportBuilder/util.js +729 -0
  262. package/dist/esm/components/UiComponents.d.ts +221 -0
  263. package/dist/esm/components/UiComponents.d.ts.map +1 -0
  264. package/dist/esm/components/UiComponents.js +571 -0
  265. package/dist/esm/components/selectUtils.d.ts +9 -0
  266. package/dist/esm/components/selectUtils.d.ts.map +1 -0
  267. package/dist/esm/components/selectUtils.js +17 -0
  268. package/dist/esm/contexts/BaseColorContext.d.ts +4 -0
  269. package/dist/esm/contexts/BaseColorContext.d.ts.map +1 -0
  270. package/dist/esm/contexts/BaseColorContext.js +3 -0
  271. package/dist/esm/contexts/HoveredValueContext.d.ts +8 -0
  272. package/dist/esm/contexts/HoveredValueContext.d.ts.map +1 -0
  273. package/dist/esm/contexts/HoveredValueContext.js +5 -0
  274. package/dist/esm/contexts/RootStylesContext.d.ts +4 -0
  275. package/dist/esm/contexts/RootStylesContext.d.ts.map +1 -0
  276. package/dist/esm/contexts/RootStylesContext.js +3 -0
  277. package/dist/esm/contexts/SelectedValueContext.d.ts +8 -0
  278. package/dist/esm/contexts/SelectedValueContext.d.ts.map +1 -0
  279. package/dist/esm/contexts/SelectedValueContext.js +6 -0
  280. package/dist/esm/contexts/index.d.ts +5 -0
  281. package/dist/esm/contexts/index.d.ts.map +1 -0
  282. package/dist/esm/contexts/index.js +4 -0
  283. package/dist/esm/hooks/index.d.ts +6 -0
  284. package/dist/esm/hooks/index.d.ts.map +1 -0
  285. package/dist/esm/hooks/index.js +5 -0
  286. package/dist/esm/hooks/useAstToFilterTree.d.ts +11 -0
  287. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -0
  288. package/dist/esm/hooks/useAstToFilterTree.js +24 -0
  289. package/dist/esm/hooks/useDashboard.d.ts +7 -0
  290. package/dist/esm/hooks/useDashboard.d.ts.map +1 -0
  291. package/dist/esm/hooks/useDashboard.js +69 -0
  292. package/dist/esm/hooks/useExport.d.ts +6 -0
  293. package/dist/esm/hooks/useExport.d.ts.map +1 -0
  294. package/dist/esm/hooks/useExport.js +125 -0
  295. package/dist/esm/hooks/useFormat.d.ts +5 -0
  296. package/dist/esm/hooks/useFormat.d.ts.map +1 -0
  297. package/dist/esm/hooks/useFormat.js +25 -0
  298. package/dist/esm/hooks/useInternalState.d.ts +4 -0
  299. package/dist/esm/hooks/useInternalState.d.ts.map +1 -0
  300. package/dist/esm/hooks/useInternalState.js +14 -0
  301. package/dist/esm/hooks/useOnClickOutside.d.ts +3 -0
  302. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -0
  303. package/dist/esm/hooks/useOnClickOutside.js +18 -0
  304. package/dist/esm/hooks/useOnWindowResize.d.ts +5 -0
  305. package/dist/esm/hooks/useOnWindowResize.d.ts.map +1 -0
  306. package/dist/esm/hooks/useOnWindowResize.js +14 -0
  307. package/dist/esm/hooks/useQuill.d.ts +37 -0
  308. package/dist/esm/hooks/useQuill.d.ts.map +1 -0
  309. package/dist/esm/hooks/useQuill.js +182 -0
  310. package/dist/esm/hooks/useSelectOnKeyDown.d.ts +3 -0
  311. package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -0
  312. package/dist/esm/hooks/useSelectOnKeyDown.js +63 -0
  313. package/dist/esm/hooks/useTheme.d.ts +7 -0
  314. package/dist/esm/hooks/useTheme.d.ts.map +1 -0
  315. package/dist/esm/hooks/useTheme.js +10 -0
  316. package/dist/esm/index.d.ts +29 -0
  317. package/dist/esm/index.d.ts.map +1 -0
  318. package/dist/esm/index.js +16 -0
  319. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +28 -0
  320. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -0
  321. package/dist/esm/internals/ReportBuilder/PivotForm.js +62 -0
  322. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +39 -0
  323. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -0
  324. package/dist/esm/internals/ReportBuilder/PivotList.js +89 -0
  325. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +146 -0
  326. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -0
  327. package/dist/esm/internals/ReportBuilder/PivotModal.js +1210 -0
  328. package/dist/esm/lib/font.d.ts +14 -0
  329. package/dist/esm/lib/font.d.ts.map +1 -0
  330. package/dist/esm/lib/font.js +13 -0
  331. package/dist/esm/lib/index.d.ts +4 -0
  332. package/dist/esm/lib/index.d.ts.map +1 -0
  333. package/dist/esm/lib/index.js +3 -0
  334. package/dist/esm/lib/inputTypes.d.ts +21 -0
  335. package/dist/esm/lib/inputTypes.d.ts.map +1 -0
  336. package/dist/esm/lib/inputTypes.js +55 -0
  337. package/dist/esm/lib/utils.d.ts +10 -0
  338. package/dist/esm/lib/utils.d.ts.map +1 -0
  339. package/dist/esm/lib/utils.js +35 -0
  340. package/dist/esm/models/Columns.d.ts +12 -0
  341. package/dist/esm/models/Columns.d.ts.map +1 -0
  342. package/dist/esm/models/Columns.js +1 -0
  343. package/dist/esm/models/Filter.d.ts +118 -0
  344. package/dist/esm/models/Filter.d.ts.map +1 -0
  345. package/dist/esm/models/Filter.js +98 -0
  346. package/dist/esm/models/Pagination.d.ts +10 -0
  347. package/dist/esm/models/Pagination.d.ts.map +1 -0
  348. package/dist/esm/models/Pagination.js +1 -0
  349. package/dist/esm/models/Pivots.d.ts +2 -0
  350. package/dist/esm/models/Pivots.d.ts.map +1 -0
  351. package/dist/esm/models/Pivots.js +1 -0
  352. package/dist/esm/models/Report.d.ts +103 -0
  353. package/dist/esm/models/Report.d.ts.map +1 -0
  354. package/dist/esm/models/Report.js +1 -0
  355. package/dist/esm/models/Tables.d.ts +8 -0
  356. package/dist/esm/models/Tables.d.ts.map +1 -0
  357. package/dist/esm/models/Tables.js +1 -0
  358. package/dist/esm/utils/aggregate.d.ts +4 -0
  359. package/dist/esm/utils/aggregate.d.ts.map +1 -0
  360. package/dist/esm/utils/aggregate.js +422 -0
  361. package/dist/esm/utils/astFilterProcessing.d.ts +36 -0
  362. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -0
  363. package/dist/esm/utils/astFilterProcessing.js +8084 -0
  364. package/dist/esm/utils/astProcessing.d.ts +26 -0
  365. package/dist/esm/utils/astProcessing.d.ts.map +1 -0
  366. package/dist/esm/utils/astProcessing.js +254 -0
  367. package/dist/esm/utils/axisFormatter.d.ts +20 -0
  368. package/dist/esm/utils/axisFormatter.d.ts.map +1 -0
  369. package/dist/esm/utils/axisFormatter.js +179 -0
  370. package/dist/esm/utils/color.d.ts +44 -0
  371. package/dist/esm/utils/color.d.ts.map +1 -0
  372. package/dist/esm/utils/color.js +425 -0
  373. package/dist/esm/utils/columnProcessing.d.ts +13 -0
  374. package/dist/esm/utils/columnProcessing.d.ts.map +1 -0
  375. package/dist/esm/utils/columnProcessing.js +260 -0
  376. package/dist/esm/utils/constants.d.ts +3 -0
  377. package/dist/esm/utils/constants.d.ts.map +1 -0
  378. package/dist/esm/utils/constants.js +2 -0
  379. package/dist/esm/utils/crypto.d.ts +2 -0
  380. package/dist/esm/utils/crypto.d.ts.map +1 -0
  381. package/dist/esm/utils/crypto.js +10 -0
  382. package/dist/esm/utils/csv.d.ts +6 -0
  383. package/dist/esm/utils/csv.d.ts.map +1 -0
  384. package/dist/esm/utils/csv.js +78 -0
  385. package/dist/esm/utils/dashboard.d.ts +13 -0
  386. package/dist/esm/utils/dashboard.d.ts.map +1 -0
  387. package/dist/esm/utils/dashboard.js +171 -0
  388. package/dist/esm/utils/dataFetcher.d.ts +3 -0
  389. package/dist/esm/utils/dataFetcher.d.ts.map +1 -0
  390. package/dist/esm/utils/dataFetcher.js +205 -0
  391. package/dist/esm/utils/dataProcessing.d.ts +11 -0
  392. package/dist/esm/utils/dataProcessing.d.ts.map +1 -0
  393. package/dist/esm/utils/dataProcessing.js +162 -0
  394. package/dist/esm/utils/dates.d.ts +20 -0
  395. package/dist/esm/utils/dates.d.ts.map +1 -0
  396. package/dist/esm/utils/dates.js +95 -0
  397. package/dist/esm/utils/error.d.ts +5 -0
  398. package/dist/esm/utils/error.d.ts.map +1 -0
  399. package/dist/esm/utils/error.js +8 -0
  400. package/dist/esm/utils/errorProcessing.d.ts +2 -0
  401. package/dist/esm/utils/errorProcessing.d.ts.map +1 -0
  402. package/dist/esm/utils/errorProcessing.js +5 -0
  403. package/dist/esm/utils/filterConstants.d.ts +34 -0
  404. package/dist/esm/utils/filterConstants.d.ts.map +1 -0
  405. package/dist/esm/utils/filterConstants.js +33 -0
  406. package/dist/esm/utils/filterProcessing.d.ts +10 -0
  407. package/dist/esm/utils/filterProcessing.d.ts.map +1 -0
  408. package/dist/esm/utils/filterProcessing.js +232 -0
  409. package/dist/esm/utils/getDomain.d.ts +8 -0
  410. package/dist/esm/utils/getDomain.d.ts.map +1 -0
  411. package/dist/esm/utils/getDomain.js +52 -0
  412. package/dist/esm/utils/logging.d.ts +2 -0
  413. package/dist/esm/utils/logging.d.ts.map +1 -0
  414. package/dist/esm/utils/logging.js +7 -0
  415. package/dist/esm/utils/merge.d.ts +2 -0
  416. package/dist/esm/utils/merge.d.ts.map +1 -0
  417. package/dist/esm/utils/merge.js +18 -0
  418. package/dist/esm/utils/monacoConfig.d.ts +21 -0
  419. package/dist/esm/utils/monacoConfig.d.ts.map +1 -0
  420. package/dist/esm/utils/monacoConfig.js +319 -0
  421. package/dist/esm/utils/paginationProcessing.d.ts +5 -0
  422. package/dist/esm/utils/paginationProcessing.d.ts.map +1 -0
  423. package/dist/esm/utils/paginationProcessing.js +25 -0
  424. package/dist/esm/utils/parserBigQuery.d.ts +6 -0
  425. package/dist/esm/utils/parserBigQuery.d.ts.map +1 -0
  426. package/dist/esm/utils/parserBigQuery.js +52 -0
  427. package/dist/esm/utils/parserPostgres.d.ts +3 -0
  428. package/dist/esm/utils/parserPostgres.d.ts.map +1 -0
  429. package/dist/esm/utils/parserPostgres.js +37 -0
  430. package/dist/esm/utils/pivotConstructor.d.ts +7 -0
  431. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -0
  432. package/dist/esm/utils/pivotConstructor.js +151 -0
  433. package/dist/esm/utils/pivotProcessing.d.ts +17 -0
  434. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  435. package/dist/esm/utils/pivotProcessing.js +135 -0
  436. package/dist/esm/utils/queryConstructor.d.ts +7 -0
  437. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  438. package/dist/esm/utils/queryConstructor.js +226 -0
  439. package/dist/esm/utils/report.d.ts +10 -0
  440. package/dist/esm/utils/report.d.ts.map +1 -0
  441. package/dist/esm/utils/report.js +186 -0
  442. package/dist/esm/utils/schema.d.ts +6 -0
  443. package/dist/esm/utils/schema.d.ts.map +1 -0
  444. package/dist/esm/utils/schema.js +156 -0
  445. package/dist/esm/utils/styles.d.ts +17 -0
  446. package/dist/esm/utils/styles.d.ts.map +1 -0
  447. package/dist/esm/utils/styles.js +16 -0
  448. package/dist/esm/utils/tableProcessing.d.ts +45 -0
  449. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  450. package/dist/esm/utils/tableProcessing.js +301 -0
  451. package/dist/esm/utils/textProcessing.d.ts +6 -0
  452. package/dist/esm/utils/textProcessing.d.ts.map +1 -0
  453. package/dist/esm/utils/textProcessing.js +49 -0
  454. package/dist/esm/utils/validation.d.ts +9 -0
  455. package/dist/esm/utils/validation.d.ts.map +1 -0
  456. package/dist/esm/utils/validation.js +20 -0
  457. package/dist/esm/utils/valueFormatter.d.ts +29 -0
  458. package/dist/esm/utils/valueFormatter.d.ts.map +1 -0
  459. package/dist/esm/utils/valueFormatter.js +342 -0
  460. package/dist/esm/utils/width.d.ts +12 -0
  461. package/dist/esm/utils/width.d.ts.map +1 -0
  462. package/dist/esm/utils/width.js +21 -0
  463. package/package.json +1 -1
@@ -0,0 +1,1210 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useContext, useMemo, useState, useEffect, useRef, } from 'react';
3
+ import { ClientContext, CustomFieldContext } from '../../Context';
4
+ import { getDataFromCloud } from '../../utils/dataFetcher';
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';
9
+ import { snakeAndCamelCaseToTitleCase } from '../../utils/textProcessing';
10
+ import { QuillErrorMessageComponent, QuillLoadingComponent, QuillPivotColumnContainer, QuillPivotRowContainer, } from '../../components/UiComponents';
11
+ import { isNumericColumnType } from '../../components/ReportBuilder/ast';
12
+ import { QuillCard } from '../../components/QuillCard';
13
+ import { cleanPivot, getPossiblePivotFieldOptions, isValidPivot, } from '../../utils/pivotProcessing';
14
+ import { hashCode } from '../../utils/crypto';
15
+ import { getCountsByColumns, getDateRangeByColumns, getUniqueValuesByColumns, } from '../../utils/tableProcessing';
16
+ import { generatePivotWithSQL } from '../../utils/pivotConstructor';
17
+ import { getDateBucketFromRange } from '../../utils/dates';
18
+ 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, initialSelectedPivotTable, disabled = false, pivotRecommendationsEnabled = true, report, }) => {
19
+ const [isLoading, setIsLoading] = useState(false);
20
+ const [selectedPivotType, setSelectedPivotType] = useState('recommended');
21
+ const [errors, setErrors] = useState([]);
22
+ const [client] = useContext(ClientContext);
23
+ const [customFields] = useContext(CustomFieldContext);
24
+ const rowFieldRef = useRef(null);
25
+ const colFieldRef = useRef(null);
26
+ const [pivotCardWidth, setPivotCardWidth] = useState(420);
27
+ const [samplePivotTable, setSamplePivotTable] = useState(null);
28
+ const [allowedColumnFields, setAllowedColumnFields] = useState([]);
29
+ const [allowedRowFields, setAllowedRowFields] = useState([]);
30
+ const [allowedValueFields, setAllowedValueFields] = useState([]);
31
+ const [uniqueValues, setUniqueValues] = useState(initialUniqueValues);
32
+ const [dateRanges, setDateRanges] = useState({});
33
+ const getDistinctValues = async () => {
34
+ if (columns) {
35
+ const stringColumns = columns.filter((column) => {
36
+ return column.jsType === 'string';
37
+ });
38
+ if (stringColumns.length === 0) {
39
+ const possibleColumns = getPossiblePivotFieldOptions(columns, {});
40
+ setAllowedRowFields(possibleColumns.rowFields);
41
+ setAllowedColumnFields(possibleColumns.columnFields);
42
+ setAllowedValueFields(possibleColumns.valueFields);
43
+ return { possibleColumns, uniqueValues: {} };
44
+ }
45
+ const smallStringColumns = await getCountsByColumns(stringColumns, query || '', client, customFields);
46
+ const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, query || '', data.rows || [], client, customFields);
47
+ if (!uniqueValues ||
48
+ hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
49
+ const possibleColumns = getPossiblePivotFieldOptions(columns, newUniqueValues || {});
50
+ setAllowedRowFields(possibleColumns.rowFields);
51
+ setAllowedColumnFields(possibleColumns.columnFields);
52
+ setAllowedValueFields(possibleColumns.valueFields);
53
+ setUniqueValues(newUniqueValues);
54
+ return { possibleColumns, uniqueValues: newUniqueValues };
55
+ }
56
+ }
57
+ return {
58
+ possibleColumns: { rowFields: [], columnFields: [], valueFields: [] },
59
+ uniqueValues: {},
60
+ };
61
+ };
62
+ const getAllDateRangesByColumn = async () => {
63
+ // Don't reprocess dateRanges if they are already gathered
64
+ if (columns) {
65
+ const dateColumns = columns.filter((column) => {
66
+ return column.jsType === 'date';
67
+ });
68
+ if (dateColumns.length === 0) {
69
+ return [];
70
+ }
71
+ const dateRangeByColumn = await getDateRangeByColumns(dateColumns, query || '', client, customFields);
72
+ setDateRanges(dateRangeByColumn || {});
73
+ }
74
+ };
75
+ useEffect(() => {
76
+ const calculatePivotCardSize = () => {
77
+ // The pivot card should be the same width as the row of inputs
78
+ // below it (two selects, plus the gap between them).
79
+ if (rowFieldRef.current && colFieldRef.current) {
80
+ const rowFieldSize = rowFieldRef.current?.getBoundingClientRect();
81
+ const colFieldSize = colFieldRef.current?.getBoundingClientRect();
82
+ const selectWidth = rowFieldSize.width;
83
+ const gap = colFieldSize.left - rowFieldSize.right;
84
+ const width = 2 * selectWidth + gap;
85
+ setPivotCardWidth(width);
86
+ }
87
+ };
88
+ if (rowFieldRef.current && colFieldRef.current) {
89
+ setTimeout(() => {
90
+ calculatePivotCardSize();
91
+ }, 0);
92
+ }
93
+ else {
94
+ setTimeout(() => {
95
+ calculatePivotCardSize();
96
+ }, 500);
97
+ }
98
+ }, [showUpdatePivot, isOpen]);
99
+ useEffect(() => {
100
+ const fetchPivotData = async () => {
101
+ if (pivotRowField && data && columns) {
102
+ const pivot = {
103
+ rowField: pivotRowField || '',
104
+ rowFieldType: columnsToShow[pivotRowField || ''],
105
+ columnField: pivotColumnField,
106
+ columnFieldType: columnsToShow[pivotColumnField || ''],
107
+ valueField: pivotValueField || '',
108
+ aggregationType: pivotAggregation || '',
109
+ };
110
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
111
+ setSamplePivotTable({ pivot: pivot, rows, columns });
112
+ }
113
+ if ((pivotRowField && data && columns) || initialSelectedPivotTable) {
114
+ getDistinctValues();
115
+ }
116
+ if (initialUniqueValues) {
117
+ const possibleColumns = getPossiblePivotFieldOptions(columns, initialUniqueValues);
118
+ setAllowedRowFields(possibleColumns.rowFields);
119
+ setAllowedColumnFields(possibleColumns.columnFields);
120
+ setAllowedValueFields(possibleColumns.valueFields);
121
+ setUniqueValues(initialUniqueValues);
122
+ }
123
+ if (pivotRowField && data && columns) {
124
+ const pivot = {
125
+ rowField: pivotRowField || '',
126
+ rowFieldType: columnsToShow[pivotRowField || ''],
127
+ columnField: pivotColumnField,
128
+ columnFieldType: columnsToShow[pivotColumnField || ''],
129
+ valueField: pivotValueField || '',
130
+ aggregationType: pivotAggregation || '',
131
+ };
132
+ if (initialSelectedPivotTable) {
133
+ setSamplePivotTable({
134
+ pivot: pivot,
135
+ rows: initialSelectedPivotTable.rows,
136
+ columns: initialSelectedPivotTable.columns,
137
+ });
138
+ }
139
+ else {
140
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
141
+ setSamplePivotTable({ pivot: pivot, rows, columns });
142
+ }
143
+ }
144
+ };
145
+ fetchPivotData();
146
+ }, []);
147
+ useEffect(() => {
148
+ if (pivotRowField && data && columns) {
149
+ getDistinctValues();
150
+ getAllDateRangesByColumn();
151
+ }
152
+ else if (initialSelectedPivotTable) {
153
+ getDistinctValues();
154
+ }
155
+ }, [initialSelectedPivotTable, columns, data, pivotRowField]);
156
+ useEffect(() => {
157
+ if (!initialUniqueValues) {
158
+ return;
159
+ }
160
+ const possibleColumns = getPossiblePivotFieldOptions(columns, initialUniqueValues);
161
+ setAllowedRowFields(possibleColumns.rowFields);
162
+ setAllowedColumnFields(possibleColumns.columnFields);
163
+ setAllowedValueFields(possibleColumns.valueFields);
164
+ setUniqueValues(initialUniqueValues);
165
+ }, [initialUniqueValues, columns]);
166
+ const columnsToShow = useMemo(() => {
167
+ return (columns || []).reduce((map, col) => {
168
+ // only use columns shown in the report builder's table
169
+ // also filter out id
170
+ if (col.field !== 'id') {
171
+ map[col.field] = col.format;
172
+ }
173
+ return map;
174
+ }, {});
175
+ }, [columns]);
176
+ const [selectedPivotTable, setSelectedPivotTable] = useState(null);
177
+ useEffect(() => {
178
+ const fetchPivotTables = async () => {
179
+ if (selectedPivotIndex === -1) {
180
+ return null;
181
+ }
182
+ const pivot = createdPivots[selectedPivotIndex];
183
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, undefined, report, client, uniqueValues);
184
+ setSelectedPivotTable({
185
+ pivot: pivot,
186
+ rows: rows,
187
+ columns: columns,
188
+ });
189
+ };
190
+ fetchPivotTables();
191
+ }, [selectedPivotIndex, data, dateRange, createdPivots]);
192
+ const onSelectRecommendedPivot = (pivot, index) => {
193
+ if (showEditOnPivotClick) {
194
+ onEditPivot(pivot, index, 'recommended');
195
+ return;
196
+ }
197
+ if (index === selectedPivotIndex && selectedPivotType === 'recommended') {
198
+ removePivot();
199
+ }
200
+ else {
201
+ selectPivot(pivot);
202
+ setSelectedPivotType('recommended');
203
+ }
204
+ setIsOpen(false);
205
+ };
206
+ const onSelectCreatedPivot = (pivot) => {
207
+ selectPivot(pivot, pivot.columnField ? uniqueValues : undefined, dateRanges[pivot.rowField]?.dateRange, samplePivotTable);
208
+ setSelectedPivotType('created');
209
+ setIsOpen(false);
210
+ setPopUpTitle('Add pivot');
211
+ };
212
+ const onEditPivot = async (pivot, index, pivotType) => {
213
+ setIsLoading(false);
214
+ setPivotRowField(pivot.rowField);
215
+ setPivotColumnField(pivot.columnField);
216
+ setPivotValueField(pivot.valueField);
217
+ setPivotAggregation(pivot.aggregationType);
218
+ setShowUpdatePivot(true);
219
+ if (pivotType === 'recommended' &&
220
+ index !== null &&
221
+ recommendedPivotTables[index]) {
222
+ setSamplePivotTable(recommendedPivotTables[index]);
223
+ return;
224
+ }
225
+ if (isValidPivot(pivot)) {
226
+ let dateBucket = undefined;
227
+ if (pivotRowField && dateRanges[pivotRowField]) {
228
+ dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
229
+ }
230
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
231
+ setSamplePivotTable({ pivot, rows, columns });
232
+ return;
233
+ }
234
+ setSamplePivotTable(null);
235
+ };
236
+ const onEditRecommendedPivot = (pivot) => {
237
+ onEditPivot(pivot, null);
238
+ };
239
+ const refreshPivots = useCallback(async () => {
240
+ if (isLoading ||
241
+ Object.keys(columnsToShow).length === 0 ||
242
+ !pivotRecommendationsEnabled) {
243
+ return;
244
+ }
245
+ setIsLoading(true);
246
+ let tempUniqueValues = uniqueValues;
247
+ let possibleColumns = {
248
+ rowFields: allowedRowFields,
249
+ columnFields: allowedColumnFields,
250
+ valueFields: allowedValueFields,
251
+ };
252
+ if ((allowedRowFields.length === 0 &&
253
+ allowedColumnFields.length === 0 &&
254
+ allowedValueFields.length === 0) ||
255
+ !uniqueValues) {
256
+ const distinctValues = await getDistinctValues();
257
+ possibleColumns = distinctValues.possibleColumns;
258
+ tempUniqueValues = distinctValues.uniqueValues;
259
+ }
260
+ const cloudBody = {
261
+ pivotCountRequest,
262
+ allowedRowFields: possibleColumns?.rowFields || [],
263
+ allowedColumnFields: possibleColumns?.columnFields || [],
264
+ allowedValueFields: possibleColumns?.valueFields || [],
265
+ tableSchema: Object.keys(columnsToShow).reduce(function (map, col) {
266
+ // stop ai from seeing date fields. this is meant to stop the ai
267
+ // pivot tables from extracting month and year from the date
268
+ const fieldType = isDateField(columnsToShow[col])
269
+ ? 'string'
270
+ : columnsToShow[col];
271
+ map[col] = fieldType;
272
+ return map;
273
+ }, {}),
274
+ };
275
+ try {
276
+ const resp = await getDataFromCloud(client, 'pivotai', cloudBody);
277
+ const recommendedPivots = resp?.data?.pivotTables.map((pivot) => cleanPivot(pivot, possibleColumns)) || [];
278
+ const cleanedPivots = recommendedPivots.map((pivot) => {
279
+ if (pivot.columnField && columnsToShow[pivot.columnField] === 'date') {
280
+ const columnField = pivot.columnField;
281
+ pivot.columnField = pivot.rowField;
282
+ pivot.rowField = columnField;
283
+ }
284
+ return {
285
+ ...pivot,
286
+ rowFieldType: columnsToShow[pivot.rowField],
287
+ columnFieldType: pivot.columnField
288
+ ? columnsToShow[pivot.columnField]
289
+ : undefined,
290
+ title: generatePivotTitle(pivot),
291
+ };
292
+ });
293
+ setRecommendedPivots(cleanedPivots);
294
+ const pts = await Promise.all(cleanedPivots.map(async (p) => {
295
+ const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, tempUniqueValues);
296
+ return { pivot: p, rows, columns };
297
+ }));
298
+ setRecommendedPivotTables(pts);
299
+ setSelectedPivotIndex(-1);
300
+ }
301
+ catch (e) {
302
+ console.error('Failed parsing pivotai response', e);
303
+ }
304
+ setIsLoading(false);
305
+ }, [
306
+ selectedTable,
307
+ data,
308
+ columnsToShow,
309
+ isLoading,
310
+ showTrigger,
311
+ allowedColumnFields,
312
+ allowedRowFields,
313
+ allowedValueFields,
314
+ columns,
315
+ ]);
316
+ const pivotFieldChange = async (field, value) => {
317
+ setErrors([]);
318
+ setIsLoading(true);
319
+ const pivot = {
320
+ rowField: pivotRowField,
321
+ rowFieldType: columnsToShow[pivotRowField],
322
+ columnField: pivotColumnField,
323
+ valueField: pivotValueField,
324
+ aggregationType: pivotAggregation,
325
+ };
326
+ // @ts-ignore
327
+ pivot[field] = value;
328
+ pivot.title = generatePivotTitle(pivot);
329
+ if (field === 'rowField') {
330
+ pivot.rowFieldType = columnsToShow[value];
331
+ }
332
+ else if (field === 'columnField') {
333
+ pivot.columnFieldType = columnsToShow[value];
334
+ }
335
+ if (!isValidPivot(pivot)) {
336
+ setIsLoading(false);
337
+ setSamplePivotTable(null);
338
+ return;
339
+ }
340
+ let dateBucket = undefined;
341
+ if (pivotRowField && dateRanges[pivotRowField]) {
342
+ dateBucket = getDateBucketFromRange(dateRanges[pivotRowField].dateRange);
343
+ }
344
+ setTimeout(async () => {
345
+ const { rows, columns } = await generatePivotTable(pivot, data, dateRange, false, -1, undefined, dateBucket, report, client, uniqueValues);
346
+ setSamplePivotTable({ pivot, rows, columns });
347
+ setIsLoading(false);
348
+ }, 500);
349
+ };
350
+ const [recommendedPivotTables, setRecommendedPivotTables] = useState([]);
351
+ // useEffect(() => {
352
+ // const fetchPivotTables = async () => {
353
+ // const pts = await Promise.all(
354
+ // recommendedPivots.map(async (p: Pivot) => {
355
+ // const { rows, columns } = await generatePivotTable(
356
+ // p,
357
+ // data,
358
+ // dateRange,
359
+ // false,
360
+ // 6,
361
+ // undefined,
362
+ // undefined,
363
+ // report,
364
+ // client,
365
+ // uniqueValues,
366
+ // );
367
+ // return { pivot: p, rows, columns };
368
+ // }),
369
+ // );
370
+ // setRecommendedPivotTables(pts);
371
+ // };
372
+ // fetchPivotTables();
373
+ // }, [recommendedPivots, dateRange]);
374
+ const [createdPivotTables, setCreatedPivotTables] = useState([]);
375
+ useEffect(() => {
376
+ const fetchPivotTables = async () => {
377
+ const pts = await Promise.all(createdPivots.map(async (p) => {
378
+ const { rows, columns } = await generatePivotTable(p, data, dateRange, false, 6, undefined, undefined, report, client, uniqueValues);
379
+ return { pivot: p, rows, columns };
380
+ }));
381
+ setCreatedPivotTables(pts);
382
+ };
383
+ fetchPivotTables();
384
+ }, [createdPivots, dateRange]);
385
+ return (_jsx("div", { style: { display: 'flex', flexDirection: 'column' }, children: _jsxs("div", { style: {
386
+ position: 'relative',
387
+ display: 'inline-block',
388
+ textAlign: 'left',
389
+ }, children: [_jsx("div", { style: {
390
+ display: 'flex',
391
+ flexDirection: 'row',
392
+ alignItems: 'center',
393
+ }, children: selectedPivotIndex !== -1 && (_jsx("span", { style: {
394
+ height: 10,
395
+ width: 10,
396
+ backgroundColor: theme.primaryButtonColor,
397
+ borderRadius: '50%',
398
+ position: 'absolute',
399
+ top: -2,
400
+ right: -2,
401
+ } })) }), showTrigger && (_jsx(SecondaryButtonComponent, { disabled: disabled, onClick: () => {
402
+ if (columns.length === 0) {
403
+ setIsOpen(false);
404
+ }
405
+ // table is not loaded yet, so pivot button is not clickable
406
+ if (Object.keys(columnsToShow).length === 0) {
407
+ return;
408
+ }
409
+ if (!isOpen && recommendedPivots.length === 0) {
410
+ refreshPivots();
411
+ }
412
+ setIsOpen(!isOpen);
413
+ setShowUpdatePivot(false);
414
+ }, label: triggerButtonText })), _jsx("div", { style: {
415
+ position: 'relative',
416
+ ...(isOpen && showTrigger && { top: 12 }),
417
+ }, children: _jsx(PopoverComponent, { isOpen: isOpen, setIsOpen: (isOpen) => {
418
+ if (!isOpen) {
419
+ setShowUpdatePivot(false);
420
+ setPopUpTitle('Add pivot');
421
+ }
422
+ setIsOpen(isOpen);
423
+ }, popoverTitle: showUpdatePivot || !pivotRecommendationsEnabled
424
+ ? popUpTitle
425
+ : 'Recommended pivots', popoverChildren: _jsx("div", { style: {
426
+ paddingTop: showUpdatePivot || !pivotRecommendationsEnabled ? 0 : 20,
427
+ position: 'relative',
428
+ }, children: showUpdatePivot || !pivotRecommendationsEnabled ? (_jsxs("div", { style: {
429
+ backgroundColor: 'rgb(255, 255, 255)',
430
+ display: 'flex',
431
+ flexDirection: 'column',
432
+ gap: 20,
433
+ }, children: [isLoading && _jsx(LoadingComponent, {}), samplePivotTable && !isLoading && (_jsx("div", { style: {
434
+ width: pivotCardWidth,
435
+ minHeight: 160,
436
+ }, 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: () => {
437
+ setPivotAggregation(null);
438
+ setPivotRowField(null);
439
+ setPivotValueField(null);
440
+ setPivotColumnField(null);
441
+ setSamplePivotTable(null);
442
+ } }) })), _jsxs(PivotColumnContainer, { children: [_jsxs(PivotRowContainer, { children: [_jsx("div", { ref: rowFieldRef, children: _jsx(SelectComponent, { id: "pivot-row-field", label: "Row field", value: pivotRowField, onChange: (e) => {
443
+ pivotFieldChange('rowField', e.target.value);
444
+ setPivotRowField(e.target.value === ''
445
+ ? undefined
446
+ : e.target.value);
447
+ }, options: allowedRowFields.map((field) => {
448
+ return {
449
+ label: snakeAndCamelCaseToTitleCase(field),
450
+ value: field,
451
+ };
452
+ }), width: 200 }) }), _jsx("div", { ref: colFieldRef, children: _jsx(SelectComponent, { id: "pivot-row-field", label: "Column field", value: pivotColumnField, onChange: (e) => {
453
+ pivotFieldChange('columnField', e.target.value);
454
+ setPivotColumnField(e.target.value === ''
455
+ ? undefined
456
+ : e.target.value);
457
+ }, options: allowedColumnFields.map((field) => {
458
+ return {
459
+ label: snakeAndCamelCaseToTitleCase(field),
460
+ value: field,
461
+ };
462
+ }), width: 200 }) })] }), _jsxs(PivotRowContainer, { children: [_jsx(SelectComponent, { id: "pivot-row-field", label: "Value field", value: pivotValueField, onChange: (e) => {
463
+ pivotFieldChange('valueField', e.target.value);
464
+ setPivotValueField(e.target.value === ''
465
+ ? undefined
466
+ : e.target.value);
467
+ }, options: allowedValueFields.map((field) => {
468
+ return {
469
+ label: snakeAndCamelCaseToTitleCase(field),
470
+ value: field,
471
+ };
472
+ }), width: 200 }), _jsx(SelectComponent, { id: "pivot-row-field", label: "Aggregation type", value: pivotAggregation, onChange: (e) => {
473
+ if (e.target.value !== 'count' &&
474
+ pivotValueField &&
475
+ !numberFormatOptions.includes(columns.find((col) => col.field === pivotValueField).format)) {
476
+ setPivotValueField(null);
477
+ }
478
+ pivotFieldChange('aggregationType', e.target.value);
479
+ setPivotAggregation(e.target.value === ''
480
+ ? undefined
481
+ : e.target.value);
482
+ }, options: [
483
+ ...['sum', 'average', 'count', 'max', 'min'].map((option) => {
484
+ return { label: option, value: option };
485
+ }),
486
+ ], width: 200 })] })] }), _jsxs("div", { children: [_jsx(ButtonComponent, { id: "custom-button", onClick: () => {
487
+ const errors = [];
488
+ if (!pivotValueField &&
489
+ pivotAggregation !== 'count') {
490
+ errors.push("Value field cannot be empty when aggregation is not 'count'");
491
+ }
492
+ if (!pivotAggregation) {
493
+ errors.push('Aggregation cannot be empty');
494
+ }
495
+ if (errors.length === 0) {
496
+ const pivot = {
497
+ rowField: pivotRowField || '',
498
+ rowFieldType: columnsToShow[pivotRowField || ''],
499
+ columnField: pivotColumnField,
500
+ columnFieldType: columnsToShow[pivotColumnField || ''],
501
+ valueField: pivotValueField || '',
502
+ aggregationType: pivotAggregation || '',
503
+ };
504
+ pivot.title = generatePivotTitle(pivot);
505
+ setIsOpen(false);
506
+ setCreatedPivots([pivot]);
507
+ onSelectCreatedPivot(pivot);
508
+ setPopUpTitle('Add pivot');
509
+ }
510
+ setErrors(errors);
511
+ }, label: popUpTitle }), errors.length > 0 && (_jsx("div", { style: {
512
+ display: 'flex',
513
+ flexDirection: 'column',
514
+ gap: 8,
515
+ paddingTop: 8,
516
+ width: pivotCardWidth,
517
+ maxWidth: pivotCardWidth,
518
+ }, children: errors.map((error, index) => (_jsx(ErrorMessageComponent, { errorMessage: error }, `error_message_${index}`))) }))] })] })) : (_jsx("div", { style: {
519
+ display: 'flex',
520
+ flexDirection: 'column',
521
+ fontFamily: theme?.fontFamily,
522
+ color: theme?.primaryTextColor,
523
+ width: selectedPivotTable ? 500 : 600,
524
+ maxHeight: 600,
525
+ overflowY: 'scroll',
526
+ }, children: selectedPivotIndex >= 0 ? (_jsx("div", { children: _jsx("div", { onClick: () => {
527
+ setPopUpTitle('Edit pivot');
528
+ onEditPivot(createdPivots[0], 0);
529
+ }, children: _jsx(PivotCard, { pivotTable: {
530
+ pivot: selectedPivotTable?.pivot,
531
+ rows: selectedPivotTable?.rows,
532
+ columns: selectedPivotTable?.columns,
533
+ }, theme: theme, index: 0, onSelectPivot: () => { }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, showEdit: false, onClose: () => {
534
+ removePivot();
535
+ }, clickable: true, minHeight: 180, CardComponent: CardComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, HeaderComponent: HeaderComponent }) }) })) : (_jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [_jsxs("div", { style: {
536
+ // position button inline with the popover title
537
+ position: 'absolute',
538
+ top: -36,
539
+ right: 0,
540
+ display: 'flex',
541
+ flexDirection: 'row',
542
+ gap: 8,
543
+ }, 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 }) }))] })) })) }) }) })] }) }));
544
+ };
545
+ export function generatePivotTableYAxis(pivot, cols, yAxisField) {
546
+ // For count aggregations, use 'count' for the label
547
+ if (pivot?.aggregationType === 'count') {
548
+ return [
549
+ {
550
+ field: pivot.valueField || 'count',
551
+ label: yAxisField.label,
552
+ format: yAxisField.format,
553
+ },
554
+ ];
555
+ }
556
+ // otherwise use the default (ie. the field label)
557
+ return [
558
+ {
559
+ field: pivot.valueField,
560
+ label: yAxisField.label,
561
+ format: yAxisField.format,
562
+ },
563
+ ];
564
+ }
565
+ export function generatePivotTitle(pivot) {
566
+ if (pivot.rowField && !pivot.valueField) {
567
+ return snakeAndCamelCaseToTitleCase(`${pivot.aggregationType} of ${pivot.rowField}
568
+ `);
569
+ }
570
+ else if (pivot.valueField && !pivot.rowField) {
571
+ return snakeAndCamelCaseToTitleCase(`${pivot.aggregationType} of ${pivot.valueField}
572
+ `);
573
+ }
574
+ return snakeAndCamelCaseToTitleCase(`${pivot.aggregationType} of ${pivot.valueField} by ${pivot.rowField}${pivot.columnField ? ` and ${pivot.columnField}` : ''}`);
575
+ }
576
+ function castValueToDate(value) {
577
+ if (!value) {
578
+ return null;
579
+ }
580
+ if (typeof value === 'object' && value.value) {
581
+ return new Date(value.value);
582
+ }
583
+ return new Date(value);
584
+ }
585
+ function getLatestDate(a, b) {
586
+ return a > b ? a : b;
587
+ }
588
+ function getEarliestDate(a, b) {
589
+ return a < b ? a : b;
590
+ }
591
+ export function getDateRange(dateRange, column, data) {
592
+ const currentTime = new Date().getTime();
593
+ const ONE_CENTURY_IN_MILLISECONDS = 100 * 365 * 24 * 60 * 60 * 1000;
594
+ const maxDate = new Date(currentTime + ONE_CENTURY_IN_MILLISECONDS);
595
+ const minDate = new Date(0);
596
+ if (!dateRange) {
597
+ if (data.length == 0 || !data[0][column]) {
598
+ return { start: new Date(), end: new Date() };
599
+ }
600
+ const firstDate = castValueToDate(data[0][column]);
601
+ if (data.length == 1) {
602
+ return {
603
+ start: firstDate || new Date(),
604
+ end: firstDate || new Date(),
605
+ };
606
+ }
607
+ let earliestDate = undefined;
608
+ let latestDate = undefined;
609
+ for (let i = 0; i < data.length; i++) {
610
+ if (earliestDate && latestDate) {
611
+ break;
612
+ }
613
+ const value = castValueToDate(data[i][column]);
614
+ earliestDate = value && value > minDate ? value : null;
615
+ latestDate = value && value < maxDate ? value : null;
616
+ }
617
+ if (!earliestDate || !latestDate) {
618
+ return {
619
+ start: earliestDate || new Date(),
620
+ end: latestDate || new Date(),
621
+ };
622
+ }
623
+ for (let i = 0; i < data.length; i++) {
624
+ if (data[i][column]) {
625
+ const value = castValueToDate(data[i][column]);
626
+ if (value && value < maxDate) {
627
+ latestDate =
628
+ latestDate === null ? value : getLatestDate(latestDate, value);
629
+ }
630
+ if (value && value > minDate) {
631
+ earliestDate =
632
+ earliestDate === null
633
+ ? value
634
+ : getEarliestDate(earliestDate, value);
635
+ }
636
+ }
637
+ }
638
+ return {
639
+ start: earliestDate || new Date(),
640
+ end: latestDate || new Date(),
641
+ };
642
+ }
643
+ else {
644
+ return dateRange;
645
+ }
646
+ }
647
+ function determineIntervalThroughOverride(dateBucket, dateRange) {
648
+ switch (dateBucket) {
649
+ case 'day':
650
+ return eachDayOfInterval(dateRange);
651
+ case 'week':
652
+ return eachWeekOfInterval(dateRange, { weekStartsOn: 1 });
653
+ case 'month':
654
+ return eachMonthOfInterval(dateRange);
655
+ case 'year':
656
+ return eachYearOfInterval(dateRange);
657
+ default:
658
+ return eachMonthOfInterval(dateRange);
659
+ }
660
+ }
661
+ export function getDateBuckets(dateRange, column, data, dateBucket) {
662
+ if (!dateRange) {
663
+ if (dateBucket) {
664
+ return determineIntervalThroughOverride(dateBucket, getDateRange(undefined, column, data));
665
+ }
666
+ return eachMonthOfInterval(getDateRange(dateRange, column, data));
667
+ }
668
+ if (dateBucket) {
669
+ return determineIntervalThroughOverride(dateBucket, dateRange);
670
+ }
671
+ const dayDifference = differenceInDays(dateRange.end, dateRange.start);
672
+ return dayDifferenceToInterval(dayDifference, dateRange);
673
+ }
674
+ function getCompDateBuckets(dateRange, compDateRange, column, data) {
675
+ if (!dateRange) {
676
+ return eachMonthOfInterval(getDateRange(undefined, column, data));
677
+ }
678
+ const dayDifference = differenceInDays(dateRange.end, dateRange.start);
679
+ return dayDifferenceToInterval(dayDifference, compDateRange);
680
+ }
681
+ function dayDifferenceToInterval(dayDifference, dateRange) {
682
+ if (dayDifference < 14) {
683
+ return eachDayOfInterval(dateRange);
684
+ }
685
+ else if (dayDifference < 60) {
686
+ return eachWeekOfInterval(dateRange, { weekStartsOn: 1 });
687
+ }
688
+ else if (dayDifference < 365 * 3) {
689
+ return eachMonthOfInterval(dateRange);
690
+ }
691
+ else {
692
+ return eachYearOfInterval(dateRange);
693
+ }
694
+ }
695
+ export function getDateString(value, dateRange, dateBucket) {
696
+ let format;
697
+ if (dateBucket) {
698
+ switch (dateBucket) {
699
+ case 'day':
700
+ format = 'MMM_dd';
701
+ break;
702
+ case 'week':
703
+ format = 'MMM_dd-MMM_dd';
704
+ break;
705
+ case 'month':
706
+ format = 'MMM_yyyy';
707
+ break;
708
+ case 'year':
709
+ format = 'yyyy';
710
+ break;
711
+ default:
712
+ format = 'MMM_yyyy';
713
+ break;
714
+ }
715
+ }
716
+ else {
717
+ if (!dateRange) {
718
+ format = 'MMM_yyyy';
719
+ }
720
+ else {
721
+ const dayDifference = differenceInDays(new Date(dateRange.end), new Date(dateRange.start));
722
+ if (dayDifference < 14) {
723
+ format = 'MMM_dd_yyyy';
724
+ }
725
+ else if (dayDifference < 60) {
726
+ format = 'MMM_dd-MMM_dd';
727
+ }
728
+ else if (dayDifference < 365 * 3) {
729
+ format = 'MMM_yyyy';
730
+ }
731
+ else {
732
+ format = 'yyyy';
733
+ }
734
+ }
735
+ }
736
+ return valueFormatter({
737
+ value,
738
+ field: 'date',
739
+ // @ts-ignore
740
+ fields: [{ field: 'date', format }],
741
+ });
742
+ }
743
+ export function isDateField(fieldType) {
744
+ return (fieldType === 'date' ||
745
+ fieldType === 'datetime' ||
746
+ fieldType === 'timestamp' ||
747
+ fieldType === 'timestamptz' ||
748
+ fieldType === 'MMM_yyyy' ||
749
+ fieldType === 'MMM_dd' ||
750
+ fieldType === 'MMM_dd_yyyy' ||
751
+ fieldType === 'MMM_dd_hh:mm_ap_pm' ||
752
+ fieldType === 'hh_ap_pm');
753
+ }
754
+ const isNullUndefinedOrInvalidDate = (date) => date === null || date === undefined || isNaN(date.getTime());
755
+ // If the value is an object with key value (ie. a BigQuery date) we will
756
+ // return the inner value, otherwise return passed param as-is.
757
+ const handleBigQueryValue = (value) => {
758
+ if (Boolean(value) &&
759
+ typeof value === 'object' &&
760
+ Object.keys(value).length === 1 &&
761
+ value['value']) {
762
+ return value['value'];
763
+ }
764
+ return value;
765
+ };
766
+ // Process out all the BigQuery dates.
767
+ const fixBigQueryData = (data = []) => {
768
+ const newData = [];
769
+ for (const row of data) {
770
+ const newRow = {};
771
+ for (const key in row) {
772
+ newRow[key] = handleBigQueryValue(row[key]);
773
+ }
774
+ newData.push(newRow);
775
+ }
776
+ return newData;
777
+ };
778
+ export async function generatePivotTable(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket, report, client, uniqueValues) {
779
+ try {
780
+ if (report && report.rowCount && report.rowCount !== data.length) {
781
+ const dateFilter = report
782
+ ? report.filtersApplied.find((f) => f.filterType === 'date_range')
783
+ : undefined;
784
+ const pivotTable = await generatePivotWithSQL(pivot, report, client, dateBucket, dateFilter, pivot.columnField && uniqueValues
785
+ ? Object.keys(uniqueValues[pivot.columnField])
786
+ : undefined);
787
+ if (pivotTable) {
788
+ return pivotTable;
789
+ }
790
+ }
791
+ }
792
+ catch (e) {
793
+ console.error('Error generating pivot table with SQL, using in memory process', e);
794
+ }
795
+ return generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit, compRange);
796
+ }
797
+ export function generatePivotTableInMemory(pivot, data, dateRange, isComparison, rowLimit = -1, compRange = undefined, dateBucket) {
798
+ // If there is no rowField, aggregate on the valueField
799
+ if (!pivot.rowField) {
800
+ return valueFieldAggregation(data, pivot.valueField, pivot.aggregationType, isComparison);
801
+ }
802
+ // Handle edge-case for BigQuery objects.
803
+ data = fixBigQueryData(data);
804
+ if (!dateRange) {
805
+ if (isDateField(pivot.rowFieldType)) {
806
+ dateRange = getDateRange(dateRange, pivot.rowField, data);
807
+ }
808
+ }
809
+ if (!compRange ||
810
+ isNullUndefinedOrInvalidDate(compRange.start) ||
811
+ isNullUndefinedOrInvalidDate(compRange.end)) {
812
+ compRange = undefined;
813
+ }
814
+ const pivotRows = [];
815
+ const uniqueRows = (isDateField(pivot.rowFieldType)
816
+ ? getDateBuckets(dateRange, pivot.rowField, data, dateBucket)
817
+ : [...new Set(data.map((item) => item[pivot.rowField]))]).filter((row) => Boolean(row));
818
+ const rowDateRange = getDateRange(dateRange, pivot.rowField, data);
819
+ const compRowDateRange = getDateRange(compRange ?? dateRange, pivot.rowField, data);
820
+ // If columnField is not provided, we will not be using uniqueColumns
821
+ // @ts-ignore
822
+ const uniqueColumns = (pivot.columnField
823
+ ? isDateField(pivot.columnFieldType || '')
824
+ ? getDateBuckets(dateRange, pivot.columnField, data, dateBucket)
825
+ : [...new Set(data.map((item) => item[pivot.columnField || '']))]
826
+ : [pivot.valueField]).filter((col) => Boolean(col));
827
+ // Map from new dates to their corresponding prior dates
828
+ const COL_DATE_MAP = {};
829
+ const ROW_DATE_MAP = {};
830
+ // add in the comparison columns for all columns in the pivot
831
+ let compUniqueRows = [];
832
+ if (isComparison) {
833
+ if (pivot.columnField) {
834
+ const col = pivot.columnField;
835
+ const row = pivot.rowField;
836
+ const isDateCol = isDateField(pivot.columnFieldType || '');
837
+ const isDateRow = isDateField(pivot.rowFieldType);
838
+ data.forEach((item) => {
839
+ if (isDateCol) {
840
+ const key = getDateString(item[col], dateRange);
841
+ const value = getDateString(item[`comparison_${col}`], dateRange, dateBucket);
842
+ COL_DATE_MAP[key] = value;
843
+ }
844
+ if (isDateRow) {
845
+ const key = getDateString(item[row], dateRange);
846
+ const value = getDateString(item[`comparison_${row}`], dateRange, dateBucket);
847
+ ROW_DATE_MAP[key] = value;
848
+ }
849
+ });
850
+ }
851
+ else {
852
+ const primaryColumns = [...uniqueColumns];
853
+ for (const primaryKey of primaryColumns) {
854
+ uniqueColumns.push(`comparison_${primaryKey}`);
855
+ }
856
+ }
857
+ compUniqueRows = (isDateField(pivot.rowFieldType)
858
+ ? getCompDateBuckets(dateRange, compRange ?? dateRange, pivot.rowField, data)
859
+ : [...new Set(data.map((item) => item[pivot.rowField]))]).filter((row) => Boolean(row));
860
+ }
861
+ // Special corner case for count with only rowField pivot
862
+ if (!pivot.valueField &&
863
+ !pivot.columnField &&
864
+ pivot.aggregationType === 'count') {
865
+ uniqueColumns.push('count');
866
+ if (isComparison) {
867
+ uniqueColumns.push('comparison_count');
868
+ }
869
+ }
870
+ const rowsToGenerate = rowLimit !== -1 && rowLimit <= uniqueRows.length
871
+ ? uniqueRows.slice(0, rowLimit + 1)
872
+ : uniqueRows;
873
+ rowsToGenerate.forEach((rowValue, rowIndex) => {
874
+ const row = {
875
+ [pivot.rowField]: isDateField(pivot.rowFieldType)
876
+ ? getDateString(rowValue, dateRange, dateBucket)
877
+ : rowValue === null
878
+ ? 'Null'
879
+ : rowValue === false
880
+ ? 'False'
881
+ : rowValue === true
882
+ ? 'True'
883
+ : rowValue,
884
+ };
885
+ uniqueColumns.forEach((colValue, colIndex) => {
886
+ let comparisonFilteredData = [];
887
+ let filteredData = [];
888
+ let comparisonValue;
889
+ let value;
890
+ const nextRowValue = isDateField(pivot.rowFieldType)
891
+ ? // @ts-ignore
892
+ uniqueRows[rowIndex + 1] ?? endOfDay(rowDateRange.end)
893
+ : null;
894
+ const compRowValue = compUniqueRows[rowIndex];
895
+ const compNextRowValue = isDateField(pivot.rowFieldType)
896
+ ? compUniqueRows[rowIndex + 1] ?? endOfDay(compRowDateRange.end)
897
+ : null;
898
+ if (pivot.columnField) {
899
+ const columnDateRange = getDateRange(dateRange, pivot.columnField, data);
900
+ const nextColumnValue = isDateField(pivot.columnFieldType || '')
901
+ ? uniqueColumns[colIndex + 1] || endOfDay(columnDateRange.end)
902
+ : null;
903
+ // If columnField is provided, filter by both rowField and columnField
904
+ if (isDateField(pivot.columnFieldType || '') &&
905
+ isDateField(pivot.rowFieldType)) {
906
+ filteredData = data.filter((item) => {
907
+ return (isWithinInterval(new Date(item[pivot.rowField]), {
908
+ start: rowValue,
909
+ end: subMilliseconds(nextRowValue, 1),
910
+ }) &&
911
+ isWithinInterval(new Date(item[pivot.columnField]), {
912
+ start: colValue,
913
+ end: subMilliseconds(nextColumnValue, 1),
914
+ }));
915
+ });
916
+ if (isComparison) {
917
+ comparisonFilteredData = data.filter((item) => {
918
+ return (isWithinInterval(new Date(item[pivot.rowField]), {
919
+ start: rowValue,
920
+ end: subMilliseconds(nextRowValue, 1),
921
+ }) &&
922
+ isWithinInterval(new Date(item[pivot.columnField]), {
923
+ start: colValue,
924
+ end: subMilliseconds(nextColumnValue, 1),
925
+ }));
926
+ });
927
+ }
928
+ }
929
+ else if (isDateField(pivot.columnFieldType || '') &&
930
+ !isDateField(pivot.rowFieldType)) {
931
+ filteredData = data.filter((item) => {
932
+ return (item[pivot.rowField] === rowValue &&
933
+ isWithinInterval(new Date(item[pivot.columnField]), {
934
+ start: colValue,
935
+ end: subMilliseconds(nextColumnValue, 1),
936
+ }));
937
+ });
938
+ if (isComparison) {
939
+ comparisonFilteredData = data.filter((item) => {
940
+ return (item[`comparison_${pivot.rowField}`] === rowValue &&
941
+ isWithinInterval(new Date(item[pivot.columnField]), {
942
+ start: colValue,
943
+ end: subMilliseconds(nextColumnValue, 1),
944
+ }));
945
+ });
946
+ }
947
+ }
948
+ else if (!isDateField(pivot.columnFieldType || '') &&
949
+ isDateField(pivot.rowFieldType)) {
950
+ filteredData = data.filter((item) => {
951
+ return (isWithinInterval(new Date(item[pivot.rowField]), {
952
+ start: rowValue,
953
+ end: subMilliseconds(nextRowValue, 1),
954
+ }) && item[pivot.columnField || ''] === colValue);
955
+ });
956
+ if (isComparison) {
957
+ comparisonFilteredData = data.filter((item) => {
958
+ return (isWithinInterval(new Date(item[pivot.rowField]), {
959
+ start: rowValue,
960
+ end: subMilliseconds(nextRowValue, 1),
961
+ }) &&
962
+ item[`comparison_${pivot.columnField}` || ''] === colValue);
963
+ });
964
+ }
965
+ }
966
+ else {
967
+ filteredData = data.filter((item) => {
968
+ return (item[pivot.rowField] === rowValue &&
969
+ item[pivot.columnField || ''] === colValue);
970
+ });
971
+ if (isComparison) {
972
+ comparisonFilteredData = data.filter((item) => {
973
+ return (item[`comparison_${pivot.rowField}`] === rowValue &&
974
+ item[`comparison_${pivot.columnField}`] === colValue);
975
+ });
976
+ }
977
+ }
978
+ }
979
+ else {
980
+ // NOTE: For 1D columns, the comparisons are handled inside the colvalue
981
+ // so there is no need to filter for comparisonFilteredData here.
982
+ // If columnField is not provided, filter by rowField only
983
+ if (colValue.startsWith('comparison_')) {
984
+ filteredData = isDateField(pivot.rowFieldType)
985
+ ? data.filter((item) => {
986
+ return (compRowValue &&
987
+ isWithinInterval(new Date(item[`comparison_${pivot.rowField}`]), {
988
+ start: compRowValue,
989
+ end: subMilliseconds(compNextRowValue, 1),
990
+ }));
991
+ })
992
+ : data.filter((item) => item[`comparison_${pivot.rowField}`] === compRowValue);
993
+ }
994
+ else {
995
+ filteredData = isDateField(pivot.rowFieldType)
996
+ ? data.filter((item) => {
997
+ return isWithinInterval(new Date(item[pivot.rowField]), {
998
+ start: rowValue,
999
+ end: subMilliseconds(nextRowValue, 1),
1000
+ });
1001
+ })
1002
+ : data.filter((item) => item[pivot.rowField] === rowValue);
1003
+ }
1004
+ }
1005
+ // Aggregation logic remains the same
1006
+ const key = pivot.columnField && pivot.columnField.trim()
1007
+ ? pivot.valueField
1008
+ : colValue;
1009
+ switch (pivot.aggregationType) {
1010
+ case 'sum':
1011
+ value = filteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0);
1012
+ if (isComparison) {
1013
+ comparisonValue = comparisonFilteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0);
1014
+ }
1015
+ break;
1016
+ case 'count':
1017
+ value = filteredData.length;
1018
+ if (isComparison) {
1019
+ comparisonValue = comparisonFilteredData.length;
1020
+ }
1021
+ break;
1022
+ case 'average':
1023
+ case 'avg':
1024
+ value = filteredData.length
1025
+ ? filteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0) / filteredData.length
1026
+ : 0;
1027
+ if (isComparison) {
1028
+ comparisonValue = comparisonFilteredData.length
1029
+ ? comparisonFilteredData.reduce((sum, item) => sum + parseFloat(item[key] ?? 0), 0) / comparisonFilteredData.length
1030
+ : 0;
1031
+ }
1032
+ break;
1033
+ case 'max':
1034
+ value = filteredData.reduce((max, item) => Math.max(max, parseFloat(item[key] ?? -Infinity)), -Infinity);
1035
+ if (isComparison) {
1036
+ comparisonValue = comparisonFilteredData.reduce((max, item) => Math.max(max, parseFloat(item[key] ?? -Infinity)), -Infinity);
1037
+ }
1038
+ break;
1039
+ case 'min':
1040
+ value = filteredData.reduce((min, item) => Math.min(min, parseFloat(item[key] ?? Infinity)), Infinity);
1041
+ if (isComparison) {
1042
+ comparisonValue = comparisonFilteredData.reduce((min, item) => Math.min(min, parseFloat(item[key] ?? Infinity)), Infinity);
1043
+ }
1044
+ break;
1045
+ // Implement other aggregation types as needed
1046
+ default:
1047
+ throw new Error('Unsupported aggregation type');
1048
+ }
1049
+ // Set the value on the row
1050
+ // If columnField is not provided, colValue will be valueField
1051
+ row[isDateField(pivot.columnFieldType || '')
1052
+ ? getDateString(colValue, dateRange)
1053
+ : colValue] =
1054
+ pivot.aggregationType === 'count' ? value.toFixed(0) : value.toFixed(2);
1055
+ if (isComparison && pivot.columnField) {
1056
+ if (isDateField(pivot.columnFieldType || '')) {
1057
+ row[`comparison_${getDateString(colValue, dateRange)}`] =
1058
+ pivot.aggregationType === 'count'
1059
+ ? comparisonValue.toFixed(0)
1060
+ : comparisonValue.toFixed(2);
1061
+ }
1062
+ else {
1063
+ row[`comparison_${colValue}`] =
1064
+ pivot.aggregationType === 'count'
1065
+ ? comparisonValue.toFixed(0)
1066
+ : comparisonValue.toFixed(2);
1067
+ }
1068
+ }
1069
+ });
1070
+ if (pivot.aggregationType === 'max' || pivot.aggregationType === 'min') {
1071
+ for (const [key, value] of Object.entries(row)) {
1072
+ if (value === '-Infinity' || value === 'Infinity') {
1073
+ row[key] = null;
1074
+ }
1075
+ }
1076
+ }
1077
+ pivotRows.push(row);
1078
+ });
1079
+ const columns = [
1080
+ {
1081
+ label: pivot.rowField === null
1082
+ ? 'Null'
1083
+ : snakeAndCamelCaseToTitleCase(pivot.rowField),
1084
+ field: pivot.rowField,
1085
+ },
1086
+ ...uniqueColumns.map((column) => {
1087
+ const columnName = isDateField(pivot.columnFieldType || '')
1088
+ ? getDateString(column, dateRange, dateBucket)
1089
+ : column;
1090
+ return {
1091
+ label: column === null
1092
+ ? 'Null'
1093
+ : column === false
1094
+ ? 'False'
1095
+ : snakeAndCamelCaseToTitleCase(columnName).replace('Comparison', 'comparison'),
1096
+ field: columnName,
1097
+ };
1098
+ }),
1099
+ ...(isComparison && pivot.columnField
1100
+ ? uniqueColumns.map((column, index) => {
1101
+ const columnName = isDateField(pivot.columnFieldType || '')
1102
+ ? getDateString(column, dateRange, dateBucket)
1103
+ : column;
1104
+ return {
1105
+ label: column === null
1106
+ ? 'Null'
1107
+ : column === false
1108
+ ? 'False'
1109
+ : pivot.aggregationType === 'count' &&
1110
+ !pivot.columnField &&
1111
+ index === 1
1112
+ ? `comparison Count`
1113
+ : isDateField(pivot.columnFieldType || '')
1114
+ ? COL_DATE_MAP[getDateString(column, dateRange, dateBucket)] ?? 'comparison'
1115
+ : `comparison ${snakeAndCamelCaseToTitleCase(columnName)}`,
1116
+ field: `comparison_${columnName}`,
1117
+ };
1118
+ })
1119
+ : []),
1120
+ ];
1121
+ if (pivot.sort) {
1122
+ pivotRows.sort((a, b) => {
1123
+ if (pivot.sortDirection === 'ASC') {
1124
+ if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1125
+ // @ts-ignore
1126
+ return new Date(a[pivot.sortField]) - new Date(b[pivot.sortField]);
1127
+ }
1128
+ else if (isNumericColumnType(pivot.sortFieldType)) {
1129
+ return a[pivot.sortField] - b[pivot.sortField];
1130
+ }
1131
+ return a[pivot.sortField].localeCompare(b[pivot.sortField]);
1132
+ }
1133
+ else {
1134
+ if (dateFormatOptions.includes(pivot.sortFieldType ?? '')) {
1135
+ // @ts-ignore
1136
+ return new Date(b[pivot.sortField]) - new Date(a[pivot.sortField]);
1137
+ }
1138
+ else if (isNumericColumnType(pivot.sortFieldType)) {
1139
+ return b[pivot.sortField] - a[pivot.sortField];
1140
+ }
1141
+ return b[pivot.sortField].localeCompare(a[pivot.sortField]);
1142
+ }
1143
+ });
1144
+ }
1145
+ return { rows: pivotRows, columns };
1146
+ }
1147
+ function valueFieldAggregation(data, valueField, aggregationType, isComparison) {
1148
+ if (!data || data.length === 0) {
1149
+ return {
1150
+ rows: [],
1151
+ columns: [
1152
+ { label: snakeAndCamelCaseToTitleCase(valueField), field: valueField },
1153
+ ],
1154
+ };
1155
+ }
1156
+ let value = 0;
1157
+ let comparisonValue = 0;
1158
+ let count = 0;
1159
+ switch (aggregationType) {
1160
+ case 'sum':
1161
+ value = data.reduce((sum, item) => sum + parseFloat(item[valueField] ?? 0), 0);
1162
+ if (isComparison) {
1163
+ comparisonValue = data.reduce((sum, item) => sum + parseFloat(item[`comparison_${valueField}`] ?? 0), 0);
1164
+ }
1165
+ break;
1166
+ case 'count':
1167
+ value = data.reduce((count, item) => count + (item[valueField] ? 1 : 0), 0);
1168
+ if (isComparison) {
1169
+ comparisonValue = data.reduce((count, item) => count + (item[`comparison_${valueField}`] ? 1 : 0), 0);
1170
+ }
1171
+ break;
1172
+ case 'avg':
1173
+ case 'average':
1174
+ count = data.reduce((count, item) => count + (item[valueField] ? 1 : 0), 0);
1175
+ value =
1176
+ data.reduce((sum, item) => sum + parseFloat(item[valueField] ?? 0), 0) / (count === 0 ? 1 : count);
1177
+ if (isComparison) {
1178
+ const comparisonCount = data.reduce((count, item) => count + (item[`comparison_${valueField}`] ? 1 : 0), 0);
1179
+ comparisonValue =
1180
+ data.reduce((sum, item) => sum + parseFloat(item[`comparison_${valueField}`] ?? 0), 0) / (comparisonCount === 0 ? 1 : comparisonCount);
1181
+ }
1182
+ break;
1183
+ case 'max':
1184
+ value = data.reduce((max, item) => Math.max(max, parseFloat(item[valueField] ?? -Infinity)), -Infinity);
1185
+ if (isComparison) {
1186
+ comparisonValue = data.reduce((max, item) => Math.max(max, parseFloat(item[`comparison_${valueField}`] ?? -Infinity)), -Infinity);
1187
+ }
1188
+ break;
1189
+ case 'min':
1190
+ value = data.reduce((min, item) => Math.min(min, parseFloat(item[valueField] ?? Infinity)), Infinity);
1191
+ if (isComparison) {
1192
+ comparisonValue = data.reduce((min, item) => Math.min(min, parseFloat(item[`comparison_${valueField}`] ?? Infinity)), Infinity);
1193
+ }
1194
+ break;
1195
+ // Implement other aggregation types as needed
1196
+ default:
1197
+ throw new Error('Unsupported aggregation type');
1198
+ }
1199
+ const row = {};
1200
+ row[valueField] = value;
1201
+ if (isComparison) {
1202
+ row[`comparison_${valueField}`] = comparisonValue;
1203
+ }
1204
+ return {
1205
+ rows: [row],
1206
+ columns: [
1207
+ { label: snakeAndCamelCaseToTitleCase(valueField), field: valueField },
1208
+ ],
1209
+ };
1210
+ }