@quillsql/react 2.12.29 → 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 (483) 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 +143 -183
  4. package/dist/cjs/ChartBuilder.d.ts +18 -12
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +125 -98
  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.map +1 -1
  11. package/dist/cjs/Context.js +42 -2
  12. package/dist/cjs/Dashboard.d.ts +16 -7
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +17 -22
  15. package/dist/cjs/DateRangePicker/Calendar.d.ts.map +1 -1
  16. package/dist/cjs/DateRangePicker/Calendar.js +3 -6
  17. package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  18. package/dist/cjs/DateRangePicker/DateRangePicker.js +2 -3
  19. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts +1 -2
  20. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
  21. package/dist/cjs/DateRangePicker/DateRangePickerButton.js +2 -4
  22. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  23. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  24. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -4
  25. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  26. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  27. package/dist/cjs/DateRangePicker/dateRangePickerUtils.js +1 -15
  28. package/dist/cjs/ReportBuilder.d.ts +17 -5
  29. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  30. package/dist/cjs/ReportBuilder.js +510 -487
  31. package/dist/cjs/SQLEditor.d.ts +2 -9
  32. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  33. package/dist/cjs/SQLEditor.js +69 -86
  34. package/dist/cjs/Table.d.ts +19 -3
  35. package/dist/cjs/Table.d.ts.map +1 -1
  36. package/dist/cjs/Table.js +105 -87
  37. package/dist/cjs/TableChart.d.ts.map +1 -1
  38. package/dist/cjs/TableChart.js +0 -1
  39. package/dist/cjs/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  40. package/dist/cjs/assets/ArrowDownIcon.d.ts.map +1 -1
  41. package/dist/cjs/assets/ArrowDownRightIcon.d.ts.map +1 -1
  42. package/dist/cjs/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
  43. package/dist/cjs/assets/ArrowRightHeadIcon.d.ts.map +1 -1
  44. package/dist/cjs/assets/ArrowRightIcon.d.ts.map +1 -1
  45. package/dist/cjs/assets/ArrowUpHeadIcon.d.ts.map +1 -1
  46. package/dist/cjs/assets/ArrowUpIcon.d.ts.map +1 -1
  47. package/dist/cjs/assets/ArrowUpRightIcon.d.ts.map +1 -1
  48. package/dist/cjs/assets/CalendarIcon.d.ts.map +1 -1
  49. package/dist/cjs/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
  50. package/dist/cjs/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
  51. package/dist/cjs/assets/ExclamationFilledIcon.d.ts.map +1 -1
  52. package/dist/cjs/assets/LoadingSpinner.d.ts.map +1 -1
  53. package/dist/cjs/assets/SearchIcon.d.ts.map +1 -1
  54. package/dist/cjs/assets/XCircleIcon.d.ts.map +1 -1
  55. package/dist/cjs/components/Banner/index.d.ts +1 -1
  56. package/dist/cjs/components/Banner/index.d.ts.map +1 -1
  57. package/dist/cjs/components/Banner/index.js +1 -1
  58. package/dist/cjs/components/BigModal/BigModal.d.ts.map +1 -1
  59. package/dist/cjs/components/BigModal/BigModal.js +6 -12
  60. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  61. package/dist/cjs/components/Chart/BarList.js +21 -14
  62. package/dist/cjs/components/Chart/ChartError.d.ts +8 -1
  63. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  64. package/dist/cjs/components/Chart/ChartError.js +40 -5
  65. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  66. package/dist/cjs/components/Chart/ChartTooltip.js +8 -2
  67. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  68. package/dist/cjs/components/Chart/LineChart.js +2 -2
  69. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
  70. package/dist/cjs/components/Chart/PieChart.js +1 -3
  71. package/dist/cjs/components/Dashboard/ChartComponent.d.ts +1 -1
  72. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  73. package/dist/cjs/components/Dashboard/ChartComponent.js +1 -1
  74. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +5 -1
  75. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  76. package/dist/cjs/components/Dashboard/DashboardFilter.js +10 -5
  77. package/dist/cjs/components/Dashboard/DataLoader.d.ts +2 -6
  78. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  79. package/dist/cjs/components/Dashboard/DataLoader.js +88 -181
  80. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  81. package/dist/cjs/components/Dashboard/MetricComponent.js +1 -1
  82. package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -4
  83. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  84. package/dist/cjs/components/Dashboard/TableComponent.js +3 -3
  85. package/dist/cjs/components/Dropdown/Dropdown.d.ts.map +1 -1
  86. package/dist/cjs/components/Dropdown/Dropdown.js +1 -3
  87. package/dist/cjs/components/Dropdown/DropdownItem.d.ts.map +1 -1
  88. package/dist/cjs/components/Dropdown/DropdownItem.js +3 -8
  89. package/dist/cjs/components/Dropdown/index.d.ts +2 -2
  90. package/dist/cjs/components/Modal/Modal.d.ts.map +1 -1
  91. package/dist/cjs/components/Modal/Modal.js +2 -3
  92. package/dist/cjs/components/Modal/index.d.ts +1 -1
  93. package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
  94. package/dist/cjs/components/QuillMultiSelect.js +18 -3
  95. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  96. package/dist/cjs/components/QuillMultiSelectWithCombo.js +2 -2
  97. package/dist/cjs/components/QuillSelect.js +1 -1
  98. package/dist/cjs/components/QuillSelectWithCombo.js +2 -2
  99. package/dist/cjs/components/QuillTable.d.ts +1 -4
  100. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  101. package/dist/cjs/components/QuillTable.js +5 -11
  102. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +3 -1
  103. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  104. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +5 -8
  105. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  106. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -3
  107. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  108. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +12 -1
  109. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +22 -0
  110. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  111. package/dist/cjs/components/ReportBuilder/FilterModal.js +555 -0
  112. package/dist/cjs/components/ReportBuilder/ast.d.ts +2 -1
  113. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  114. package/dist/cjs/components/ReportBuilder/ast.js +33 -6
  115. package/dist/cjs/components/ReportBuilder/constants.d.ts +18 -3
  116. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  117. package/dist/cjs/components/ReportBuilder/constants.js +24 -3
  118. package/dist/cjs/components/ReportBuilder/convert.d.ts +12 -15
  119. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  120. package/dist/cjs/components/ReportBuilder/convert.js +326 -494
  121. package/dist/cjs/components/ReportBuilder/operators.d.ts +24 -4
  122. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  123. package/dist/cjs/components/ReportBuilder/operators.js +32 -4
  124. package/dist/cjs/components/ReportBuilder/ui.d.ts +20 -0
  125. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  126. package/dist/cjs/components/ReportBuilder/ui.js +30 -4
  127. package/dist/cjs/components/ReportBuilder/util.d.ts +3 -11
  128. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  129. package/dist/cjs/components/ReportBuilder/util.js +15 -18
  130. package/dist/cjs/components/UiComponents.d.ts +10 -7
  131. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  132. package/dist/cjs/components/UiComponents.js +9 -8
  133. package/dist/cjs/components/selectUtils.d.ts +0 -1
  134. package/dist/cjs/components/selectUtils.d.ts.map +1 -1
  135. package/dist/cjs/components/selectUtils.js +1 -22
  136. package/dist/cjs/hooks/index.d.ts +4 -4
  137. package/dist/cjs/hooks/useAstToFilterTree.d.ts +11 -0
  138. package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -0
  139. package/dist/cjs/hooks/useAstToFilterTree.js +26 -0
  140. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  141. package/dist/cjs/hooks/useDashboard.js +5 -1
  142. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  143. package/dist/cjs/hooks/useExport.js +3 -1
  144. package/dist/cjs/hooks/useOnClickOutside.js +4 -4
  145. package/dist/cjs/hooks/useOnWindowResize.d.ts.map +1 -1
  146. package/dist/cjs/hooks/useOnWindowResize.js +2 -2
  147. package/dist/cjs/hooks/useQuill.d.ts +10 -27
  148. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  149. package/dist/cjs/hooks/useQuill.js +114 -82
  150. package/dist/cjs/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  151. package/dist/cjs/hooks/useSelectOnKeyDown.js +4 -4
  152. package/dist/cjs/hooks/useTheme.js +1 -1
  153. package/dist/cjs/index.d.ts +1 -0
  154. package/dist/cjs/index.d.ts.map +1 -1
  155. package/dist/cjs/index.js +3 -1
  156. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  157. package/dist/cjs/internals/ReportBuilder/PivotForm.js +8 -1
  158. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +2 -2
  159. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  160. package/dist/cjs/internals/ReportBuilder/PivotList.js +2 -2
  161. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +1 -1
  162. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  163. package/dist/cjs/internals/ReportBuilder/PivotModal.js +8 -21
  164. package/dist/cjs/lib/utils.js +2 -2
  165. package/dist/cjs/models/Filter.d.ts +104 -4
  166. package/dist/cjs/models/Filter.d.ts.map +1 -1
  167. package/dist/cjs/models/Filter.js +91 -0
  168. package/dist/cjs/models/Pagination.d.ts +10 -0
  169. package/dist/cjs/models/Pagination.d.ts.map +1 -0
  170. package/dist/cjs/models/Pagination.js +2 -0
  171. package/dist/cjs/models/Report.d.ts +116 -0
  172. package/dist/cjs/models/Report.d.ts.map +1 -0
  173. package/dist/cjs/models/Report.js +2 -0
  174. package/dist/cjs/utils/aggregate.js +1 -1
  175. package/dist/cjs/utils/astFilterProcessing.d.ts +36 -0
  176. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -0
  177. package/dist/cjs/utils/astFilterProcessing.js +8056 -0
  178. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  179. package/dist/cjs/utils/astProcessing.js +4 -3
  180. package/dist/cjs/utils/axisFormatter.js +0 -71
  181. package/dist/cjs/utils/color.js +9 -87
  182. package/dist/cjs/utils/csv.d.ts.map +1 -1
  183. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  184. package/dist/cjs/utils/dashboard.js +3 -3
  185. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  186. package/dist/cjs/utils/dataFetcher.js +63 -1
  187. package/dist/cjs/utils/dataProcessing.d.ts +8 -0
  188. package/dist/cjs/utils/dataProcessing.d.ts.map +1 -0
  189. package/dist/cjs/utils/dataProcessing.js +127 -0
  190. package/dist/cjs/utils/dates.d.ts +1 -1
  191. package/dist/cjs/utils/error.d.ts +5 -0
  192. package/dist/cjs/utils/error.d.ts.map +1 -0
  193. package/dist/cjs/utils/error.js +12 -0
  194. package/dist/cjs/utils/filterConstants.d.ts +34 -0
  195. package/dist/cjs/utils/filterConstants.d.ts.map +1 -0
  196. package/dist/cjs/utils/filterConstants.js +36 -0
  197. package/dist/cjs/utils/filterProcessing.js +4 -4
  198. package/dist/cjs/utils/logging.d.ts.map +1 -1
  199. package/dist/cjs/utils/logging.js +1 -0
  200. package/dist/cjs/utils/merge.js +0 -21
  201. package/dist/cjs/utils/{monacoAutocomplete.d.ts → monacoConfig.d.ts} +3 -2
  202. package/dist/cjs/utils/monacoConfig.d.ts.map +1 -0
  203. package/dist/cjs/utils/monacoConfig.js +324 -0
  204. package/dist/cjs/utils/paginationProcessing.d.ts +5 -0
  205. package/dist/cjs/utils/paginationProcessing.d.ts.map +1 -0
  206. package/dist/cjs/utils/paginationProcessing.js +30 -0
  207. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  208. package/dist/cjs/utils/pivotConstructor.js +9 -0
  209. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  210. package/dist/cjs/utils/pivotProcessing.js +12 -6
  211. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  212. package/dist/cjs/utils/queryConstructor.js +4 -3
  213. package/dist/cjs/utils/report.d.ts +7 -0
  214. package/dist/cjs/utils/report.d.ts.map +1 -0
  215. package/dist/cjs/utils/report.js +93 -0
  216. package/dist/cjs/utils/schema.d.ts.map +1 -1
  217. package/dist/cjs/utils/schema.js +35 -6
  218. package/dist/cjs/utils/styles.d.ts +1 -1
  219. package/dist/cjs/utils/styles.d.ts.map +1 -1
  220. package/dist/cjs/utils/tableProcessing.d.ts +22 -8
  221. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  222. package/dist/cjs/utils/tableProcessing.js +116 -35
  223. package/dist/cjs/utils/textProcessing.js +3 -3
  224. package/dist/cjs/utils/validation.d.ts +9 -0
  225. package/dist/cjs/utils/validation.d.ts.map +1 -0
  226. package/dist/cjs/utils/validation.js +24 -0
  227. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  228. package/dist/cjs/utils/valueFormatter.js +8 -4
  229. package/dist/esm/Chart.d.ts +24 -10
  230. package/dist/esm/Chart.d.ts.map +1 -1
  231. package/dist/esm/Chart.js +146 -186
  232. package/dist/esm/ChartBuilder.d.ts +18 -12
  233. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  234. package/dist/esm/ChartBuilder.js +126 -99
  235. package/dist/esm/ChartEditor.d.ts +13 -1
  236. package/dist/esm/ChartEditor.d.ts.map +1 -1
  237. package/dist/esm/ChartEditor.js +63 -122
  238. package/dist/esm/Context.d.ts.map +1 -1
  239. package/dist/esm/Context.js +42 -2
  240. package/dist/esm/Dashboard.d.ts +16 -7
  241. package/dist/esm/Dashboard.d.ts.map +1 -1
  242. package/dist/esm/Dashboard.js +17 -22
  243. package/dist/esm/DateRangePicker/Calendar.d.ts.map +1 -1
  244. package/dist/esm/DateRangePicker/Calendar.js +5 -8
  245. package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  246. package/dist/esm/DateRangePicker/DateRangePicker.js +2 -3
  247. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +1 -2
  248. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +1 -1
  249. package/dist/esm/DateRangePicker/DateRangePickerButton.js +2 -4
  250. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  251. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  252. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -4
  253. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  254. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  255. package/dist/esm/DateRangePicker/dateRangePickerUtils.js +1 -15
  256. package/dist/esm/ReportBuilder.d.ts +17 -5
  257. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  258. package/dist/esm/ReportBuilder.js +516 -493
  259. package/dist/esm/SQLEditor.d.ts +2 -9
  260. package/dist/esm/SQLEditor.d.ts.map +1 -1
  261. package/dist/esm/SQLEditor.js +68 -85
  262. package/dist/esm/Table.d.ts +19 -3
  263. package/dist/esm/Table.d.ts.map +1 -1
  264. package/dist/esm/Table.js +107 -89
  265. package/dist/esm/TableChart.d.ts.map +1 -1
  266. package/dist/esm/TableChart.js +0 -1
  267. package/dist/esm/assets/ArrowDownHeadIcon.d.ts.map +1 -1
  268. package/dist/esm/assets/ArrowDownIcon.d.ts.map +1 -1
  269. package/dist/esm/assets/ArrowDownRightIcon.d.ts.map +1 -1
  270. package/dist/esm/assets/ArrowLeftHeadIcon.d.ts.map +1 -1
  271. package/dist/esm/assets/ArrowRightHeadIcon.d.ts.map +1 -1
  272. package/dist/esm/assets/ArrowRightIcon.d.ts.map +1 -1
  273. package/dist/esm/assets/ArrowUpHeadIcon.d.ts.map +1 -1
  274. package/dist/esm/assets/ArrowUpIcon.d.ts.map +1 -1
  275. package/dist/esm/assets/ArrowUpRightIcon.d.ts.map +1 -1
  276. package/dist/esm/assets/CalendarIcon.d.ts.map +1 -1
  277. package/dist/esm/assets/DoubleArrowLeftHeadIcon.d.ts.map +1 -1
  278. package/dist/esm/assets/DoubleArrowRightHeadIcon.d.ts.map +1 -1
  279. package/dist/esm/assets/ExclamationFilledIcon.d.ts.map +1 -1
  280. package/dist/esm/assets/LoadingSpinner.d.ts.map +1 -1
  281. package/dist/esm/assets/SearchIcon.d.ts.map +1 -1
  282. package/dist/esm/assets/XCircleIcon.d.ts.map +1 -1
  283. package/dist/esm/components/Banner/index.d.ts +1 -1
  284. package/dist/esm/components/Banner/index.d.ts.map +1 -1
  285. package/dist/esm/components/Banner/index.js +1 -1
  286. package/dist/esm/components/BigModal/BigModal.d.ts.map +1 -1
  287. package/dist/esm/components/BigModal/BigModal.js +7 -13
  288. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  289. package/dist/esm/components/Chart/BarList.js +21 -14
  290. package/dist/esm/components/Chart/ChartError.d.ts +8 -1
  291. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  292. package/dist/esm/components/Chart/ChartError.js +39 -6
  293. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  294. package/dist/esm/components/Chart/ChartTooltip.js +8 -2
  295. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  296. package/dist/esm/components/Chart/LineChart.js +2 -2
  297. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
  298. package/dist/esm/components/Chart/PieChart.js +1 -3
  299. package/dist/esm/components/Dashboard/ChartComponent.d.ts +1 -1
  300. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  301. package/dist/esm/components/Dashboard/ChartComponent.js +1 -1
  302. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +5 -1
  303. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  304. package/dist/esm/components/Dashboard/DashboardFilter.js +10 -5
  305. package/dist/esm/components/Dashboard/DataLoader.d.ts +2 -6
  306. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  307. package/dist/esm/components/Dashboard/DataLoader.js +88 -181
  308. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  309. package/dist/esm/components/Dashboard/MetricComponent.js +1 -1
  310. package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -4
  311. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  312. package/dist/esm/components/Dashboard/TableComponent.js +3 -3
  313. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  314. package/dist/esm/components/Dropdown/Dropdown.js +2 -4
  315. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -1
  316. package/dist/esm/components/Dropdown/DropdownItem.js +4 -9
  317. package/dist/esm/components/Dropdown/index.d.ts +2 -2
  318. package/dist/esm/components/Dropdown/index.js +2 -2
  319. package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
  320. package/dist/esm/components/Modal/Modal.js +2 -3
  321. package/dist/esm/components/Modal/index.d.ts +1 -1
  322. package/dist/esm/components/Modal/index.js +1 -1
  323. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
  324. package/dist/esm/components/QuillMultiSelect.js +18 -3
  325. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  326. package/dist/esm/components/QuillMultiSelectWithCombo.js +2 -2
  327. package/dist/esm/components/QuillSelect.js +1 -1
  328. package/dist/esm/components/QuillSelectWithCombo.js +2 -2
  329. package/dist/esm/components/QuillTable.d.ts +1 -4
  330. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  331. package/dist/esm/components/QuillTable.js +5 -11
  332. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +3 -1
  333. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  334. package/dist/esm/components/ReportBuilder/AddColumnModal.js +8 -11
  335. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  336. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +2 -4
  337. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  338. package/dist/esm/components/ReportBuilder/AddSortPopover.js +12 -1
  339. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +22 -0
  340. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -0
  341. package/dist/esm/components/ReportBuilder/FilterModal.js +552 -0
  342. package/dist/esm/components/ReportBuilder/ast.d.ts +2 -1
  343. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  344. package/dist/esm/components/ReportBuilder/ast.js +31 -5
  345. package/dist/esm/components/ReportBuilder/constants.d.ts +18 -3
  346. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  347. package/dist/esm/components/ReportBuilder/constants.js +24 -3
  348. package/dist/esm/components/ReportBuilder/convert.d.ts +12 -15
  349. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  350. package/dist/esm/components/ReportBuilder/convert.js +324 -493
  351. package/dist/esm/components/ReportBuilder/convert.uspec.d.ts +2 -0
  352. package/dist/esm/components/ReportBuilder/convert.uspec.d.ts.map +1 -0
  353. package/dist/esm/components/ReportBuilder/convert.uspec.js +1152 -0
  354. package/dist/esm/components/ReportBuilder/operators.d.ts +24 -4
  355. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  356. package/dist/esm/components/ReportBuilder/operators.js +32 -4
  357. package/dist/esm/components/ReportBuilder/ui.d.ts +20 -0
  358. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  359. package/dist/esm/components/ReportBuilder/ui.js +28 -3
  360. package/dist/esm/components/ReportBuilder/util.d.ts +3 -11
  361. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  362. package/dist/esm/components/ReportBuilder/util.js +16 -19
  363. package/dist/esm/components/UiComponents.d.ts +10 -7
  364. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  365. package/dist/esm/components/UiComponents.js +9 -8
  366. package/dist/esm/components/selectUtils.d.ts +0 -1
  367. package/dist/esm/components/selectUtils.d.ts.map +1 -1
  368. package/dist/esm/components/selectUtils.js +0 -20
  369. package/dist/esm/hooks/index.d.ts +4 -4
  370. package/dist/esm/hooks/index.js +4 -4
  371. package/dist/esm/hooks/useAstToFilterTree.d.ts +11 -0
  372. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -0
  373. package/dist/esm/hooks/useAstToFilterTree.js +24 -0
  374. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  375. package/dist/esm/hooks/useDashboard.js +5 -1
  376. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  377. package/dist/esm/hooks/useExport.js +4 -2
  378. package/dist/esm/hooks/useOnClickOutside.js +5 -5
  379. package/dist/esm/hooks/useOnWindowResize.d.ts.map +1 -1
  380. package/dist/esm/hooks/useOnWindowResize.js +3 -3
  381. package/dist/esm/hooks/useQuill.d.ts +10 -27
  382. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  383. package/dist/esm/hooks/useQuill.js +114 -82
  384. package/dist/esm/hooks/useSelectOnKeyDown.d.ts.map +1 -1
  385. package/dist/esm/hooks/useSelectOnKeyDown.js +5 -5
  386. package/dist/esm/hooks/useTheme.js +1 -1
  387. package/dist/esm/index.d.ts +1 -0
  388. package/dist/esm/index.d.ts.map +1 -1
  389. package/dist/esm/index.js +1 -0
  390. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  391. package/dist/esm/internals/ReportBuilder/PivotForm.js +9 -2
  392. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +2 -2
  393. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  394. package/dist/esm/internals/ReportBuilder/PivotList.js +3 -3
  395. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +1 -1
  396. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  397. package/dist/esm/internals/ReportBuilder/PivotModal.js +11 -24
  398. package/dist/esm/lib/utils.js +2 -2
  399. package/dist/esm/models/Filter.d.ts +104 -4
  400. package/dist/esm/models/Filter.d.ts.map +1 -1
  401. package/dist/esm/models/Filter.js +90 -1
  402. package/dist/esm/models/Pagination.d.ts +10 -0
  403. package/dist/esm/models/Pagination.d.ts.map +1 -0
  404. package/dist/esm/models/Pagination.js +1 -0
  405. package/dist/esm/models/Report.d.ts +116 -0
  406. package/dist/esm/models/Report.d.ts.map +1 -0
  407. package/dist/esm/models/Report.js +1 -0
  408. package/dist/esm/utils/aggregate.js +1 -1
  409. package/dist/esm/utils/astFilterProcessing.d.ts +36 -0
  410. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -0
  411. package/dist/esm/utils/astFilterProcessing.js +8049 -0
  412. package/dist/esm/utils/astFilterProcessing.uspec.d.ts +2 -0
  413. package/dist/esm/utils/astFilterProcessing.uspec.d.ts.map +1 -0
  414. package/dist/esm/utils/astFilterProcessing.uspec.js +2729 -0
  415. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  416. package/dist/esm/utils/astProcessing.js +4 -3
  417. package/dist/esm/utils/axisFormatter.js +0 -71
  418. package/dist/esm/utils/color.js +9 -87
  419. package/dist/esm/utils/csv.d.ts.map +1 -1
  420. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  421. package/dist/esm/utils/dashboard.js +3 -3
  422. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  423. package/dist/esm/utils/dataFetcher.js +63 -1
  424. package/dist/esm/utils/dataProcessing.d.ts +8 -0
  425. package/dist/esm/utils/dataProcessing.d.ts.map +1 -0
  426. package/dist/esm/utils/dataProcessing.js +122 -0
  427. package/dist/esm/utils/dataProcessing.uspec.d.ts +2 -0
  428. package/dist/esm/utils/dataProcessing.uspec.d.ts.map +1 -0
  429. package/dist/esm/utils/dataProcessing.uspec.js +204 -0
  430. package/dist/esm/utils/dates.d.ts +1 -1
  431. package/dist/esm/utils/error.d.ts +5 -0
  432. package/dist/esm/utils/error.d.ts.map +1 -0
  433. package/dist/esm/utils/error.js +8 -0
  434. package/dist/esm/utils/filterConstants.d.ts +34 -0
  435. package/dist/esm/utils/filterConstants.d.ts.map +1 -0
  436. package/dist/esm/utils/filterConstants.js +33 -0
  437. package/dist/esm/utils/filterProcessing.js +4 -4
  438. package/dist/esm/utils/logging.d.ts.map +1 -1
  439. package/dist/esm/utils/logging.js +1 -0
  440. package/dist/esm/utils/merge.js +0 -21
  441. package/dist/esm/utils/{monacoAutocomplete.d.ts → monacoConfig.d.ts} +3 -2
  442. package/dist/esm/utils/monacoConfig.d.ts.map +1 -0
  443. package/dist/esm/utils/monacoConfig.js +319 -0
  444. package/dist/esm/utils/paginationProcessing.d.ts +5 -0
  445. package/dist/esm/utils/paginationProcessing.d.ts.map +1 -0
  446. package/dist/esm/utils/paginationProcessing.js +25 -0
  447. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  448. package/dist/esm/utils/pivotConstructor.js +9 -0
  449. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  450. package/dist/esm/utils/pivotProcessing.js +12 -6
  451. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  452. package/dist/esm/utils/queryConstructor.js +4 -3
  453. package/dist/esm/utils/queryConstructor.uspec.js +21 -21
  454. package/dist/esm/utils/report.d.ts +7 -0
  455. package/dist/esm/utils/report.d.ts.map +1 -0
  456. package/dist/esm/utils/report.ispec.d.ts +2 -0
  457. package/dist/esm/utils/report.ispec.d.ts.map +1 -0
  458. package/dist/esm/utils/report.ispec.js +46 -0
  459. package/dist/esm/utils/report.js +88 -0
  460. package/dist/esm/utils/schema.d.ts.map +1 -1
  461. package/dist/esm/utils/schema.js +35 -6
  462. package/dist/esm/utils/styles.d.ts +1 -1
  463. package/dist/esm/utils/styles.d.ts.map +1 -1
  464. package/dist/esm/utils/tableProcessing.d.ts +22 -8
  465. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  466. package/dist/esm/utils/tableProcessing.ispec.d.ts +2 -0
  467. package/dist/esm/utils/tableProcessing.ispec.d.ts.map +1 -0
  468. package/dist/esm/utils/tableProcessing.ispec.js +61 -0
  469. package/dist/esm/utils/tableProcessing.js +112 -33
  470. package/dist/esm/utils/textProcessing.js +3 -3
  471. package/dist/esm/utils/validation.d.ts +9 -0
  472. package/dist/esm/utils/validation.d.ts.map +1 -0
  473. package/dist/esm/utils/validation.js +20 -0
  474. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  475. package/dist/esm/utils/valueFormatter.js +8 -4
  476. package/package.json +1 -1
  477. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +0 -1
  478. package/dist/cjs/utils/monacoAutocomplete.js +0 -145
  479. package/dist/cjs/utils/queryConstructor.uspec.d.ts +0 -2
  480. package/dist/cjs/utils/queryConstructor.uspec.d.ts.map +0 -1
  481. package/dist/cjs/utils/queryConstructor.uspec.js +0 -225
  482. package/dist/esm/utils/monacoAutocomplete.d.ts.map +0 -1
  483. package/dist/esm/utils/monacoAutocomplete.js +0 -140
