@quillsql/react 2.12.28 → 2.12.30

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 (502) hide show
  1. package/dist/cjs/Chart.d.ts +24 -10
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +151 -189
  4. package/dist/cjs/ChartBuilder.d.ts +51 -11
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +162 -101
  7. package/dist/cjs/ChartEditor.d.ts +13 -1
  8. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  9. package/dist/cjs/ChartEditor.js +62 -121
  10. package/dist/cjs/Context.d.ts +1 -19
  11. package/dist/cjs/Context.d.ts.map +1 -1
  12. package/dist/cjs/Context.js +74 -85
  13. package/dist/cjs/Dashboard.d.ts +16 -7
  14. package/dist/cjs/Dashboard.d.ts.map +1 -1
  15. package/dist/cjs/Dashboard.js +90 -68
  16. package/dist/cjs/DateRangePicker/Calendar.d.ts.map +1 -1
  17. package/dist/cjs/DateRangePicker/Calendar.js +3 -6
  18. package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  19. package/dist/cjs/DateRangePicker/DateRangePicker.js +2 -3
  20. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts +1 -2
  21. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
  22. package/dist/cjs/DateRangePicker/DateRangePickerButton.js +2 -4
  23. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  24. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  25. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -4
  26. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  27. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  28. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -15
  29. package/dist/cjs/ReportBuilder.d.ts +22 -1
  30. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  31. package/dist/cjs/ReportBuilder.js +758 -505
  32. package/dist/cjs/SQLEditor.d.ts +2 -9
  33. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  34. package/dist/cjs/SQLEditor.js +142 -90
  35. package/dist/cjs/Table.d.ts +19 -3
  36. package/dist/cjs/Table.d.ts.map +1 -1
  37. package/dist/cjs/Table.js +110 -92
  38. package/dist/cjs/TableChart.d.ts.map +1 -1
  39. package/dist/cjs/TableChart.js +0 -1
  40. package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  41. package/dist/cjs/assets/ArrowDownIcon.d.ts.map +1 -1
  42. package/dist/cjs/assets/ArrowDownRightIcon.d.ts.map +1 -1
  43. package/dist/cjs/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
  44. package/dist/cjs/assets/ArrowRightHeadIcon.d.ts.map +1 -1
  45. package/dist/cjs/assets/ArrowRightIcon.d.ts.map +1 -1
  46. package/dist/cjs/assets/ArrowUpHeadIcon.d.ts.map +1 -1
  47. package/dist/cjs/assets/ArrowUpIcon.d.ts.map +1 -1
  48. package/dist/cjs/assets/ArrowUpRightIcon.d.ts.map +1 -1
  49. package/dist/cjs/assets/CalendarIcon.d.ts.map +1 -1
  50. package/dist/cjs/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
  51. package/dist/cjs/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
  52. package/dist/cjs/assets/ExclamationFilledIcon.d.ts.map +1 -1
  53. package/dist/cjs/assets/LoadingSpinner.d.ts.map +1 -1
  54. package/dist/cjs/assets/SearchIcon.d.ts.map +1 -1
  55. package/dist/cjs/assets/XCircleIcon.d.ts.map +1 -1
  56. package/dist/cjs/components/Banner/index.d.ts +1 -1
  57. package/dist/cjs/components/Banner/index.d.ts.map +1 -1
  58. package/dist/cjs/components/Banner/index.js +1 -1
  59. package/dist/cjs/components/BigModal/BigModal.d.ts.map +1 -1
  60. package/dist/cjs/components/BigModal/BigModal.js +6 -12
  61. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  62. package/dist/cjs/components/Chart/BarList.js +21 -14
  63. package/dist/cjs/components/Chart/ChartError.d.ts +8 -1
  64. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  65. package/dist/cjs/components/Chart/ChartError.js +40 -5
  66. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  67. package/dist/cjs/components/Chart/ChartTooltip.js +8 -2
  68. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  69. package/dist/cjs/components/Chart/LineChart.js +2 -2
  70. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
  71. package/dist/cjs/components/Chart/PieChart.js +1 -3
  72. package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
  73. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  74. package/dist/cjs/components/Dashboard/ChartComponent.js +1 -1
  75. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +5 -1
  76. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  77. package/dist/cjs/components/Dashboard/DashboardFilter.js +10 -5
  78. package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -6
  79. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  80. package/dist/cjs/components/Dashboard/DataLoader.js +98 -187
  81. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  82. package/dist/cjs/components/Dashboard/MetricComponent.js +1 -1
  83. package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -4
  84. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  85. package/dist/cjs/components/Dashboard/TableComponent.js +3 -3
  86. package/dist/cjs/components/Dropdown/Dropdown.d.ts.map +1 -1
  87. package/dist/cjs/components/Dropdown/Dropdown.js +1 -3
  88. package/dist/cjs/components/Dropdown/DropdownItem.d.ts.map +1 -1
  89. package/dist/cjs/components/Dropdown/DropdownItem.js +3 -8
  90. package/dist/cjs/components/Dropdown/index.d.ts +2 -2
  91. package/dist/cjs/components/Modal/Modal.d.ts.map +1 -1
  92. package/dist/cjs/components/Modal/Modal.js +2 -3
  93. package/dist/cjs/components/Modal/index.d.ts +1 -1
  94. package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
  95. package/dist/cjs/components/QuillMultiSelect.js +18 -3
  96. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  97. package/dist/cjs/components/QuillMultiSelectWithCombo.js +2 -2
  98. package/dist/cjs/components/QuillSelect.js +1 -1
  99. package/dist/cjs/components/QuillSelectWithCombo.js +2 -2
  100. package/dist/cjs/components/QuillTable.d.ts +1 -4
  101. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  102. package/dist/cjs/components/QuillTable.js +5 -11
  103. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -1
  104. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  105. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +5 -8
  106. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  107. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -3
  108. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  109. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +12 -1
  110. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +22 -0
  111. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  112. package/dist/cjs/components/ReportBuilder/FilterModal.js +555 -0
  113. package/dist/cjs/components/ReportBuilder/ast.d.ts +2 -1
  114. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  115. package/dist/cjs/components/ReportBuilder/ast.js +33 -6
  116. package/dist/cjs/components/ReportBuilder/constants.d.ts +18 -3
  117. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  118. package/dist/cjs/components/ReportBuilder/constants.js +24 -3
  119. package/dist/cjs/components/ReportBuilder/convert.d.ts +12 -15
  120. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  121. package/dist/cjs/components/ReportBuilder/convert.js +326 -494
  122. package/dist/cjs/components/ReportBuilder/operators.d.ts +24 -4
  123. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  124. package/dist/cjs/components/ReportBuilder/operators.js +32 -4
  125. package/dist/cjs/components/ReportBuilder/ui.d.ts +20 -0
  126. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  127. package/dist/cjs/components/ReportBuilder/ui.js +30 -4
  128. package/dist/cjs/components/ReportBuilder/util.d.ts +3 -11
  129. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  130. package/dist/cjs/components/ReportBuilder/util.js +15 -18
  131. package/dist/cjs/components/UiComponents.d.ts +10 -7
  132. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  133. package/dist/cjs/components/UiComponents.js +9 -8
  134. package/dist/cjs/components/selectUtils.d.ts +0 -1
  135. package/dist/cjs/components/selectUtils.d.ts.map +1 -1
  136. package/dist/cjs/components/selectUtils.js +1 -22
  137. package/dist/cjs/hooks/index.d.ts +4 -4
  138. package/dist/cjs/hooks/useAstToFilterTree.d.ts +11 -0
  139. package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -0
  140. package/dist/cjs/hooks/useAstToFilterTree.js +26 -0
  141. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  142. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  143. package/dist/cjs/hooks/useDashboard.js +22 -4
  144. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  145. package/dist/cjs/hooks/useExport.js +3 -1
  146. package/dist/cjs/hooks/useOnClickOutside.js +4 -4
  147. package/dist/cjs/hooks/useOnWindowResize.d.ts.map +1 -1
  148. package/dist/cjs/hooks/useOnWindowResize.js +2 -2
  149. package/dist/cjs/hooks/useQuill.d.ts +10 -27
  150. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  151. package/dist/cjs/hooks/useQuill.js +114 -82
  152. package/dist/cjs/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  153. package/dist/cjs/hooks/useSelectOnKeyDown.js +4 -4
  154. package/dist/cjs/hooks/useTheme.js +1 -1
  155. package/dist/cjs/index.d.ts +1 -0
  156. package/dist/cjs/index.d.ts.map +1 -1
  157. package/dist/cjs/index.js +3 -1
  158. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  159. package/dist/cjs/internals/ReportBuilder/PivotForm.js +8 -1
  160. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +2 -2
  161. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  162. package/dist/cjs/internals/ReportBuilder/PivotList.js +2 -2
  163. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
  164. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  165. package/dist/cjs/internals/ReportBuilder/PivotModal.js +64 -78
  166. package/dist/cjs/lib/utils.js +2 -2
  167. package/dist/cjs/models/Filter.d.ts +104 -4
  168. package/dist/cjs/models/Filter.d.ts.map +1 -1
  169. package/dist/cjs/models/Filter.js +91 -0
  170. package/dist/cjs/models/Pagination.d.ts +10 -0
  171. package/dist/cjs/models/Pagination.d.ts.map +1 -0
  172. package/dist/cjs/models/Pagination.js +2 -0
  173. package/dist/cjs/models/Report.d.ts +116 -0
  174. package/dist/cjs/models/Report.d.ts.map +1 -0
  175. package/dist/cjs/models/Report.js +2 -0
  176. package/dist/cjs/utils/aggregate.js +1 -1
  177. package/dist/cjs/utils/astFilterProcessing.d.ts +36 -0
  178. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -0
  179. package/dist/cjs/utils/astFilterProcessing.js +8056 -0
  180. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  181. package/dist/cjs/utils/astProcessing.js +4 -3
  182. package/dist/cjs/utils/axisFormatter.js +0 -71
  183. package/dist/cjs/utils/color.js +9 -87
  184. package/dist/cjs/utils/columnProcessing.d.ts +1 -0
  185. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -1
  186. package/dist/cjs/utils/columnProcessing.js +8 -1
  187. package/dist/cjs/utils/csv.d.ts.map +1 -1
  188. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  189. package/dist/cjs/utils/dashboard.js +4 -4
  190. package/dist/cjs/utils/dataFetcher.d.ts +1 -1
  191. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  192. package/dist/cjs/utils/dataFetcher.js +72 -5
  193. package/dist/cjs/utils/dataProcessing.d.ts +8 -0
  194. package/dist/cjs/utils/dataProcessing.d.ts.map +1 -0
  195. package/dist/cjs/utils/dataProcessing.js +127 -0
  196. package/dist/cjs/utils/dates.d.ts +2 -1
  197. package/dist/cjs/utils/dates.d.ts.map +1 -1
  198. package/dist/cjs/utils/dates.js +12 -3
  199. package/dist/cjs/utils/error.d.ts +5 -0
  200. package/dist/cjs/utils/error.d.ts.map +1 -0
  201. package/dist/cjs/utils/error.js +12 -0
  202. package/dist/cjs/utils/filterConstants.d.ts +34 -0
  203. package/dist/cjs/utils/filterConstants.d.ts.map +1 -0
  204. package/dist/cjs/utils/filterConstants.js +36 -0
  205. package/dist/cjs/utils/filterProcessing.js +4 -4
  206. package/dist/cjs/utils/logging.d.ts.map +1 -1
  207. package/dist/cjs/utils/logging.js +1 -0
  208. package/dist/cjs/utils/merge.js +0 -21
  209. package/dist/cjs/utils/monacoConfig.d.ts +21 -0
  210. package/dist/cjs/utils/monacoConfig.d.ts.map +1 -0
  211. package/dist/cjs/utils/monacoConfig.js +324 -0
  212. package/dist/cjs/utils/paginationProcessing.d.ts +5 -0
  213. package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -0
  214. package/dist/cjs/utils/paginationProcessing.js +30 -0
  215. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  216. package/dist/cjs/utils/pivotConstructor.js +67 -5
  217. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  218. package/dist/cjs/utils/pivotProcessing.js +12 -6
  219. package/dist/cjs/utils/queryConstructor.d.ts +4 -2
  220. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  221. package/dist/cjs/utils/queryConstructor.js +121 -59
  222. package/dist/cjs/utils/report.d.ts +7 -0
  223. package/dist/cjs/utils/report.d.ts.map +1 -0
  224. package/dist/cjs/utils/report.js +93 -0
  225. package/dist/cjs/utils/schema.d.ts.map +1 -1
  226. package/dist/cjs/utils/schema.js +35 -6
  227. package/dist/cjs/utils/styles.d.ts +1 -1
  228. package/dist/cjs/utils/styles.d.ts.map +1 -1
  229. package/dist/cjs/utils/tableProcessing.d.ts +23 -8
  230. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  231. package/dist/cjs/utils/tableProcessing.js +156 -38
  232. package/dist/cjs/utils/textProcessing.js +3 -3
  233. package/dist/cjs/utils/validation.d.ts +9 -0
  234. package/dist/cjs/utils/validation.d.ts.map +1 -0
  235. package/dist/cjs/utils/validation.js +24 -0
  236. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  237. package/dist/cjs/utils/valueFormatter.js +8 -4
  238. package/dist/esm/Chart.d.ts +24 -10
  239. package/dist/esm/Chart.d.ts.map +1 -1
  240. package/dist/esm/Chart.js +154 -192
  241. package/dist/esm/ChartBuilder.d.ts +51 -11
  242. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  243. package/dist/esm/ChartBuilder.js +161 -101
  244. package/dist/esm/ChartEditor.d.ts +13 -1
  245. package/dist/esm/ChartEditor.d.ts.map +1 -1
  246. package/dist/esm/ChartEditor.js +63 -122
  247. package/dist/esm/Context.d.ts +1 -19
  248. package/dist/esm/Context.d.ts.map +1 -1
  249. package/dist/esm/Context.js +74 -84
  250. package/dist/esm/Dashboard.d.ts +16 -7
  251. package/dist/esm/Dashboard.d.ts.map +1 -1
  252. package/dist/esm/Dashboard.js +91 -69
  253. package/dist/esm/DateRangePicker/Calendar.d.ts.map +1 -1
  254. package/dist/esm/DateRangePicker/Calendar.js +5 -8
  255. package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  256. package/dist/esm/DateRangePicker/DateRangePicker.js +2 -3
  257. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +1 -2
  258. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
  259. package/dist/esm/DateRangePicker/DateRangePickerButton.js +2 -4
  260. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  261. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  262. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -4
  263. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  264. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  265. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -15
  266. package/dist/esm/ReportBuilder.d.ts +22 -1
  267. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  268. package/dist/esm/ReportBuilder.js +766 -513
  269. package/dist/esm/SQLEditor.d.ts +2 -9
  270. package/dist/esm/SQLEditor.d.ts.map +1 -1
  271. package/dist/esm/SQLEditor.js +144 -92
  272. package/dist/esm/Table.d.ts +19 -3
  273. package/dist/esm/Table.d.ts.map +1 -1
  274. package/dist/esm/Table.js +112 -94
  275. package/dist/esm/TableChart.d.ts.map +1 -1
  276. package/dist/esm/TableChart.js +0 -1
  277. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  278. package/dist/esm/assets/ArrowDownIcon.d.ts.map +1 -1
  279. package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +1 -1
  280. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
  281. package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +1 -1
  282. package/dist/esm/assets/ArrowRightIcon.d.ts.map +1 -1
  283. package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +1 -1
  284. package/dist/esm/assets/ArrowUpIcon.d.ts.map +1 -1
  285. package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +1 -1
  286. package/dist/esm/assets/CalendarIcon.d.ts.map +1 -1
  287. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
  288. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
  289. package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -1
  290. package/dist/esm/assets/LoadingSpinner.d.ts.map +1 -1
  291. package/dist/esm/assets/SearchIcon.d.ts.map +1 -1
  292. package/dist/esm/assets/XCircleIcon.d.ts.map +1 -1
  293. package/dist/esm/components/Banner/index.d.ts +1 -1
  294. package/dist/esm/components/Banner/index.d.ts.map +1 -1
  295. package/dist/esm/components/Banner/index.js +1 -1
  296. package/dist/esm/components/BigModal/BigModal.d.ts.map +1 -1
  297. package/dist/esm/components/BigModal/BigModal.js +7 -13
  298. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  299. package/dist/esm/components/Chart/BarList.js +21 -14
  300. package/dist/esm/components/Chart/ChartError.d.ts +8 -1
  301. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  302. package/dist/esm/components/Chart/ChartError.js +39 -6
  303. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  304. package/dist/esm/components/Chart/ChartTooltip.js +8 -2
  305. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  306. package/dist/esm/components/Chart/LineChart.js +2 -2
  307. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
  308. package/dist/esm/components/Chart/PieChart.js +1 -3
  309. package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
  310. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  311. package/dist/esm/components/Dashboard/ChartComponent.js +1 -1
  312. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +5 -1
  313. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  314. package/dist/esm/components/Dashboard/DashboardFilter.js +10 -5
  315. package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -6
  316. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  317. package/dist/esm/components/Dashboard/DataLoader.js +98 -187
  318. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  319. package/dist/esm/components/Dashboard/MetricComponent.js +1 -1
  320. package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -4
  321. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  322. package/dist/esm/components/Dashboard/TableComponent.js +3 -3
  323. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  324. package/dist/esm/components/Dropdown/Dropdown.js +2 -4
  325. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -1
  326. package/dist/esm/components/Dropdown/DropdownItem.js +4 -9
  327. package/dist/esm/components/Dropdown/index.d.ts +2 -2
  328. package/dist/esm/components/Dropdown/index.js +2 -2
  329. package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
  330. package/dist/esm/components/Modal/Modal.js +2 -3
  331. package/dist/esm/components/Modal/index.d.ts +1 -1
  332. package/dist/esm/components/Modal/index.js +1 -1
  333. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
  334. package/dist/esm/components/QuillMultiSelect.js +18 -3
  335. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  336. package/dist/esm/components/QuillMultiSelectWithCombo.js +2 -2
  337. package/dist/esm/components/QuillSelect.js +1 -1
  338. package/dist/esm/components/QuillSelectWithCombo.js +2 -2
  339. package/dist/esm/components/QuillTable.d.ts +1 -4
  340. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  341. package/dist/esm/components/QuillTable.js +5 -11
  342. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -1
  343. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  344. package/dist/esm/components/ReportBuilder/AddColumnModal.js +8 -11
  345. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  346. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -4
  347. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  348. package/dist/esm/components/ReportBuilder/AddSortPopover.js +12 -1
  349. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +22 -0
  350. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  351. package/dist/esm/components/ReportBuilder/FilterModal.js +552 -0
  352. package/dist/esm/components/ReportBuilder/ast.d.ts +2 -1
  353. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  354. package/dist/esm/components/ReportBuilder/ast.js +31 -5
  355. package/dist/esm/components/ReportBuilder/constants.d.ts +18 -3
  356. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  357. package/dist/esm/components/ReportBuilder/constants.js +24 -3
  358. package/dist/esm/components/ReportBuilder/convert.d.ts +12 -15
  359. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  360. package/dist/esm/components/ReportBuilder/convert.js +324 -493
  361. package/dist/esm/components/ReportBuilder/convert.uspec.d.ts +2 -0
  362. package/dist/esm/components/ReportBuilder/convert.uspec.d.ts.map +1 -0
  363. package/dist/esm/components/ReportBuilder/convert.uspec.js +1152 -0
  364. package/dist/esm/components/ReportBuilder/operators.d.ts +24 -4
  365. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  366. package/dist/esm/components/ReportBuilder/operators.js +32 -4
  367. package/dist/esm/components/ReportBuilder/ui.d.ts +20 -0
  368. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  369. package/dist/esm/components/ReportBuilder/ui.js +28 -3
  370. package/dist/esm/components/ReportBuilder/util.d.ts +3 -11
  371. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  372. package/dist/esm/components/ReportBuilder/util.js +16 -19
  373. package/dist/esm/components/UiComponents.d.ts +10 -7
  374. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  375. package/dist/esm/components/UiComponents.js +9 -8
  376. package/dist/esm/components/selectUtils.d.ts +0 -1
  377. package/dist/esm/components/selectUtils.d.ts.map +1 -1
  378. package/dist/esm/components/selectUtils.js +0 -20
  379. package/dist/esm/hooks/index.d.ts +4 -4
  380. package/dist/esm/hooks/index.js +4 -4
  381. package/dist/esm/hooks/useAstToFilterTree.d.ts +11 -0
  382. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -0
  383. package/dist/esm/hooks/useAstToFilterTree.js +24 -0
  384. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  385. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  386. package/dist/esm/hooks/useDashboard.js +23 -5
  387. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  388. package/dist/esm/hooks/useExport.js +4 -2
  389. package/dist/esm/hooks/useOnClickOutside.js +5 -5
  390. package/dist/esm/hooks/useOnWindowResize.d.ts.map +1 -1
  391. package/dist/esm/hooks/useOnWindowResize.js +3 -3
  392. package/dist/esm/hooks/useQuill.d.ts +10 -27
  393. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  394. package/dist/esm/hooks/useQuill.js +114 -82
  395. package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  396. package/dist/esm/hooks/useSelectOnKeyDown.js +5 -5
  397. package/dist/esm/hooks/useTheme.js +1 -1
  398. package/dist/esm/index.d.ts +1 -0
  399. package/dist/esm/index.d.ts.map +1 -1
  400. package/dist/esm/index.js +1 -0
  401. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  402. package/dist/esm/internals/ReportBuilder/PivotForm.js +9 -2
  403. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +2 -2
  404. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  405. package/dist/esm/internals/ReportBuilder/PivotList.js +3 -3
  406. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
  407. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  408. package/dist/esm/internals/ReportBuilder/PivotModal.js +68 -82
  409. package/dist/esm/lib/utils.js +2 -2
  410. package/dist/esm/models/Filter.d.ts +104 -4
  411. package/dist/esm/models/Filter.d.ts.map +1 -1
  412. package/dist/esm/models/Filter.js +90 -1
  413. package/dist/esm/models/Pagination.d.ts +10 -0
  414. package/dist/esm/models/Pagination.d.ts.map +1 -0
  415. package/dist/esm/models/Pagination.js +1 -0
  416. package/dist/esm/models/Report.d.ts +116 -0
  417. package/dist/esm/models/Report.d.ts.map +1 -0
  418. package/dist/esm/models/Report.js +1 -0
  419. package/dist/esm/utils/aggregate.js +1 -1
  420. package/dist/esm/utils/astFilterProcessing.d.ts +36 -0
  421. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -0
  422. package/dist/esm/utils/astFilterProcessing.js +8049 -0
  423. package/dist/esm/utils/astFilterProcessing.uspec.d.ts +2 -0
  424. package/dist/esm/utils/astFilterProcessing.uspec.d.ts.map +1 -0
  425. package/dist/esm/utils/astFilterProcessing.uspec.js +2729 -0
  426. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  427. package/dist/esm/utils/astProcessing.js +4 -3
  428. package/dist/esm/utils/axisFormatter.js +0 -71
  429. package/dist/esm/utils/color.js +9 -87
  430. package/dist/esm/utils/columnProcessing.d.ts +1 -0
  431. package/dist/esm/utils/columnProcessing.d.ts.map +1 -1
  432. package/dist/esm/utils/columnProcessing.js +6 -0
  433. package/dist/esm/utils/csv.d.ts.map +1 -1
  434. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  435. package/dist/esm/utils/dashboard.js +4 -4
  436. package/dist/esm/utils/dataFetcher.d.ts +1 -1
  437. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  438. package/dist/esm/utils/dataFetcher.js +72 -5
  439. package/dist/esm/utils/dataProcessing.d.ts +8 -0
  440. package/dist/esm/utils/dataProcessing.d.ts.map +1 -0
  441. package/dist/esm/utils/dataProcessing.js +122 -0
  442. package/dist/esm/utils/dataProcessing.uspec.d.ts +2 -0
  443. package/dist/esm/utils/dataProcessing.uspec.d.ts.map +1 -0
  444. package/dist/esm/utils/dataProcessing.uspec.js +204 -0
  445. package/dist/esm/utils/dates.d.ts +2 -1
  446. package/dist/esm/utils/dates.d.ts.map +1 -1
  447. package/dist/esm/utils/dates.js +10 -2
  448. package/dist/esm/utils/error.d.ts +5 -0
  449. package/dist/esm/utils/error.d.ts.map +1 -0
  450. package/dist/esm/utils/error.js +8 -0
  451. package/dist/esm/utils/filterConstants.d.ts +34 -0
  452. package/dist/esm/utils/filterConstants.d.ts.map +1 -0
  453. package/dist/esm/utils/filterConstants.js +33 -0
  454. package/dist/esm/utils/filterProcessing.js +4 -4
  455. package/dist/esm/utils/logging.d.ts.map +1 -1
  456. package/dist/esm/utils/logging.js +1 -0
  457. package/dist/esm/utils/merge.js +0 -21
  458. package/dist/esm/utils/monacoConfig.d.ts +21 -0
  459. package/dist/esm/utils/monacoConfig.d.ts.map +1 -0
  460. package/dist/esm/utils/monacoConfig.js +319 -0
  461. package/dist/esm/utils/paginationProcessing.d.ts +5 -0
  462. package/dist/esm/utils/paginationProcessing.d.ts.map +1 -0
  463. package/dist/esm/utils/paginationProcessing.js +25 -0
  464. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  465. package/dist/esm/utils/pivotConstructor.js +67 -5
  466. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  467. package/dist/esm/utils/pivotProcessing.js +12 -6
  468. package/dist/esm/utils/queryConstructor.d.ts +4 -2
  469. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  470. package/dist/esm/utils/queryConstructor.js +118 -58
  471. package/dist/esm/utils/queryConstructor.uspec.d.ts +2 -0
  472. package/dist/esm/utils/queryConstructor.uspec.d.ts.map +1 -0
  473. package/dist/esm/utils/queryConstructor.uspec.js +223 -0
  474. package/dist/esm/utils/report.d.ts +7 -0
  475. package/dist/esm/utils/report.d.ts.map +1 -0
  476. package/dist/esm/utils/report.ispec.d.ts +2 -0
  477. package/dist/esm/utils/report.ispec.d.ts.map +1 -0
  478. package/dist/esm/utils/report.ispec.js +46 -0
  479. package/dist/esm/utils/report.js +88 -0
  480. package/dist/esm/utils/schema.d.ts.map +1 -1
  481. package/dist/esm/utils/schema.js +35 -6
  482. package/dist/esm/utils/styles.d.ts +1 -1
  483. package/dist/esm/utils/styles.d.ts.map +1 -1
  484. package/dist/esm/utils/tableProcessing.d.ts +23 -8
  485. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  486. package/dist/esm/utils/tableProcessing.ispec.d.ts +2 -0
  487. package/dist/esm/utils/tableProcessing.ispec.d.ts.map +1 -0
  488. package/dist/esm/utils/tableProcessing.ispec.js +61 -0
  489. package/dist/esm/utils/tableProcessing.js +152 -37
  490. package/dist/esm/utils/textProcessing.js +3 -3
  491. package/dist/esm/utils/validation.d.ts +9 -0
  492. package/dist/esm/utils/validation.d.ts.map +1 -0
  493. package/dist/esm/utils/validation.js +20 -0
  494. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  495. package/dist/esm/utils/valueFormatter.js +8 -4
  496. package/package.json +1 -1
  497. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  498. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  499. package/dist/cjs/internals/ReportBuilder/PivotModal.spec.js +0 -213
  500. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts +0 -2
  501. package/dist/esm/internals/ReportBuilder/PivotModal.spec.d.ts.map +0 -1
  502. package/dist/esm/internals/ReportBuilder/PivotModal.spec.js +0 -211
