@quillsql/react 2.12.36 → 2.12.37

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 (456) hide show
  1. package/dist/cjs/ChartBuilder.js +2 -2
  2. package/dist/cjs/Dashboard.d.ts.map +1 -1
  3. package/dist/cjs/Dashboard.js +1 -1
  4. package/dist/cjs/components/Chart/ChartError.js +1 -1
  5. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  6. package/dist/cjs/utils/dataFetcher.js +7 -1
  7. package/dist/cjs/utils/report.d.ts.map +1 -1
  8. package/dist/cjs/utils/report.js +6 -3
  9. package/package.json +1 -1
  10. package/dist/esm/Chart.d.ts +0 -204
  11. package/dist/esm/Chart.d.ts.map +0 -1
  12. package/dist/esm/Chart.js +0 -431
  13. package/dist/esm/ChartBuilder.d.ts +0 -339
  14. package/dist/esm/ChartBuilder.d.ts.map +0 -1
  15. package/dist/esm/ChartBuilder.js +0 -1312
  16. package/dist/esm/ChartEditor.d.ts +0 -209
  17. package/dist/esm/ChartEditor.d.ts.map +0 -1
  18. package/dist/esm/ChartEditor.js +0 -182
  19. package/dist/esm/Context.d.ts +0 -14
  20. package/dist/esm/Context.d.ts.map +0 -1
  21. package/dist/esm/Context.js +0 -269
  22. package/dist/esm/Dashboard.d.ts +0 -279
  23. package/dist/esm/Dashboard.d.ts.map +0 -1
  24. package/dist/esm/Dashboard.js +0 -660
  25. package/dist/esm/DateRangePicker/Calendar.d.ts +0 -17
  26. package/dist/esm/DateRangePicker/Calendar.d.ts.map +0 -1
  27. package/dist/esm/DateRangePicker/Calendar.js +0 -164
  28. package/dist/esm/DateRangePicker/DateRangePicker.d.ts +0 -39
  29. package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +0 -1
  30. package/dist/esm/DateRangePicker/DateRangePicker.js +0 -95
  31. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +0 -22
  32. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +0 -1
  33. package/dist/esm/DateRangePicker/DateRangePickerButton.js +0 -134
  34. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +0 -25
  35. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +0 -1
  36. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +0 -260
  37. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +0 -80
  38. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +0 -1
  39. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +0 -521
  40. package/dist/esm/DateRangePicker/index.d.ts +0 -3
  41. package/dist/esm/DateRangePicker/index.d.ts.map +0 -1
  42. package/dist/esm/DateRangePicker/index.js +0 -2
  43. package/dist/esm/QuillProvider.d.ts +0 -163
  44. package/dist/esm/QuillProvider.d.ts.map +0 -1
  45. package/dist/esm/QuillProvider.js +0 -104
  46. package/dist/esm/ReportBuilder.d.ts +0 -318
  47. package/dist/esm/ReportBuilder.d.ts.map +0 -1
  48. package/dist/esm/ReportBuilder.js +0 -3279
  49. package/dist/esm/SQLEditor.d.ts +0 -272
  50. package/dist/esm/SQLEditor.d.ts.map +0 -1
  51. package/dist/esm/SQLEditor.js +0 -510
  52. package/dist/esm/Table.d.ts +0 -167
  53. package/dist/esm/Table.d.ts.map +0 -1
  54. package/dist/esm/Table.js +0 -215
  55. package/dist/esm/TableChart.d.ts +0 -15
  56. package/dist/esm/TableChart.d.ts.map +0 -1
  57. package/dist/esm/TableChart.js +0 -95
  58. package/dist/esm/assets/ArrowDownHeadIcon.d.ts +0 -5
  59. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +0 -1
  60. package/dist/esm/assets/ArrowDownHeadIcon.js +0 -3
  61. package/dist/esm/assets/ArrowDownIcon.d.ts +0 -5
  62. package/dist/esm/assets/ArrowDownIcon.d.ts.map +0 -1
  63. package/dist/esm/assets/ArrowDownIcon.js +0 -3
  64. package/dist/esm/assets/ArrowDownRightIcon.d.ts +0 -5
  65. package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +0 -1
  66. package/dist/esm/assets/ArrowDownRightIcon.js +0 -3
  67. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts +0 -5
  68. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +0 -1
  69. package/dist/esm/assets/ArrowLeftHeadIcon.js +0 -3
  70. package/dist/esm/assets/ArrowRightHeadIcon.d.ts +0 -5
  71. package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +0 -1
  72. package/dist/esm/assets/ArrowRightHeadIcon.js +0 -3
  73. package/dist/esm/assets/ArrowRightIcon.d.ts +0 -5
  74. package/dist/esm/assets/ArrowRightIcon.d.ts.map +0 -1
  75. package/dist/esm/assets/ArrowRightIcon.js +0 -3
  76. package/dist/esm/assets/ArrowUpHeadIcon.d.ts +0 -5
  77. package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +0 -1
  78. package/dist/esm/assets/ArrowUpHeadIcon.js +0 -3
  79. package/dist/esm/assets/ArrowUpIcon.d.ts +0 -5
  80. package/dist/esm/assets/ArrowUpIcon.d.ts.map +0 -1
  81. package/dist/esm/assets/ArrowUpIcon.js +0 -3
  82. package/dist/esm/assets/ArrowUpRightIcon.d.ts +0 -5
  83. package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +0 -1
  84. package/dist/esm/assets/ArrowUpRightIcon.js +0 -3
  85. package/dist/esm/assets/CalendarIcon.d.ts +0 -5
  86. package/dist/esm/assets/CalendarIcon.d.ts.map +0 -1
  87. package/dist/esm/assets/CalendarIcon.js +0 -3
  88. package/dist/esm/assets/CalendarNormalIcon.d.ts +0 -5
  89. package/dist/esm/assets/CalendarNormalIcon.d.ts.map +0 -1
  90. package/dist/esm/assets/CalendarNormalIcon.js +0 -3
  91. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts +0 -5
  92. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +0 -1
  93. package/dist/esm/assets/DoubleArrowLeftHeadIcon.js +0 -3
  94. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts +0 -5
  95. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +0 -1
  96. package/dist/esm/assets/DoubleArrowRightHeadIcon.js +0 -3
  97. package/dist/esm/assets/ExclamationFilledIcon.d.ts +0 -5
  98. package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +0 -1
  99. package/dist/esm/assets/ExclamationFilledIcon.js +0 -3
  100. package/dist/esm/assets/FilterIcon.d.ts +0 -5
  101. package/dist/esm/assets/FilterIcon.d.ts.map +0 -1
  102. package/dist/esm/assets/FilterIcon.js +0 -3
  103. package/dist/esm/assets/LoadingSpinner.d.ts +0 -5
  104. package/dist/esm/assets/LoadingSpinner.d.ts.map +0 -1
  105. package/dist/esm/assets/LoadingSpinner.js +0 -3
  106. package/dist/esm/assets/RefreshIcon.d.ts +0 -5
  107. package/dist/esm/assets/RefreshIcon.d.ts.map +0 -1
  108. package/dist/esm/assets/RefreshIcon.js +0 -3
  109. package/dist/esm/assets/SearchIcon.d.ts +0 -5
  110. package/dist/esm/assets/SearchIcon.d.ts.map +0 -1
  111. package/dist/esm/assets/SearchIcon.js +0 -3
  112. package/dist/esm/assets/UpLeftArrowsIcon.d.ts +0 -5
  113. package/dist/esm/assets/UpLeftArrowsIcon.d.ts.map +0 -1
  114. package/dist/esm/assets/UpLeftArrowsIcon.js +0 -3
  115. package/dist/esm/assets/XCircleIcon.d.ts +0 -5
  116. package/dist/esm/assets/XCircleIcon.d.ts.map +0 -1
  117. package/dist/esm/assets/XCircleIcon.js +0 -3
  118. package/dist/esm/assets/XIcon.d.ts +0 -5
  119. package/dist/esm/assets/XIcon.d.ts.map +0 -1
  120. package/dist/esm/assets/XIcon.js +0 -3
  121. package/dist/esm/assets/index.d.ts +0 -22
  122. package/dist/esm/assets/index.d.ts.map +0 -1
  123. package/dist/esm/assets/index.js +0 -21
  124. package/dist/esm/components/Banner/index.d.ts +0 -3
  125. package/dist/esm/components/Banner/index.d.ts.map +0 -1
  126. package/dist/esm/components/Banner/index.js +0 -24
  127. package/dist/esm/components/BigModal/BigModal.d.ts +0 -15
  128. package/dist/esm/components/BigModal/BigModal.d.ts.map +0 -1
  129. package/dist/esm/components/BigModal/BigModal.js +0 -56
  130. package/dist/esm/components/Chart/BarChart.d.ts +0 -23
  131. package/dist/esm/components/Chart/BarChart.d.ts.map +0 -1
  132. package/dist/esm/components/Chart/BarChart.js +0 -110
  133. package/dist/esm/components/Chart/BarList.d.ts +0 -27
  134. package/dist/esm/components/Chart/BarList.d.ts.map +0 -1
  135. package/dist/esm/components/Chart/BarList.js +0 -148
  136. package/dist/esm/components/Chart/ChartError.d.ts +0 -10
  137. package/dist/esm/components/Chart/ChartError.d.ts.map +0 -1
  138. package/dist/esm/components/Chart/ChartError.js +0 -65
  139. package/dist/esm/components/Chart/ChartSkeleton.d.ts +0 -8
  140. package/dist/esm/components/Chart/ChartSkeleton.d.ts.map +0 -1
  141. package/dist/esm/components/Chart/ChartSkeleton.js +0 -19
  142. package/dist/esm/components/Chart/ChartTooltip.d.ts +0 -31
  143. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +0 -1
  144. package/dist/esm/components/Chart/ChartTooltip.js +0 -234
  145. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts +0 -6
  146. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts.map +0 -1
  147. package/dist/esm/components/Chart/ChartTooltipFrame.js +0 -14
  148. package/dist/esm/components/Chart/ChartTooltipGroup.d.ts +0 -11
  149. package/dist/esm/components/Chart/ChartTooltipGroup.d.ts.map +0 -1
  150. package/dist/esm/components/Chart/ChartTooltipGroup.js +0 -23
  151. package/dist/esm/components/Chart/ChartTooltipRow.d.ts +0 -8
  152. package/dist/esm/components/Chart/ChartTooltipRow.d.ts.map +0 -1
  153. package/dist/esm/components/Chart/ChartTooltipRow.js +0 -41
  154. package/dist/esm/components/Chart/LineChart.d.ts +0 -29
  155. package/dist/esm/components/Chart/LineChart.d.ts.map +0 -1
  156. package/dist/esm/components/Chart/LineChart.js +0 -163
  157. package/dist/esm/components/Chart/PieChart.d.ts +0 -62
  158. package/dist/esm/components/Chart/PieChart.d.ts.map +0 -1
  159. package/dist/esm/components/Chart/PieChart.js +0 -195
  160. package/dist/esm/components/Dashboard/ChartComponent.d.ts +0 -4
  161. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +0 -1
  162. package/dist/esm/components/Dashboard/ChartComponent.js +0 -60
  163. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +0 -38
  164. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +0 -1
  165. package/dist/esm/components/Dashboard/DashboardFilter.js +0 -89
  166. package/dist/esm/components/Dashboard/DashboardSection.d.ts +0 -7
  167. package/dist/esm/components/Dashboard/DashboardSection.d.ts.map +0 -1
  168. package/dist/esm/components/Dashboard/DashboardSection.js +0 -22
  169. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts +0 -3
  170. package/dist/esm/components/Dashboard/DashboardSectionContainer.d.ts.map +0 -1
  171. package/dist/esm/components/Dashboard/DashboardSectionContainer.js +0 -10
  172. package/dist/esm/components/Dashboard/DataLoader.d.ts +0 -44
  173. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +0 -1
  174. package/dist/esm/components/Dashboard/DataLoader.js +0 -190
  175. package/dist/esm/components/Dashboard/MetricComponent.d.ts +0 -4
  176. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +0 -1
  177. package/dist/esm/components/Dashboard/MetricComponent.js +0 -133
  178. package/dist/esm/components/Dashboard/TableComponent.d.ts +0 -15
  179. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +0 -1
  180. package/dist/esm/components/Dashboard/TableComponent.js +0 -62
  181. package/dist/esm/components/Dropdown/Dropdown.d.ts +0 -14
  182. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +0 -1
  183. package/dist/esm/components/Dropdown/Dropdown.js +0 -69
  184. package/dist/esm/components/Dropdown/DropdownItem.d.ts +0 -11
  185. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +0 -1
  186. package/dist/esm/components/Dropdown/DropdownItem.js +0 -37
  187. package/dist/esm/components/Dropdown/index.d.ts +0 -3
  188. package/dist/esm/components/Dropdown/index.d.ts.map +0 -1
  189. package/dist/esm/components/Dropdown/index.js +0 -2
  190. package/dist/esm/components/Modal/Modal.d.ts +0 -15
  191. package/dist/esm/components/Modal/Modal.d.ts.map +0 -1
  192. package/dist/esm/components/Modal/Modal.js +0 -64
  193. package/dist/esm/components/Modal/index.d.ts +0 -2
  194. package/dist/esm/components/Modal/index.d.ts.map +0 -1
  195. package/dist/esm/components/Modal/index.js +0 -1
  196. package/dist/esm/components/QuillCard.d.ts +0 -9
  197. package/dist/esm/components/QuillCard.d.ts.map +0 -1
  198. package/dist/esm/components/QuillCard.js +0 -56
  199. package/dist/esm/components/QuillMultiSelect.d.ts +0 -11
  200. package/dist/esm/components/QuillMultiSelect.d.ts.map +0 -1
  201. package/dist/esm/components/QuillMultiSelect.js +0 -193
  202. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts +0 -11
  203. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +0 -1
  204. package/dist/esm/components/QuillMultiSelectWithCombo.js +0 -215
  205. package/dist/esm/components/QuillSelect.d.ts +0 -6
  206. package/dist/esm/components/QuillSelect.d.ts.map +0 -1
  207. package/dist/esm/components/QuillSelect.js +0 -136
  208. package/dist/esm/components/QuillSelectWithCombo.d.ts +0 -6
  209. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +0 -1
  210. package/dist/esm/components/QuillSelectWithCombo.js +0 -163
  211. package/dist/esm/components/QuillTable.d.ts +0 -31
  212. package/dist/esm/components/QuillTable.d.ts.map +0 -1
  213. package/dist/esm/components/QuillTable.js +0 -261
  214. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +0 -34
  215. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +0 -1
  216. package/dist/esm/components/ReportBuilder/AddColumnModal.js +0 -145
  217. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +0 -26
  218. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +0 -1
  219. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +0 -36
  220. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +0 -23
  221. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +0 -1
  222. package/dist/esm/components/ReportBuilder/AddSortPopover.js +0 -73
  223. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +0 -30
  224. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +0 -1
  225. package/dist/esm/components/ReportBuilder/FilterModal.js +0 -576
  226. package/dist/esm/components/ReportBuilder/ast.d.ts +0 -523
  227. package/dist/esm/components/ReportBuilder/ast.d.ts.map +0 -1
  228. package/dist/esm/components/ReportBuilder/ast.js +0 -230
  229. package/dist/esm/components/ReportBuilder/bigDateMap.d.ts +0 -7
  230. package/dist/esm/components/ReportBuilder/bigDateMap.d.ts.map +0 -1
  231. package/dist/esm/components/ReportBuilder/bigDateMap.js +0 -687
  232. package/dist/esm/components/ReportBuilder/constants.d.ts +0 -117
  233. package/dist/esm/components/ReportBuilder/constants.d.ts.map +0 -1
  234. package/dist/esm/components/ReportBuilder/constants.js +0 -161
  235. package/dist/esm/components/ReportBuilder/convert.d.ts +0 -65
  236. package/dist/esm/components/ReportBuilder/convert.d.ts.map +0 -1
  237. package/dist/esm/components/ReportBuilder/convert.js +0 -717
  238. package/dist/esm/components/ReportBuilder/operators.d.ts +0 -462
  239. package/dist/esm/components/ReportBuilder/operators.d.ts.map +0 -1
  240. package/dist/esm/components/ReportBuilder/operators.js +0 -581
  241. package/dist/esm/components/ReportBuilder/pivot.d.ts +0 -16
  242. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +0 -1
  243. package/dist/esm/components/ReportBuilder/pivot.js +0 -1
  244. package/dist/esm/components/ReportBuilder/postgres.d.ts +0 -150
  245. package/dist/esm/components/ReportBuilder/postgres.d.ts.map +0 -1
  246. package/dist/esm/components/ReportBuilder/postgres.js +0 -355
  247. package/dist/esm/components/ReportBuilder/schema.d.ts +0 -23
  248. package/dist/esm/components/ReportBuilder/schema.d.ts.map +0 -1
  249. package/dist/esm/components/ReportBuilder/schema.js +0 -1
  250. package/dist/esm/components/ReportBuilder/ui.d.ts +0 -119
  251. package/dist/esm/components/ReportBuilder/ui.d.ts.map +0 -1
  252. package/dist/esm/components/ReportBuilder/ui.js +0 -382
  253. package/dist/esm/components/ReportBuilder/util.d.ts +0 -76
  254. package/dist/esm/components/ReportBuilder/util.d.ts.map +0 -1
  255. package/dist/esm/components/ReportBuilder/util.js +0 -729
  256. package/dist/esm/components/UiComponents.d.ts +0 -221
  257. package/dist/esm/components/UiComponents.d.ts.map +0 -1
  258. package/dist/esm/components/UiComponents.js +0 -571
  259. package/dist/esm/components/selectUtils.d.ts +0 -9
  260. package/dist/esm/components/selectUtils.d.ts.map +0 -1
  261. package/dist/esm/components/selectUtils.js +0 -17
  262. package/dist/esm/contexts/BaseColorContext.d.ts +0 -4
  263. package/dist/esm/contexts/BaseColorContext.d.ts.map +0 -1
  264. package/dist/esm/contexts/BaseColorContext.js +0 -3
  265. package/dist/esm/contexts/HoveredValueContext.d.ts +0 -8
  266. package/dist/esm/contexts/HoveredValueContext.d.ts.map +0 -1
  267. package/dist/esm/contexts/HoveredValueContext.js +0 -5
  268. package/dist/esm/contexts/RootStylesContext.d.ts +0 -4
  269. package/dist/esm/contexts/RootStylesContext.d.ts.map +0 -1
  270. package/dist/esm/contexts/RootStylesContext.js +0 -3
  271. package/dist/esm/contexts/SelectedValueContext.d.ts +0 -8
  272. package/dist/esm/contexts/SelectedValueContext.d.ts.map +0 -1
  273. package/dist/esm/contexts/SelectedValueContext.js +0 -6
  274. package/dist/esm/contexts/index.d.ts +0 -5
  275. package/dist/esm/contexts/index.d.ts.map +0 -1
  276. package/dist/esm/contexts/index.js +0 -4
  277. package/dist/esm/hooks/index.d.ts +0 -6
  278. package/dist/esm/hooks/index.d.ts.map +0 -1
  279. package/dist/esm/hooks/index.js +0 -5
  280. package/dist/esm/hooks/useAstToFilterTree.d.ts +0 -11
  281. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +0 -1
  282. package/dist/esm/hooks/useAstToFilterTree.js +0 -24
  283. package/dist/esm/hooks/useDashboard.d.ts +0 -7
  284. package/dist/esm/hooks/useDashboard.d.ts.map +0 -1
  285. package/dist/esm/hooks/useDashboard.js +0 -69
  286. package/dist/esm/hooks/useExport.d.ts +0 -6
  287. package/dist/esm/hooks/useExport.d.ts.map +0 -1
  288. package/dist/esm/hooks/useExport.js +0 -125
  289. package/dist/esm/hooks/useFormat.d.ts +0 -5
  290. package/dist/esm/hooks/useFormat.d.ts.map +0 -1
  291. package/dist/esm/hooks/useFormat.js +0 -25
  292. package/dist/esm/hooks/useInternalState.d.ts +0 -4
  293. package/dist/esm/hooks/useInternalState.d.ts.map +0 -1
  294. package/dist/esm/hooks/useInternalState.js +0 -14
  295. package/dist/esm/hooks/useOnClickOutside.d.ts +0 -3
  296. package/dist/esm/hooks/useOnClickOutside.d.ts.map +0 -1
  297. package/dist/esm/hooks/useOnClickOutside.js +0 -18
  298. package/dist/esm/hooks/useOnWindowResize.d.ts +0 -5
  299. package/dist/esm/hooks/useOnWindowResize.d.ts.map +0 -1
  300. package/dist/esm/hooks/useOnWindowResize.js +0 -14
  301. package/dist/esm/hooks/useQuill.d.ts +0 -37
  302. package/dist/esm/hooks/useQuill.d.ts.map +0 -1
  303. package/dist/esm/hooks/useQuill.js +0 -182
  304. package/dist/esm/hooks/useSelectOnKeyDown.d.ts +0 -3
  305. package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +0 -1
  306. package/dist/esm/hooks/useSelectOnKeyDown.js +0 -63
  307. package/dist/esm/hooks/useTheme.d.ts +0 -7
  308. package/dist/esm/hooks/useTheme.d.ts.map +0 -1
  309. package/dist/esm/hooks/useTheme.js +0 -10
  310. package/dist/esm/index.d.ts +0 -29
  311. package/dist/esm/index.d.ts.map +0 -1
  312. package/dist/esm/index.js +0 -16
  313. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +0 -28
  314. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +0 -1
  315. package/dist/esm/internals/ReportBuilder/PivotForm.js +0 -62
  316. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +0 -39
  317. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +0 -1
  318. package/dist/esm/internals/ReportBuilder/PivotList.js +0 -89
  319. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +0 -146
  320. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +0 -1
  321. package/dist/esm/internals/ReportBuilder/PivotModal.js +0 -1210
  322. package/dist/esm/lib/font.d.ts +0 -14
  323. package/dist/esm/lib/font.d.ts.map +0 -1
  324. package/dist/esm/lib/font.js +0 -13
  325. package/dist/esm/lib/index.d.ts +0 -4
  326. package/dist/esm/lib/index.d.ts.map +0 -1
  327. package/dist/esm/lib/index.js +0 -3
  328. package/dist/esm/lib/inputTypes.d.ts +0 -21
  329. package/dist/esm/lib/inputTypes.d.ts.map +0 -1
  330. package/dist/esm/lib/inputTypes.js +0 -55
  331. package/dist/esm/lib/utils.d.ts +0 -10
  332. package/dist/esm/lib/utils.d.ts.map +0 -1
  333. package/dist/esm/lib/utils.js +0 -35
  334. package/dist/esm/models/Columns.d.ts +0 -12
  335. package/dist/esm/models/Columns.d.ts.map +0 -1
  336. package/dist/esm/models/Columns.js +0 -1
  337. package/dist/esm/models/Filter.d.ts +0 -118
  338. package/dist/esm/models/Filter.d.ts.map +0 -1
  339. package/dist/esm/models/Filter.js +0 -98
  340. package/dist/esm/models/Pagination.d.ts +0 -10
  341. package/dist/esm/models/Pagination.d.ts.map +0 -1
  342. package/dist/esm/models/Pagination.js +0 -1
  343. package/dist/esm/models/Pivots.d.ts +0 -2
  344. package/dist/esm/models/Pivots.d.ts.map +0 -1
  345. package/dist/esm/models/Pivots.js +0 -1
  346. package/dist/esm/models/Report.d.ts +0 -103
  347. package/dist/esm/models/Report.d.ts.map +0 -1
  348. package/dist/esm/models/Report.js +0 -1
  349. package/dist/esm/models/Tables.d.ts +0 -8
  350. package/dist/esm/models/Tables.d.ts.map +0 -1
  351. package/dist/esm/models/Tables.js +0 -1
  352. package/dist/esm/utils/aggregate.d.ts +0 -4
  353. package/dist/esm/utils/aggregate.d.ts.map +0 -1
  354. package/dist/esm/utils/aggregate.js +0 -422
  355. package/dist/esm/utils/astFilterProcessing.d.ts +0 -36
  356. package/dist/esm/utils/astFilterProcessing.d.ts.map +0 -1
  357. package/dist/esm/utils/astFilterProcessing.js +0 -8084
  358. package/dist/esm/utils/astProcessing.d.ts +0 -26
  359. package/dist/esm/utils/astProcessing.d.ts.map +0 -1
  360. package/dist/esm/utils/astProcessing.js +0 -254
  361. package/dist/esm/utils/axisFormatter.d.ts +0 -20
  362. package/dist/esm/utils/axisFormatter.d.ts.map +0 -1
  363. package/dist/esm/utils/axisFormatter.js +0 -179
  364. package/dist/esm/utils/color.d.ts +0 -44
  365. package/dist/esm/utils/color.d.ts.map +0 -1
  366. package/dist/esm/utils/color.js +0 -425
  367. package/dist/esm/utils/columnProcessing.d.ts +0 -13
  368. package/dist/esm/utils/columnProcessing.d.ts.map +0 -1
  369. package/dist/esm/utils/columnProcessing.js +0 -260
  370. package/dist/esm/utils/constants.d.ts +0 -2
  371. package/dist/esm/utils/constants.d.ts.map +0 -1
  372. package/dist/esm/utils/constants.js +0 -1
  373. package/dist/esm/utils/crypto.d.ts +0 -2
  374. package/dist/esm/utils/crypto.d.ts.map +0 -1
  375. package/dist/esm/utils/crypto.js +0 -10
  376. package/dist/esm/utils/csv.d.ts +0 -6
  377. package/dist/esm/utils/csv.d.ts.map +0 -1
  378. package/dist/esm/utils/csv.js +0 -78
  379. package/dist/esm/utils/dashboard.d.ts +0 -13
  380. package/dist/esm/utils/dashboard.d.ts.map +0 -1
  381. package/dist/esm/utils/dashboard.js +0 -171
  382. package/dist/esm/utils/dataFetcher.d.ts +0 -3
  383. package/dist/esm/utils/dataFetcher.d.ts.map +0 -1
  384. package/dist/esm/utils/dataFetcher.js +0 -199
  385. package/dist/esm/utils/dataProcessing.d.ts +0 -11
  386. package/dist/esm/utils/dataProcessing.d.ts.map +0 -1
  387. package/dist/esm/utils/dataProcessing.js +0 -162
  388. package/dist/esm/utils/dates.d.ts +0 -20
  389. package/dist/esm/utils/dates.d.ts.map +0 -1
  390. package/dist/esm/utils/dates.js +0 -95
  391. package/dist/esm/utils/error.d.ts +0 -5
  392. package/dist/esm/utils/error.d.ts.map +0 -1
  393. package/dist/esm/utils/error.js +0 -8
  394. package/dist/esm/utils/errorProcessing.d.ts +0 -2
  395. package/dist/esm/utils/errorProcessing.d.ts.map +0 -1
  396. package/dist/esm/utils/errorProcessing.js +0 -5
  397. package/dist/esm/utils/filterConstants.d.ts +0 -34
  398. package/dist/esm/utils/filterConstants.d.ts.map +0 -1
  399. package/dist/esm/utils/filterConstants.js +0 -33
  400. package/dist/esm/utils/filterProcessing.d.ts +0 -10
  401. package/dist/esm/utils/filterProcessing.d.ts.map +0 -1
  402. package/dist/esm/utils/filterProcessing.js +0 -232
  403. package/dist/esm/utils/getDomain.d.ts +0 -8
  404. package/dist/esm/utils/getDomain.d.ts.map +0 -1
  405. package/dist/esm/utils/getDomain.js +0 -52
  406. package/dist/esm/utils/logging.d.ts +0 -2
  407. package/dist/esm/utils/logging.d.ts.map +0 -1
  408. package/dist/esm/utils/logging.js +0 -7
  409. package/dist/esm/utils/merge.d.ts +0 -2
  410. package/dist/esm/utils/merge.d.ts.map +0 -1
  411. package/dist/esm/utils/merge.js +0 -18
  412. package/dist/esm/utils/monacoConfig.d.ts +0 -21
  413. package/dist/esm/utils/monacoConfig.d.ts.map +0 -1
  414. package/dist/esm/utils/monacoConfig.js +0 -319
  415. package/dist/esm/utils/paginationProcessing.d.ts +0 -5
  416. package/dist/esm/utils/paginationProcessing.d.ts.map +0 -1
  417. package/dist/esm/utils/paginationProcessing.js +0 -25
  418. package/dist/esm/utils/parserBigQuery.d.ts +0 -6
  419. package/dist/esm/utils/parserBigQuery.d.ts.map +0 -1
  420. package/dist/esm/utils/parserBigQuery.js +0 -52
  421. package/dist/esm/utils/parserPostgres.d.ts +0 -3
  422. package/dist/esm/utils/parserPostgres.d.ts.map +0 -1
  423. package/dist/esm/utils/parserPostgres.js +0 -37
  424. package/dist/esm/utils/pivotConstructor.d.ts +0 -7
  425. package/dist/esm/utils/pivotConstructor.d.ts.map +0 -1
  426. package/dist/esm/utils/pivotConstructor.js +0 -151
  427. package/dist/esm/utils/pivotProcessing.d.ts +0 -17
  428. package/dist/esm/utils/pivotProcessing.d.ts.map +0 -1
  429. package/dist/esm/utils/pivotProcessing.js +0 -132
  430. package/dist/esm/utils/queryConstructor.d.ts +0 -7
  431. package/dist/esm/utils/queryConstructor.d.ts.map +0 -1
  432. package/dist/esm/utils/queryConstructor.js +0 -226
  433. package/dist/esm/utils/report.d.ts +0 -10
  434. package/dist/esm/utils/report.d.ts.map +0 -1
  435. package/dist/esm/utils/report.js +0 -183
  436. package/dist/esm/utils/schema.d.ts +0 -6
  437. package/dist/esm/utils/schema.d.ts.map +0 -1
  438. package/dist/esm/utils/schema.js +0 -153
  439. package/dist/esm/utils/styles.d.ts +0 -17
  440. package/dist/esm/utils/styles.d.ts.map +0 -1
  441. package/dist/esm/utils/styles.js +0 -16
  442. package/dist/esm/utils/tableProcessing.d.ts +0 -45
  443. package/dist/esm/utils/tableProcessing.d.ts.map +0 -1
  444. package/dist/esm/utils/tableProcessing.js +0 -300
  445. package/dist/esm/utils/textProcessing.d.ts +0 -6
  446. package/dist/esm/utils/textProcessing.d.ts.map +0 -1
  447. package/dist/esm/utils/textProcessing.js +0 -49
  448. package/dist/esm/utils/validation.d.ts +0 -9
  449. package/dist/esm/utils/validation.d.ts.map +0 -1
  450. package/dist/esm/utils/validation.js +0 -20
  451. package/dist/esm/utils/valueFormatter.d.ts +0 -29
  452. package/dist/esm/utils/valueFormatter.d.ts.map +0 -1
  453. package/dist/esm/utils/valueFormatter.js +0 -342
  454. package/dist/esm/utils/width.d.ts +0 -12
  455. package/dist/esm/utils/width.d.ts.map +0 -1
  456. package/dist/esm/utils/width.js +0 -21
@@ -1,1210 +0,0 @@
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
- }