@@ -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';
8
+ import { extractColumnish, getTableAliases, getTableNames, isBoolColumnType, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
11
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
20
  import { PivotModal, generatePivotTable, } from './internals/ReportBuilder/PivotModal';
23
- import { snakeAndCamelCaseToTitleCase, } from './utils/textProcessing';
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,15 +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, getDateRangeByColumns, getCountsByColumns, } 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';
38
- import { MAX_COLUMN_ROWS_LIMIT } from './utils/constants';
39
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';
40
44
  export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
41
45
  'https://quill-344421.uc.r.appspot.com';
42
46
  /**
@@ -70,7 +74,7 @@ export const QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUI
70
74
  * ### Report Builder API
71
75
  * @see https://docs.quillsql.com/components/report-builder
72
76
  */
73
- 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, }) {
74
78
  const { data: report } = useQuill(reportId || '');
75
79
  const [aiPrompt, setAiPrompt] = useState('');
76
80
  const [errorMessage, setErrorMessage] = useState('');
@@ -95,7 +99,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
95
99
  const [columns, setColumns] = useState([]);
96
100
  const [tempReport, setTempReport] = useState({});
97
101
  const [topLevelBinaryOperator, setTopLevelBinaryOperator] = useState('AND');
98
- const [editPopoverKey, setEditPopoverKey] = useState(null);
99
102
  const [uniqueValues, setUniqueValues] = useState({});
100
103
  const [pivot, setPivot] = useState(null);
101
104
  const [pivotData, setPivotData] = useState(null);
@@ -103,8 +106,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
103
106
  const [recommendedPivots, setRecommendedPivots] = useState([]);
104
107
  const [pivotPopUpTitle, setPivotPopUpTitle] = useState('Add pivot');
105
108
  const [showPivotPopover, setShowPivotPopover] = useState(false);
106
- const [isEdittingPivot, setIsEdittingPivot] = useState(false);
107
- const [initalChartLoad, setInitalChartLoad] = useState(false);
109
+ const [isEditingPivot, setIsEditingPivot] = useState(false);
110
+ const [initialChartLoad, setInitialChartLoad] = useState(false);
108
111
  const [askedAQuestion, setAskedAQuestion] = useState(false);
109
112
  const [selectedPivotIndex, setSelectedPivotIndex] = useState(-1);
110
113
  const [initialLoad, setInitialLoad] = useState(!!initialTableName || !!reportId);
@@ -120,11 +123,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
120
123
  const [pivotValueField, setPivotValueField] = useState(undefined);
121
124
  const [pivotAggregation, setPivotAggregation] = useState(undefined);
122
125
  const [dateRanges, setDateRanges] = useState(null);
123
- // eslint-disable-next-line no-unused-vars
124
- const [client, _setClient] = useContext(ClientContext);
126
+ const [client] = useContext(ClientContext);
125
127
  // JANK: This is temp and stupid
126
128
  const [overrideRecommendations, setOverrideRecommendations] = useState(true);
127
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
128
133
  useEffect(() => {
129
134
  if (!client) {
130
135
  return;
@@ -140,6 +145,21 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
140
145
  updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
141
146
  updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
142
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]);
143
163
  useEffect(() => {
144
164
  // Since the TextInput component takes a required numeric width parameter,
145
165
  // we dynamically calculate the width of this component here.
@@ -178,7 +198,17 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
178
198
  if (tempDateRange) {
179
199
  dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
180
200
  }
181
- const pivotedData = await generatePivotTable(pivot, rows, undefined, false, -1, undefined, dateBucket, tempReport, client, uniqueValues[currentTable]);
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);
182
212
  setPivotData(pivotedData || []);
183
213
  const formattedRows = formatRows(pivotedData.rows, columns, true, newPivot.aggregationType);
184
214
  setPivot(newPivot);
@@ -218,7 +248,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
218
248
  setRows([]);
219
249
  setColumns([]);
220
250
  setTopLevelBinaryOperator('AND');
221
- setEditPopoverKey(null);
222
251
  setErrorMessage('');
223
252
  setFormattedRows([]);
224
253
  // setUniqueValues({});
@@ -246,8 +275,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
246
275
  if (pivot) {
247
276
  const formattedRows = copiedRows.map((row) => {
248
277
  const formattedRow = row;
249
- Object.keys(row).forEach((key, index) => {
250
- let column = columns.find((c) => c.field === key);
278
+ Object.keys(row).forEach((key) => {
279
+ const column = columns.find((c) => c.field === key);
251
280
  let format = 'string';
252
281
  if (!column) {
253
282
  format =
@@ -307,42 +336,20 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
307
336
  navigator.clipboard.writeText(query);
308
337
  setTimeout(() => setIsCopying(false), 800);
309
338
  };
310
- const copyToClipboard = (str) => {
311
- setIsCopying(true);
312
- navigator.clipboard.writeText(str);
313
- setTimeout(() => setIsCopying(false), 800);
314
- };
315
339
  const clearCheckboxes = () => {
316
340
  const checkboxes = uniqueValues;
317
341
  const newValues = {};
318
- for (let table of Object.keys(checkboxes)) {
342
+ for (const table of Object.keys(checkboxes)) {
319
343
  newValues[table] = {};
320
- for (let column of Object.keys(checkboxes[table])) {
344
+ for (const column of Object.keys(checkboxes[table])) {
321
345
  newValues[table][column] = {};
322
- for (let variant of Object.keys(checkboxes[table][column])) {
346
+ for (const variant of Object.keys(checkboxes[table][column])) {
323
347
  newValues[table][column][variant] = false;
324
348
  }
325
349
  }
326
350
  }
327
351
  setUniqueValues(newValues);
328
352
  };
329
- const setCheckboxes = (node) => {
330
- if (!['IN', 'NOT IN'].includes(node.operator))
331
- return;
332
- const selectedItems = node.right.value.flatMap((v) => v.args.value.map((x) => x.value.toLowerCase()));
333
- const checkboxes = uniqueValues;
334
- const newValues = {};
335
- for (let table of Object.keys(checkboxes)) {
336
- newValues[table] = {};
337
- for (let column of Object.keys(checkboxes[table])) {
338
- newValues[table][column] = {};
339
- for (let variant of Object.keys(checkboxes[table][column])) {
340
- newValues[table][column][variant] = selectedItems.includes(variant.toLowerCase());
341
- }
342
- }
343
- }
344
- setUniqueValues(newValues);
345
- };
346
353
  const fetchSqlQuery = async (ast, formData, fetchData = true) => {
347
354
  if (fetchData) {
348
355
  setLoading(true);
@@ -358,6 +365,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
358
365
  body: JSON.stringify({
359
366
  ast: { ...ast, where },
360
367
  publicKey: client.publicKey,
368
+ useNewNodeSql: true, // new flag
361
369
  }),
362
370
  });
363
371
  const data = await response.json();
@@ -365,6 +373,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
365
373
  if (fetchData) {
366
374
  fetchUponChange(ast, formData);
367
375
  }
376
+ return data.query;
368
377
  }
369
378
  catch (error) {
370
379
  setLoading(false);
@@ -489,83 +498,102 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
489
498
  };
490
499
  useEffect(() => {
491
500
  const loadChart = async () => {
492
- setInitalChartLoad(true);
501
+ setInitialChartLoad(true);
502
+ // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
493
503
  if (!report || report.referencedTables.length !== 1) {
494
- setInitalChartLoad(false);
495
- return;
496
- }
497
- const tableName = report.referencedTables[0];
498
- if (!tableName) {
499
- return;
500
- }
501
- const resp = await getDataFromCloud(client, `astify`, {
502
- query: report.queryString,
503
- });
504
- if (resp.success === false) {
505
- setErrorMessage('Error: ' + resp.message);
504
+ setInitialChartLoad(false);
506
505
  return;
507
506
  }
508
- const ast = getSelectFromAST(resp.ast);
509
- let convertedAst = processStarColumn(ast, report.columns);
510
- processApostrophe(convertedAst, ['type', 'value']);
511
- convertedAst = convertBigQuery(convertedAst);
512
- let schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
513
- let newAst, groupByPivot;
514
- ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(convertedAst,
515
- // @ts-ignore
516
- report.pivot, schemaInfo));
517
- if (convertedAst.where) {
518
- setFormData(deepCopy(convertedAst.where));
519
- }
520
- setActiveQuery(report.queryString);
521
- newAst = groupByPivot ? newAst : convertedAst;
522
- setBaseAst(newAst);
523
- const initialRows = await fetchUponChange(newAst, undefined);
524
- const tableInfo = schemaInfo.find((table) => table.name === tableName);
525
- let newUniqueValues = undefined;
526
- let dateRangesTemp = undefined;
527
- if (tableName) {
528
- newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
529
- setUniqueValues(newUniqueValues);
530
- dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
531
- setDateRanges(dateRangesTemp);
532
- }
533
- if (groupByPivot) {
534
- // @ts-ignore
535
- setPivotRowField(groupByPivot.rowField);
536
- // @ts-ignore
537
- setPivotAggregation(groupByPivot.aggregationType);
538
- // @ts-ignore
539
- setPivotColumnField(groupByPivot.columnField);
540
- // @ts-ignore
541
- setPivotValueField(groupByPivot.valueField);
542
- setPivot(groupByPivot);
543
- let dateBucket = undefined;
544
- const tempDateRange = dateRangesTemp &&
545
- groupByPivot.rowField &&
546
- dateRangesTemp[groupByPivot.rowField];
547
- if (tempDateRange) {
548
- dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
549
- }
550
- const pivotedData = await generatePivotTable(
551
- // @ts-ignore
552
- groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
553
- setPivotData(pivotedData || []);
554
- 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,
555
530
  // @ts-ignore
556
- groupByPivot.aggregationType);
557
- 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);
558
586
  }
559
- else {
560
- const formattedRows = formatRows(report.rows, report.columns);
561
- setFormattedRows(formattedRows);
587
+ catch (error) {
588
+ console.error(error);
589
+ setErrorMessage('Error loading report');
562
590
  }
563
- setCurrentTable(tableName);
564
591
  // This handles a flashing issue
565
592
  setTimeout(() => {
566
- setInitalChartLoad(false);
593
+ setInitialChartLoad(false);
567
594
  }, 500);
568
595
  };
596
+ // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
569
597
  if (report && report.referencedTables.length === 1) {
570
598
  loadChart();
571
599
  }
@@ -891,10 +919,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
891
919
  isReplaceSubtree: true,
892
920
  });
893
921
  };
894
- // Function to handle the deletion of expressions
895
- const handleDelete = (key) => {
896
- updateFormData([{ path: key, value: null }], { isDeletion: true });
897
- };
898
922
  // Function to handle the insertion of expressions
899
923
  const handleInsertion = (value, op = 'OR', isCondition = undefined) => {
900
924
  updateFormData([{ path: '', value }], {
@@ -959,84 +983,61 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
959
983
  };
960
984
  const [previousPage, setPreviousPage] = useState(0);
961
985
  const [currentProcessing, setCurrentProcessing] = useState({
962
- page: { currentPage: 0, rowsPerPage: 20 },
986
+ page: DEFAULT_PAGINATION,
963
987
  });
964
988
  const [numberOfRows, setNumberOfRows] = useState(0);
965
989
  const [tableLoading, setTableLoading] = useState(false);
966
990
  const onPageChange = (page) => {
967
- if (pivot) {
968
- return;
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);
969
997
  }
970
- if ((previousPage < page.currentPage &&
971
- (page.currentPage * page.rowsPerPage) % MAX_COLUMN_ROWS_LIMIT === 0) ||
972
- (previousPage > page.currentPage &&
973
- (previousPage * page.rowsPerPage) % MAX_COLUMN_ROWS_LIMIT === 0)) {
974
- handleRunQuery({ ...currentProcessing, page });
998
+ if (page > previousPage) {
999
+ setPreviousPage(page);
975
1000
  }
976
- setPreviousPage(page.currentPage);
977
1001
  };
978
1002
  const onSortChange = (sort) => {
979
- if (pivot) {
1003
+ if (report &&
1004
+ shouldSortInMemory(DEFAULT_PAGINATION, report.rowCount, !!report.pivot)) {
980
1005
  return;
981
1006
  }
982
- handleRunQuery({ sort, page: { currentPage: 0, rowsPerPage: 20 } });
1007
+ const updatedProcessing = { page: DEFAULT_PAGINATION, sort };
1008
+ handleRunQuery(updatedProcessing, true);
1009
+ setCurrentProcessing(updatedProcessing);
983
1010
  setPreviousPage(0);
984
1011
  };
985
- const handleRunQuery = async (processing) => {
1012
+ const handleRunQuery = async (processing, resetRows = false) => {
986
1013
  try {
987
1014
  setErrorMessage('');
988
1015
  setTableLoading(true);
989
- const hostedBody = {
990
- metadata: {
991
- query: activeQuery,
992
- task: 'query',
993
- orgId: client.customerId || '*',
994
- clientId: client.publicKey,
995
- databaseType: client?.databaseType,
996
- getCustomFields: !client.customerId || client.customerId === '*' ? false : true,
997
- customFieldsByTable: customFields,
998
- additionalProcessing: processing,
999
- useUpdatedDataGathering: true,
1000
- },
1001
- };
1002
- const cloudBody = { activeQuery };
1003
- const resp = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
1004
- if (resp && resp.errorMessage) {
1005
- setTableLoading(false);
1006
- setErrorMessage('Failed to run SQL query: ' + resp.errorMessage);
1007
- setRows([]);
1008
- setColumns([]);
1009
- return;
1016
+ const tableInfo = await fetchTableByQuery(activeQuery, client, processing, customFields);
1017
+ if (tableInfo.error) {
1018
+ throw new Error(tableInfo.error);
1010
1019
  }
1011
- if (resp.rowCount) {
1012
- setNumberOfRows(resp.rowCount);
1020
+ else if (tableInfo.rows.length === 0) {
1021
+ throw new Error('No data found');
1022
+ }
1023
+ if (tableInfo.rowCount) {
1024
+ setNumberOfRows(tableInfo.rowCount);
1013
1025
  }
1014
- setErrorMessage('');
1015
1026
  setCurrentProcessing(processing);
1016
- if (resp.rows.length === 0) {
1017
- setErrorMessage('No data found');
1018
- }
1019
- const temp_rows = resp.rows && resp.rows.length ? resp.rows : [];
1020
- const processedFields = resp.fields.map((elem) => convertPostgresColumn(elem));
1021
- setRows(temp_rows);
1022
- // setNumberOfRows(resp.compareRows[0]?.count || temp_rows.length);
1023
- setFormattedRows(temp_rows.map((row) => {
1024
- return processedFields.reduce((formattedRow, column) => {
1025
- // Apply the format function to each field in the row
1026
- const formattedValue = quillFormat({
1027
- value: row[column.field],
1028
- format: column.format,
1029
- });
1030
- formattedRow[column.field] = formattedValue;
1031
- return formattedRow;
1032
- }, {});
1033
- }));
1034
- setColumns(processedFields);
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);
1035
1034
  setTableLoading(false);
1036
1035
  }
1037
1036
  catch (e) {
1038
1037
  setTableLoading(false);
1039
- console.log('ERROR: ', e);
1038
+ setErrorMessage('Failed to run SQL query: ' + e);
1039
+ setRows([]);
1040
+ setColumns([]);
1040
1041
  return;
1041
1042
  }
1042
1043
  };
@@ -1055,10 +1056,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1055
1056
  case 'binary_expr':
1056
1057
  if (dateComparisonPartialMatch ||
1057
1058
  (isDateTruncEquals(node) && client.databaseType !== 'BigQuery')) {
1058
- const { dateColumn,
1059
- // see onChange callback handleChange
1060
- // eslint-disable-next-line no-unused-vars
1061
- dateColumnPath, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
1059
+ const { dateColumn, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
1062
1060
  const isPlural = intervalCount !== 1 && dateFilterType !== 'in the current'
1063
1061
  ? 's'
1064
1062
  : '';
@@ -1206,7 +1204,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1206
1204
  } }))] }));
1207
1205
  }
1208
1206
  else if (isInTheLastInterval(node, client.databaseType)) {
1209
- const { dateColumn, dateFilterType, intervalCount, intervalType } = getDateFilterInfo(node);
1207
+ const { dateColumn } = getDateFilterInfo(node);
1210
1208
  const options = getAllPossibleColumns().map((column) => ({
1211
1209
  label: snakeAndCamelCaseToTitleCase(column.displayName),
1212
1210
  value: column.name,
@@ -1267,7 +1265,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1267
1265
  ], width: 200 }) })] }));
1268
1266
  }
1269
1267
  else if (isTheCurrentInterval(node, client.databaseType)) {
1270
- const { dateFilterType } = getDateFilterInfo(node);
1271
1268
  const options = getAllPossibleColumns().map((column) => ({
1272
1269
  label: snakeAndCamelCaseToTitleCase(column.displayName),
1273
1270
  value: column.name,
@@ -1326,7 +1323,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1326
1323
  { label: `week`, value: 'WEEK' },
1327
1324
  ], width: 200 })] }));