@@ -1,26 +1,24 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- /* eslint-disable no-unused-vars */
3
2
  import { useContext, useEffect, useRef, useState, } from 'react';
4
3
  import { DEFAULT_TAB_OPTIONS, MemoizedButton, MemoizedCheckbox, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedSecondaryButton, MemoizedText, MemoizedPopover, QuillTabs, MemoizedModal, QuillChartBuilderInputRowContainer, QuillChartBuilderInputColumnContainer, MemoizedSubHeader, QuillErrorMessageComponent, QuillPivotRowContainer, QuillPivotColumnContainer, QuillColumnSearchEmptyState, QuillChartBuilderFormContainer, QuillLoadingComponent, QuillTableSQLEditorComponent, } from './components/UiComponents';
5
4
  import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
6
5
  import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
7
6
  import { CSS as DND_CSS } from '@dnd-kit/utilities';
8
- import { getQuarter } from 'date-fns';
9
7
  import { ClientContext, CustomFieldContext, SchemaContext, ThemeContext, } from './Context';
10
- import { getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
11
- import { ChartBuilderWithModal } from './ChartBuilder';
8
+ import { extractColumnish, getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
9
+ import { ChartBuilderWithModal, createInitialFormData } from './ChartBuilder';
12
10
  import { QuillTextInput } from './components/UiComponents';
13
- import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover, TagWrapper, EditPopover, AddFilterPopover, QuillLimitPopover, } from './components/ReportBuilder/ui';
11
+ import { QuillSidebar, CustomContainer, QuillSelectColumn, QuillDraggableColumn, QuillSidebarHeading, QuillFilterPopover, QuillSortPopover, QuillLimitPopover, FilterPopoverWrapper, } from './components/ReportBuilder/ui';
14
12
  import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
15
13
  import { convertBigQuery, convertGroupBy, convertRemoveSimpleParentheses, convertStringComparison, convertWildcardColumns, } from './components/ReportBuilder/convert';
16
- import { deepCopy, formatDateComparisonNode, getDateFilterInfo, getPostgresBasicType, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, isTopLevelBoolean, showNodeAsRow, tryConvertDateEquality, removeNonSelectedTableReferences, getCustomSentence, isEquals, } from './components/ReportBuilder/util';
14
+ import { deepCopy, formatDateComparisonNode, getDateFilterInfo, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, showNodeAsRow, removeNonSelectedTableReferences, isEquals, } from './components/ReportBuilder/util';
17
15
  import { getDefaultOperatorSubtrees, OPERATOR_GROUPS, } from './components/ReportBuilder/operators';
18
16
  import { hashCode } from './utils/crypto';
19
- import { DATE_FMT, DAY_OF_WEEK, defaultAST, defaultBoolComparison, defaultColumn, defaultEntry, defaultNumericComparison, defaultTable, defaultVariant, MONTH_OF_YEAR, } from './components/ReportBuilder/constants';
17
+ import { defaultAST, defaultBoolComparison, defaultColumn, defaultEntry, defaultNumericComparison, defaultTable, defaultVariant, } from './components/ReportBuilder/constants';
20
18
  import AddColumnModal from './components/ReportBuilder/AddColumnModal';
21
19
  import { AddSortPopover, SortSentence, } from './components/ReportBuilder/AddSortPopover';
22
- import { PivotModal, generatePivotTableInMemory, } from './internals/ReportBuilder/PivotModal';
23
- import { snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
20
+ import { PivotModal, generatePivotTable, } from './internals/ReportBuilder/PivotModal';
21
+ import { snakeAndCamelCaseToTitleCase } from './utils/textProcessing';
24
22
  import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddLimitPopover';
25
23
  import { updateFirstChildWidth } from './utils/width';
26
24
  import { QuillSelectComponent } from './components/QuillSelect';
@@ -28,13 +26,21 @@ import { QuillCard } from './components/QuillCard';
28
26
  import { getData } from './utils/dataFetcher';
29
27
  import { DATE_FORMAT_TYPES, quillFormat } from './utils/valueFormatter';
30
28
  import { getPossiblePivotFieldOptions, pivotToSql, } from './utils/pivotProcessing';
31
- import { getUniqueValuesByColumns } from './utils/tableProcessing';
29
+ import { getUniqueValuesByColumns, getDateRangeByColumns, getCountsByColumns, fetchTableByQuery, } from './utils/tableProcessing';
32
30
  import { useQuill } from './hooks/useQuill';
33
31
  import { getDataFromCloud } from './utils/dataFetcher';
34
32
  import { convertColumnInfoToColumnInternal, convertPostgresColumn, } from './utils/columnProcessing';
35
33
  import { getSelectFromAST, processApostrophe, processStarColumn, } from './utils/astProcessing';
36
34
  import PivotForm from './internals/ReportBuilder/PivotForm';
37
35
  import { getSchemaInfoWithCustomFields } from './utils/schema';
36
+ import { getDateBucketFromRange } from './utils/dates';
37
+ import FilterModal from './components/ReportBuilder/FilterModal';
38
+ import { DateOperator, FilterNames } from './models/Filter';
39
+ import { filterToAst, filterTreeToAst, } from './utils/astFilterProcessing';
40
+ import useAstToFilterTree from './hooks/useAstToFilterTree';
41
+ import { QuillMultiSelectComponent } from './components/QuillMultiSelect';
42
+ import { shouldFetchMore, DEFAULT_PAGINATION, shouldSortInMemory, } from './utils/paginationProcessing';
43
+ import { formatRowsFromReport } from './utils/report';
38
44
  export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
39
45
  'https://quill-344421.uc.r.appspot.com';
40
46
  /**
@@ -68,7 +74,7 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
68
74
  * ### Report Builder API
69
75
  * @see https://docs.quillsql.com/components/report-builder
70
76
  */
71
- export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = (_) => void null, onSubmitCreateReport = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
77
+ export default function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = MemoizedButton, SecondaryButtonComponent = MemoizedSecondaryButton, DeleteButtonComponent = MemoizedDeleteButton, ModalComponent = MemoizedModal, TextInputComponent = QuillTextInput, SelectComponent = QuillSelectComponent, MultiSelectComponent = QuillMultiSelectComponent, TableComponent = QuillTableSQLEditorComponent, PopoverComponent = MemoizedPopover, TabsComponent = QuillTabs, CheckboxComponent = MemoizedCheckbox, SidebarComponent = QuillSidebar, ContainerComponent = CustomContainer, SelectColumnComponent = QuillSelectColumn, DraggableColumnComponent = QuillDraggableColumn, SidebarHeadingComponent = QuillSidebarHeading, FilterPopoverComponent = QuillFilterPopover, SortPopoverComponent = QuillSortPopover, LimitPopoverComponent = QuillLimitPopover, CardComponent = QuillCard, LabelComponent = MemoizedLabel, HeaderComponent = MemoizedHeader, SubHeaderComponent = MemoizedSubHeader, TextComponent = MemoizedText, ErrorMessageComponent = QuillErrorMessageComponent, ChartBuilderInputRowContainer = QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = QuillChartBuilderInputColumnContainer, PivotRowContainer = QuillPivotRowContainer, PivotColumnContainer = QuillPivotColumnContainer, LoadingComponent = QuillLoadingComponent, ColumnSearchEmptyState = QuillColumnSearchEmptyState, ChartBuilderFormContainer = QuillChartBuilderFormContainer, ChartBuilderModalComponent = MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
72
78
  const { data: report } = useQuill(reportId || '');
73
79
  const [aiPrompt, setAiPrompt] = useState('');
74
80
  const [errorMessage, setErrorMessage] = useState('');
@@ -91,8 +97,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
91
97
  const [rows, setRows] = useState([]);
92
98
  const [formattedRows, setFormattedRows] = useState([]);
93
99
  const [columns, setColumns] = useState([]);
100
+ const [tempReport, setTempReport] = useState({});
94
101
  const [topLevelBinaryOperator, setTopLevelBinaryOperator] = useState('AND');
95
- const [editPopoverKey, setEditPopoverKey] = useState(null);
96
102
  const [uniqueValues, setUniqueValues] = useState({});
97
103
  const [pivot, setPivot] = useState(null);
98
104
  const [pivotData, setPivotData] = useState(null);
@@ -100,8 +106,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
100
106
  const [recommendedPivots, setRecommendedPivots] = useState([]);
101
107
  const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
102
108
  const [showPivotPopover, setShowPivotPopover] = useState(false);
103
- const [isEdittingPivot, setIsEdittingPivot] = useState(false);
104
- const [initalChartLoad, setInitalChartLoad] = useState(false);
109
+ const [isEditingPivot, setIsEditingPivot] = useState(false);
110
+ const [initialChartLoad, setInitialChartLoad] = useState(false);
105
111
  const [askedAQuestion, setAskedAQuestion] = useState(false);
106
112
  const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
107
113
  const [initialLoad, setInitialLoad] = useState(!!initialTableName || !!reportId);
@@ -116,23 +122,44 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
116
122
  const [pivotColumnField, setPivotColumnField] = useState(undefined);
117
123
  const [pivotValueField, setPivotValueField] = useState(undefined);
118
124
  const [pivotAggregation, setPivotAggregation] = useState(undefined);
119
- // eslint-disable-next-line no-unused-vars
120
- const [client, _setClient] = useContext(ClientContext);
125
+ const [dateRanges, setDateRanges] = useState(null);
126
+ const [client] = useContext(ClientContext);
121
127
  // JANK: This is temp and stupid
122
128
  const [overrideRecommendations, setOverrideRecommendations] = useState(true);
123
129
  const [customFields, setCustomFields] = useContext(CustomFieldContext);
130
+ const [openFilterIndex, setOpenFilterIndex] = useState(null); // Sets open filter modals
131
+ const [fieldValuesMap, setFieldValuesMap] = useState({}); // Mapping of unique values per field, used in string filter 'in' and 'not in'
132
+ const filterTree = useAstToFilterTree(formData, client); // Stores the state of filters
124
133
  useEffect(() => {
134
+ if (!client) {
135
+ return;
136
+ }
125
137
  if (client.publicKey === '663416663aa9bc716e59a89d') {
126
138
  setOverrideRecommendations(false);
127
139
  }
128
140
  if (!loadingSchema) {
129
141
  fetchSchema();
130
142
  }
131
- }, [client.publicKey, client.customerId]);
143
+ }, [client]);
132
144
  useEffect(() => {
133
145
  updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
134
146
  updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
135
147
  }, [dataDisplayed]);
148
+ // Whenever unique values changes, update the fieldValuesMap, used in FilterModals
149
+ useEffect(() => {
150
+ const tables = getTableNames(baseAst);
151
+ const table = tables.length === 1 ? tables[0] : initialTableName;
152
+ const newFieldValues = {};
153
+ if (uniqueValues[table]) {
154
+ for (const field of Object.keys(uniqueValues[table])) {
155
+ newFieldValues[field] = [];
156
+ for (const value of Object.keys(uniqueValues[table][field])) {
157
+ newFieldValues[field]?.push(value);
158
+ }
159
+ }
160
+ }
161
+ setFieldValuesMap(newFieldValues);
162
+ }, [uniqueValues]);
136
163
  useEffect(() => {
137
164
  // Since the TextInput component takes a required numeric width parameter,
138
165
  // we dynamically calculate the width of this component here.
@@ -146,8 +173,9 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
146
173
  window.removeEventListener('resize', handleResize);
147
174
  };
148
175
  }, []);
149
- const updatePivot = (changeField, fieldKey) => {
176
+ const updatePivot = async (changeField, fieldKey) => {
150
177
  const newPivot = pivot;
178
+ setTableLoading(true);
151
179
  // @ts-ignore
152
180
  newPivot[fieldKey] = changeField;
153
181
  if (fieldKey === 'rowField') {
@@ -165,11 +193,27 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
165
193
  newPivot.sort = undefined;
166
194
  }
167
195
  }
168
- setPivot(newPivot);
169
- const pivotedData = generatePivotTableInMemory(newPivot, rows, undefined, false);
196
+ let dateBucket = undefined;
197
+ const tempDateRange = dateRanges && dateRanges[newPivot.rowField];
198
+ if (tempDateRange) {
199
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
200
+ }
201
+ let distinctValuesForQuery = {};
202
+ if (pivot.columnField) {
203
+ distinctValuesForQuery = await getUniqueValuesByColumns([
204
+ {
205
+ field: pivot.columnField,
206
+ label: pivot.columnField,
207
+ format: 'string',
208
+ },
209
+ ], activeQuery, [], client, customFields);
210
+ }
211
+ const pivotedData = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, distinctValuesForQuery);
170
212
  setPivotData(pivotedData || []);
171
213
  const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
214
+ setPivot(newPivot);
172
215
  setFormattedRows(formattedRows);
216
+ setTableLoading(false);
173
217
  };
174
218
  const enforceOrderOnColumns = (columnNames) => {
175
219
  if (pivot) {
@@ -204,7 +248,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
204
248
  setRows([]);
205
249
  setColumns([]);
206
250
  setTopLevelBinaryOperator('AND');
207
- setEditPopoverKey(null);
208
251
  setErrorMessage('');
209
252
  setFormattedRows([]);
210
253
  // setUniqueValues({});
@@ -214,10 +257,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
214
257
  }, 0);
215
258
  };