1328
1325
  }
1329
- else if (isThePreviousInterval(node, client.databaseType)) {
1326
+ else if (isThePreviousInterval(node)) {
1330
1327
  const options = getAllPossibleColumns().map((column) => ({
1331
1328
  label: snakeAndCamelCaseToTitleCase(column.displayName),
1332
1329
  value: column.name,
@@ -1473,7 +1470,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1473
1470
  .find((tableInfo) => tableInfo.name === table)
1474
1471
  ?.columns.find((col) => col.name === leftChildValue);
1475
1472
  const columnType = column?.fieldType;
1476
- let operatorOptions = [
1473
+ const operatorOptions = [
1477
1474
  ...(isNumericColumnType(columnType)
1478
1475
  ? [
1479
1476
  { label: 'equal to', value: '=' },
@@ -1714,112 +1711,214 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1714
1711
  }
1715
1712
  return validPivot;
1716
1713
  };
1717
- const renderSentence = (formData, node, keyPrefix = '',
1718
- // @depreciated TODO: remove next update
1719
- // eslint-disable-next-line no-unused-vars
1720
- isTopLevel = false,
1721
- // @depreciated TODO: remove next update
1722
- // eslint-disable-next-line no-unused-vars
1723
- isTopLevelAnd = false, isParentRow = false) => {
1724
- const uniqueSentence = getCustomSentence(node, client.databaseType);
1725
- let dateComparisonPartialMatch = null;
1726
- let dateEqualityPartialMatch = null;
1727
- if (client.databaseType !== 'BigQuery') {
1728
- dateComparisonPartialMatch = formatDateComparisonNode(node);
1729
- 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
+ }
1730
1739
  }
1731
- const isRow = !isTopLevelBoolean(node);
1732
- const isCard = isRow && !isParentRow;
1733
- const OPS = {
1734
- AND: 'and',
1735
- OR: 'or',
1736
- LIKE: 'is exactly',
1737
- BETWEEN: 'is between',
1738
- IN: 'is',
1739
- 'NOT IN': 'is not',
1740
- 'NOT LIKE': 'is not exactly',
1741
- '!=': 'is not exactly',
1742
- '=': 'is',
1743
- '<': 'is less than',
1744
- '>': 'is greater than',
1745
- '<=': 'is less than or equal to',
1746
- '>=': 'is greater than or equal to',
1747
- '<>': 'is not',
1748
- '-': 'minus',
1749
- 'IS NOT': 'is not',
1750
- IS: 'is',
1751
- };
1752
- switch (node.type) {
1753
- case 'binary_expr':
1754
- 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 ??
1755
- dateEqualityPartialMatch ??
1756
- uniqueSentence ?? (_jsxs(_Fragment, { children: [node.left &&
1757
- 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 &&
1758
- renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
1759
- case 'column_ref':
1760
- return snakeAndCamelCaseToTitleCase(node.column);
1761
- case 'expr_list':
1762
- if (node.value.length === 1) {
1763
- const subQuery = renderSentence(formData, node.value[0]);
1764
- if (subQuery) {
1765
- return `${subQuery}`;
1766
- }
1767
- 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}`;
1768
1758
  }
1769
- return `${node.value
1770
- .map((elem) => renderSentence(formData, elem))
1771
- .join(', ')}`;
1772
- case 'single_quote_string':
1773
- return node.value.replaceAll('%', '');
1774
- case 'double_quote_string':
1775
- case 'number':
1776
- return node.value;
1777
- case 'null':
1778
- return 'null';
1779
- case 'bool':
1780
- return node.value.toString();
1781
- case 'interval':
1782
- if (node.unit) {
1783
- // eg. `INTERVAL '90' DAY` -> "90 days"
1784
- return `${node.expr.value} ${node.unit}s`;
1759
+ else {
1760
+ value = `${filter.value.value} ${filter.value.unit}${filter.value.value === 1 ? '' : 's'}`;
1785
1761
  }
1786
- return node.expr.value;
1787
- case 'function':
1788
- if (node.name.toLowerCase() === 'lower' ||
1789
- node.name.toLowerCase() === 'upper') {
1790
- // how many transactions were above 20 and not fuel or made in the last 90 days (hint: use lower)
1791
- if (node.args.value.length < 1)
1792
- return null;
1793
- if (node.args.value[0].value) {
1794
- if (node.args.value[0].type === 'single_quote_string') {
1795
- return node.args.value[0].value.replaceAll('%', '');
1796
- }
1797
- return snakeAndCamelCaseToTitleCase(node.args.value[0].value.replaceAll('%', ''));
1798
- }
1799
- if (node.args.value[0].column)
1800
- 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) {
1801
1784
  return null;
1802
1785
  }
1803
- if (node.name.toLowerCase() === 'current_date' ||
1804
- node.name.toLowerCase() === 'now') {
1805
- return 'today';
1806
- }
1807
- if (node.name.toLowerCase() === 'date_trunc') {
1808
- // eg. date_trunc('month', now())
1809
- if (!node.args)
1810
- return null;
1811
- if (node.args.type !== 'expr_list')
1812
- return null;
1813
- if (node.args.value?.length !== 2)
1814
- return null;
1815
- const interval = renderSentence(formData, node.args.value[0]);
1816
- const timestamp = renderSentence(formData, node.args.value[1]);
1817
- 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
+ }
1818
1803
  }
1819
- return null;
1820
- default:
1821
- return null;
1804
+ return newNode;
1805
+ }
1806
+ return buildTree(0);
1822
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
+ }) }));
1823
1922
  };
1824
1923
  const getAllPossibleColumns = () => {
1825
1924
  if (!baseAst || !baseAst.from) {
@@ -1861,7 +1960,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1861
1960
  if (selectedColumns.length < 1)
1862
1961
  return false;
1863
1962
  const allColumns = orderedColumnNames.filter((row) => {
1864
- const [table, _] = row.split('.');
1963
+ const [table] = row.split('.');
1865
1964
  const selectedTable = selectedColumns[0].split('.')[0];
1866
1965
  return selectedTable === table;
1867
1966
  });
@@ -1907,23 +2006,16 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1907
2006
  customFields,
1908
2007
  additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
1909
2008
  useUpdatedDataGathering: true,
2009
+ useNewNodeSql: true, // new flag
1910
2010
  },
1911
2011
  };
1912
- const cloudBody = {};
1913
- const data2 = await getData(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
1914
- if (data2.success === false) {
1915
- throw new Error(data2.errorMessage);
1916
- }
1917
- rows = data2.rows;
1918
- if (data2.rowCount) {
1919
- setNumberOfRows(data2.rowCount);
1920
- }
1921
2012
  const tables = getTableNames(baseAst);
1922
2013
  const table = tables.length >= 1 ? tables[0] : initialTableName;
1923
2014
  let newUniqueValues = uniqueValues;
1924
2015
  let dateRangesTemp = dateRanges;
1925
- let curReport = undefined;
1926
- if (table !== currentTable) {
2016
+ let curReport = tempReport;
2017
+ if ((newUniqueValues && Object.keys(newUniqueValues).length === 0) ||
2018
+ table !== currentTable) {
1927
2019
  const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
1928
2020
  if (tableInfo) {
1929
2021
  newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
@@ -1935,6 +2027,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1935
2027
  }
1936
2028
  setCurrentTable(table);
1937
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
+ }
1938
2039
  if (data2.rows && data2.rows.length) {
1939
2040
  if (pivot) {
1940
2041
  // check if any of the pivot fields aren't in the data2.fields array
@@ -1964,13 +2065,14 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1964
2065
  setFormattedRows(formattedRows);
1965
2066
  return;
1966
2067
  }
2068
+ curReport = {
2069
+ ...formData,
2070
+ itemQuery: data2.itemQuery,
2071
+ rowCount: data2.rowCount,
2072
+ filtersApplied: [],
2073
+ rows: data2.rows,
2074
+ };
1967
2075
  // Do all of this to make sure we have the right unique columns when applying a pivot
1968
- let uniqueFormatted = {};
1969
- const uniqueRecords = Array.from(new Set(data2.rows.map((row) => row[pivot.columnField]))).reduce((acc, curr) => {
1970
- acc[curr] = false;
1971
- return acc;
1972
- }, {});
1973
- uniqueFormatted[pivot.columnField] = uniqueRecords;
1974
2076
  let dateBucket = undefined;
1975
2077
  const tempDateRange = dateRangesTemp &&
1976
2078
  pivot.rowField &&
@@ -1978,9 +2080,20 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
1978
2080
  if (tempDateRange) {
1979
2081
  dateBucket = getDateBucketFromRange(tempDateRange.dateRange);
1980
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
+ }
1981
2094
  const pivotedData = await generatePivotTable(
1982
2095
  // @ts-ignore
1983
- pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, uniqueFormatted[pivot.columnField]);
2096
+ pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, distinctValuesForQuery ? distinctValuesForQuery : undefined);
1984
2097
  console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
1985
2098
  const processedFields = data2.fields.map((elem) => convertPostgresColumn(elem));
1986
2099
  setPivotData(pivotedData);
@@ -2042,105 +2155,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2042
2155
  setFormattedRows([]);
2043
2156
  setPivotData(null);
2044
2157
  }
2158
+ setLoading(false);
2159
+ setDataDisplayed(true);
2160
+ return rows;
2045
2161
  }
2046
2162
  catch (e) {
2047
- console.error(e);
2048
2163
  setErrorMessage(e.message);
2049
- }
2050
- finally {
2051
2164
  setLoading(false);
2052
2165
  setDataDisplayed(true);
2053
- return rows;
2166
+ setRows([]);
2167
+ setColumns([]);
2168
+ setFormattedRows([]);
2169
+ setPivotData(null);
2170
+ return { error: true, message: e.message };
2054
2171
  }
2055
2172
  }
2056
2173
  };
2057
- // Convert an array of columns to a map where the name is the
2058
- // key and the value is the column node.
2059
- const columnArrayToMap = (columns) => {
2060
- const columnMap = {};
2061
- for (const col of columns) {
2062
- const key = col.expr?.value ?? col.expr?.column ?? col.as;
2063
- columnMap[key] = col;
2064
- }
2065
- return columnMap;
2066
- };
2067
- const applyFormatting = (response, columns) => {
2068
- const columnFormatters = {};
2069
- const columnMap = columnArrayToMap(columns);
2070
- response.fields.forEach((field) => {
2071
- // TODO: columnMap[field.name] silently breaks for columnField columns
2072
- const formatType = getPostgresBasicType(field);
2073
- if (formatType === 'date') {
2074
- columnFormatters[field.name] = (x) => {
2075
- const d = new Date(x);
2076
- // check if d is a valid date
2077
- if (isNaN(d.getTime())) {
2078
- return 'Invalid Date';
2079
- }
2080
- d.setMinutes(d.getMinutes() + d.getTimezoneOffset()); // TZ adjust
2081
- if (columnMap[field.name]?.expr.type === 'function' &&
2082
- columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
2083
- columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
2084
- 'month') {
2085
- return d.toLocaleString('default', {
2086
- month: 'short',
2087
- year: 'numeric',
2088
- });
2089
- }
2090
- else if (columnMap[field.name]?.expr.type === 'function' &&
2091
- columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
2092
- columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
2093
- 'quarter') {
2094
- return `Q${getQuarter(d)} ${d.getFullYear()}`;
2095
- }
2096
- else if (columnMap[field.name]?.expr.type === 'function' &&
2097
- columnMap[field.name]?.expr.name.toLowerCase() === 'date_trunc' &&
2098
- columnMap[field.name]?.expr.args.value[0].value.toLowerCase() ===
2099
- 'year') {
2100
- return d.toLocaleString('default', {
2101
- year: 'numeric',
2102
- });
2103
- }
2104
- return DATE_FMT.format(d);
2105
- };
2106
- }
2107
- else if (formatType === 'number') {
2108
- columnFormatters[field.name] = (x) => {
2109
- if (columnMap[field.name]?.expr.type === 'extract' &&
2110
- columnMap[field.name]?.expr.args.field.toLowerCase() === 'dow') {
2111
- return DAY_OF_WEEK[x];
2112
- }
2113
- else if (columnMap[field.name]?.expr.type === 'extract' &&
2114
- columnMap[field.name]?.expr.args.field.toLowerCase() === 'month') {
2115
- return MONTH_OF_YEAR[x - 1];
2116
- }
2117
- else if (`${x}`.includes('.')) {
2118
- // return MONEY_FMT.format(Number(x ?? 0.0));
2119
- return Number(x ?? 0.0).toFixed(2);
2120
- }
2121
- return x ?? 0.0;
2122
- };
2123
- }
2124
- else if (formatType === 'boolean') {
2125
- columnFormatters[field.name] = (x) => {
2126
- if (x) {
2127
- return 'True';
2128
- }
2129
- return 'False';
2130
- };
2131
- }
2132
- else {
2133
- columnFormatters[field.name] = (x) => x;
2134
- }
2135
- });
2136
- return response.rows.map((row) => {
2137
- const newRow = {};
2138
- Object.keys(row).forEach((key) => (newRow[key] = columnFormatters[key]
2139
- ? columnFormatters[key](row[key])
2140
- : row[key]));
2141
- return newRow;
2142
- });
2143
- };
2144
2174
  // Returns whether a where-clause contains a nested subquery.
2145
2175
  const isSubquery = (node) => {
2146
2176
  if (!node)
@@ -2164,7 +2194,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2164
2194
  return;
2165
2195
  }
2166
2196
  try {
2167
- let errored = false;
2168
2197
  setLoading(true);
2169
2198
  setAskedAQuestion(true);
2170
2199
  setErrorMessage('');
@@ -2184,6 +2213,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2184
2213
  body: JSON.stringify({
2185
2214
  initialQuestion: aiPrompt || overridePrompt,
2186
2215
  publicKey: client.publicKey,
2216
+ useNewNodeSql: true, // new flag
2187
2217
  }),
2188
2218
  });
2189
2219
  }
@@ -2195,6 +2225,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2195
2225
  sqlQuery: activeQuery,
2196
2226
  initialQuestion: aiPrompt,
2197
2227
  publicKey: client.publicKey,
2228
+ useNewNodeSql: true, // new flag
2198
2229
  }),
2199
2230
  });
2200
2231
  }
@@ -2212,31 +2243,33 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2212
2243
  setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
2213
2244
  return;
2214
2245
  }
2246
+ let currentSchema = schema;
2247
+ if (currentSchema && currentSchema.length === 0) {
2248
+ currentSchema = await fetchSchema();
2249
+ }
2215
2250
  let newAst, groupByPivot;
2216
2251
  if (ast) {
2217
2252
  // Unwrap the ast object, supporting many possible types
2218
2253
  ast = ast.length ? ast[0] : ast;
2219
2254
  newAst = convertBigQuery(ast);
2220
- newAst = convertWildcardColumns(newAst, schema); // must go before groupby
2221
- ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, schema));
2222
- if (groupByPivot && !groupByPivot?.valueField) {
2223
- setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
2224
- return;
2225
- }
2255
+ newAst = convertWildcardColumns(newAst, currentSchema); // must go before groupby
2256
+ ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, currentSchema));
2226
2257
  newAst = convertStringComparison(newAst, client.databaseType);
2227
2258
  newAst = convertRemoveSimpleParentheses(newAst);
2228
2259
  const table = getTableNames(newAst)[0] ?? initialTableName;
2229
2260
  const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
2230
2261
  newAst = removeNonSelectedTableReferences(newAst, tableAlias ?? table, getAllPossibleColumns().map((col) => col.name));
2231
- setSelectedColumns(deepCopy(newAst).columns?.map((column) => {
2262
+ const procesedColumns = deepCopy(newAst).columns?.map((column) => {
2232
2263
  if (column.expr.type === 'column_ref') {
2233
- return `${table}.${column.expr.column}`;
2264
+ const columnName = extractColumnish(column.expr);
2265
+ return `${table}.${columnName}`;
2234
2266
  }
2235
2267
  else if (column.as) {
2236
2268
  return `${table}.${column.as}`;
2237
2269
  }
2238
2270
  return `${table}.${column.expr.value}`;
2239
- }));
2271
+ });
2272
+ setSelectedColumns(procesedColumns);
2240
2273
  if (groupByPivot) {
2241
2274
  setBaseAst(deepCopy({ ...newAst, orderby: null, limit: null }));
2242
2275
  newAst = deepCopy({ ...newAst, orderby: null, limit: null });
@@ -2252,7 +2285,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2252
2285
  ast = newAst; // so we fetch data for newAst later.
2253
2286
  fetchSqlQuery(ast, undefined, false);
2254
2287
  const table = getTableNames(newAst)[0] ?? initialTableName;
2255
- const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
2256
2288
  const hostedBody = {
2257
2289
  metadata: {
2258
2290
  clientId: client.publicKey,
@@ -2263,19 +2295,19 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2263
2295
  additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
2264
2296
  useUpdatedDataGathering: true,
2265
2297
  pivot: groupByPivot,
2298
+ useNewNodeSql: true, // new flag
2266
2299
  },
2267
2300
  };
2268
- const cloudBody = {};
2269
- const data2 = await getData(client, 'patterns', 'same-origin', hostedBody, cloudBody);
2270
- if (data2.status === 'error') {
2271
- throw new Error('Error querying data from patterns');
2272
- }
2273
2301
  let currentUniqueValues = uniqueValues;
2274
2302
  let dateRangesTemp = dateRanges;
2275
- if (table !== currentTable) {
2276
- const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
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);
2277
2308
  if (tableInfo) {
2278
2309
  const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
2310
+ currentUniqueValues = newUniqueValues;
2279
2311
  if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
2280
2312
  setUniqueValues(newUniqueValues);
2281
2313
  }
@@ -2284,8 +2316,22 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2284
2316
  }
2285
2317
  setCurrentTable(table);
2286
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
+ }
2287
2324
  if (data2.rows && data2.rows.length) {
2288
- 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);
2289
2335
  let possiblePivot = true;
2290
2336
  const possibleColumns = getPossiblePivotFieldOptions(processedFields, currentUniqueValues[table]);
2291
2337
  if (groupByPivot &&
@@ -2299,7 +2345,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2299
2345
  let errorMessageEnding = '';
2300
2346
  if (groupByPivot.columnField &&
2301
2347
  !possibleColumns.columnFields.includes(groupByPivot?.columnField || '')) {
2302
- if (currentUniqueValues[table][groupByPivot?.columnField || '']) {
2348
+ if (currentUniqueValues[table]?.[groupByPivot?.columnField || '']) {
2303
2349
  errorMessageEnding = `The column ${groupByPivot?.columnField} has more than 24 unique values to pivot on.`;
2304
2350
  }
2305
2351
  else {
@@ -2308,7 +2354,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2308
2354
  }
2309
2355
  else if (groupByPivot.rowField &&
2310
2356
  !possibleColumns.rowFields.includes(groupByPivot?.rowField || '')) {
2311
- if (currentUniqueValues[table][groupByPivot?.rowField || '']) {
2357
+ if (currentUniqueValues[table]?.[groupByPivot?.rowField || '']) {
2312
2358
  errorMessageEnding = `The column ${groupByPivot?.rowField} has more than 36 unique values to pivot on.`;
2313
2359
  }
2314
2360
  else {
@@ -2320,7 +2366,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2320
2366
  errorMessageEnding = `The column ${groupByPivot?.valueField} is not a proper value field.`;
2321
2367
  }
2322
2368
  setErrorMessage(`The requested pivot is not supported. ${errorMessageEnding}`);
2323
- errored = true;
2324
2369
  }
2325
2370
  if (groupByPivot && possiblePivot) {
2326
2371
  let curReport = report ? report : undefined;
@@ -2397,7 +2442,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2397
2442
  setActiveQuery('');
2398
2443
  }
2399
2444
  if (data2.errorMessage) {
2400
- setErrorMessage(`Error: ${data2.errorMessage}`);
2445
+ setErrorMessage(`Error: Couldn't process your request, please re-word your prompt.`);
2401
2446
  }
2402
2447
  }
2403
2448
  catch (e) {
@@ -2417,7 +2462,8 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2417
2462
  setSelectedColumns((selectedColumns) => selectedColumns.filter((column) => !column.endsWith(name)));
2418
2463
  const columns = baseAst.columns.filter((col) => {
2419
2464
  if (col.expr.type === 'column_ref') {
2420
- return col.expr.column !== name;
2465
+ return (col.expr.column !== name &&
2466
+ (!col.expr.column.expr || col.expr.column.expr.value !== name));
2421
2467
  }
2422
2468
  else if (col.as) {
2423
2469
  return col.as !== name;
@@ -2432,14 +2478,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2432
2478
  setBaseAst(newAst);
2433
2479
  fetchSqlQuery(newAst);
2434
2480
  };
2435
- function TopLevelBooleanSwitch({ node, keyPrefix, handleOperatorChange, }) {
2436
- return (_jsx("div", { style: { width: 'fit-content' }, children: _jsx(TabsComponent, { value: node.operator, options: DEFAULT_TAB_OPTIONS, onChange: (event) => {
2437
- if (loading) {
2438
- return;
2439
- }
2440
- handleOperatorChange(event.target.value, node, keyPrefix);
2441
- } }) }));
2442
- }
2443
2481
  const DraggableItem = ({ id, label, onDelete }) => {
2444
2482
  const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: id });
2445
2483
  const style = {
@@ -2466,7 +2504,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2466
2504
  setOrderedColumnNames(newOrder);
2467
2505
  const orderedSelectedColumns = [];
2468
2506
  for (const value of newOrder) {
2469
- const [_, column] = value.split('.');
2507
+ const column = value.split('.')[1];
2470
2508
  if (selectedColumns.includes(value)) {
2471
2509
  orderedSelectedColumns.push(column);
2472
2510
  }
@@ -2490,12 +2528,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2490
2528
  fetchSqlQuery(newAst, undefined, false);
2491
2529
  }
2492
2530
  }
2493
- const columnNamesInAst = baseAst?.columns.map((col) => {
2494
- if (col.expr.type === 'column_ref') {
2495
- 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
+ }
2496
2540
  }
2497
2541
  else if (col.as) {
2498
- return col.as;
2542
+ if (typeof col.as === 'string') {
2543
+ return col.as;
2544
+ }
2545
+ else {
2546
+ return col.as.expr?.value;
2547
+ }
2499
2548
  }
2500
2549
  else if (col.expr && col.expr.type === 'aggr_func') {
2501
2550
  if (col.expr.args) {
@@ -2504,22 +2553,23 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2504
2553
  return col.expr.name;
2505
2554
  }
2506
2555
  return col.expr.value;
2507
- }) ?? [];
2556
+ })
2557
+ .filter(
2558
+ // remove duplicate entries
2559
+ (value, index, self) => value && self.indexOf(value) === index) ?? [];
2508
2560
  return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: columnNamesInAst, strategy: verticalListSortingStrategy, children: _jsxs("div", { style: {
2509
2561
  display: 'flex',
2510
2562
  flexDirection: 'column',
2511
2563
  gap: 8,
2512
2564
  }, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
2513
2565
  }
2514
- if (loading || initalChartLoad) {
2566
+ if (loading || initialChartLoad) {
2515
2567
  return (_jsxs("div", { style: {
2516
2568
  display: 'flex',
2517
2569
  flexDirection: 'row',
2518
2570
  height: '100%',
2519
2571
  ...containerStyle,
2520
2572
  }, className: className, ref: parentRef, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
2521
- if (loadingSchema)
2522
- return;
2523
2573
  if (!openPopover) {
2524
2574
  setOpenPopover('AddColumnModal');
2525
2575
  }
@@ -2540,12 +2590,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2540
2590
  }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
2541
2591
  setBaseAst(ast);
2542
2592
  fetchSqlQuery(ast);
2543
- }, 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: {
2544
2594
  display: 'flex',
2545
2595
  flexDirection: 'column',
2546
2596
  gap: 8,
2547
2597
  marginBottom: 12,
2548
- }, children: renderSentence(formData, formData, '', true) })), _jsxs("div", { style: {
2598
+ }, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
2549
2599
  display: 'flex',
2550
2600
  flexDirection: 'column',
2551
2601
  alignItems: 'flex-start',
@@ -2557,7 +2607,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2557
2607
  }
2558
2608
  if (!openPopover) {
2559
2609
  const value = orderedColumnNames[0];
2560
- const [_table, column] = value.split('.');
2610
+ const column = value.split('.')[1];
2561
2611
  const columnType = getColumnTypeByName(column);
2562
2612
  if (isNumericColumnType(columnType)) {
2563
2613
  const newSubtree = deepCopy(defaultNumericComparison);
@@ -2586,27 +2636,15 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2586
2636
  setActiveEditItem(null);
2587
2637
  }, 300);
2588
2638
  }
2589
- }, popoverTitle: 'Add filter', popoverChildren: _jsx(AddFilterPopover, { onSave: () => {
2590
- if (isNodeEmptyCollection(activeEditItem)) {
2591
- setIsPending(false);
2592
- setActivePath(null);
2593
- setOpenPopover(null);
2594
- setTimeout(() => {
2595
- clearCheckboxes();
2596
- setActiveEditItem(null);
2597
- }, 300);
2598
- }
2599
- else {
2600
- setIsPending(false);
2601
- handleInsertion(activeEditItem, 'AND', false);
2602
- setActivePath(null);
2603
- setOpenPopover(null);
2604
- setTimeout(() => {
2605
- clearCheckboxes();
2606
- setActiveEditItem(null);
2607
- }, 300);
2608
- }
2609
- }, 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 &&
2610
2648
  false && ( // temp removed the AddConditionPopover
2611
2649
  _jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
2612
2650
  if (!openPopover) {
@@ -2645,14 +2683,14 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2645
2683
  setActivePath(null);
2646
2684
  setOpenPopover(null);
2647
2685
  }
2648
- } }) })] }))] })] }), _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: () => {
2649
2687
  setPivot(null);
2650
2688
  setPivotData(null);
2651
2689
  const formattedRows = formatRows(rows, columns, false);
2652
2690
  setFormattedRows(formattedRows);
2653
2691
  },
2654
2692
  // TODOs
2655
- selectPivot: (pivot) => {
2693
+ selectPivot: () => {
2656
2694
  return;
2657
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) => {
2658
2696
  setPivotRowField(value);
@@ -2669,7 +2707,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2669
2707
  }, children: _jsx(SortSentence, { sortData: {
2670
2708
  type: pivot.sortDirection,
2671
2709
  expr: { type: 'column_ref', column: pivot.sortField },
2672
- }, 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: () => {
2673
2711
  setPivot({ ...pivot, sort: false });
2674
2712
  setBaseAst(deepCopy(baseAst));
2675
2713
  if (!pivot) {
@@ -2718,7 +2756,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2718
2756
  if (!pivot) {
2719
2757
  fetchSqlQuery(newAst);
2720
2758
  }
2721
- }, 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: () => {
2722
2760
  const newAst = { ...baseAst };
2723
2761
  newAst.orderby.splice(id, 1);
2724
2762
  setBaseAst(deepCopy(newAst));
@@ -2741,7 +2779,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2741
2779
  setActivePath(null);
2742
2780
  setOpenPopover(null);
2743
2781
  }
2744
- }, 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: {
2745
2783
  display: 'flex',
2746
2784
  flexDirection: 'column',
2747
2785
  gap: 8,
@@ -2796,7 +2834,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2796
2834
  ? askAIInputWidth
2797
2835
  : askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), _jsx(ButtonComponent, { onClick: () => { }, label: "Ask AI" }), ((baseAst && dataDisplayed) ||
2798
2836
  initialLoad ||
2799
- 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: {
2800
2838
  display: 'flex',
2801
2839
  flexDirection: 'row',
2802
2840
  gap: '12px',
@@ -2811,8 +2849,6 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2811
2849
  boxSizing: 'border-box',
2812
2850
  ...containerStyle,
2813
2851
  }, className: className, children: [_jsxs(SidebarComponent, { children: [_jsxs("div", { style: { width: '100%' }, children: [_jsx(SidebarHeadingComponent, { label: "Columns" }), _jsx(DraggableColumns, {}), _jsx(SecondaryButtonComponent, { onClick: () => {
2814
- if (loadingSchema)
2815
- return;
2816
2852
  if (!orderedColumnNames) {
2817
2853
  return;
2818
2854
  }
@@ -2836,12 +2872,12 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2836
2872
  }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
2837
2873
  setBaseAst(ast);
2838
2874
  fetchSqlQuery(ast);
2839
- }, 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: {
2840
2876
  display: 'flex',
2841
2877
  flexDirection: 'column',
2842
2878
  gap: 8,
2843
2879
  marginBottom: 12,
2844
- }, children: renderSentence(formData, formData, '', true) })), _jsxs("div", { style: {
2880
+ }, children: filterTree && renderFilters(filterTree) })), _jsxs("div", { style: {
2845
2881
  display: 'flex',
2846
2882
  flexDirection: 'column',
2847
2883
  alignItems: 'flex-start',
@@ -2853,7 +2889,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2853
2889
  }
2854
2890
  if (!openPopover) {
2855
2891
  const value = orderedColumnNames[0];
2856
- const [_table, column] = value.split('.');
2892
+ const column = value.split('.')[1];
2857
2893
  const columnType = getColumnTypeByName(column);
2858
2894
  if (isNumericColumnType(columnType)) {
2859
2895
  const newSubtree = deepCopy(defaultNumericComparison);
@@ -2883,27 +2919,13 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2883
2919
  setActiveEditItem(null);
2884
2920
  }, 300);
2885
2921
  }
2886
- }, popoverTitle: "Add filter", popoverChildren: _jsx(AddFilterPopover, { onSave: () => {
2887
- if (isNodeEmptyCollection(activeEditItem)) {
2888
- setOpenPopover(null);
2889
- clearCheckboxes();
2890
- setIsPending(false);
2891
- setTimeout(() => {
2892
- setActivePath(null);
2893
- setActiveEditItem(null);
2894
- }, 300);
2895
- }
2896
- else {
2897
- setOpenPopover(null);
2898
- setIsPending(false);
2899
- handleInsertion(activeEditItem, 'AND', false);
2900
- setActivePath(null);
2901
- setTimeout(() => {
2902
- clearCheckboxes();
2903
- setActiveEditItem(null);
2904
- }, 300);
2905
- }
2906
- }, 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 &&
2907
2929
  false && ( // temp removed the AddConditionPopover
2908
2930
  _jsxs(_Fragment, { children: [_jsx(SecondaryButtonComponent, { onClick: () => {
2909
2931
  if (!openPopover) {
@@ -2943,7 +2965,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
2943
2965
  setOpenPopover(null);
2944
2966
  clearCheckboxes();
2945
2967
  }
2946
- } }) })] }))] })] }), _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: () => {
2947
2969
  setPivot(null);
2948
2970
  setPivotData(null);
2949
2971
  const formattedRows = formatRows(rows, columns, false);
@@ -3002,7 +3024,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3002
3024
  `.${pivot.rowField}`,
3003
3025
  `.${pivot.valueField || 'count'}`,
3004
3026
  ]
3005
- : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
3027
+ : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: () => { }, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover, handleDelete: async () => {
3006
3028
  if (pivot) {
3007
3029
  const tempPivot = { ...pivot, sort: false };
3008
3030
  let dateBucket = undefined;
@@ -3057,7 +3079,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3057
3079
  flexDirection: 'column',
3058
3080
  gap: 8,
3059
3081
  marginBottom: 12,
3060
- }, 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: () => {
3061
3083
  if (pivot) {
3062
3084
  setPivot({ ...pivot, sort: false });
3063
3085
  return;
@@ -3167,7 +3189,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3167
3189
  setOpenPopover(null);
3168
3190
  setBaseAst(deepCopy(newAst));
3169
3191
  fetchSqlQuery(deepCopy(newAst));
3170
- } }) }) })] }), _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: {
3171
3193
  display: 'flex',
3172
3194
  flexDirection: 'column',
3173
3195
  gap: 8,
@@ -3240,7 +3262,7 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3240
3262
  ? 'Ask a follow-up question...'
3241
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 ||
3242
3264
  (loading && errorMessage.length === 0) ||
3243
- initalChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
3265
+ initialChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
3244
3266
  ? pivotData?.columns || emptyPivotColumns()
3245
3267
  : enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
3246
3268
  return {
@@ -3258,9 +3280,10 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3258
3280
  overflow: 'hidden',
3259
3281
  width: '100%',
3260
3282
  gap: 12,
3261
- }, 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: () => {
3262
3285
  setIsChartBuilderOpen(true);
3263
- }, 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
3264
3287
  ? {
3265
3288
  ...report,
3266
3289
  ...tempReport,
@@ -3274,5 +3297,5 @@ export default function ReportBuilder({ initialTableName = '', onSubmitEditRepor
3274
3297
  queryString: activeQuery,
3275
3298
  rows: rows,
3276
3299
  }
3277
- : 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 }))] }));
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 }))] }));
3278
3301
  }