216
259
  useEffect(() => {
260
+ if (!client) {
261
+ return;
262
+ }
217
263
  if (!initialLoad && client.publicKey) {
218
264
  clearAllState();
219
265
  }
220
- }, [client.publicKey, client.customerId]);
266
+ }, [client]);
221
267
  useEffect(() => {
222
268
  if (activePath !== null) {
223
269
  // update the modal with the new subtree
@@ -229,8 +275,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
229
275
  if (pivot) {
230
276
  const formattedRows = copiedRows.map((row) => {
231
277
  const formattedRow = row;
232
- Object.keys(row).forEach((key, index) => {
233
- let column = columns.find((c) => c.field === key);
278
+ Object.keys(row).forEach((key) => {
279
+ const column = columns.find((c) => c.field === key);
234
280
  let format = 'string';
235
281
  if (!column) {
236
282
  format =
@@ -290,42 +336,20 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
290
336
  navigator.clipboard.writeText(query);
291
337
  setTimeout(() => setIsCopying(false), 800);
292
338
  };
293
- const copyToClipboard = (str) => {
294
- setIsCopying(true);
295
- navigator.clipboard.writeText(str);
296
- setTimeout(() => setIsCopying(false), 800);
297
- };
298
339
  const clearCheckboxes = () => {
299
340
  const checkboxes = uniqueValues;
300
341
  const newValues = {};
301
- for (let table of Object.keys(checkboxes)) {
342
+ for (const table of Object.keys(checkboxes)) {
302
343
  newValues[table] = {};
303
- for (let column of Object.keys(checkboxes[table])) {
344
+ for (const column of Object.keys(checkboxes[table])) {
304
345
  newValues[table][column] = {};
305
- for (let variant of Object.keys(checkboxes[table][column])) {
346
+ for (const variant of Object.keys(checkboxes[table][column])) {
306
347
  newValues[table][column][variant] = false;
307
348
  }
308
349
  }
309
350
  }
310
351
  setUniqueValues(newValues);
311
352
  };
312
- const setCheckboxes = (node) => {
313
- if (!['IN', 'NOT IN'].includes(node.operator))
314
- return;
315
- const selectedItems = node.right.value.flatMap((v) => v.args.value.map((x) => x.value.toLowerCase()));
316
- const checkboxes = uniqueValues;
317
- const newValues = {};
318
- for (let table of Object.keys(checkboxes)) {
319
- newValues[table] = {};
320
- for (let column of Object.keys(checkboxes[table])) {
321
- newValues[table][column] = {};
322
- for (let variant of Object.keys(checkboxes[table][column])) {
323
- newValues[table][column][variant] = selectedItems.includes(variant.toLowerCase());
324
- }
325
- }
326
- }
327
- setUniqueValues(newValues);
328
- };
329
353
  const fetchSqlQuery = async (ast, formData, fetchData = true) => {
330
354
  if (fetchData) {
331
355
  setLoading(true);
@@ -341,6 +365,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
341
365
  body: JSON.stringify({
342
366
  ast: { ...ast, where },
343
367
  publicKey: client.publicKey,
368
+ useNewNodeSql: true, // new flag
344
369
  }),
345
370
  });
346
371
  const data = await response.json();
@@ -348,12 +373,41 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
348
373
  if (fetchData) {
349
374
  fetchUponChange(ast, formData);
350
375
  }
376
+ return data.query;
351
377
  }
352
378
  catch (error) {
353
379
  setLoading(false);
354
380
  console.error(error);
355
381
  }
356
382
  };
383
+ const getUniqueStringValues = async (columns, tableName) => {
384
+ const convertedStringColumns = columns
385
+ .filter((column) => {
386
+ return isTextColumnType(column.fieldType);
387
+ })
388
+ .map((column) => convertColumnInfoToColumnInternal(column));
389
+ const stringNames = convertedStringColumns.map((column) => column.field);
390
+ const smallStringColumns = await getCountsByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, client, customFields);
391
+ const smallStringNames = smallStringColumns.map((column) => column.field);
392
+ const newUniqueValues = await getUniqueValuesByColumns(smallStringColumns, `Select ${smallStringNames.join(', ')} from ${tableName}`, [], client, customFields);
393
+ const joinedUniqueValues = deepCopy(uniqueValues);
394
+ joinedUniqueValues[tableName] = newUniqueValues;
395
+ return joinedUniqueValues;
396
+ };
397
+ const getDateRanges = async (columns, tableName) => {
398
+ const dateColumns = columns.filter((column) => {
399
+ return column.fieldType === 'date';
400
+ });
401
+ if (dateColumns.length === 0) {
402
+ return {};
403
+ }
404
+ const dateColumnNames = dateColumns.map((column) => {
405
+ //@ts-ignore
406
+ return column.field || column.name;
407
+ });
408
+ const dateRanges = await getDateRangeByColumns(dateColumns, `Select ${dateColumnNames.join(', ')} from ${tableName}`, client, customFields);
409
+ return dateRanges;
410
+ };
357
411
  // It's just like getColumnsInPivot but we expand the columnField
358
412
  // if there is one to include all the variants just like it would
359
413
  // show up in the table. (eg. category -> ...[Fuel, Food, Other])
@@ -380,18 +434,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
380
434
  setLoading(true);
381
435
  const tableInfo = tables.find((tableInfo) => tableInfo.name === initialTableName);
382
436
  if (tableInfo) {
383
- const convertedStringColumns = tableInfo.columns
384
- .filter((column) => {
385
- return isTextColumnType(column.fieldType);
386
- })
387
- .map((column) => convertColumnInfoToColumnInternal(column));
388
- const stringNames = convertedStringColumns.map((column) => column.field);
389
- const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client, customFields);
390
- const joinedUniqueValues = deepCopy(uniqueValues);
391
- joinedUniqueValues[initialTableName] = newUniqueValues;
392
- if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
393
- setUniqueValues(joinedUniqueValues);
437
+ const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName);
438
+ if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
439
+ setUniqueValues(newUniqueValues);
394
440
  }
441
+ const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
442
+ setDateRanges(dateRangesTemp);
395
443
  }
396
444
  const columnsForTable = tables
397
445
  .find((t) => t.name === initialTableName)
@@ -450,80 +498,102 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
450
498
  };
451
499
  useEffect(() => {
452
500
  const loadChart = async () => {
453
- setInitalChartLoad(true);
501
+ setInitialChartLoad(true);
502
+ // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
454
503
  if (!report || report.referencedTables.length !== 1) {
455
- setInitalChartLoad(false);
456
- return;
457
- }
458
- const tableName = report.referencedTables[0];
459
- if (!tableName) {
460
- return;
461
- }
462
- const resp = await getDataFromCloud(client, `astify`, {
463
- query: report.queryString,
464
- });
465
- if (resp.success === false) {
466
- setErrorMessage('Error: ' + resp.message);
504
+ setInitialChartLoad(false);
467
505
  return;
468
506
  }
469
- const ast = getSelectFromAST(resp.ast);
470
- let convertedAst = processStarColumn(ast, report.columns);
471
- processApostrophe(convertedAst, ['type', 'value']);
472
- convertedAst = convertBigQuery(convertedAst);
473
- let schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
474
- let newAst, groupByPivot;
475
- ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(convertedAst,
476
- // @ts-ignore
477
- report.pivot, schemaInfo));
478
- if (convertedAst.where) {
479
- setFormData(deepCopy(convertedAst.where));
480
- }
481
- setActiveQuery(report.queryString);
482
- newAst = groupByPivot ? newAst : convertedAst;
483
- setBaseAst(newAst);
484
- const initialRows = await fetchUponChange(newAst, undefined);
485
- const tableInfo = schemaInfo.find((table) => table.name === tableName);
486
- const stringColumns = tableInfo.columns
487
- .filter((column) => {
488
- return column.fieldType === 'varchar' || column.fieldType === 'text';
489
- })
490
- .map((column) => convertColumnInfoToColumnInternal(column));
491
- if (stringColumns.length !== 0 && tableName) {
492
- const stringNames = stringColumns.map((column) => column.field);
493
- const newUniqueValues = await getUniqueValuesByColumns(stringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, [], client, customFields);
494
- const joinedUniqueValues = deepCopy(uniqueValues);
495
- joinedUniqueValues[tableName] = newUniqueValues;
496
- setUniqueValues(joinedUniqueValues);
497
- }
498
- if (groupByPivot) {
499
- // @ts-ignore
500
- setPivotRowField(groupByPivot.rowField);
501
- // @ts-ignore
502
- setPivotAggregation(groupByPivot.aggregationType);
503
- // @ts-ignore
504
- setPivotColumnField(groupByPivot.columnField);
505
- // @ts-ignore
506
- setPivotValueField(groupByPivot.valueField);
507
- setPivot(groupByPivot);
508
- const pivotedData = generatePivotTableInMemory(
509
- // @ts-ignore
510
- groupByPivot, initialRows, undefined, false);
511
- setPivotData(pivotedData || []);
512
- const formattedRows = formatRows(pivotedData.rows, report.columns, true,
507
+ try {
508
+ // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
509
+ const tableName = report.referencedTables[0];
510
+ if (!tableName) {
511
+ return;
512
+ }
513
+ const resp = await getDataFromCloud(client, `astify`, {
514
+ // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
515
+ query: report.queryString,
516
+ useNewNodeSql: true,
517
+ });
518
+ if (resp.success === false) {
519
+ setErrorMessage(resp.message);
520
+ return;
521
+ }
522
+ const ast = getSelectFromAST(resp.ast);
523
+ let convertedAst = processStarColumn(ast, report.columns);
524
+ processApostrophe(convertedAst, ['type', 'value']);
525
+ convertedAst = convertBigQuery(convertedAst);
526
+ const schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
527
+ let newAst;
528
+ let groupByPivot = {};
529
+ ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(convertedAst,
513
530
  // @ts-ignore
514
- groupByPivot.aggregationType);
515
- setFormattedRows(formattedRows);
531
+ report.pivot, schemaInfo));
532
+ if (convertedAst.where) {
533
+ setFormData(deepCopy(convertedAst.where));
534
+ }
535
+ // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
536
+ setActiveQuery(report.queryString);
537
+ newAst = groupByPivot ? newAst : convertedAst;
538
+ const initialRows = await fetchUponChange(newAst, undefined);
539
+ if (initialRows.error) {
540
+ setBaseAst(null);
541
+ setErrorMessage(initialRows.message);
542
+ setInitialChartLoad(false);
543
+ return;
544
+ }
545
+ setBaseAst(newAst);
546
+ const tableInfo = schemaInfo.find((table) => table.name === tableName);
547
+ let newUniqueValues = undefined;
548
+ let dateRangesTemp = undefined;
549
+ if (tableName) {
550
+ newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
551
+ setUniqueValues(newUniqueValues);
552
+ dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
553
+ setDateRanges(dateRangesTemp);
554
+ }
555
+ if (groupByPivot) {
556
+ // @ts-ignore
557
+ setPivotRowField(groupByPivot.rowField);
558
+ // @ts-ignore
559
+ setPivotAggregation(groupByPivot.aggregationType);
560
+ // @ts-ignore
561
+ setPivotColumnField(groupByPivot.columnField);
562
+ // @ts-ignore
563
+ setPivotValueField(groupByPivot.valueField);
564
+ setPivot(groupByPivot);
565
+ let dateBucket = undefined;
566
+ const tempDateRange = dateRangesTemp &&
567
+ groupByPivot.rowField &&
568
+ dateRangesTemp[groupByPivot.rowField];
569
+ if (tempDateRange) {
570
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
571
+ }
572
+ const pivotedData = await generatePivotTable(
573
+ // @ts-ignore
574
+ groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
575
+ setPivotData(pivotedData || []);
576
+ const formattedRows = formatRows(pivotedData.rows, report.columns, true,
577
+ // @ts-ignore
578
+ groupByPivot.aggregationType);
579
+ setFormattedRows(formattedRows);
580
+ }
581
+ else {
582
+ const formattedRows = formatRows(report.rows, report.columns);
583
+ setFormattedRows(formattedRows);
584
+ }
585
+ setCurrentTable(tableName);
516
586
  }
517
- else {
518
- const formattedRows = formatRows(report.rows, report.columns);
519
- setFormattedRows(formattedRows);
587
+ catch (error) {
588
+ console.error(error);
589
+ setErrorMessage('Error loading report');
520
590
  }
521
- setCurrentTable(tableName);
522
591
  // This handles a flashing issue
523
592
  setTimeout(() => {
524
- setInitalChartLoad(false);
593
+ setInitialChartLoad(false);
525
594
  }, 500);
526
595
  };
596
+ // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
527
597
  if (report && report.referencedTables.length === 1) {
528
598
  loadChart();
529
599
  }
@@ -849,10 +919,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
849
919
  isReplaceSubtree: true,
850
920
  });
851
921
  };
852
- // Function to handle the deletion of expressions
853
- const handleDelete = (key) => {
854
- updateFormData([{ path: key, value: null }], { isDeletion: true });
855
- };
856
922
  // Function to handle the insertion of expressions
857
923
  const handleInsertion = (value, op = 'OR', isCondition = undefined) => {
858
924
  updateFormData([{ path: '', value }], {
@@ -915,6 +981,66 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
915
981
  return [{ label: snakeAndCamelCaseToTitleCase(pivot.valueField) }];
916
982
  }
917
983
  };
984
+ const [previousPage, setPreviousPage] = useState(0);
985
+ const [currentProcessing, setCurrentProcessing] = useState({
986
+ page: DEFAULT_PAGINATION,
987
+ });
988
+ const [numberOfRows, setNumberOfRows] = useState(0);
989
+ const [tableLoading, setTableLoading] = useState(false);
990
+ const onPageChange = (page) => {
991
+ if (currentProcessing.page &&
992
+ shouldFetchMore(DEFAULT_PAGINATION, page, previousPage)) {
993
+ const newPagination = { ...currentProcessing.page, page };
994
+ const updatedProcessing = { ...currentProcessing, page: newPagination };
995
+ setCurrentProcessing(updatedProcessing);
996
+ handleRunQuery(updatedProcessing);
997
+ }
998
+ if (page > previousPage) {
999
+ setPreviousPage(page);
1000
+ }
1001
+ };
1002
+ const onSortChange = (sort) => {
1003
+ if (report &&
1004
+ shouldSortInMemory(DEFAULT_PAGINATION, report.rowCount, !!report.pivot)) {
1005
+ return;
1006
+ }
1007
+ const updatedProcessing = { page: DEFAULT_PAGINATION, sort };
1008
+ handleRunQuery(updatedProcessing, true);
1009
+ setCurrentProcessing(updatedProcessing);
1010
+ setPreviousPage(0);
1011
+ };
1012
+ const handleRunQuery = async (processing, resetRows = false) => {
1013
+ try {
1014
+ setErrorMessage('');
1015
+ setTableLoading(true);
1016
+ const tableInfo = await fetchTableByQuery(activeQuery, client, processing, customFields);
1017
+ if (tableInfo.error) {
1018
+ throw new Error(tableInfo.error);
1019
+ }
1020
+ else if (tableInfo.rows.length === 0) {
1021
+ throw new Error('No data found');
1022
+ }
1023
+ if (tableInfo.rowCount) {
1024
+ setNumberOfRows(tableInfo.rowCount);
1025
+ }
1026
+ setCurrentProcessing(processing);
1027
+ let tempRows = [...rows, ...tableInfo.rows];
1028
+ if (resetRows) {
1029
+ tempRows = tableInfo.rows;
1030
+ }
1031
+ setRows(tempRows);
1032
+ setFormattedRows(formatRowsFromReport({ rows: tempRows, columns: tableInfo.columns }));
1033
+ setColumns(tableInfo.columns);
1034
+ setTableLoading(false);
1035
+ }
1036
+ catch (e) {
1037
+ setTableLoading(false);
1038
+ setErrorMessage('Failed to run SQL query: ' + e);
1039
+ setRows([]);
1040
+ setColumns([]);
1041
+ return;
1042
+ }
1043
+ };
918
1044
  /**
919
1045
  * Render form fields based on the type of the node
920
1046
  * @param node the AST or subtree to render recursively
@@ -930,10 +1056,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
930
1056
  case 'binary_expr':
931
1057
  if (dateComparisonPartialMatch ||
932
1058
  (isDateTruncEquals(node) && client.databaseType !== 'BigQuery')) {
933
- const { dateColumn,
934
- // see onChange callback handleChange
935
- // eslint-disable-next-line no-unused-vars
936
- dateColumnPath, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
1059
+ const { dateColumn, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
937
1060
  const isPlural = intervalCount !== 1 && dateFilterType !== 'in the current'
938
1061
  ? 's'
939
1062
  : '';
@@ -1081,7 +1204,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1081
1204
  } }))] }));
1082
1205
  }
1083
1206
  else if (isInTheLastInterval(node, client.databaseType)) {
1084
- const { dateColumn, dateFilterType, intervalCount, intervalType } = getDateFilterInfo(node);
1207
+ const { dateColumn } = getDateFilterInfo(node);
1085
1208
  const options = getAllPossibleColumns().map((column) => ({
1086
1209
  label: snakeAndCamelCaseToTitleCase(column.displayName),
1087
1210
  value: column.name,
@@ -1142,7 +1265,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1142
1265
  ], width: 200 }) })] }));
1143
1266
  }
1144
1267
  else if (isTheCurrentInterval(node, client.databaseType)) {
1145
- const { dateFilterType } = getDateFilterInfo(node);
1146
1268
  const options = getAllPossibleColumns().map((column) => ({
1147
1269
  label: snakeAndCamelCaseToTitleCase(column.displayName),
1148
1270
  value: column.name,
@@ -1201,7 +1323,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1201
1323
  { label: `week`, value: 'WEEK' },
1202
1324
  ], width: 200 })] }));
1203
1325
  }
1204
- else if (isThePreviousInterval(node, client.databaseType)) {
1326
+ else if (isThePreviousInterval(node)) {
1205
1327
  const options = getAllPossibleColumns().map((column) => ({
1206
1328
  label: snakeAndCamelCaseToTitleCase(column.displayName),
1207
1329
  value: column.name,
@@ -1348,7 +1470,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1348
1470
  .find((tableInfo) => tableInfo.name === table)
1349
1471
  ?.columns.find((col) => col.name === leftChildValue);
1350
1472
  const columnType = column?.fieldType;
1351
- let operatorOptions = [
1473
+ const operatorOptions = [
1352
1474
  ...(isNumericColumnType(columnType)
1353
1475
  ? [
1354
1476
  { label: 'equal to', value: '=' },
@@ -1589,112 +1711,214 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1589
1711
  }
1590
1712
  return validPivot;
1591
1713
  };
1592
- const renderSentence = (formData, node, keyPrefix = '',
1593
- // @depreciated TODO: remove next update
1594
- // eslint-disable-next-line no-unused-vars
1595
- isTopLevel = false,
1596
- // @depreciated TODO: remove next update
1597
- // eslint-disable-next-line no-unused-vars
1598
- isTopLevelAnd = false, isParentRow = false) => {
1599
- const uniqueSentence = getCustomSentence(node, client.databaseType);
1600
- let dateComparisonPartialMatch = null;
1601
- let dateEqualityPartialMatch = null;
1602
- if (client.databaseType !== 'BigQuery') {
1603
- dateComparisonPartialMatch = formatDateComparisonNode(node);
1604
- dateEqualityPartialMatch = tryConvertDateEquality(node, client.databaseType);
1714
+ /**
1715
+ *
1716
+ * @param filterTree
1717
+ * Returns a list of filters to be displayed
1718
+ * Replaces the functionality of renderNodes in the context of filters
1719
+ * Contains filterSentence, which replaces renderSentence
1720
+ */
1721
+ const renderFilters = (filterTree) => {
1722
+ let tree = filterTree;
1723
+ let filterStack = [];
1724
+ /**
1725
+ * Function that takes in a FilterTree and flattens it into an array using in order traversal
1726
+ */
1727
+ function traverseTree(node) {
1728
+ if (!node) {
1729
+ return;
1730
+ }
1731
+ if (node.leaf) {
1732
+ filterStack.push(node);
1733
+ }
1734
+ else {
1735
+ traverseTree(node.leftNode);
1736
+ filterStack.push(node);
1737
+ traverseTree(node.rightNode);
1738
+ }
1605
1739
  }
1606
- const isRow = !isTopLevelBoolean(node);
1607
- const isCard = isRow && !isParentRow;
1608
- const OPS = {
1609
- AND: 'and',
1610
- OR: 'or',
1611
- LIKE: 'is exactly',
1612
- BETWEEN: 'is between',
1613
- IN: 'is',
1614
- 'NOT IN': 'is not',
1615
- 'NOT LIKE': 'is not exactly',
1616
- '!=': 'is not exactly',
1617
- '=': 'is',
1618
- '<': 'is less than',
1619
- '>': 'is greater than',
1620
- '<=': 'is less than or equal to',
1621
- '>=': 'is greater than or equal to',
1622
- '<>': 'is not',
1623
- '-': 'minus',
1624
- 'IS NOT': 'is not',
1625
- IS: 'is',
1626
- };
1627
- switch (node.type) {
1628
- case 'binary_expr':
1629
- return (_jsx(TagWrapper, { keyPrefix: keyPrefix, formData: formData, activeEditItem: activeEditItem, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setCheckboxes: setCheckboxes, handleReplaceSubtree: handleReplaceSubtree, FilterPopover: FilterPopoverComponent, setActivePath: setActivePath, setOpenPopover: setOpenPopover, setIsPending: setIsPending, clearCheckboxes: clearCheckboxes, handleDelete: handleDelete, editPopoverKey: editPopoverKey, isCard: isCard, isRow: isRow, getByKey: getByKey, EditPopover: EditPopover, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, renderNode: renderNode, children: dateComparisonPartialMatch ??
1630
- dateEqualityPartialMatch ??
1631
- uniqueSentence ?? (_jsxs(_Fragment, { children: [node.left &&
1632
- renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : isTopLevel || topLevelBinaryOperator === 'OR' ? (_jsx(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: SelectComponent })) : null, node.right &&
1633
- renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
1634
- case 'column_ref':
1635
- return snakeAndCamelCaseToTitleCase(node.column);
1636
- case 'expr_list':
1637
- if (node.value.length === 1) {
1638
- const subQuery = renderSentence(formData, node.value[0]);
1639
- if (subQuery) {
1640
- return `${subQuery}`;
1641
- }
1642
- return '()';
1740
+ /**
1741
+ * Returns a sentence to describe a Filter
1742
+ */
1743
+ function filterSentence(filter) {
1744
+ let value = '';
1745
+ if (filter.name == FilterNames.NullFilter) {
1746
+ return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator}`;
1747
+ }
1748
+ else if (filter.value === null || filter.value === undefined) {
1749
+ return 'Error: filter missing value';
1750
+ }
1751
+ if (typeof filter.value === 'string' ||
1752
+ typeof filter.value === 'number') {
1753
+ value = filter.value.toString();
1754
+ }
1755
+ else if ('unit' in filter.value) {
1756
+ if (filter.operator === DateOperator.InTheCurrent) {
1757
+ value = `${filter.value.unit}`;
1643
1758
  }
1644
- return `${node.value
1645
- .map((elem) => renderSentence(formData, elem))
1646
- .join(', ')}`;
1647
- case 'single_quote_string':
1648
- return node.value.replaceAll('%', '');
1649
- case 'double_quote_string':
1650
- case 'number':
1651
- return node.value;
1652
- case 'null':
1653
- return 'null';
1654
- case 'bool':
1655
- return node.value.toString();
1656
- case 'interval':
1657
- if (node.unit) {
1658
- // eg. `INTERVAL '90' DAY` -> "90 days"
1659
- return `${node.expr.value} ${node.unit}s`;
1759
+ else {
1760
+ value = `${filter.value.value} ${filter.value.unit}${filter.value.value === 1 ? '' : 's'}`;
1660
1761
  }
1661
- return node.expr.value;
1662
- case 'function':
1663
- if (node.name.toLowerCase() === 'lower' ||
1664
- node.name.toLowerCase() === 'upper') {
1665
- // how many transactions were above 20 and not fuel or made in the last 90 days (hint: use lower)
1666
- if (node.args.value.length < 1)
1667
- return null;
1668
- if (node.args.value[0].value) {
1669
- if (node.args.value[0].type === 'single_quote_string') {
1670
- return node.args.value[0].value.replaceAll('%', '');
1671
- }
1672
- return snakeAndCamelCaseToTitleCase(node.args.value[0].value.replaceAll('%', ''));
1673
- }
1674
- if (node.args.value[0].column)
1675
- return snakeAndCamelCaseToTitleCase(node.args.value[0].column.replaceAll('%', ''));
1762
+ }
1763
+ else if ('startDate' in filter.value) {
1764
+ value = `from ${filter.value.startDate}`;
1765
+ }
1766
+ else if (filter.value.length > 0) {
1767
+ value = filter.value.join(', ');
1768
+ }
1769
+ return `${snakeAndCamelCaseToTitleCase(filter.field)} ${filter.operator} ${value}`;
1770
+ }
1771
+ /**
1772
+ * Given an array of Filters (presumed to be in in-order state), generate
1773
+ * the corresponding Filter tree. Essentially the reverse of what traverseTree does
1774
+ */
1775
+ function filterStackToFilterTree(stack) {
1776
+ function buildTree(i) {
1777
+ const newNode = {
1778
+ leaf: false,
1779
+ operator: null,
1780
+ leftNode: null,
1781
+ rightNode: null,
1782
+ };
1783
+ if (i >= stack.length) {
1676
1784
  return null;
1677
1785
  }
1678
- if (node.name.toLowerCase() === 'current_date' ||
1679
- node.name.toLowerCase() === 'now') {
1680
- return 'today';
1681
- }
1682
- if (node.name.toLowerCase() === 'date_trunc') {
1683
- // eg. date_trunc('month', now())
1684
- if (!node.args)
1685
- return null;
1686
- if (node.args.type !== 'expr_list')
1687
- return null;
1688
- if (node.args.value?.length !== 2)
1689
- return null;
1690
- const interval = renderSentence(formData, node.args.value[0]);
1691
- const timestamp = renderSentence(formData, node.args.value[1]);
1692
- return `start of the ${interval} of ${timestamp}`;
1786
+ else if (stack[i].leaf) {
1787
+ if (i < stack.length - 1) {
1788
+ // more nodes later
1789
+ newNode.operator = stack[i + 1].operator;
1790
+ newNode.leftNode = {
1791
+ leaf: true,
1792
+ leftNode: null,
1793
+ rightNode: null,
1794
+ operator: null,
1795
+ value: stack[i].value,
1796
+ };
1797
+ newNode.rightNode = buildTree(i + 2);
1798
+ }
1799
+ else {
1800
+ newNode.leaf = true;
1801
+ newNode.value = stack[i].value;
1802
+ }
1693
1803
  }
1694
- return null;
1695
- default:
1696
- return null;
1804
+ return newNode;
1805
+ }
1806
+ return buildTree(0);
1697
1807
  }
1808
+ traverseTree(tree);
1809
+ // Remove null (invalid) filters from filter stack
1810
+ filterStack = filterStack.filter((filter) => {
1811
+ return ((!filter.leaf &&
1812
+ filter.rightNode &&
1813
+ (!filter.rightNode.leaf || filter.rightNode.value)) ||
1814
+ (filter.leaf && filter.value));
1815
+ });
1816
+ // Render filterStack
1817
+ return (_jsx("div", { style: {
1818
+ display: 'flex',
1819
+ flexDirection: 'column',
1820
+ }, children: filterStack.map((item, index) => {
1821
+ if (!item.leaf &&
1822
+ (item.operator === 'and' || item.operator === 'or')) {
1823
+ return (_jsx("div", { style: {
1824
+ width: 'fit-content',
1825
+ marginBottom: '8px',
1826
+ marginTop: '8px',
1827
+ }, children: _jsx(TabsComponent, { value: item.operator.toUpperCase(), options: DEFAULT_TAB_OPTIONS, onChange: () => {
1828
+ if (item.operator === 'and') {
1829
+ item.operator = 'or';
1830
+ }
1831
+ else {
1832
+ item.operator = 'and';
1833
+ }
1834
+ let newFormData = null;
1835
+ if (tree) {
1836
+ newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
1837
+ }
1838
+ const newAst = deepCopy({
1839
+ ...defaultAST,
1840
+ ...baseAst,
1841
+ ...(!baseAst?.columns && {
1842
+ columns: getAllPossibleColumns().map((c) => {
1843
+ const newColumn = deepCopy(defaultColumn);
1844
+ newColumn.expr.column = c.name;
1845
+ return newColumn;
1846
+ }),
1847
+ }),
1848
+ ...(!baseAst?.from && {
1849
+ from: [{ ...defaultTable, table: initialTableName }],
1850
+ }),
1851
+ where: newFormData,
1852
+ });
1853
+ setBaseAst(newAst);
1854
+ setFormData(newFormData);
1855
+ fetchSqlQuery(newAst, newFormData);
1856
+ } }) }, index));
1857
+ }
1858
+ else {
1859
+ return (_jsx("div", { children: _jsx(FilterPopoverWrapper, { schema: schema.find((s) => s.name === currentTable ||
1860
+ s.displayName === currentTable) ?? schema[0], filter: item.value, filterLabel: item.value ? filterSentence(item.value) : '', index: index, openFilterIndex: openFilterIndex, setOpenFilterIndex: setOpenFilterIndex, FilterPopover: FilterPopoverComponent, FilterModal: FilterModal, fieldValuesMap: fieldValuesMap, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, handleFilterSave: (filter) => {
1861
+ item.value = filter;
1862
+ let newFormData = null;
1863
+ if (tree) {
1864
+ newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
1865
+ }
1866
+ const newAst = deepCopy({
1867
+ ...defaultAST,
1868
+ ...baseAst,
1869
+ ...(!baseAst?.columns && {
1870
+ columns: getAllPossibleColumns().map((c) => {
1871
+ const newColumn = deepCopy(defaultColumn);
1872
+ newColumn.expr.column = c.name;
1873
+ return newColumn;
1874
+ }),
1875
+ }),
1876
+ ...(!baseAst?.from && {
1877
+ from: [{ ...defaultTable, table: initialTableName }],
1878
+ }),
1879
+ where: newFormData,
1880
+ });
1881
+ setBaseAst(newAst);
1882
+ setFormData(newFormData);
1883
+ fetchSqlQuery(newAst, newFormData);
1884
+ }, handleFilterDelete: (i) => {
1885
+ if (i > 0) {
1886
+ filterStack.splice(i - 1, 2);
1887
+ }
1888
+ else {
1889
+ if (filterStack.length > 1) {
1890
+ filterStack.splice(i, 2);
1891
+ }
1892
+ else {
1893
+ filterStack.splice(i, 1);
1894
+ }
1895
+ }
1896
+ tree = filterStackToFilterTree(filterStack);
1897
+ let newFormData = null;
1898
+ if (tree) {
1899
+ newFormData = filterTreeToAst(tree, client.databaseType.toLowerCase());
1900
+ }
1901
+ const newAst = deepCopy({
1902
+ ...defaultAST,
1903
+ ...baseAst,
1904
+ ...(!baseAst?.columns && {
1905
+ columns: getAllPossibleColumns().map((c) => {
1906
+ const newColumn = deepCopy(defaultColumn);
1907
+ newColumn.expr.column = c.name;
1908
+ return newColumn;
1909
+ }),
1910
+ }),
1911
+ ...(!baseAst?.from && {
1912
+ from: [{ ...defaultTable, table: initialTableName }],
1913
+ }),
1914
+ where: newFormData,
1915
+ });
1916
+ setBaseAst(newAst);
1917
+ setFormData(newFormData);
1918
+ fetchSqlQuery(newAst, newFormData);
1919
+ } }) }, index));
1920
+ }
1921
+ }) }));
1698
1922
  };
1699
1923
  const getAllPossibleColumns = () => {
1700
1924
  if (!baseAst || !baseAst.from) {
@@ -1736,7 +1960,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1736
1960
  if (selectedColumns.length < 1)
1737
1961
  return false;
1738
1962
  const allColumns = orderedColumnNames.filter((row) => {
1739
- const [table, _] = row.split('.');
1963
+ const [table] = row.split('.');
1740
1964
  const selectedTable = selectedColumns[0].split('.')[0];
1741
1965
  return selectedTable === table;
1742
1966
  });
@@ -1780,35 +2004,38 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1780
2004
  task: 'patterns',
1781
2005
  getCustomFields: false,
1782
2006
  customFields,
1783
- // additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
2007
+ additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
2008
+ useUpdatedDataGathering: true,
2009
+ useNewNodeSql: true, // new flag
1784
2010
  },
1785
2011
  };
1786
- const cloudBody = {};
1787
- const data2 = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
1788
- if (data2.success === false) {
1789
- throw new Error(data2.errorMessage);
1790
- }
1791
- rows = data2.rows;
1792
2012
  const tables = getTableNames(baseAst);
1793
2013
  const table = tables.length >= 1 ? tables[0] : initialTableName;
1794
- if (table !== currentTable) {
2014
+ let newUniqueValues = uniqueValues;
2015
+ let dateRangesTemp = dateRanges;
2016
+ let curReport = tempReport;
2017
+ if ((newUniqueValues && Object.keys(newUniqueValues).length === 0) ||
2018
+ table !== currentTable) {
1795
2019
  const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
1796
2020
  if (tableInfo) {
1797
- const convertedStringColumns = tableInfo.columns
1798
- .filter((column) => {
1799
- return isTextColumnType(column.fieldType);
1800
- })
1801
- .map((column) => convertColumnInfoToColumnInternal(column));
1802
- const stringNames = convertedStringColumns.map((column) => column.field);
1803
- const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
1804
- const joinedUniqueValues = deepCopy(uniqueValues);
1805
- joinedUniqueValues[table] = newUniqueValues;
1806
- if (hashCode(uniqueValues) !== hashCode(joinedUniqueValues)) {
1807
- setUniqueValues(joinedUniqueValues);
2021
+ newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
2022
+ if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
2023
+ setUniqueValues(newUniqueValues);
1808
2024
  }
2025
+ dateRangesTemp = await getDateRanges(tableInfo.columns, table);
2026
+ setDateRanges(dateRangesTemp || {});
1809
2027
  }
1810
2028
  setCurrentTable(table);
1811
2029
  }
2030
+ const cloudBody = {};
2031
+ const data2 = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
2032
+ if (data2.success === false) {
2033
+ throw new Error(data2.errorMessage);
2034
+ }
2035
+ rows = data2.rows;
2036
+ if (data2.rowCount) {
2037
+ setNumberOfRows(data2.rowCount);
2038
+ }
1812
2039
  if (data2.rows && data2.rows.length) {
1813
2040
  if (pivot) {
1814
2041
  // check if any of the pivot fields aren't in the data2.fields array
@@ -1818,23 +2045,75 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1818
2045
  setPivotData(null);
1819
2046
  setRows(data2.rows);
1820
2047
  setColumns(processedFields);
2048
+ if (data2.rowCount) {
2049
+ const processedFormData = report
2050
+ ? report
2051
+ : createInitialFormData(processedFields);
2052
+ setNumberOfRows(data2.rowCount);
2053
+ curReport = {
2054
+ ...formData,
2055
+ ...processedFormData,
2056
+ itemQuery: data2.itemQuery,
2057
+ rowCount: data2.rowCount,
2058
+ filtersApplied: [],
2059
+ rows: data2.rows,
2060
+ columns: processedFields,
2061
+ };
2062
+ setTempReport(curReport);
2063
+ }
1821
2064
  const formattedRows = formatRows(data2.rows, processedFields, false);
1822
2065
  setFormattedRows(formattedRows);
1823
2066
  return;
1824
2067
  }
2068
+ curReport = {
2069
+ ...formData,
2070
+ itemQuery: data2.itemQuery,
2071
+ rowCount: data2.rowCount,
2072
+ filtersApplied: [],
2073
+ rows: data2.rows,
2074
+ };
1825
2075
  // Do all of this to make sure we have the right unique columns when applying a pivot
1826
- let uniqueFormatted = {};
1827
- const uniqueRecords = Array.from(new Set(data2.rows.map((row) => row[pivot.columnField]))).reduce((acc, curr) => {
1828
- acc[curr] = false;
1829
- return acc;
1830
- }, {});
1831
- uniqueFormatted[pivot.columnField] = uniqueRecords;
1832
- const pivotedData = generatePivotTableInMemory(pivot, data2.rows, undefined, false);
2076
+ let dateBucket = undefined;
2077
+ const tempDateRange = dateRangesTemp &&
2078
+ pivot.rowField &&
2079
+ dateRangesTemp[pivot.rowField];
2080
+ if (tempDateRange) {
2081
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
2082
+ }
2083
+ let distinctValuesForQuery = {};
2084
+ if (pivot.columnField) {
2085
+ const sqlQuery = await fetchSqlQuery({ ...baseAst, where: curFormData }, null, false);
2086
+ distinctValuesForQuery = await getUniqueValuesByColumns([
2087
+ {
2088
+ field: pivot.columnField,
2089
+ label: pivot.columnField,
2090
+ format: 'string',
2091
+ },
2092
+ ], sqlQuery, [], client, customFields);
2093
+ }
2094
+ const pivotedData = await generatePivotTable(
2095
+ // @ts-ignore
2096
+ pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, distinctValuesForQuery ? distinctValuesForQuery : undefined);
1833
2097
  console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
1834
2098
  const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
1835
2099
  setPivotData(pivotedData);
1836
2100
  setRows(data2.rows);
1837
2101
  setColumns(processedFields);
2102
+ if (data2.rowCount) {
2103
+ const processedFormData = report
2104
+ ? report
2105
+ : createInitialFormData(processedFields);
2106
+ setNumberOfRows(data2.rowCount);
2107
+ setTempReport({
2108
+ ...formData,
2109
+ ...processedFormData,
2110
+ itemQuery: data2.itemQuery,
2111
+ rowCount: data2.rowCount,
2112
+ filtersApplied: [],
2113
+ rows: data2.rows,
2114
+ columns: processedFields,
2115
+ });
2116
+ }
1838
2117
  const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
1839
2118
  setSelectedColumns(processedFields.map((column) => {
1840
2119
  return `${table}.${column.field}`;
@@ -1845,6 +2124,21 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1845
2124
  const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
1846
2125
  setRows(data2.rows);
1847
2126
  setColumns(processedFields);
2127
+ if (data2.rowCount) {
2128
+ const processedFormData = report
2129
+ ? report
2130
+ : createInitialFormData(processedFields);
2131
+ setNumberOfRows(data2.rowCount);
2132
+ setTempReport({
2133
+ ...formData,
2134
+ ...processedFormData,
2135
+ itemQuery: data2.itemQuery,
2136
+ rowCount: data2.rowCount,
2137
+ filtersApplied: [],
2138
+ rows: data2.rows,
2139
+ columns: processedFields,
2140
+ });
2141
+ }
1848
2142
  setSelectedColumns(processedFields.map((column) => {
1849
2143
  return `${table}.${column.field}`;
1850
2144
  }));
@@ -1861,105 +2155,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1861
2155
  setFormattedRows([]);
1862
2156
  setPivotData(null);
1863
2157
  }
2158
+ setLoading(false);
2159
+ setDataDisplayed(true);
2160
+ return rows;
1864
2161
  }
1865
2162
  catch (e) {
1866
- console.error(e);
1867
2163
  setErrorMessage(e.message);
1868
- }
1869
- finally {
1870
2164
  setLoading(false);
1871
2165
  setDataDisplayed(true);
1872
- return rows;
2166
+ setRows([]);
2167
+ setColumns([]);
2168
+ setFormattedRows([]);
2169
+ setPivotData(null);
2170
+ return { error: true, message: e.message };
1873
2171
  }
1874
2172
  }
1875
2173
  };
1876
- // Convert an array of columns to a map where the name is the
1877
- // key and the value is the column node.
1878
- const columnArrayToMap = (columns) => {
1879
- const columnMap = {};
1880
- for (const col of columns) {
1881
- const key = col.expr?.value ?? col.expr?.column ?? col.as;
1882
- columnMap[key] = col;
1883
- }
1884
- return columnMap;
1885
- };
1886
- const applyFormatting = (response, columns) => {
1887
- const columnFormatters = {};
1888
- const columnMap = columnArrayToMap(columns);
1889
- response.fields.forEach((field) => {
1890
- // TODO: columnMap[field.name] silently breaks for columnField columns
1891
- const formatType = getPostgresBasicType(field);
1892
- if (formatType === 'date') {
1893
- columnFormatters[field.name] = (x) => {
1894
- const d = new Date(x);
1895
- // check if d is a valid date
1896
- if (isNaN(d.getTime())) {
1897
- return 'Invalid Date';
1898
- }
1899
- d.setMinutes(d.getMinutes() + d.getTimezoneOffset()); // TZ adjust
1900
- if (columnMap[field.name]?.expr.type === 'function' &&
1901
- columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
1902
- columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
1903
- 'month') {
1904
- return d.toLocaleString('default', {
1905
- month: 'short',
1906
- year: 'numeric',
1907
- });
1908
- }
1909
- else if (columnMap[field.name]?.expr.type === 'function' &&
1910
- columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
1911
- columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
1912
- 'quarter') {
1913
- return `Q${getQuarter(d)} ${d.getFullYear()}`;
1914
- }
1915
- else if (columnMap[field.name]?.expr.type === 'function' &&
1916
- columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
1917
- columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
1918
- 'year') {
1919
- return d.toLocaleString('default', {
1920
- year: 'numeric',
1921
- });
1922
- }
1923
- return DATE_FMT.format(d);
1924
- };
1925
- }
1926
- else if (formatType === 'number') {
1927
- columnFormatters[field.name] = (x) => {
1928
- if (columnMap[field.name]?.expr.type === 'extract' &&
1929
- columnMap[field.name]?.expr.args.field.toLowerCase() === 'dow') {
1930
- return DAY_OF_WEEK[x];
1931
- }
1932
- else if (columnMap[field.name]?.expr.type === 'extract' &&
1933
- columnMap[field.name]?.expr.args.field.toLowerCase() === 'month') {
1934
- return MONTH_OF_YEAR[x - 1];
1935
- }
1936
- else if (`${x}`.includes('.')) {
1937
- // return MONEY_FMT.format(Number(x ?? 0.0));
1938
- return Number(x ?? 0.0).toFixed(2);
1939
- }
1940
- return x ?? 0.0;
1941
- };
1942
- }
1943
- else if (formatType === 'boolean') {
1944
- columnFormatters[field.name] = (x) => {
1945
- if (x) {
1946
- return 'True';
1947
- }
1948
- return 'False';
1949
- };
1950
- }
1951
- else {
1952
- columnFormatters[field.name] = (x) => x;
1953
- }
1954
- });
1955
- return response.rows.map((row) => {
1956
- const newRow = {};
1957
- Object.keys(row).forEach((key) => (newRow[key] = columnFormatters[key]
1958
- ? columnFormatters[key](row[key])
1959
- : row[key]));
1960
- return newRow;
1961
- });
1962
- };
1963
2174
  // Returns whether a where-clause contains a nested subquery.
1964
2175
  const isSubquery = (node) => {
1965
2176
  if (!node)
@@ -1983,7 +2194,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1983
2194
  return;
1984
2195
  }
1985
2196
  try {
1986
- let errored = false;
1987
2197
  setLoading(true);
1988
2198
  setAskedAQuestion(true);
1989
2199
  setErrorMessage('');
@@ -2003,6 +2213,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2003
2213
  body: JSON.stringify({
2004
2214
  initialQuestion: aiPrompt || overridePrompt,
2005
2215
  publicKey: client.publicKey,
2216
+ useNewNodeSql: true, // new flag
2006
2217
  }),
2007
2218
  });
2008
2219
  }
@@ -2014,6 +2225,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2014
2225
  sqlQuery: activeQuery,
2015
2226
  initialQuestion: aiPrompt,
2016
2227
  publicKey: client.publicKey,
2228
+ useNewNodeSql: true, // new flag
2017
2229
  }),
2018
2230
  });
2019
2231
  }
@@ -2031,31 +2243,33 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2031
2243
  setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
2032
2244
  return;
2033
2245
  }
2246
+ let currentSchema = schema;
2247
+ if (currentSchema && currentSchema.length === 0) {
2248
+ currentSchema = await fetchSchema();
2249
+ }
2034
2250
  let newAst, groupByPivot;
2035
2251
  if (ast) {
2036
2252
  // Unwrap the ast object, supporting many possible types
2037
2253
  ast = ast.length ? ast[0] : ast;
2038
2254
  newAst = convertBigQuery(ast);
2039
- newAst = convertWildcardColumns(newAst, schema); // must go before groupby
2040
- ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, schema));
2041
- if (groupByPivot && !groupByPivot?.valueField) {
2042
- setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
2043
- return;
2044
- }
2255
+ newAst = convertWildcardColumns(newAst, currentSchema); // must go before groupby
2256
+ ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, currentSchema));
2045
2257
  newAst = convertStringComparison(newAst, client.databaseType);
2046
2258
  newAst = convertRemoveSimpleParentheses(newAst);
2047
2259
  const table = getTableNames(newAst)[0] ?? initialTableName;
2048
2260
  const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
2049
2261
  newAst = removeNonSelectedTableReferences(newAst, tableAlias ?? table, getAllPossibleColumns().map((col) => col.name));
2050
- setSelectedColumns(deepCopy(newAst).columns?.map((column) => {
2262
+ const procesedColumns = deepCopy(newAst).columns?.map((column) => {
2051
2263
  if (column.expr.type === 'column_ref') {
2052
- return `${table}.${column.expr.column}`;
2264
+ const columnName = extractColumnish(column.expr);
2265
+ return `${table}.${columnName}`;
2053
2266
  }
2054
2267
  else if (column.as) {
2055
2268
  return `${table}.${column.as}`;
2056
2269
  }
2057
2270
  return `${table}.${column.expr.value}`;
2058
- }));
2271
+ });
2272
+ setSelectedColumns(procesedColumns);
2059
2273
  if (groupByPivot) {
2060
2274
  setBaseAst(deepCopy({ ...newAst, orderby: null, limit: null }));
2061
2275
  newAst = deepCopy({ ...newAst, orderby: null, limit: null });
@@ -2071,7 +2285,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2071
2285
  ast = newAst; // so we fetch data for newAst later.
2072
2286
  fetchSqlQuery(ast, undefined, false);
2073
2287
  const table = getTableNames(newAst)[0] ?? initialTableName;
2074
- const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
2075
2288
  const hostedBody = {
2076
2289
  metadata: {
2077
2290
  clientId: client.publicKey,
@@ -2079,34 +2292,46 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2079
2292
  publicKey: client.publicKey,
2080
2293
  orgId: client.customerId,
2081
2294
  task: 'patterns',
2082
- // additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
2295
+ additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
2296
+ useUpdatedDataGathering: true,
2297
+ pivot: groupByPivot,
2298
+ useNewNodeSql: true, // new flag
2083
2299
  },
2084
2300
  };
2085
- const cloudBody = {};
2086
- const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
2087
- if (data2.status === 'error') {
2088
- throw new Error('Error querying data from patterns');
2089
- }
2090
2301
  let currentUniqueValues = uniqueValues;
2091
- if (table !== currentTable) {
2092
- const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
2302
+ let dateRangesTemp = dateRanges;
2303
+ if ((currentUniqueValues &&
2304
+ currentUniqueValues[table] &&
2305
+ Object.keys(currentUniqueValues[table]).length === 0) ||
2306
+ table !== currentTable) {
2307
+ const tableInfo = currentSchema.find((tableInfo) => tableInfo.name === table);
2093
2308
  if (tableInfo) {
2094
- const convertedStringColumns = tableInfo.columns
2095
- .filter((column) => {
2096
- return isTextColumnType(column.fieldType);
2097
- })
2098
- .map((column) => convertColumnInfoToColumnInternal(column));
2099
- const stringNames = convertedStringColumns.map((column) => column.field);
2100
- const newUniqueValues = await getUniqueValuesByColumns(convertedStringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client, customFields);
2101
- currentUniqueValues[table] = newUniqueValues;
2102
- if (hashCode(uniqueValues) !== hashCode(currentUniqueValues)) {
2103
- setUniqueValues(currentUniqueValues);
2309
+ const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
2310
+ currentUniqueValues = newUniqueValues;
2311
+ if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
2312
+ setUniqueValues(newUniqueValues);
2104
2313
  }
2314
+ dateRangesTemp = await getDateRanges(tableInfo.columns, table);
2315
+ setDateRanges(dateRangesTemp);
2105
2316
  }
2106
2317
  setCurrentTable(table);
2107
2318
  }
2319
+ const cloudBody = {};
2320
+ const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
2321
+ if (!data2 || data2.status === 'error') {
2322
+ throw new Error('Error querying data from patterns');
2323
+ }
2108
2324
  if (data2.rows && data2.rows.length) {
2109
- const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
2325
+ const processedFields = data2.fields
2326
+ .map((elem) => convertPostgresColumn(elem))
2327
+ .map((elem) => {
2328
+ const tableInfo = currentSchema.find((t) => t.name === table);
2329
+ const columnInfo = tableInfo?.columns.find((column) => column.name === elem.field);
2330
+ return columnInfo
2331
+ ? convertColumnInfoToColumnInternal(columnInfo)
2332
+ : null;
2333
+ })
2334
+ .filter((elem) => elem);
2110
2335
  let possiblePivot = true;
2111
2336
  const possibleColumns = getPossiblePivotFieldOptions(processedFields, currentUniqueValues[table]);
2112
2337
  if (groupByPivot &&
@@ -2120,7 +2345,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2120
2345
  let errorMessageEnding = '';
2121
2346
  if (groupByPivot.columnField &&
2122
2347
  !possibleColumns.columnFields.includes(groupByPivot?.columnField || '')) {
2123
- if (currentUniqueValues[table][groupByPivot?.columnField || '']) {
2348
+ if (currentUniqueValues[table]?.[groupByPivot?.columnField || '']) {
2124
2349
  errorMessageEnding = `The column ${groupByPivot?.columnField} has more than 24 unique values to pivot on.`;
2125
2350
  }
2126
2351
  else {
@@ -2129,7 +2354,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2129
2354
  }
2130
2355
  else if (groupByPivot.rowField &&
2131
2356
  !possibleColumns.rowFields.includes(groupByPivot?.rowField || '')) {
2132
- if (currentUniqueValues[table][groupByPivot?.rowField || '']) {
2357
+ if (currentUniqueValues[table]?.[groupByPivot?.rowField || '']) {
2133
2358
  errorMessageEnding = `The column ${groupByPivot?.rowField} has more than 36 unique values to pivot on.`;
2134
2359
  }
2135
2360
  else {
@@ -2141,18 +2366,45 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2141
2366
  errorMessageEnding = `The column ${groupByPivot?.valueField} is not a proper value field.`;
2142
2367
  }
2143
2368
  setErrorMessage(`The requested pivot is not supported. ${errorMessageEnding}`);
2144
- errored = true;
2145
2369
  }
2146
2370
  if (groupByPivot && possiblePivot) {
2147
- setPivotRowField(groupByPivot?.rowField);
2148
- setPivotColumnField(groupByPivot?.columnField);
2149
- setPivotValueField(groupByPivot?.valueField);
2150
- setPivotAggregation(groupByPivot?.aggregationType);
2151
- const pivotedData = generatePivotTableInMemory(groupByPivot, data2.rows, undefined, false);
2371
+ let curReport = report ? report : undefined;
2372
+ if (data2.rowCount) {
2373
+ const processedFormData = report
2374
+ ? report
2375
+ : createInitialFormData(processedFields);
2376
+ setNumberOfRows(data2.rowCount);
2377
+ curReport = {
2378
+ ...formData,
2379
+ ...processedFormData,
2380
+ itemQuery: data2.itemQuery,
2381
+ rowCount: data2.rowCount,
2382
+ filtersApplied: [],
2383
+ rows: data2.rows,
2384
+ columns: processedFields,
2385
+ };
2386
+ setTempReport(curReport || null);
2387
+ }
2388
+ let dateBucket = undefined;
2389
+ const tempDateRange = dateRangesTemp &&
2390
+ groupByPivot.rowField &&
2391
+ dateRangesTemp[groupByPivot.rowField];
2392
+ if (tempDateRange) {
2393
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
2394
+ }
2395
+ const pivotedData = await generatePivotTable(
2396
+ // @ts-ignore
2397
+ groupByPivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, groupByPivot.columnField
2398
+ ? currentUniqueValues[groupByPivot.columnField]
2399
+ : undefined);
2152
2400
  console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
2153
2401
  setPivotData(pivotedData);
2154
2402
  setPivot(groupByPivot);
2155
2403
  setRows(data2.rows);
2404
+ setPivotRowField(groupByPivot?.rowField);
2405
+ setPivotColumnField(groupByPivot?.columnField);
2406
+ setPivotValueField(groupByPivot?.valueField);
2407
+ setPivotAggregation(groupByPivot?.aggregationType);
2156
2408
  setColumns(processedFields);
2157
2409
  const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
2158
2410
  setFormattedRows(formattedRows);
@@ -2161,6 +2413,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2161
2413
  const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
2162
2414
  setRows(data2.rows);
2163
2415
  setColumns(processedFields);
2416
+ if (data2.rowCount) {
2417
+ setNumberOfRows(data2.rowCount);
2418
+ setTempReport({
2419
+ ...formData,
2420
+ itemQuery: data2.itemQuery,
2421
+ rowCount: data2.rowCount,
2422
+ filtersApplied: [],
2423
+ rows: data2.rows,
2424
+ columns: processedFields,
2425
+ });
2426
+ }
2164
2427
  const formattedRows = formatRows(data2.rows, processedFields, false);
2165
2428
  setFormattedRows(formattedRows);
2166
2429
  }
@@ -2179,7 +2442,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2179
2442
  setActiveQuery('');
2180
2443
  }
2181
2444
  if (data2.errorMessage) {
2182
- setErrorMessage(`Error: ${data2.errorMessage}`);
2445
+ setErrorMessage(`Error: Couldn't process your request, please re-word your prompt.`);
2183
2446
  }
2184
2447
  }
2185
2448
  catch (e) {
@@ -2199,7 +2462,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2199
2462
  setSelectedColumns((selectedColumns) => selectedColumns.filter((column) => !column.endsWith(name)));
2200
2463
  const columns = baseAst.columns.filter((col) => {
2201
2464
  if (col.expr.type === 'column_ref') {
2202
- return col.expr.column !== name;
2465
+ return (col.expr.column !== name &&
2466
+ (!col.expr.column.expr || col.expr.column.expr.value !== name));
2203
2467
  }
2204
2468
  else if (col.as) {
2205
2469
  return col.as !== name;
@@ -2214,14 +2478,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2214
2478
  setBaseAst(newAst);
2215
2479
  fetchSqlQuery(newAst);
2216
2480
  };
2217
- function TopLevelBooleanSwitch({ node, keyPrefix, handleOperatorChange, }) {
2218
- return (_jsx("div", { style: { width: 'fit-content' }, children: _jsx(TabsComponent, { value: node.operator, options: DEFAULT_TAB_OPTIONS, onChange: (event) => {
2219
- if (loading) {
2220
- return;
2221
- }
2222
- handleOperatorChange(event.target.value, node, keyPrefix);
2223
- } }) }));
2224
- }
2225
2481
  const DraggableItem = ({ id, label, onDelete }) => {
2226
2482
  const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: id });
2227
2483
  const style = {
@@ -2248,7 +2504,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2248
2504
  setOrderedColumnNames(newOrder);
2249
2505
  const orderedSelectedColumns = [];
2250
2506
  for (const value of newOrder) {
2251
- const [_, column] = value.split('.');
2507
+ const column = value.split('.')[1];
2252
2508
  if (selectedColumns.includes(value)) {
2253
2509
  orderedSelectedColumns.push(column);
2254
2510
  }
@@ -2272,12 +2528,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2272
2528
  fetchSqlQuery(newAst, undefined, false);
2273
2529
  }
2274
2530
  }
2275
- const columnNamesInAst = baseAst?.columns.map((col) => {
2276
- if (col.expr.type === 'column_ref') {
2277
- return col.expr.column;
2531
+ const columnNamesInAst = baseAst?.columns
2532
+ .map((col) => {
2533
+ if (col.expr.type === 'column_ref' && col.expr.column) {
2534
+ if (typeof col.expr.column === 'string') {
2535
+ return col.expr.column;
2536
+ }
2537
+ else {
2538
+ return col.expr.column.expr.value;
2539
+ }
2278
2540
  }
2279
2541
  else if (col.as) {
2280
- return col.as;
2542
+ if (typeof col.as === 'string') {
2543
+ return col.as;
2544
+ }
2545
+ else {
2546
+ return col.as.expr?.value;
2547
+ }
2281
2548
  }
2282
2549
  else if (col.expr && col.expr.type === 'aggr_func') {
2283
2550
  if (col.expr.args) {
@@ -2286,22 +2553,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2286
2553
  return col.expr.name;
2287
2554
  }
2288
2555
  return col.expr.value;
2289
- }) ?? [];
2556
+ })
2557
+ .filter(
2558
+ // remove duplicate entries
2559
+ (value, index, self) => value && self.indexOf(value) === index) ?? [];
2290
2560
  return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: columnNamesInAst, strategy: verticalListSortingStrategy, children: _jsxs("div", { style: {
2291
2561
  display: 'flex',
2292
2562
  flexDirection: 'column',
2293
2563
  gap: 8,
2294
2564
  }, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
2295
2565
  }
2296
- if (loading || initalChartLoad) {
2566
+ if (loading || initialChartLoad) {
2297
2567
  return (_jsxs("div", { style: {
2298
2568
  display: 'flex',
2299
2569
  flexDirection: 'row',
2300
2570
  height: '100%',
2301
2571
  ...containerStyle,
2302
2572
  }, className: className, ref: parentRef, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
2303
- if (loadingSchema)
2304
- return;
2305
2573
  if (!openPopover) {
2306
2574
  setOpenPopover('AddColumnModal');
2307
2575
  }
@@ -2322,12 +2590,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2322
2590
  }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
2323
2591
  setBaseAst(ast);
2324
2592
  fetchSqlQuery(ast);
2325
- }, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
2593
+ }, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
2326
2594
  display: 'flex',
2327
2595
  flexDirection: 'column',
2328
2596
  gap: 8,
2329
2597
  marginBottom: 12,
2330
- }, children: renderSentence(formData, formData, '', true) })), _jsxs("div", { style: {
2598
+ }, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
2331
2599
  display: 'flex',
2332
2600
  flexDirection: 'column',
2333
2601
  alignItems: 'flex-start',
@@ -2339,7 +2607,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2339
2607
  }
2340
2608
  if (!openPopover) {
2341
2609
  const value = orderedColumnNames[0];
2342
- const [_table, column] = value.split('.');
2610
+ const column = value.split('.')[1];
2343
2611
  const columnType = getColumnTypeByName(column);
2344
2612
  if (isNumericColumnType(columnType)) {
2345
2613
  const newSubtree = deepCopy(defaultNumericComparison);
@@ -2368,27 +2636,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2368
2636
  setActiveEditItem(null);
2369
2637
  }, 300);
2370
2638
  }
2371
- }, popoverTitle: 'Add filter', popoverChildren: _jsx(AddFilterPopover, { onSave: () => {
2372
- if (isNodeEmptyCollection(activeEditItem)) {
2373
- setIsPending(false);
2374
- setActivePath(null);
2375
- setOpenPopover(null);
2376
- setTimeout(() => {
2377
- clearCheckboxes();
2378
- setActiveEditItem(null);
2379
- }, 300);
2380
- }
2381
- else {
2382
- setIsPending(false);
2383
- handleInsertion(activeEditItem, 'AND', false);
2384
- setActivePath(null);
2385
- setOpenPopover(null);
2386
- setTimeout(() => {
2387
- clearCheckboxes();
2388
- setActiveEditItem(null);
2389
- }, 300);
2390
- }
2391
- }, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
2639
+ }, popoverTitle: 'Add filter', popoverChildren: _jsx(FilterModal, { schema: schema.find((s) => s.name === currentTable ||
2640
+ s.displayName === currentTable) ?? schema[0], fieldValuesMap: uniqueValues[getTableNames(baseAst).length === 1
2641
+ ? getTableNames(baseAst)[0]
2642
+ : initialTableName], onSubmitFilter: (filter) => {
2643
+ setOpenPopover(null);
2644
+ setIsPending(false);
2645
+ const item = filterToAst(filter, client.databaseType.toLowerCase());
2646
+ handleInsertion(item, 'AND', false);
2647
+ }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
2392
2648
  false && ( // temp removed the AddConditionPopover
2393
2649
  _jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
2394
2650
  if (!openPopover) {
@@ -2427,25 +2683,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2427
2683
  setActivePath(null);
2428
2684
  setOpenPopover(null);
2429
2685
  }
2430
- } }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, CardComponent: CardComponent, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2686
+ } }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, CardComponent: CardComponent, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEditingPivot, setShowUpdatePivot: setIsEditingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2431
2687
  setPivot(null);
2432
2688
  setPivotData(null);
2433
2689
  const formattedRows = formatRows(rows, columns, false);
2434
2690
  setFormattedRows(formattedRows);
2435
2691
  },
2436
2692
  // TODOs
2437
- selectPivot: (pivot) => {
2438
- if (!pivot)
2439
- return;
2440
- const newAst = { ...baseAst };
2441
- newAst.orderby = null;
2442
- setBaseAst(newAst); // trigger refetch
2443
- setPivot(pivot);
2444
- const pivotedData = generatePivotTableInMemory(pivot, rows, undefined, false);
2445
- setPivotData(pivotedData || []);
2446
- const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2447
- setFormattedRows(formattedRows);
2448
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2693
+ selectPivot: () => {
2694
+ return;
2695
+ }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport ?? report }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2449
2696
  setPivotRowField(value);
2450
2697
  }, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
2451
2698
  setPivot(null);
@@ -2460,7 +2707,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2460
2707
  }, children: _jsx(SortSentence, { sortData: {
2461
2708
  type: pivot.sortDirection,
2462
2709
  expr: { type: 'column_ref', column: pivot.sortField },
2463
- }, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
2710
+ }, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
2464
2711
  setPivot({ ...pivot, sort: false });
2465
2712
  setBaseAst(deepCopy(baseAst));
2466
2713
  if (!pivot) {
@@ -2509,7 +2756,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2509
2756
  if (!pivot) {
2510
2757
  fetchSqlQuery(newAst);
2511
2758
  }
2512
- }, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
2759
+ }, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
2513
2760
  const newAst = { ...baseAst };
2514
2761
  newAst.orderby.splice(id, 1);
2515
2762
  setBaseAst(deepCopy(newAst));
@@ -2532,7 +2779,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2532
2779
  setActivePath(null);
2533
2780
  setOpenPopover(null);
2534
2781
  }
2535
- }, popoverTitle: "Sort by", popoverChildren: _jsx(AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? (_jsx("div", { style: {
2782
+ }, popoverTitle: "Sort by", popoverChildren: _jsx(AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? (_jsx("div", { style: {
2536
2783
  display: 'flex',
2537
2784
  flexDirection: 'column',
2538
2785
  gap: 8,
@@ -2587,7 +2834,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2587
2834
  ? askAIInputWidth
2588
2835
  : askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), _jsx(ButtonComponent, { onClick: () => { }, label: "Ask AI" }), ((baseAst && dataDisplayed) ||
2589
2836
  initialLoad ||
2590
- initalChartLoad) && (_jsx(SecondaryButtonComponent, { onClick: () => { }, label: "New report" }))] }) })), _jsxs(_Fragment, { children: [_jsx(TableComponent, { isLoading: true, rows: [], columns: [] }), baseAst && dataDisplayed && !initalChartLoad && (_jsxs("div", { style: {
2837
+ initialChartLoad) && (_jsx(SecondaryButtonComponent, { onClick: () => { }, label: "New report" }))] }) })), _jsxs(_Fragment, { children: [_jsx(TableComponent, { isLoading: true, rows: [], columns: [] }), baseAst && dataDisplayed && !initialChartLoad && (_jsxs("div", { style: {
2591
2838
  display: 'flex',
2592
2839
  flexDirection: 'row',
2593
2840
  gap: '12px',
@@ -2602,8 +2849,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2602
2849
  boxSizing: 'border-box',
2603
2850
  ...containerStyle,
2604
2851
  }, className: className, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
2605
- if (loadingSchema)
2606
- return;
2607
2852
  if (!orderedColumnNames) {
2608
2853
  return;
2609
2854
  }
@@ -2627,12 +2872,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2627
2872
  }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
2628
2873
  setBaseAst(ast);
2629
2874
  fetchSqlQuery(ast);
2630
- }, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
2875
+ }, pivot: pivot, initialTableName: initialTableName, defaultAST: defaultAST, defaultTable: defaultTable, schemaLoading: loadingSchema, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Filters" }), formData && (_jsx("div", { style: {
2631
2876
  display: 'flex',
2632
2877
  flexDirection: 'column',
2633
2878
  gap: 8,
2634
2879
  marginBottom: 12,
2635
- }, children: renderSentence(formData, formData, '', true) })), _jsxs("div", { style: {
2880
+ }, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
2636
2881
  display: 'flex',
2637
2882
  flexDirection: 'column',
2638
2883
  alignItems: 'flex-start',
@@ -2644,7 +2889,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2644
2889
  }
2645
2890
  if (!openPopover) {
2646
2891
  const value = orderedColumnNames[0];
2647
- const [_table, column] = value.split('.');
2892
+ const column = value.split('.')[1];
2648
2893
  const columnType = getColumnTypeByName(column);
2649
2894
  if (isNumericColumnType(columnType)) {
2650
2895
  const newSubtree = deepCopy(defaultNumericComparison);
@@ -2674,27 +2919,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2674
2919
  setActiveEditItem(null);
2675
2920
  }, 300);
2676
2921
  }
2677
- }, popoverTitle: "Add filter", popoverChildren: _jsx(AddFilterPopover, { onSave: () => {
2678
- if (isNodeEmptyCollection(activeEditItem)) {
2679
- setOpenPopover(null);
2680
- clearCheckboxes();
2681
- setIsPending(false);
2682
- setTimeout(() => {
2683
- setActivePath(null);
2684
- setActiveEditItem(null);
2685
- }, 300);
2686
- }
2687
- else {
2688
- setOpenPopover(null);
2689
- setIsPending(false);
2690
- handleInsertion(activeEditItem, 'AND', false);
2691
- setActivePath(null);
2692
- setTimeout(() => {
2693
- clearCheckboxes();
2694
- setActiveEditItem(null);
2695
- }, 300);
2696
- }
2697
- }, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
2922
+ }, popoverTitle: "Add filter", popoverChildren: _jsx(FilterModal, { schema: schema.find((s) => s.name === currentTable ||
2923
+ s.displayName === currentTable) ?? schema[0], fieldValuesMap: fieldValuesMap, onSubmitFilter: (filter) => {
2924
+ setOpenPopover(null);
2925
+ setIsPending(false);
2926
+ const item = filterToAst(filter, client.databaseType.toLowerCase());
2927
+ handleInsertion(item, 'AND', false);
2928
+ }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
2698
2929
  false && ( // temp removed the AddConditionPopover
2699
2930
  _jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
2700
2931
  if (!openPopover) {
@@ -2734,12 +2965,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2734
2965
  setOpenPopover(null);
2735
2966
  clearCheckboxes();
2736
2967
  }
2737
- } }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2968
+ } }) })] }))] })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Pivot" }), _jsx(PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEditingPivot, setShowUpdatePivot: setIsEditingPivot, parentRef: parentRef, data: rows, columns: columns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2738
2969
  setPivot(null);
2739
2970
  setPivotData(null);
2740
2971
  const formattedRows = formatRows(rows, columns, false);
2741
2972
  setFormattedRows(formattedRows);
2742
- }, selectPivot: (pivot) => {
2973
+ }, selectPivot: async (pivot, uniqueValues, dateRange, pivotTable) => {
2743
2974
  if (!pivot)
2744
2975
  return;
2745
2976
  const newAst = { ...baseAst };
@@ -2749,13 +2980,19 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2749
2980
  pivot['sortDirection'] = 'ASC';
2750
2981
  }
2751
2982
  setBaseAst(newAst); // trigger refetch
2983
+ let dateBucket = undefined;
2984
+ if (dateRange) {
2985
+ dateBucket = getDateBucketFromRange(dateRange);
2986
+ }
2987
+ if (!pivotTable) {
2988
+ pivotTable = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues);
2989
+ }
2990
+ setPivotData(pivotTable || []);
2752
2991
  setPivot(pivot);
2753
- const pivotedData = generatePivotTableInMemory(pivot, rows, undefined, false);
2754
- setPivotData(pivotedData || []);
2755
- const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2992
+ const formattedRows = formatRows(pivotTable.rows, columns, true, pivot.aggregationType);
2756
2993
  setFormattedRows(formattedRows);
2757
2994
  setErrorMessage('');
2758
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2995
+ }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, report: tempReport }), pivot && (_jsx(PivotForm, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2759
2996
  setPivotRowField(value);
2760
2997
  updatePivot(value, 'rowField');
2761
2998
  }, setPivotColumnField: (value) => {
@@ -2787,10 +3024,18 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2787
3024
  `.${pivot.rowField}`,
2788
3025
  `.${pivot.valueField || 'count'}`,
2789
3026
  ]
2790
- : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
3027
+ : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
2791
3028
  if (pivot) {
2792
- setPivot({ ...pivot, sort: false });
2793
- const pivotedData = generatePivotTableInMemory({ ...pivot, sort: false }, rows, undefined, false);
3029
+ const tempPivot = { ...pivot, sort: false };
3030
+ let dateBucket = undefined;
3031
+ const tempDateRange = dateRanges &&
3032
+ pivot.rowField &&
3033
+ dateRanges[pivot.rowField];
3034
+ if (tempDateRange) {
3035
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
3036
+ }
3037
+ setPivot(tempPivot);
3038
+ const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
2794
3039
  setPivotData(pivotedData || []);
2795
3040
  const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2796
3041
  setFormattedRows(formattedRows);
@@ -2799,25 +3044,27 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2799
3044
  }
2800
3045
  setBaseAst(deepCopy(baseAst));
2801
3046
  fetchSqlQuery(deepCopy(baseAst));
2802
- }, onSave: (column, direction) => {
3047
+ }, onSave: async (column, direction) => {
2803
3048
  if (pivot) {
2804
3049
  const sortFieldType = column === (pivot.valueField || 'count')
2805
3050
  ? 'number'
2806
3051
  : pivot.rowFieldType;
2807
- setPivot({
3052
+ const tempPivot = {
2808
3053
  ...pivot,
2809
3054
  sort: true,
2810
3055
  sortDirection: direction,
2811
3056
  sortField: column,
2812
3057
  sortFieldType: sortFieldType,
2813
- });
2814
- const pivotedData = generatePivotTableInMemory({
2815
- ...pivot,
2816
- sort: true,
2817
- sortDirection: direction,
2818
- sortField: column,
2819
- sortFieldType: sortFieldType,
2820
- }, rows, undefined, false);
3058
+ };
3059
+ setPivot(tempPivot);
3060
+ let dateBucket = undefined;
3061
+ const tempDateRange = dateRanges &&
3062
+ pivot.rowField &&
3063
+ dateRanges[pivot.rowField];
3064
+ if (tempDateRange) {
3065
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
3066
+ }
3067
+ const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
2821
3068
  setPivotData(pivotedData || []);
2822
3069
  const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
2823
3070
  setFormattedRows(formattedRows);
@@ -2832,7 +3079,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2832
3079
  flexDirection: 'column',
2833
3080
  gap: 8,
2834
3081
  marginBottom: 12,
2835
- }, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
3082
+ }, children: baseAst.orderby.map((sortData, id) => (_jsx(SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: () => {
2836
3083
  if (pivot) {
2837
3084
  setPivot({ ...pivot, sort: false });
2838
3085
  return;
@@ -2898,27 +3145,29 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2898
3145
  `.${pivot.rowField}`,
2899
3146
  `.${pivot.valueField || 'count'}`,
2900
3147
  ]
2901
- : selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
3148
+ : selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
2902
3149
  if (column === '')
2903
3150
  return;
2904
3151
  if (pivot) {
2905
3152
  const sortFieldType = column === (pivot.valueField || 'count')
2906
3153
  ? 'number'
2907
3154
  : pivot.rowFieldType;
2908
- setPivot({
2909
- ...pivot,
2910
- sort: true,
2911
- sortDirection: direction,
2912
- sortField: column,
2913
- sortFieldType: sortFieldType,
2914
- });
2915
- const pivotedData = generatePivotTableInMemory({
3155
+ const tempPivot = {
2916
3156
  ...pivot,
2917
3157
  sort: true,
2918
3158
  sortDirection: direction,
2919
3159
  sortField: column,
2920
3160
  sortFieldType: sortFieldType,
2921
- }, rows, undefined, false);
3161
+ };
3162
+ setPivot(tempPivot);
3163
+ let dateBucket = undefined;
3164
+ const tempDateRange = dateRanges &&
3165
+ pivot.rowField &&
3166
+ dateRanges[pivot.rowField];
3167
+ if (tempDateRange) {
3168
+ dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
3169
+ }
3170
+ const pivotedData = await generatePivotTable(tempPivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
2922
3171
  setErrorMessage('');
2923
3172
  setPivotData(pivotedData || []);
2924
3173
  const formattedRows = formatRows(pivotedData.rows, columns, true, pivot.aggregationType);
@@ -2940,7 +3189,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2940
3189
  setOpenPopover(null);
2941
3190
  setBaseAst(deepCopy(newAst));
2942
3191
  fetchSqlQuery(deepCopy(newAst));
2943
- } }) }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? (_jsx("div", { style: {
3192
+ } }) }) })] }), _jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit && baseAst.limit.value?.length > 0 ? (_jsx("div", { style: {
2944
3193
  display: 'flex',
2945
3194
  flexDirection: 'column',
2946
3195
  gap: 8,
@@ -3011,14 +3260,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3011
3260
  ? askAIInputWidth
3012
3261
  : askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
3013
3262
  ? 'Ask a follow-up question...'
3014
- : 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: (loading && errorMessage.length === 0) || initalChartLoad, rows: formattedRows, columns: pivot
3263
+ : 'Ask a question...' }), _jsx(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && (_jsx(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && (_jsx(TableComponent, { isLoading: tableLoading ||
3264
+ (loading && errorMessage.length === 0) ||
3265
+ initialChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
3015
3266
  ? pivotData?.columns || emptyPivotColumns()
3016
3267
  : enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
3017
3268
  return {
3018
3269
  label: snakeAndCamelCaseToTitleCase(c),
3019
3270
  field: c,
3020
3271
  };
3021
- }) })), _jsxs("div", { style: {
3272
+ }), onPageChange: onPageChange, onSortChange: onSortChange })), _jsxs("div", { style: {
3022
3273
  display: 'flex',
3023
3274
  flexDirection: 'row',
3024
3275
  gap: '12px',
@@ -3029,11 +3280,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3029
3280
  overflow: 'hidden',
3030
3281
  width: '100%',
3031
3282
  gap: 12,
3032
- }, children: [_jsx(ErrorMessageComponent, { errorMessage: errorMessage }), _jsx(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initalChartLoad && (_jsxs(_Fragment, { children: [!hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), _jsx(ButtonComponent, { onClick: () => {
3283
+ alignItems: 'center',
3284
+ }, children: [_jsx(ErrorMessageComponent, { errorMessage: errorMessage }), _jsx(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : (_jsx("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && (_jsxs(_Fragment, { children: [!hideCopySQL && (_jsx(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), _jsx(ButtonComponent, { onClick: () => {
3033
3285
  setIsChartBuilderOpen(true);
3034
- }, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
3286
+ }, disabled: !!errorMessage, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && (_jsx(ChartBuilderWithModal, { report: report
3035
3287
  ? {
3036
3288
  ...report,
3289
+ ...tempReport,
3037
3290
  pivot: pivot,
3038
3291
  yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
3039
3292
  columns: report.columns.filter((col) => {
@@ -3044,5 +3297,5 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3044
3297
  queryString: activeQuery,
3045
3298
  rows: rows,
3046
3299
  }
3047
- : undefined, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: report ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: report ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ChartBuilderModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, buttonLabel: report ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement }))] }));
3300
+ : tempReport, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: report ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: report ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ChartBuilderModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, buttonLabel: report ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement, rowCount: numberOfRows, onPageChange: onPageChange, onSortChange: onSortChange, isLoading: tableLoading }))] }));
3048
3301
  }