@quillsql/react 2.12.40 → 2.12.42

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 (431) hide show
  1. package/dist/cjs/Chart.d.ts +1 -1
  2. package/dist/cjs/Chart.d.ts.map +1 -1
  3. package/dist/cjs/Chart.js +26 -12
  4. package/dist/cjs/ChartBuilder.d.ts +1 -1
  5. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  6. package/dist/cjs/ChartBuilder.js +31 -25
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +7 -3
  9. package/dist/cjs/Context.d.ts +20 -5
  10. package/dist/cjs/Context.d.ts.map +1 -1
  11. package/dist/cjs/Context.js +55 -93
  12. package/dist/cjs/Dashboard.d.ts.map +1 -1
  13. package/dist/cjs/Dashboard.js +29 -18
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +11 -0
  15. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  16. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +6 -6
  17. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  18. package/dist/cjs/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  19. package/dist/cjs/QuillProvider.d.ts +5 -6
  20. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  21. package/dist/cjs/QuillProvider.js +2 -2
  22. package/dist/cjs/ReportBuilder.d.ts +1 -1
  23. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  24. package/dist/cjs/ReportBuilder.js +132 -1612
  25. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  26. package/dist/cjs/SQLEditor.js +22 -9
  27. package/dist/cjs/Table.d.ts +1 -1
  28. package/dist/cjs/Table.d.ts.map +1 -1
  29. package/dist/cjs/Table.js +4 -2
  30. package/dist/cjs/components/Chart/BarChart.d.ts +3 -2
  31. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  32. package/dist/cjs/components/Chart/BarChart.js +32 -27
  33. package/dist/cjs/components/Chart/BarList.d.ts +1 -5
  34. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  35. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  36. package/dist/cjs/components/Chart/ChartError.js +6 -5
  37. package/dist/cjs/components/Chart/ChartTooltip.d.ts +4 -7
  38. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  39. package/dist/cjs/components/Chart/ChartTooltip.js +14 -48
  40. package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
  41. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  42. package/dist/cjs/components/Chart/LineChart.js +30 -26
  43. package/dist/cjs/components/Chart/PieChart.d.ts +3 -1
  44. package/dist/cjs/components/Chart/PieChart.d.ts.map +1 -1
  45. package/dist/cjs/components/Chart/PieChart.js +0 -2
  46. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  47. package/dist/cjs/components/Dashboard/ChartComponent.js +7 -6
  48. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +4 -2
  49. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  50. package/dist/cjs/components/Dashboard/DashboardFilter.js +4 -4
  51. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts +2 -1
  52. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  53. package/dist/cjs/components/Dashboard/DashboardTemplate.js +3 -4
  54. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  55. package/dist/cjs/components/Dashboard/DataLoader.js +12 -7
  56. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  57. package/dist/cjs/components/Dashboard/MetricComponent.js +8 -7
  58. package/dist/cjs/components/Dashboard/TableComponent.js +6 -6
  59. package/dist/cjs/components/Dashboard/util.d.ts +2 -1
  60. package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
  61. package/dist/cjs/components/QuillCard.d.ts.map +1 -1
  62. package/dist/cjs/components/QuillCard.js +6 -5
  63. package/dist/cjs/components/QuillMultiSelect.d.ts.map +1 -1
  64. package/dist/cjs/components/QuillMultiSelect.js +11 -11
  65. package/dist/cjs/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  66. package/dist/cjs/components/QuillMultiSelectWithCombo.js +11 -11
  67. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  68. package/dist/cjs/components/QuillSelect.js +12 -12
  69. package/dist/cjs/components/QuillSelectWithCombo.d.ts.map +1 -1
  70. package/dist/cjs/components/QuillSelectWithCombo.js +12 -12
  71. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts +4 -1
  72. package/dist/cjs/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  73. package/dist/cjs/components/ReportBuilder/FilterModal.js +33 -33
  74. package/dist/cjs/components/ReportBuilder/convert.d.ts +7 -33
  75. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  76. package/dist/cjs/components/ReportBuilder/convert.js +3 -7
  77. package/dist/cjs/components/ReportBuilder/ui.d.ts +4 -1
  78. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  79. package/dist/cjs/components/ReportBuilder/ui.js +1 -2
  80. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  81. package/dist/cjs/components/UiComponents.js +9 -10
  82. package/dist/cjs/hooks/index.d.ts +0 -1
  83. package/dist/cjs/hooks/index.d.ts.map +1 -1
  84. package/dist/cjs/hooks/index.js +1 -3
  85. package/dist/cjs/hooks/useAskQuill.d.ts +27 -0
  86. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -0
  87. package/dist/cjs/hooks/useAskQuill.js +185 -0
  88. package/dist/cjs/hooks/useAstToFilterTree.d.ts +2 -1
  89. package/dist/cjs/hooks/useAstToFilterTree.d.ts.map +1 -1
  90. package/dist/cjs/hooks/useAstToFilterTree.js +1 -1
  91. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  92. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  93. package/dist/cjs/hooks/useDashboard.js +10 -6
  94. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  95. package/dist/cjs/hooks/useExport.js +8 -3
  96. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  97. package/dist/cjs/hooks/useQuill.js +7 -1
  98. package/dist/cjs/index.d.ts +2 -1
  99. package/dist/cjs/index.d.ts.map +1 -1
  100. package/dist/cjs/index.js +3 -1
  101. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +3 -3
  102. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  103. package/dist/cjs/internals/ReportBuilder/PivotForm.js +4 -2
  104. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +3 -16
  105. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  106. package/dist/cjs/internals/ReportBuilder/PivotModal.js +36 -24
  107. package/dist/cjs/models/Client.d.ts +11 -0
  108. package/dist/cjs/models/Client.d.ts.map +1 -0
  109. package/dist/cjs/models/Columns.d.ts +1 -0
  110. package/dist/cjs/models/Columns.d.ts.map +1 -1
  111. package/dist/cjs/models/Dashboard.d.ts +14 -0
  112. package/dist/cjs/models/Dashboard.d.ts.map +1 -0
  113. package/dist/cjs/models/Filter.d.ts +87 -19
  114. package/dist/cjs/models/Filter.d.ts.map +1 -1
  115. package/dist/cjs/models/Filter.js +15 -4
  116. package/dist/{esm/components/ReportBuilder/pivot.d.ts → cjs/models/Pivot.d.ts} +13 -4
  117. package/dist/cjs/models/Pivot.d.ts.map +1 -0
  118. package/dist/cjs/models/Pivot.js +2 -0
  119. package/dist/cjs/models/Report.d.ts +4 -2
  120. package/dist/cjs/models/Report.d.ts.map +1 -1
  121. package/dist/cjs/models/Tables.d.ts +29 -2
  122. package/dist/cjs/models/Tables.d.ts.map +1 -1
  123. package/dist/cjs/utils/astFilterProcessing.js +27 -27
  124. package/dist/cjs/utils/astProcessing.d.ts +46 -3
  125. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  126. package/dist/cjs/utils/astProcessing.js +210 -7
  127. package/dist/cjs/utils/axisFormatter.d.ts +3 -4
  128. package/dist/cjs/utils/axisFormatter.d.ts.map +1 -1
  129. package/dist/cjs/utils/axisFormatter.js +42 -34
  130. package/dist/cjs/utils/client.d.ts +4 -0
  131. package/dist/cjs/utils/client.d.ts.map +1 -0
  132. package/dist/cjs/utils/client.js +40 -0
  133. package/dist/cjs/utils/constants.d.ts +1 -0
  134. package/dist/cjs/utils/constants.d.ts.map +1 -1
  135. package/dist/cjs/utils/constants.js +2 -1
  136. package/dist/cjs/utils/csv.d.ts +2 -1
  137. package/dist/cjs/utils/csv.d.ts.map +1 -1
  138. package/dist/cjs/utils/dashboard.d.ts +3 -2
  139. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  140. package/dist/cjs/utils/dashboard.js +11 -2
  141. package/dist/cjs/utils/dataFetcher.d.ts +7 -2
  142. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  143. package/dist/cjs/utils/dataFetcher.js +24 -4
  144. package/dist/cjs/utils/dataProcessing.d.ts +6 -5
  145. package/dist/cjs/utils/dataProcessing.d.ts.map +1 -1
  146. package/dist/cjs/utils/dataProcessing.js +15 -23
  147. package/dist/cjs/utils/dates.d.ts +1 -1
  148. package/dist/cjs/utils/filterProcessing.d.ts +2 -2
  149. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  150. package/dist/cjs/utils/filterProcessing.js +6 -6
  151. package/dist/cjs/utils/monacoConfig.d.ts +2 -1
  152. package/dist/cjs/utils/monacoConfig.d.ts.map +1 -1
  153. package/dist/cjs/utils/monacoConfig.js +2 -2
  154. package/dist/cjs/utils/pivotConstructor.d.ts +3 -2
  155. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  156. package/dist/cjs/utils/pivotConstructor.js +10 -6
  157. package/dist/cjs/utils/pivotProcessing.d.ts +4 -4
  158. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  159. package/dist/cjs/utils/pivotProcessing.js +21 -2
  160. package/dist/cjs/utils/queryConstructor.d.ts +1 -1
  161. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  162. package/dist/cjs/utils/queryConstructor.js +3 -3
  163. package/dist/cjs/utils/report.d.ts +27 -1
  164. package/dist/cjs/utils/report.d.ts.map +1 -1
  165. package/dist/cjs/utils/report.js +143 -4
  166. package/dist/cjs/utils/schema.d.ts +6 -4
  167. package/dist/cjs/utils/schema.d.ts.map +1 -1
  168. package/dist/cjs/utils/schema.js +27 -4
  169. package/dist/cjs/utils/tableProcessing.d.ts +24 -6
  170. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  171. package/dist/cjs/utils/tableProcessing.js +94 -5
  172. package/dist/cjs/utils/valueFormatter.d.ts +0 -2
  173. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  174. package/dist/cjs/utils/valueFormatter.js +83 -67
  175. package/dist/esm/Chart.d.ts +1 -1
  176. package/dist/esm/Chart.d.ts.map +1 -1
  177. package/dist/esm/Chart.js +27 -13
  178. package/dist/esm/ChartBuilder.d.ts +1 -1
  179. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  180. package/dist/esm/ChartBuilder.js +33 -27
  181. package/dist/esm/ChartEditor.d.ts.map +1 -1
  182. package/dist/esm/ChartEditor.js +7 -3
  183. package/dist/esm/Context.d.ts +20 -5
  184. package/dist/esm/Context.d.ts.map +1 -1
  185. package/dist/esm/Context.js +54 -92
  186. package/dist/esm/Dashboard.d.ts.map +1 -1
  187. package/dist/esm/Dashboard.js +29 -18
  188. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +11 -0
  189. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  190. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +6 -6
  191. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts +1 -1
  192. package/dist/esm/DateRangePicker/dateRangePickerUtils.d.ts.map +1 -1
  193. package/dist/esm/QuillProvider.d.ts +5 -6
  194. package/dist/esm/QuillProvider.d.ts.map +1 -1
  195. package/dist/esm/QuillProvider.js +2 -2
  196. package/dist/esm/ReportBuilder.d.ts +1 -1
  197. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  198. package/dist/esm/ReportBuilder.js +141 -1621
  199. package/dist/esm/SQLEditor.d.ts.map +1 -1
  200. package/dist/esm/SQLEditor.js +23 -10
  201. package/dist/esm/Table.d.ts +1 -1
  202. package/dist/esm/Table.d.ts.map +1 -1
  203. package/dist/esm/Table.js +5 -3
  204. package/dist/esm/components/Chart/BarChart.d.ts +3 -2
  205. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  206. package/dist/esm/components/Chart/BarChart.js +32 -27
  207. package/dist/esm/components/Chart/BarList.d.ts +1 -5
  208. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  209. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  210. package/dist/esm/components/Chart/ChartError.js +6 -5
  211. package/dist/esm/components/Chart/ChartTooltip.d.ts +4 -7
  212. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  213. package/dist/esm/components/Chart/ChartTooltip.js +15 -49
  214. package/dist/esm/components/Chart/LineChart.d.ts +1 -1
  215. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  216. package/dist/esm/components/Chart/LineChart.js +30 -26
  217. package/dist/esm/components/Chart/PieChart.d.ts +3 -1
  218. package/dist/esm/components/Chart/PieChart.d.ts.map +1 -1
  219. package/dist/esm/components/Chart/PieChart.js +0 -2
  220. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  221. package/dist/esm/components/Dashboard/ChartComponent.js +7 -6
  222. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +4 -2
  223. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  224. package/dist/esm/components/Dashboard/DashboardFilter.js +4 -4
  225. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts +2 -1
  226. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  227. package/dist/esm/components/Dashboard/DashboardTemplate.js +4 -5
  228. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  229. package/dist/esm/components/Dashboard/DataLoader.js +13 -8
  230. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  231. package/dist/esm/components/Dashboard/MetricComponent.js +8 -7
  232. package/dist/esm/components/Dashboard/TableComponent.js +7 -7
  233. package/dist/esm/components/Dashboard/util.d.ts +2 -1
  234. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  235. package/dist/esm/components/QuillCard.d.ts.map +1 -1
  236. package/dist/esm/components/QuillCard.js +6 -5
  237. package/dist/esm/components/QuillMultiSelect.d.ts.map +1 -1
  238. package/dist/esm/components/QuillMultiSelect.js +11 -11
  239. package/dist/esm/components/QuillMultiSelectWithCombo.d.ts.map +1 -1
  240. package/dist/esm/components/QuillMultiSelectWithCombo.js +11 -11
  241. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  242. package/dist/esm/components/QuillSelect.js +12 -12
  243. package/dist/esm/components/QuillSelectWithCombo.d.ts.map +1 -1
  244. package/dist/esm/components/QuillSelectWithCombo.js +12 -12
  245. package/dist/esm/components/ReportBuilder/FilterModal.d.ts +4 -1
  246. package/dist/esm/components/ReportBuilder/FilterModal.d.ts.map +1 -1
  247. package/dist/esm/components/ReportBuilder/FilterModal.js +33 -33
  248. package/dist/esm/components/ReportBuilder/convert.d.ts +7 -33
  249. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  250. package/dist/esm/components/ReportBuilder/convert.js +3 -7
  251. package/dist/esm/components/ReportBuilder/ui.d.ts +4 -1
  252. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  253. package/dist/esm/components/ReportBuilder/ui.js +1 -2
  254. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  255. package/dist/esm/components/UiComponents.js +9 -10
  256. package/dist/esm/hooks/index.d.ts +0 -1
  257. package/dist/esm/hooks/index.d.ts.map +1 -1
  258. package/dist/esm/hooks/index.js +0 -1
  259. package/dist/esm/hooks/useAskQuill.d.ts +27 -0
  260. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -0
  261. package/dist/esm/hooks/useAskQuill.js +181 -0
  262. package/dist/esm/hooks/useAstToFilterTree.d.ts +2 -1
  263. package/dist/esm/hooks/useAstToFilterTree.d.ts.map +1 -1
  264. package/dist/esm/hooks/useAstToFilterTree.js +1 -1
  265. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  266. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  267. package/dist/esm/hooks/useDashboard.js +11 -7
  268. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  269. package/dist/esm/hooks/useExport.js +9 -4
  270. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  271. package/dist/esm/hooks/useQuill.js +8 -2
  272. package/dist/esm/index.d.ts +2 -1
  273. package/dist/esm/index.d.ts.map +1 -1
  274. package/dist/esm/index.js +1 -0
  275. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +3 -3
  276. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  277. package/dist/esm/internals/ReportBuilder/PivotForm.js +4 -2
  278. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +3 -16
  279. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  280. package/dist/esm/internals/ReportBuilder/PivotModal.js +36 -24
  281. package/dist/esm/models/Client.d.ts +11 -0
  282. package/dist/esm/models/Client.d.ts.map +1 -0
  283. package/dist/esm/models/Columns.d.ts +1 -0
  284. package/dist/esm/models/Columns.d.ts.map +1 -1
  285. package/dist/esm/models/Dashboard.d.ts +14 -0
  286. package/dist/esm/models/Dashboard.d.ts.map +1 -0
  287. package/dist/esm/models/Filter.d.ts +87 -19
  288. package/dist/esm/models/Filter.d.ts.map +1 -1
  289. package/dist/esm/models/Filter.js +13 -2
  290. package/dist/{cjs/components/ReportBuilder/pivot.d.ts → esm/models/Pivot.d.ts} +13 -4
  291. package/dist/esm/models/Pivot.d.ts.map +1 -0
  292. package/dist/esm/models/Pivot.js +1 -0
  293. package/dist/esm/models/Report.d.ts +4 -2
  294. package/dist/esm/models/Report.d.ts.map +1 -1
  295. package/dist/esm/models/Tables.d.ts +29 -2
  296. package/dist/esm/models/Tables.d.ts.map +1 -1
  297. package/dist/esm/utils/astFilterProcessing.js +27 -27
  298. package/dist/esm/utils/astProcessing.d.ts +46 -3
  299. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  300. package/dist/esm/utils/astProcessing.js +204 -6
  301. package/dist/esm/utils/axisFormatter.d.ts +3 -4
  302. package/dist/esm/utils/axisFormatter.d.ts.map +1 -1
  303. package/dist/esm/utils/axisFormatter.js +42 -34
  304. package/dist/esm/utils/client.d.ts +4 -0
  305. package/dist/esm/utils/client.d.ts.map +1 -0
  306. package/dist/esm/utils/client.js +36 -0
  307. package/dist/esm/utils/constants.d.ts +1 -0
  308. package/dist/esm/utils/constants.d.ts.map +1 -1
  309. package/dist/esm/utils/constants.js +1 -0
  310. package/dist/esm/utils/csv.d.ts +2 -1
  311. package/dist/esm/utils/csv.d.ts.map +1 -1
  312. package/dist/esm/utils/dashboard.d.ts +3 -2
  313. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  314. package/dist/esm/utils/dashboard.js +11 -2
  315. package/dist/esm/utils/dataFetcher.d.ts +7 -2
  316. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  317. package/dist/esm/utils/dataFetcher.js +22 -3
  318. package/dist/esm/utils/dataProcessing.d.ts +6 -5
  319. package/dist/esm/utils/dataProcessing.d.ts.map +1 -1
  320. package/dist/esm/utils/dataProcessing.js +15 -23
  321. package/dist/esm/utils/dates.d.ts +1 -1
  322. package/dist/esm/utils/filterProcessing.d.ts +2 -2
  323. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  324. package/dist/esm/utils/filterProcessing.js +7 -7
  325. package/dist/esm/utils/monacoConfig.d.ts +2 -1
  326. package/dist/esm/utils/monacoConfig.d.ts.map +1 -1
  327. package/dist/esm/utils/monacoConfig.js +2 -2
  328. package/dist/esm/utils/pivotConstructor.d.ts +3 -2
  329. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  330. package/dist/esm/utils/pivotConstructor.js +10 -6
  331. package/dist/esm/utils/pivotProcessing.d.ts +4 -4
  332. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  333. package/dist/esm/utils/pivotProcessing.js +19 -1
  334. package/dist/esm/utils/queryConstructor.d.ts +1 -1
  335. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  336. package/dist/esm/utils/queryConstructor.js +3 -3
  337. package/dist/esm/utils/report.d.ts +27 -1
  338. package/dist/esm/utils/report.d.ts.map +1 -1
  339. package/dist/esm/utils/report.js +143 -5
  340. package/dist/esm/utils/schema.d.ts +6 -4
  341. package/dist/esm/utils/schema.d.ts.map +1 -1
  342. package/dist/esm/utils/schema.js +27 -4
  343. package/dist/esm/utils/tableProcessing.d.ts +24 -6
  344. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  345. package/dist/esm/utils/tableProcessing.js +90 -4
  346. package/dist/esm/utils/valueFormatter.d.ts +0 -2
  347. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  348. package/dist/esm/utils/valueFormatter.js +83 -67
  349. package/package.json +1 -1
  350. package/dist/cjs/DateRangePicker/Calendar.d.ts +0 -17
  351. package/dist/cjs/DateRangePicker/Calendar.d.ts.map +0 -1
  352. package/dist/cjs/DateRangePicker/Calendar.js +0 -168
  353. package/dist/cjs/DateRangePicker/DateRangePicker.d.ts +0 -39
  354. package/dist/cjs/DateRangePicker/DateRangePicker.d.ts.map +0 -1
  355. package/dist/cjs/DateRangePicker/DateRangePicker.js +0 -123
  356. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts +0 -22
  357. package/dist/cjs/DateRangePicker/DateRangePickerButton.d.ts.map +0 -1
  358. package/dist/cjs/DateRangePicker/DateRangePickerButton.js +0 -136
  359. package/dist/cjs/DateRangePicker/index.d.ts +0 -3
  360. package/dist/cjs/DateRangePicker/index.d.ts.map +0 -1
  361. package/dist/cjs/DateRangePicker/index.js +0 -9
  362. package/dist/cjs/TableChart.d.ts +0 -15
  363. package/dist/cjs/TableChart.d.ts.map +0 -1
  364. package/dist/cjs/TableChart.js +0 -122
  365. package/dist/cjs/components/Dropdown/Dropdown.d.ts +0 -14
  366. package/dist/cjs/components/Dropdown/Dropdown.d.ts.map +0 -1
  367. package/dist/cjs/components/Dropdown/Dropdown.js +0 -97
  368. package/dist/cjs/components/Dropdown/DropdownItem.d.ts +0 -11
  369. package/dist/cjs/components/Dropdown/DropdownItem.d.ts.map +0 -1
  370. package/dist/cjs/components/Dropdown/DropdownItem.js +0 -62
  371. package/dist/cjs/components/Dropdown/index.d.ts +0 -3
  372. package/dist/cjs/components/Dropdown/index.d.ts.map +0 -1
  373. package/dist/cjs/components/Dropdown/index.js +0 -10
  374. package/dist/cjs/components/Modal/Modal.d.ts +0 -15
  375. package/dist/cjs/components/Modal/Modal.d.ts.map +0 -1
  376. package/dist/cjs/components/Modal/Modal.js +0 -89
  377. package/dist/cjs/components/Modal/index.d.ts +0 -2
  378. package/dist/cjs/components/Modal/index.d.ts.map +0 -1
  379. package/dist/cjs/components/Modal/index.js +0 -8
  380. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +0 -1
  381. package/dist/cjs/hooks/useTheme.d.ts +0 -7
  382. package/dist/cjs/hooks/useTheme.d.ts.map +0 -1
  383. package/dist/cjs/hooks/useTheme.js +0 -12
  384. package/dist/cjs/models/Pivots.d.ts +0 -2
  385. package/dist/cjs/models/Pivots.d.ts.map +0 -1
  386. package/dist/cjs/utils/aggregate.d.ts +0 -4
  387. package/dist/cjs/utils/aggregate.d.ts.map +0 -1
  388. package/dist/cjs/utils/aggregate.js +0 -428
  389. package/dist/esm/DateRangePicker/Calendar.d.ts +0 -17
  390. package/dist/esm/DateRangePicker/Calendar.d.ts.map +0 -1
  391. package/dist/esm/DateRangePicker/Calendar.js +0 -164
  392. package/dist/esm/DateRangePicker/DateRangePicker.d.ts +0 -39
  393. package/dist/esm/DateRangePicker/DateRangePicker.d.ts.map +0 -1
  394. package/dist/esm/DateRangePicker/DateRangePicker.js +0 -95
  395. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts +0 -22
  396. package/dist/esm/DateRangePicker/DateRangePickerButton.d.ts.map +0 -1
  397. package/dist/esm/DateRangePicker/DateRangePickerButton.js +0 -134
  398. package/dist/esm/DateRangePicker/index.d.ts +0 -3
  399. package/dist/esm/DateRangePicker/index.d.ts.map +0 -1
  400. package/dist/esm/DateRangePicker/index.js +0 -2
  401. package/dist/esm/TableChart.d.ts +0 -15
  402. package/dist/esm/TableChart.d.ts.map +0 -1
  403. package/dist/esm/TableChart.js +0 -95
  404. package/dist/esm/components/Dropdown/Dropdown.d.ts +0 -14
  405. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +0 -1
  406. package/dist/esm/components/Dropdown/Dropdown.js +0 -69
  407. package/dist/esm/components/Dropdown/DropdownItem.d.ts +0 -11
  408. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +0 -1
  409. package/dist/esm/components/Dropdown/DropdownItem.js +0 -37
  410. package/dist/esm/components/Dropdown/index.d.ts +0 -3
  411. package/dist/esm/components/Dropdown/index.d.ts.map +0 -1
  412. package/dist/esm/components/Dropdown/index.js +0 -2
  413. package/dist/esm/components/Modal/Modal.d.ts +0 -15
  414. package/dist/esm/components/Modal/Modal.d.ts.map +0 -1
  415. package/dist/esm/components/Modal/Modal.js +0 -64
  416. package/dist/esm/components/Modal/index.d.ts +0 -2
  417. package/dist/esm/components/Modal/index.d.ts.map +0 -1
  418. package/dist/esm/components/Modal/index.js +0 -1
  419. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +0 -1
  420. package/dist/esm/hooks/useTheme.d.ts +0 -7
  421. package/dist/esm/hooks/useTheme.d.ts.map +0 -1
  422. package/dist/esm/hooks/useTheme.js +0 -10
  423. package/dist/esm/models/Pivots.d.ts +0 -2
  424. package/dist/esm/models/Pivots.d.ts.map +0 -1
  425. package/dist/esm/utils/aggregate.d.ts +0 -4
  426. package/dist/esm/utils/aggregate.d.ts.map +0 -1
  427. package/dist/esm/utils/aggregate.js +0 -422
  428. /package/dist/cjs/{components/ReportBuilder/pivot.js → models/Client.js} +0 -0
  429. /package/dist/cjs/models/{Pivots.js → Dashboard.js} +0 -0
  430. /package/dist/esm/{components/ReportBuilder/pivot.js → models/Client.js} +0 -0
  431. /package/dist/esm/models/{Pivots.js → Dashboard.js} +0 -0
@@ -15,10 +15,7 @@ const ast_1 = require("./components/ReportBuilder/ast");
15
15
  const ChartBuilder_1 = require("./ChartBuilder");
16
16
  const UiComponents_2 = require("./components/UiComponents");
17
17
  const ui_1 = require("./components/ReportBuilder/ui");
18
- const postgres_1 = require("./components/ReportBuilder/postgres");
19
- const convert_1 = require("./components/ReportBuilder/convert");
20
18
  const util_1 = require("./components/ReportBuilder/util");
21
- const operators_1 = require("./components/ReportBuilder/operators");
22
19
  const crypto_1 = require("./utils/crypto");
23
20
  const constants_1 = require("./components/ReportBuilder/constants");
24
21
  const AddColumnModal_1 = __importDefault(require("./components/ReportBuilder/AddColumnModal"));
@@ -29,13 +26,9 @@ const AddLimitPopover_1 = require("./components/ReportBuilder/AddLimitPopover");
29
26
  const width_1 = require("./utils/width");
30
27
  const QuillSelect_1 = require("./components/QuillSelect");
31
28
  const QuillCard_1 = require("./components/QuillCard");
32
- const dataFetcher_1 = require("./utils/dataFetcher");
33
29
  const valueFormatter_1 = require("./utils/valueFormatter");
34
30
  const pivotProcessing_1 = require("./utils/pivotProcessing");
35
31
  const tableProcessing_1 = require("./utils/tableProcessing");
36
- const useQuill_1 = require("./hooks/useQuill");
37
- const dataFetcher_2 = require("./utils/dataFetcher");
38
- const columnProcessing_1 = require("./utils/columnProcessing");
39
32
  const astProcessing_1 = require("./utils/astProcessing");
40
33
  const PivotForm_1 = __importDefault(require("./internals/ReportBuilder/PivotForm"));
41
34
  const schema_1 = require("./utils/schema");
@@ -47,7 +40,6 @@ const filterProcessing_1 = require("./utils/filterProcessing");
47
40
  const QuillMultiSelectWithCombo_1 = require("./components/QuillMultiSelectWithCombo");
48
41
  const paginationProcessing_1 = require("./utils/paginationProcessing");
49
42
  const report_1 = require("./utils/report");
50
- const dataProcessing_1 = require("./utils/dataProcessing");
51
43
  exports.QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SERVER_HOST) ||
52
44
  'https://quill-344421.uc.r.appspot.com';
53
45
  /**
@@ -81,8 +73,12 @@ exports.QUILL_SERVER = (typeof process !== 'undefined' && process?.env?.QUILL_SE
81
73
  * ### Report Builder API
82
74
  * @see https://docs.quillsql.com/components/report-builder
83
75
  */
84
- function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, ModalComponent = UiComponents_1.MemoizedModal, TextInputComponent = UiComponents_2.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, MultiSelectComponent = QuillMultiSelectWithCombo_1.QuillMultiSelectComponentWithCombo, TableComponent = UiComponents_1.QuillTableSQLEditorComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.MemoizedCheckbox, SidebarComponent = ui_1.QuillSidebar, ContainerComponent = ui_1.CustomContainer, SelectColumnComponent = ui_1.QuillSelectColumn, DraggableColumnComponent = ui_1.QuillDraggableColumn, SidebarHeadingComponent = ui_1.QuillSidebarHeading, FilterPopoverComponent = ui_1.QuillFilterPopover, SortPopoverComponent = ui_1.QuillSortPopover, LimitPopoverComponent = ui_1.QuillLimitPopover, CardComponent = QuillCard_1.QuillCard, LabelComponent = UiComponents_1.MemoizedLabel, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, TextComponent = UiComponents_1.MemoizedText, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, ColumnSearchEmptyState = UiComponents_1.QuillColumnSearchEmptyState, ChartBuilderFormContainer = UiComponents_1.QuillChartBuilderFormContainer, ChartBuilderModalComponent = UiComponents_1.MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
85
- const { data: report } = (0, useQuill_1.useQuill)(reportId || '');
76
+ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, ModalComponent = UiComponents_1.MemoizedModal, TextInputComponent = UiComponents_2.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, MultiSelectComponent = QuillMultiSelectWithCombo_1.QuillMultiSelectComponentWithCombo, TableComponent = UiComponents_1.QuillTableSQLEditorComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs,
77
+ // CheckboxComponent = MemoizedCheckbox,
78
+ SidebarComponent = ui_1.QuillSidebar, ContainerComponent = ui_1.CustomContainer, SelectColumnComponent = ui_1.QuillSelectColumn, DraggableColumnComponent = ui_1.QuillDraggableColumn, SidebarHeadingComponent = ui_1.QuillSidebarHeading, FilterPopoverComponent = ui_1.QuillFilterPopover, SortPopoverComponent = ui_1.QuillSortPopover, LimitPopoverComponent = ui_1.QuillLimitPopover, CardComponent = QuillCard_1.QuillCard, LabelComponent = UiComponents_1.MemoizedLabel, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, TextComponent = UiComponents_1.MemoizedText, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, LoadingComponent = UiComponents_1.QuillLoadingComponent, ColumnSearchEmptyState = UiComponents_1.QuillColumnSearchEmptyState, ChartBuilderFormContainer = UiComponents_1.QuillChartBuilderFormContainer, ChartBuilderModalComponent = UiComponents_1.MemoizedModal, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
79
+ const [dashboard] = (0, react_1.useContext)(Context_1.DashboardContext);
80
+ const [schema, setSchema] = (0, react_1.useContext)(Context_1.SchemaContext);
81
+ const [reportInfo, setReportInfo] = (0, react_1.useState)(null);
86
82
  const [aiPrompt, setAiPrompt] = (0, react_1.useState)('');
87
83
  const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
88
84
  const [baseAst, setBaseAst] = (0, react_1.useState)(null);
@@ -90,22 +86,20 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
90
86
  const [orderedColumnNames, setOrderedColumnNames] = (0, react_1.useState)([]);
91
87
  const [selectedColumns, setSelectedColumns] = (0, react_1.useState)([]);
92
88
  const [selectedOrderedColumns, setSelectedOrderedColumns] = (0, react_1.useState)([]);
93
- const [schema, setSchema] = (0, react_1.useContext)(Context_1.SchemaContext);
94
89
  const [activeQuery, setActiveQuery] = (0, react_1.useState)('');
95
- const [activeEditItem, setActiveEditItem] = (0, react_1.useState)(null);
90
+ const [, setActiveEditItem] = (0, react_1.useState)(null);
96
91
  const [activePath, setActivePath] = (0, react_1.useState)(null);
97
92
  const [openPopover, setOpenPopover] = (0, react_1.useState)(null);
98
93
  const [loading, setLoading] = (0, react_1.useState)(!!initialTableName);
99
94
  const [loadingSchema, setLoadingSchema] = (0, react_1.useState)(false);
100
95
  const [isChartBuilderOpen, setIsChartBuilderOpen] = (0, react_1.useState)(false);
101
- const [isPending, setIsPending] = (0, react_1.useState)(false);
96
+ const [, setIsPending] = (0, react_1.useState)(false);
102
97
  const [isCopying, setIsCopying] = (0, react_1.useState)(false);
103
98
  const [dataDisplayed, setDataDisplayed] = (0, react_1.useState)(false);
104
99
  const [rows, setRows] = (0, react_1.useState)([]);
105
100
  const [formattedRows, setFormattedRows] = (0, react_1.useState)([]);
106
101
  const [columns, setColumns] = (0, react_1.useState)([]);
107
- const [tempReport, setTempReport] = (0, react_1.useState)(report_1.EMPTY_REPORT);
108
- const [topLevelBinaryOperator, setTopLevelBinaryOperator] = (0, react_1.useState)('AND');
102
+ const [tempReport, setTempReport] = (0, react_1.useState)(report_1.EMPTY_INTERNAL_REPORT);
109
103
  const [uniqueValues, setUniqueValues] = (0, react_1.useState)({});
110
104
  const [pivot, setPivot] = (0, react_1.useState)(null);
111
105
  const [pivotData, setPivotData] = (0, react_1.useState)(null);
@@ -152,20 +146,18 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
152
146
  (0, width_1.updateFirstChildWidth)(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
153
147
  }, [dataDisplayed]);
154
148
  // Whenever unique values changes, update the fieldValuesMap, used in FilterModals
155
- (0, react_1.useEffect)(() => {
156
- const tables = (0, ast_1.getTableNames)(baseAst);
157
- const table = tables.length === 1 ? tables[0] : initialTableName;
149
+ const updateFieldValuesMap = (curUnqiueValues, tableName) => {
158
150
  const newFieldValues = {};
159
- if (uniqueValues[table]) {
160
- for (const field of Object.keys(uniqueValues[table])) {
151
+ if (curUnqiueValues[tableName]) {
152
+ for (const field of Object.keys(curUnqiueValues[tableName])) {
161
153
  newFieldValues[field] = [];
162
- for (const value of Object.keys(uniqueValues[table][field])) {
154
+ for (const value of Object.keys(curUnqiueValues[tableName][field])) {
163
155
  newFieldValues[field]?.push(value);
164
156
  }
165
157
  }
166
158
  }
167
159
  setFieldValuesMap(newFieldValues);
168
- }, [uniqueValues]);
160
+ };
169
161
  (0, react_1.useEffect)(() => {
170
162
  // Since the TextInput component takes a required numeric width parameter,
171
163
  // we dynamically calculate the width of this component here.
@@ -189,7 +181,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
189
181
  const column = columns.find((c) => c.field === changeField);
190
182
  if (column?.jsType === 'date') {
191
183
  newPivot.rowFieldType = 'date';
192
- newPivot.sort = 'true';
184
+ newPivot.sort = true;
193
185
  newPivot.sortField = changeField;
194
186
  newPivot.sortFieldType = column.format;
195
187
  newPivot.sortDirection = 'ASC';
@@ -200,7 +192,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
200
192
  }
201
193
  }
202
194
  let dateBucket = undefined;
203
- const tempDateRange = dateRanges && dateRanges[newPivot.rowField];
195
+ const tempDateRange = dateRanges && dateRanges[newPivot.rowField || ''];
204
196
  if (tempDateRange) {
205
197
  dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
206
198
  }
@@ -253,7 +245,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
253
245
  setDataDisplayed(false);
254
246
  setRows([]);
255
247
  setColumns([]);
256
- setTopLevelBinaryOperator('AND');
257
248
  setErrorMessage('');
258
249
  setFormattedRows([]);
259
250
  // setUniqueValues({});
@@ -270,12 +261,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
270
261
  clearAllState();
271
262
  }
272
263
  }, [client]);
273
- (0, react_1.useEffect)(() => {
274
- if (activePath !== null) {
275
- // update the modal with the new subtree
276
- setActiveEditItem(getByKey(formData, activePath));
277
- }
278
- }, [formData]);
279
264
  const formatRows = (rows, columns, pivot, aggregationType) => {
280
265
  const copiedRows = (0, util_1.deepCopy)(rows);
281
266
  if (pivot) {
@@ -320,19 +305,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
320
305
  return formattedRows;
321
306
  }
322
307
  };
323
- const getByKey = (formData, path) => {
324
- if (!path)
325
- return (0, util_1.deepCopy)(formData);
326
- // Function to immutably update or delete nodes based on their path
327
- const paths = path.split('.');
328
- let current = (0, util_1.deepCopy)(formData);
329
- for (let i = 0; i < paths.length; i++) {
330
- if (current[paths[i]]) {
331
- current = current[paths[i]];
332
- }
333
- }
334
- return current;
335
- };
336
308
  const copySQLToClipboard = () => {
337
309
  let query = activeQuery;
338
310
  if (pivot) {
@@ -355,6 +327,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
355
327
  }
356
328
  }
357
329
  setUniqueValues(newValues);
330
+ updateFieldValuesMap(newValues, currentTable);
358
331
  };
359
332
  const fetchSqlQuery = async (ast, formData, fetchData = true) => {
360
333
  if (fetchData) {
@@ -377,7 +350,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
377
350
  const data = await response.json();
378
351
  setActiveQuery(data.query);
379
352
  if (fetchData) {
380
- fetchUponChange(ast, formData);
353
+ fetchReportFromASTHelper(ast, formData);
381
354
  }
382
355
  return data.query;
383
356
  }
@@ -387,11 +360,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
387
360
  }
388
361
  };
389
362
  const getUniqueStringValues = async (columns, tableName) => {
390
- const convertedStringColumns = columns
391
- .filter((column) => {
363
+ const convertedStringColumns = columns.filter((column) => {
392
364
  return (0, ast_1.isTextColumnType)(column.fieldType);
393
- })
394
- .map((column) => (0, columnProcessing_1.convertColumnInfoToColumnInternal)(column));
365
+ });
395
366
  const stringNames = convertedStringColumns.map((column) => column.field);
396
367
  const smallStringColumns = await (0, tableProcessing_1.getCountsByColumns)(convertedStringColumns, `Select ${stringNames.join(', ')} from ${tableName}`, client, customFields);
397
368
  const smallStringNames = smallStringColumns.map((column) => column.field);
@@ -408,8 +379,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
408
379
  return {};
409
380
  }
410
381
  const dateColumnNames = dateColumns.map((column) => {
411
- //@ts-ignore
412
- return column.field || column.name;
382
+ return column.field;
413
383
  });
414
384
  const dateRanges = await (0, tableProcessing_1.getDateRangeByColumns)(dateColumns, `Select ${dateColumnNames.join(', ')} from ${tableName}`, client, customFields);
415
385
  return dateRanges;
@@ -443,13 +413,14 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
443
413
  const newUniqueValues = await getUniqueStringValues(tableInfo.columns, initialTableName);
444
414
  if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
445
415
  setUniqueValues(newUniqueValues);
416
+ updateFieldValuesMap(newUniqueValues, initialTableName);
446
417
  }
447
418
  const dateRangesTemp = await getDateRanges(tableInfo.columns, initialTableName);
448
419
  setDateRanges(dateRangesTemp);
449
420
  }
450
421
  const columnsForTable = tables
451
422
  .find((t) => t.name === initialTableName)
452
- ?.columns.map((c) => c.name)
423
+ ?.columns.map((c) => c.field)
453
424
  .sort((a, b) => {
454
425
  const aIsId = a.endsWith('.id') ||
455
426
  a.endsWith('_id') ||
@@ -465,7 +436,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
465
436
  return -1;
466
437
  return 0;
467
438
  });
468
- await handleAsk(`get ${columnsForTable} from ${initialTableName}`);
439
+ await fetchAstFromPromptHelper(`get ${columnsForTable} from ${initialTableName}`);
469
440
  setInitialLoad(false);
470
441
  };
471
442
  const fetchSchema = async () => {
@@ -475,7 +446,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
475
446
  setCustomFields(customFieldsByTable);
476
447
  setSchema(schemaData ?? []);
477
448
  setOrderedColumnNames((schemaData ?? []).flatMap((table) => table.columns
478
- .map((c) => `${table.name}.${c.name}`)
449
+ .map((c) => `${table.name}.${c.field}`)
479
450
  .sort((a, b) => {
480
451
  const aIsId = a.endsWith('.id') ||
481
452
  a.endsWith('_id') ||
@@ -504,106 +475,27 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
504
475
  };
505
476
  (0, react_1.useEffect)(() => {
506
477
  const loadChart = async () => {
507
- setInitialChartLoad(true);
508
- // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
509
- if (!report || report.referencedTables.length !== 1) {
510
- setInitialChartLoad(false);
511
- return;
512
- }
478
+ let report;
513
479
  try {
514
- // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
515
- const tableName = report.referencedTables[0];
516
- if (!tableName) {
517
- return;
518
- }
519
- const resp = await (0, dataFetcher_2.getDataFromCloud)(client, `astify`, {
520
- // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
521
- query: report.queryString,
522
- useNewNodeSql: true,
523
- });
524
- if (resp.success === false) {
525
- setErrorMessage(resp.message);
526
- return;
527
- }
528
- const ast = (0, astProcessing_1.getSelectFromAST)(resp.ast);
529
- let convertedAst = (0, astProcessing_1.processStarColumn)(ast, report.columns);
530
- (0, astProcessing_1.processApostrophe)(convertedAst, ['type', 'value']);
531
- convertedAst = (0, convert_1.convertBigQuery)(convertedAst);
532
- const schemaInfo = schema.length !== 0 ? schema : await fetchSchema();
533
- let newAst;
534
- let groupByPivot = {};
535
- ({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(convertedAst,
536
- // @ts-ignore
537
- report.pivot, schemaInfo));
538
- if (convertedAst.where) {
539
- setFormData((0, util_1.deepCopy)(convertedAst.where));
540
- }
541
- // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
542
- setActiveQuery(report.queryString);
543
- newAst = groupByPivot ? newAst : convertedAst;
544
- const initialRows = await fetchUponChange(newAst, undefined);
545
- if (initialRows.error) {
546
- setBaseAst(null);
547
- setErrorMessage(initialRows.message);
548
- setInitialChartLoad(false);
549
- return;
550
- }
551
- setBaseAst(newAst);
552
- const tableInfo = schemaInfo.find((table) => table.name === tableName);
553
- let newUniqueValues = undefined;
554
- let dateRangesTemp = undefined;
555
- if (tableName) {
556
- newUniqueValues = await getUniqueStringValues(tableInfo.columns, tableName);
557
- setUniqueValues(newUniqueValues);
558
- dateRangesTemp = await getDateRanges(tableInfo.columns, tableName);
559
- setDateRanges(dateRangesTemp);
560
- }
561
- if (groupByPivot) {
562
- // @ts-ignore
563
- setPivotRowField(groupByPivot.rowField);
564
- // @ts-ignore
565
- setPivotAggregation(groupByPivot.aggregationType);
566
- // @ts-ignore
567
- setPivotColumnField(groupByPivot.columnField);
568
- // @ts-ignore
569
- setPivotValueField(groupByPivot.valueField);
570
- setPivot(groupByPivot);
571
- let dateBucket = undefined;
572
- const tempDateRange = dateRangesTemp &&
573
- groupByPivot.rowField &&
574
- dateRangesTemp[groupByPivot.rowField];
575
- if (tempDateRange) {
576
- dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
577
- }
578
- const pivotedData = await (0, PivotModal_1.generatePivotTable)(
579
- // @ts-ignore
580
- groupByPivot, initialRows, tempDateRange, false, -1, undefined, dateBucket, report, client, newUniqueValues[tableName]);
581
- setPivotData(pivotedData || []);
582
- const formattedRows = formatRows(pivotedData.rows, report.columns, true,
583
- // @ts-ignore
584
- groupByPivot.aggregationType);
585
- setFormattedRows(formattedRows);
586
- }
587
- else {
588
- const formattedRows = formatRows(report.rows, report.columns);
589
- setFormattedRows(formattedRows);
590
- }
591
- setCurrentTable(tableName);
480
+ if (!reportId) {
481
+ throw new Error('Report ID is required');
482
+ }
483
+ report = dashboard[reportId];
484
+ if (!report || report.referencedTables?.length !== 1) {
485
+ throw new Error('Report not found');
486
+ }
487
+ const { ast: newAst, pivot: newPivot, schema: curSchema, } = await (0, astProcessing_1.fetchASTFromQuillReport)(report, client, schema);
488
+ setBaseAst({ ...newAst, where: null });
489
+ await fetchReportFromASTHelper({ ...newAst, where: null }, newAst.where, newPivot, curSchema, report);
490
+ await fetchSchema();
491
+ setReportInfo(report);
592
492
  }
593
- catch (error) {
594
- console.error(error);
595
- setErrorMessage('Error loading report');
596
- }
597
- // This handles a flashing issue
598
- setTimeout(() => {
493
+ catch (err) {
599
494
  setInitialChartLoad(false);
600
- }, 500);
495
+ }
601
496
  };
602
- // @ts-ignore THIS PROCESS SHOULD BE UPDATED TO NOT USE USEQUILL
603
- if (report && report.referencedTables.length === 1) {
604
- loadChart();
605
- }
606
- }, [report]);
497
+ loadChart();
498
+ }, [dashboard[reportId || '']]);
607
499
  (0, react_1.useEffect)(() => {
608
500
  if (schema.length === 0) {
609
501
  fetchSchema();
@@ -626,9 +518,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
626
518
  ...constants_1.defaultAST,
627
519
  ...baseAst,
628
520
  ...(!baseAst?.columns && {
629
- columns: getAllPossibleColumns().map((c) => {
521
+ columns: (0, astProcessing_1.getAllPossibleColumns)(baseAst, schema).map((c) => {
630
522
  const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
631
- newColumn.expr.column = c.name;
523
+ newColumn.expr.column = c.field;
632
524
  return newColumn;
633
525
  }),
634
526
  }),
@@ -646,9 +538,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
646
538
  ...constants_1.defaultAST,
647
539
  ...baseAst,
648
540
  ...(!baseAst?.columns && {
649
- columns: getAllPossibleColumns().map((c) => {
541
+ columns: (0, astProcessing_1.getAllPossibleColumns)(baseAst, schema).map((c) => {
650
542
  const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
651
- newColumn.expr.column = c.name;
543
+ newColumn.expr.column = c.field;
652
544
  return newColumn;
653
545
  }),
654
546
  }),
@@ -747,9 +639,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
747
639
  ...constants_1.defaultAST,
748
640
  ...baseAst,
749
641
  ...(!baseAst?.columns && {
750
- columns: getAllPossibleColumns().map((c) => {
642
+ columns: (0, astProcessing_1.getAllPossibleColumns)(baseAst, schema).map((c) => {
751
643
  const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
752
- newColumn.expr.column = c.name;
644
+ newColumn.expr.column = c.field;
753
645
  return newColumn;
754
646
  }),
755
647
  }),
@@ -762,169 +654,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
762
654
  fetchSqlQuery(newAst, newState);
763
655
  });
764
656
  };
765
- // TODO: Merge this function with the updateFormData function
766
- const updateActiveItem = (updates, { isDeletion = false, isInsertion = false, isReplaceSubtree = false, isAddVariant = false, isDeleteVariant = false, column = undefined, }) => {
767
- let newState = (0, util_1.deepCopy)(activeEditItem);
768
- updates.forEach(({ path, value }) => {
769
- let current = newState;
770
- const globalPath = path;
771
- const paths = globalPath.split('.').filter((p) => p);
772
- if (paths.length === 0 && !isInsertion && !isReplaceSubtree) {
773
- setActiveEditItem(null);
774
- return;
775
- }
776
- const isOperatorChange = paths[paths.length - 1] === 'operator';
777
- let parent = null;
778
- let parentKey = null;
779
- for (let i = 0; i < paths.length - 1; i++) {
780
- let currentPath = paths[i];
781
- let index;
782
- if (paths[i].includes('||')) {
783
- const splitPath = paths[i].split('||');
784
- currentPath = splitPath[0];
785
- index = splitPath[1];
786
- }
787
- if (current[currentPath]) {
788
- parent = current;
789
- parentKey = currentPath;
790
- current = current[currentPath];
791
- }
792
- if (index) {
793
- current = current[parseInt(index)];
794
- }
795
- }
796
- const lastKey = paths[paths.length - 1];
797
- if (isDeletion) {
798
- if (lastKey === 'left' || lastKey === 'right') {
799
- if (parent) {
800
- if (lastKey === 'right') {
801
- parent[parentKey] = parent[parentKey].left;
802
- }
803
- else {
804
- parent[parentKey] = parent[parentKey].right;
805
- }
806
- }
807
- else {
808
- delete current[lastKey];
809
- if (newState?.left && !newState?.right) {
810
- newState = newState.left;
811
- }
812
- else if (newState?.right && !newState?.left) {
813
- newState = newState.right;
814
- }
815
- }
816
- }
817
- }
818
- else if (isInsertion) {
819
- const columns = getAllPossibleColumns();
820
- const defaultColumn = columns[0].name;
821
- // TODO: I think this is a bug, take a closer look here
822
- newState = {
823
- type: 'binary_expr',
824
- operator: 'AND',
825
- left: newState,
826
- right: {
827
- ...constants_1.defaultEntry,
828
- left: {
829
- ...constants_1.defaultEntry.left,
830
- column: defaultColumn,
831
- },
832
- },
833
- };
834
- }
835
- else if (isAddVariant) {
836
- const newVariant = (0, util_1.deepCopy)(constants_1.defaultVariant);
837
- if (value) {
838
- newVariant.args.value[0].value = value;
839
- // if there is already a single default value there,
840
- // let's remove it so when we push we replace.
841
- if (current[lastKey].length === 1 &&
842
- current[lastKey][0].args.value[0].value === '') {
843
- current[lastKey].pop();
844
- }
845
- }
846
- current[lastKey].push(newVariant);
847
- }
848
- else if (isDeleteVariant) {
849
- if (value) {
850
- const argList = current[lastKey];
851
- argList.splice(argList.findIndex((arg) => arg.args.value[0].value === value), 1);
852
- }
853
- else {
854
- current[lastKey].pop();
855
- }
856
- // add back in a phantom element to prevent app from crashing
857
- // when the user removes all variants and hits save.
858
- if (current[lastKey].length === 0) {
859
- const newVariant = (0, util_1.deepCopy)(constants_1.defaultVariant);
860
- newVariant.args.value[0].value = '';
861
- current[lastKey].push(newVariant);
862
- }
863
- }
864
- else if (isReplaceSubtree) {
865
- if (lastKey) {
866
- current[lastKey] = value;
867
- }
868
- else {
869
- newState = value;
870
- }
871
- }
872
- else if (isOperatorChange) {
873
- const newOp = value;
874
- const oldOp = current[lastKey];
875
- if (operators_1.OPERATOR_GROUPS[oldOp] === operators_1.OPERATOR_GROUPS[newOp]) {
876
- current[lastKey] = value;
877
- }
878
- else {
879
- const group = operators_1.OPERATOR_GROUPS[newOp];
880
- const subtree = (0, operators_1.getDefaultOperatorSubtrees)(group, newOp, column, '', client.databaseType);
881
- if (parentKey) {
882
- parent[parentKey] = (0, util_1.deepCopy)(subtree);
883
- }
884
- else {
885
- newState = (0, util_1.deepCopy)(subtree);
886
- }
887
- }
888
- }
889
- else {
890
- if (typeof current[lastKey] === 'object' && current[lastKey] !== null) {
891
- current[lastKey].value = value;
892
- }
893
- else {
894
- current[lastKey] = value;
895
- }
896
- }
897
- });
898
- // Function to immutably update or delete nodes based on their path
899
- setActiveEditItem(newState);
900
- };
901
- const handleChange = (updates) => {
902
- const callback = isPending ? updateActiveItem : updateFormData;
903
- callback(updates, {});
904
- };
905
- const handleChangeText = (updates) => {
906
- const callback = isPending ? updateActiveItem : updateFormData;
907
- callback(updates, {});
908
- };
909
- // Function to handle operator changes
910
- const handleOperatorChange = (value, node, keyPrefix, column = null) => {
911
- if (!keyPrefix) {
912
- setTopLevelBinaryOperator(value);
913
- }
914
- if (isPending) {
915
- updateActiveItem([{ path: keyPrefix + 'operator', value }], { column });
916
- }
917
- else {
918
- updateFormData([{ path: keyPrefix + 'operator', value }], { column });
919
- }
920
- };
921
- // Function to replace an entire subtree with a given value.
922
- const handleReplaceSubtree = (keyPrefix, newValue, pending = isPending) => {
923
- const callback = pending ? updateActiveItem : updateFormData;
924
- callback([{ path: keyPrefix, value: newValue }], {
925
- isReplaceSubtree: true,
926
- });
927
- };
928
657
  // Function to handle the insertion of expressions
929
658
  const handleInsertion = (value, op = 'OR', isCondition = undefined) => {
930
659
  updateFormData([{ path: '', value }], {
@@ -933,23 +662,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
933
662
  isCondition,
934
663
  });
935
664
  };
936
- // Function to handle the insertion of expr_list variants
937
- const handleInsertVariant = (key, name = null) => {
938
- // note: if name, treat that as the name of the value to insert
939
- const callback = isPending ? updateActiveItem : updateFormData;
940
- callback([{ path: key, value: name }], { isAddVariant: true });
941
- };
942
- // Function to handle the insertion of expr_list variants
943
- const handleDeleteVariant = (key, name = null) => {
944
- // note: if name, treat that as the name of the valeu to delete
945
- const callback = isPending ? updateActiveItem : updateFormData;
946
- callback([{ path: key, value: name }], { isDeleteVariant: true });
947
- };
948
- const getColumnValueForColumnComparison = (node) => node.left.value ??
949
- node.left.column ??
950
- node.left.args?.value[0]?.value ??
951
- node.left.args?.value[0]?.column ??
952
- undefined;
953
665
  /**
954
666
  * Searches for the column by name and returns the field type.
955
667
  *
@@ -1046,676 +758,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1046
758
  return;
1047
759
  }
1048
760
  };
1049
- /**
1050
- * Render form fields based on the type of the node
1051
- * @param node the AST or subtree to render recursively
1052
- * @param keyPrefix a stringified version of the path from the root
1053
- *
1054
- * Note: The keyPrefix should be separated by '.' characters and each item
1055
- * should be a valid index into the node (eg. 'left.right.value' is a valid
1056
- * keyPrefix but 'left.args[0].value' is not -- should be 'left.args.0.value')
1057
- */
1058
- const renderNode = (node, keyPrefix = '') => {
1059
- const dateComparisonPartialMatch = (0, util_1.formatDateComparisonNode)(node);
1060
- switch (node.type) {
1061
- case 'binary_expr':
1062
- if (dateComparisonPartialMatch ||
1063
- ((0, util_1.isDateTruncEquals)(node) && client.databaseType !== 'BigQuery')) {
1064
- const { dateColumn, dateFilterType, intervalCount, intervalType, intervalPaths, } = (0, util_1.getDateFilterInfo)(node);
1065
- const isPlural = intervalCount !== 1 && dateFilterType !== 'in the current'
1066
- ? 's'
1067
- : '';
1068
- // Pull off the string literal date for "equals" comparisons
1069
- const rawDateStringEquals = node.right?.value ??
1070
- node.right?.args?.value[1]?.column ??
1071
- node.right?.args?.value[1]?.value;
1072
- const rawDateStringEqualsPath = (node.right?.value && 'node.right.value') ??
1073
- (node.right?.args?.value[1]?.column &&
1074
- 'node.right.args.value.1.column') ??
1075
- (node.right?.args?.value[1]?.value &&
1076
- 'node.right.args.value.1.value');
1077
- return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: 20 }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: dateColumn, onChange: (event) => {
1078
- const columnType = getColumnTypeByName(event.target.value);
1079
- if ((0, ast_1.isDateishColumnType)(columnType)) {
1080
- // handleChange(value, keyPrefix + dateColumnPath, "text");
1081
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, event.target.value);
1082
- }
1083
- else if ((0, ast_1.isNumericColumnType)(columnType)) {
1084
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
1085
- newSubtree.left.column = event.target.value;
1086
- handleReplaceSubtree(keyPrefix, newSubtree);
1087
- }
1088
- else if ((0, ast_1.isBoolColumnType)(columnType)) {
1089
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1090
- newSubtree.left.column = event.target.value;
1091
- handleReplaceSubtree(keyPrefix, newSubtree);
1092
- }
1093
- else {
1094
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1095
- newSubtree.left.args.value[0].column = event.target.value;
1096
- handleReplaceSubtree(keyPrefix, newSubtree);
1097
- }
1098
- }, options: getAllPossibleColumns().map((column) => ({
1099
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
1100
- value: column.name,
1101
- })), width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: dateFilterType, onChange: (event) => {
1102
- if (event.target.value === dateFilterType)
1103
- return null;
1104
- let newSubtree = {};
1105
- // TODO: implement one for each database type (eg. pg, snowflake, etc.)
1106
- if (event.target.value === 'in the last') {
1107
- newSubtree = (0, postgres_1.generateLastNPeriodsPostgres)({
1108
- dateField: dateColumn,
1109
- intervalPeriod: `${intervalCount ?? 1} ${intervalType}`,
1110
- });
1111
- }
1112
- else if (event.target.value === 'in the previous') {
1113
- newSubtree = (0, postgres_1.generatePreviousPeriodPostgres)({
1114
- dateField: dateColumn,
1115
- intervalPeriod: `${intervalCount ?? 1} ${intervalType}`,
1116
- currentPeriod: intervalType,
1117
- });
1118
- }
1119
- else if (event.target.value === 'in the current') {
1120
- newSubtree = (0, postgres_1.generateCurrentPeriodPostgres)({
1121
- dateField: dateColumn,
1122
- currentPeriod: intervalType,
1123
- });
1124
- }
1125
- else if (event.target.value === 'equals') {
1126
- newSubtree = (0, postgres_1.generateEqualsPostgres)({
1127
- dateField: dateColumn,
1128
- currentPeriod: intervalType,
1129
- timestamp: '2024-01-01',
1130
- });
1131
- }
1132
- // replace the entire subtree for this filter
1133
- handleReplaceSubtree(keyPrefix, newSubtree);
1134
- }, options: [
1135
- { label: 'in the last', value: 'in the last' },
1136
- { label: 'in the previous', value: 'in the previous' },
1137
- { label: 'in the current', value: 'in the current' },
1138
- { label: 'equals', value: 'equals' },
1139
- ], width: 200 }), !['in the current', 'equals'].includes(dateFilterType) && ((0, jsx_runtime_1.jsx)(TextInputComponent, { id: "date_filter_interval_count", value: intervalCount?.toString() ?? '', width: 70, onChange: (e) => {
1140
- if (Number.isNaN(parseFloat(e.target.value || '0'))) {
1141
- alert('Please input a number.');
1142
- return;
1143
- }
1144
- const isPluralNow = parseFloat(e.target.value || '0') !== 1 ? 's' : '';
1145
- intervalPaths.forEach((intervalPath) => handleChangeText([
1146
- {
1147
- value: `${e.target.value || 0} ${intervalType}${isPluralNow}`,
1148
- path: keyPrefix + intervalPath,
1149
- },
1150
- ]));
1151
- } })), (0, jsx_runtime_1.jsx)(SelectComponent, { value: intervalType, onChange: (event) => {
1152
- if (intervalPaths.length === 1 &&
1153
- dateFilterType !== 'in the previous') {
1154
- handleChangeText([
1155
- {
1156
- value: intervalCount !== null
1157
- ? `${intervalCount} ${event.target.value}${isPlural}`
1158
- : event.target.value,
1159
- path: keyPrefix + intervalPaths[0],
1160
- },
1161
- ]);
1162
- return;
1163
- }
1164
- let newSubtree;
1165
- if (dateFilterType === 'in the previous') {
1166
- newSubtree = (0, postgres_1.generatePreviousPeriodPostgres)({
1167
- dateField: dateColumn,
1168
- intervalPeriod: `${intervalCount ?? 1} ${event.target.value}`,
1169
- currentPeriod: event.target.value,
1170
- });
1171
- }
1172
- else if (dateFilterType === 'equals') {
1173
- newSubtree = (0, postgres_1.generateEqualsPostgres)({
1174
- dateField: dateColumn,
1175
- currentPeriod: event.target.value,
1176
- timestamp: rawDateStringEquals,
1177
- });
1178
- }
1179
- else {
1180
- newSubtree = (0, postgres_1.generateCurrentPeriodPostgres)({
1181
- dateField: dateColumn,
1182
- currentPeriod: event.target.value,
1183
- });
1184
- }
1185
- handleReplaceSubtree(keyPrefix, newSubtree);
1186
- }, options: dateFilterType === 'in the previous' ||
1187
- dateFilterType === 'in the last'
1188
- ? [
1189
- { label: `year${isPlural}`, value: 'year' },
1190
- { label: `month${isPlural}`, value: 'month' },
1191
- { label: `week${isPlural}`, value: 'week' },
1192
- { label: `day${isPlural}`, value: 'day' },
1193
- { label: `hour${isPlural}`, value: 'hour' },
1194
- ]
1195
- : [
1196
- { label: `year${isPlural}`, value: 'year' },
1197
- { label: `quarter${isPlural}`, value: 'quarter' },
1198
- { label: `month${isPlural}`, value: 'month' },
1199
- { label: `week${isPlural}`, value: 'week' },
1200
- { label: `day${isPlural}`, value: 'day' },
1201
- { label: `hour${isPlural}`, value: 'hour' },
1202
- ], width: 200 }), dateFilterType === 'equals' && ((0, jsx_runtime_1.jsx)(TextInputComponent, { id: "date_filter_equals_raw_date", value: rawDateStringEquals, width: 120, onChange: (e) => {
1203
- handleChangeText([
1204
- {
1205
- value: e.target.value,
1206
- path: keyPrefix + rawDateStringEqualsPath,
1207
- },
1208
- ]);
1209
- } }))] }));
1210
- }
1211
- else if ((0, util_1.isInTheLastInterval)(node, client.databaseType)) {
1212
- const { dateColumn } = (0, util_1.getDateFilterInfo)(node);
1213
- const options = getAllPossibleColumns().map((column) => ({
1214
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
1215
- value: column.name,
1216
- }));
1217
- const plural = node.right.args.value[1].expr.value !== 1 ? 's' : '';
1218
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
1219
- display: 'flex',
1220
- flexDirection: 'row',
1221
- alignItems: 'center',
1222
- gap: 20,
1223
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: node.left.column, onChange: (event) => {
1224
- const columnType = getColumnTypeByName(event.target.value);
1225
- if ((0, ast_1.isDateishColumnType)(columnType)) {
1226
- // handleChange(value, keyPrefix + dateColumnPath, "text");
1227
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, event.target.value);
1228
- }
1229
- else if ((0, ast_1.isNumericColumnType)(columnType)) {
1230
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
1231
- newSubtree.left.column = event.target.value;
1232
- handleReplaceSubtree(keyPrefix, newSubtree);
1233
- }
1234
- else if ((0, ast_1.isBoolColumnType)(columnType)) {
1235
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1236
- newSubtree.left.column = event.target.value;
1237
- handleReplaceSubtree(keyPrefix, newSubtree);
1238
- }
1239
- else {
1240
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1241
- newSubtree.left.args.value[0].column = event.target.value;
1242
- handleReplaceSubtree(keyPrefix, newSubtree);
1243
- }
1244
- }, options: options, width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: 'IN_THE_LAST', onChange: (event) => {
1245
- handleOperatorChange(event.target.value, node, keyPrefix, dateColumn);
1246
- }, options: [
1247
- { label: 'in the last', value: 'IN_THE_LAST' },
1248
- { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
1249
- { label: 'in the current', value: 'IN_THE_CURRENT' },
1250
- { label: 'equals', value: 'EQUALS' },
1251
- { label: 'is not null', value: 'IS NOT' },
1252
- { label: 'is null', value: 'IS' },
1253
- ], width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'date_window_interval_count', value: node.right.args.value[1].expr.value, width: 120, onChange: (e) => {
1254
- handleChange([
1255
- {
1256
- value: e.target.value,
1257
- path: keyPrefix + 'right.args.value||1.expr.value',
1258
- },
1259
- ]);
1260
- } }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SelectComponent, { value: node.right.args.value[1].unit, onChange: (event) => handleChange([
1261
- {
1262
- value: event.target.value,
1263
- path: keyPrefix + 'right.args.value||1.unit',
1264
- },
1265
- ]), options: [
1266
- { label: `year${plural}`, value: '* 365 DAY' },
1267
- { label: `month${plural}`, value: '* 30 DAY' },
1268
- { label: `week${plural}`, value: '* 7 DAY' },
1269
- { label: `day${plural}`, value: 'DAY' },
1270
- ], width: 200 }) })] }));
1271
- }
1272
- else if ((0, util_1.isTheCurrentInterval)(node, client.databaseType)) {
1273
- const options = getAllPossibleColumns().map((column) => ({
1274
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
1275
- value: column.name,
1276
- }));
1277
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
1278
- display: 'flex',
1279
- flexDirection: 'row',
1280
- alignItems: 'center',
1281
- gap: 20,
1282
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: node.left.column, onChange: (event) => {
1283
- const columnType = getColumnTypeByName(event.target.value);
1284
- if ((0, ast_1.isDateishColumnType)(columnType)) {
1285
- // handleChange(value, keyPrefix + dateColumnPath, "text");
1286
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, event.target.value);
1287
- }
1288
- else if ((0, ast_1.isNumericColumnType)(columnType)) {
1289
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
1290
- newSubtree.left.column = event.target.value;
1291
- handleReplaceSubtree(keyPrefix, newSubtree);
1292
- }
1293
- else if ((0, ast_1.isBoolColumnType)(columnType)) {
1294
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1295
- newSubtree.left.column = event.target.value;
1296
- handleReplaceSubtree(keyPrefix, newSubtree);
1297
- }
1298
- else {
1299
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1300
- newSubtree.left.args.value[0].column = event.target.value;
1301
- handleReplaceSubtree(keyPrefix, newSubtree);
1302
- }
1303
- }, options: options, width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: 'IN_THE_CURRENT', onChange: (event) => {
1304
- handleOperatorChange(event.target.value, node, keyPrefix, node.left.column);
1305
- }, options: [
1306
- { label: 'in the last', value: 'IN_THE_LAST' },
1307
- { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
1308
- { label: 'in the current', value: 'IN_THE_CURRENT' },
1309
- { label: 'equals', value: 'EQUALS' },
1310
- { label: 'is not null', value: 'IS NOT' },
1311
- { label: 'is null', value: 'IS' },
1312
- // { label: 'equals', value: 'equals' },
1313
- ], width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: node.left.args.value[1].column, onChange: (event) => {
1314
- handleChange([
1315
- {
1316
- value: event.target.value,
1317
- path: 'right.args.value||1.column',
1318
- },
1319
- {
1320
- value: event.target.value,
1321
- path: 'left.args.value||1.column',
1322
- },
1323
- ]);
1324
- }, options: [
1325
- { label: `year`, value: 'YEAR' },
1326
- { label: `quarter`, value: 'QUARTER' },
1327
- { label: `month`, value: 'MONTH' },
1328
- { label: `week`, value: 'WEEK' },
1329
- ], width: 200 })] }));
1330
- }
1331
- else if ((0, util_1.isThePreviousInterval)(node)) {
1332
- const options = getAllPossibleColumns().map((column) => ({
1333
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
1334
- value: column.name,
1335
- }));
1336
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
1337
- display: 'flex',
1338
- flexDirection: 'row',
1339
- alignItems: 'center',
1340
- gap: 20,
1341
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: node.left.column, onChange: (event) => {
1342
- const columnType = getColumnTypeByName(event.target.value);
1343
- if ((0, ast_1.isDateishColumnType)(columnType)) {
1344
- // handleChange(value, keyPrefix + dateColumnPath, "text");
1345
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, event.target.value);
1346
- }
1347
- else if ((0, ast_1.isNumericColumnType)(columnType)) {
1348
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
1349
- newSubtree.left.column = event.target.value;
1350
- handleReplaceSubtree(keyPrefix, newSubtree);
1351
- }
1352
- else if ((0, ast_1.isBoolColumnType)(columnType)) {
1353
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1354
- newSubtree.left.column = event.target.value;
1355
- handleReplaceSubtree(keyPrefix, newSubtree);
1356
- }
1357
- else {
1358
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1359
- newSubtree.left.args.value[0].column = event.target.value;
1360
- handleReplaceSubtree(keyPrefix, newSubtree);
1361
- }
1362
- }, options: options, width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: 'IN_THE_PREVIOUS', onChange: (event) => {
1363
- handleOperatorChange(event.target.value, node, keyPrefix, node.left.column);
1364
- }, options: [
1365
- { label: 'in the last', value: 'IN_THE_LAST' },
1366
- { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
1367
- { label: 'in the current', value: 'IN_THE_CURRENT' },
1368
- { label: 'equals', value: 'EQUALS' },
1369
- { label: 'is not null', value: 'IS NOT' },
1370
- { label: 'is null', value: 'IS' },
1371
- // { label: 'equals', value: 'equals' },
1372
- ], width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: node.left.args.value[1].column, onChange: (event) => {
1373
- const dayConversion = {
1374
- YEAR: 365,
1375
- QUARTER: 90,
1376
- MONTH: 30,
1377
- WEEK: 7,
1378
- };
1379
- handleChange([
1380
- {
1381
- value: event.target.value,
1382
- path: 'left.args.value||1.column',
1383
- },
1384
- {
1385
- value: event.target.value,
1386
- path: 'right.args.value||1.column',
1387
- },
1388
- {
1389
- value: dayConversion[event.target.value] || 30,
1390
- path: 'right.args.value||0.args.value||1.expr.value',
1391
- },
1392
- ]);
1393
- }, options: [
1394
- { label: `year`, value: 'YEAR' },
1395
- { label: `quarter`, value: 'QUARTER' },
1396
- { label: `month`, value: 'MONTH' },
1397
- { label: `week`, value: 'WEEK' },
1398
- ], width: 200 })] }));
1399
- }
1400
- else if ((0, util_1.isEquals)(node, client.databaseType)) {
1401
- const options = getAllPossibleColumns().map((column) => ({
1402
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
1403
- value: column.name,
1404
- }));
1405
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
1406
- display: 'flex',
1407
- flexDirection: 'row',
1408
- alignItems: 'center',
1409
- gap: 20,
1410
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: node.left.column, onChange: (event) => {
1411
- const columnType = getColumnTypeByName(event.target.value);
1412
- if ((0, ast_1.isDateishColumnType)(columnType)) {
1413
- // handleChange(value, keyPrefix + dateColumnPath, "text");
1414
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, event.target.value);
1415
- }
1416
- else if ((0, ast_1.isNumericColumnType)(columnType)) {
1417
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
1418
- newSubtree.left.column = event.target.value;
1419
- handleReplaceSubtree(keyPrefix, newSubtree);
1420
- }
1421
- else if ((0, ast_1.isBoolColumnType)(columnType)) {
1422
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1423
- newSubtree.left.column = event.target.value;
1424
- handleReplaceSubtree(keyPrefix, newSubtree);
1425
- }
1426
- else {
1427
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1428
- newSubtree.left.args.value[0].column = event.target.value;
1429
- handleReplaceSubtree(keyPrefix, newSubtree);
1430
- }
1431
- }, options: options, width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: 'EQUALS', onChange: (event) => {
1432
- handleOperatorChange(event.target.value, node, keyPrefix, node.left.column);
1433
- }, options: [
1434
- { label: 'in the last', value: 'IN_THE_LAST' },
1435
- { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
1436
- { label: 'in the current', value: 'IN_THE_CURRENT' },
1437
- { label: 'equals', value: 'EQUALS' },
1438
- { label: 'is not null', value: 'IS NOT' },
1439
- { label: 'is null', value: 'IS' },
1440
- // { label: 'equals', value: 'equals' },
1441
- ], width: 200 }), (0, jsx_runtime_1.jsx)(SelectComponent, { value: node.right.args.value[1].column, onChange: (event) => {
1442
- handleChange([
1443
- {
1444
- value: event.target.value,
1445
- path: 'right.args.value||1.column',
1446
- },
1447
- {
1448
- value: event.target.value,
1449
- path: 'left.args.value||1.column',
1450
- },
1451
- ]);
1452
- }, options: [
1453
- { label: `year`, value: 'YEAR' },
1454
- { label: `quarter`, value: 'QUARTER' },
1455
- { label: `month`, value: 'MONTH' },
1456
- { label: `week`, value: 'WEEK' },
1457
- ], width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'quoted_string', value: node.right.args.value[0].value, width: 120, onChange: (e) => handleChange([
1458
- {
1459
- value: e.target.value,
1460
- path: 'right.args.value||0.value',
1461
- },
1462
- ]) })] }));
1463
- }
1464
- else if ((0, util_1.isColumnComparison)(node)) {
1465
- const options = getAllPossibleColumns().map((column) => ({
1466
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
1467
- value: column.name,
1468
- }));
1469
- // grab the value of the left child of the column comparison
1470
- // operator (ie. the column name)
1471
- const leftChildValue = getColumnValueForColumnComparison(node);
1472
- const tables = (0, ast_1.getTableNames)(baseAst);
1473
- const table = tables.length === 1 ? tables[0] : initialTableName;
1474
- const column = schema
1475
- .find((tableInfo) => tableInfo.name === table)
1476
- ?.columns.find((col) => col.name === leftChildValue);
1477
- const columnType = column?.fieldType;
1478
- const operatorOptions = [
1479
- ...((0, ast_1.isNumericColumnType)(columnType)
1480
- ? [
1481
- { label: 'equal to', value: '=' },
1482
- { label: 'not equal to', value: '!=' },
1483
- { label: 'greater than', value: '>' },
1484
- { label: 'less than', value: '<' },
1485
- { label: 'greater than or equal to', value: '>=' },
1486
- { label: 'less than or equal to', value: '<=' },
1487
- { label: 'is not null', value: 'IS NOT' },
1488
- { label: 'is null', value: 'IS' },
1489
- ]
1490
- : []),
1491
- ...((0, ast_1.isTextColumnType)(columnType)
1492
- ? [
1493
- { label: 'is exactly', value: 'LIKE' },
1494
- { label: 'is not exactly', value: 'NOT LIKE' },
1495
- { label: 'is', value: 'IN' },
1496
- { label: 'is not', value: 'NOT IN' },
1497
- { label: 'is not null', value: 'IS NOT' },
1498
- { label: 'is null', value: 'IS' },
1499
- ]
1500
- : []),
1501
- ...((0, ast_1.isDateishColumnType)(columnType)
1502
- ? [
1503
- { label: 'in the last', value: 'IN_THE_LAST' },
1504
- {
1505
- label: 'in the previous',
1506
- value: 'IN_THE_PREVIOUS',
1507
- },
1508
- { label: 'in the current', value: 'IN_THE_CURRENT' },
1509
- { label: 'equals', value: 'equals' },
1510
- ]
1511
- : []),
1512
- ];
1513
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
1514
- display: 'flex',
1515
- gap: 12,
1516
- flexDirection: 'column',
1517
- width: '100%',
1518
- padding: '6px 0px',
1519
- }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
1520
- display: 'flex',
1521
- gap: 20,
1522
- flexDirection: (0, util_1.showNodeAsRow)(node, formData)
1523
- ? 'row'
1524
- : 'column',
1525
- width: '100%',
1526
- }, children: [(0, jsx_runtime_1.jsx)(SelectComponent, { value: leftChildValue, onChange: (event) => {
1527
- const columnType = getColumnTypeByName(event.target.value);
1528
- if ((0, ast_1.isDateishColumnType)(columnType)) {
1529
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, event.target.value);
1530
- }
1531
- else if ((0, ast_1.isNumericColumnType)(columnType)) {
1532
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
1533
- newSubtree.left.column = event.target.value;
1534
- handleReplaceSubtree(keyPrefix, newSubtree);
1535
- }
1536
- else if ((0, ast_1.isBoolColumnType)(columnType)) {
1537
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1538
- newSubtree.left.column = event.target.value;
1539
- handleReplaceSubtree(keyPrefix, newSubtree);
1540
- }
1541
- else {
1542
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1543
- newSubtree.left.args.value[0].column = event.target.value;
1544
- handleReplaceSubtree(keyPrefix, newSubtree);
1545
- }
1546
- }, options: options, width: 200 }), operatorOptions.length > 0 && ((0, jsx_runtime_1.jsx)(SelectComponent, { value: node.operator, onChange: (event) => {
1547
- handleOperatorChange(event.target.value, node, keyPrefix, leftChildValue);
1548
- }, options: operatorOptions, width: 200 })), node.right &&
1549
- node.right.type !== 'expr_list' &&
1550
- renderNode(node.right, keyPrefix + 'right.')] }, keyPrefix), node.right && node.right.type === 'expr_list' && ((0, jsx_runtime_1.jsx)("div", { style: {
1551
- display: 'grid',
1552
- gridTemplateColumns: 'repeat(2, 1fr)',
1553
- gap: 12,
1554
- }, children: uniqueValues[table] &&
1555
- Object.keys(uniqueValues[table][leftChildValue] ?? {}).map((key) => ((0, jsx_runtime_1.jsx)(CheckboxComponent, { label: key, isChecked: uniqueValues[table][leftChildValue][key], onChange: (event) => {
1556
- const newValues = (0, util_1.deepCopy)(uniqueValues);
1557
- newValues[table][leftChildValue][key] =
1558
- event.target.checked;
1559
- setUniqueValues(newValues);
1560
- if (event.target.checked) {
1561
- handleInsertVariant(keyPrefix + 'right.' + 'value', key);
1562
- }
1563
- else {
1564
- handleDeleteVariant(keyPrefix + 'right.' + 'value', key);
1565
- }
1566
- } }))) }, keyPrefix + 'right.'))] }));
1567
- }
1568
- else {
1569
- const columnName = node.left.column;
1570
- const column = schema
1571
- .find((tableInfo) => tableInfo.name === currentTable)
1572
- ?.columns.find((col) => col.name === columnName);
1573
- const columnType = column?.fieldType;
1574
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
1575
- display: 'flex',
1576
- gap: 12,
1577
- justifyContent: 'space-between',
1578
- flexDirection: (0, util_1.showNodeAsRow)(node, formData) ? 'row' : 'column',
1579
- width: '100%',
1580
- }, children: [node.left && renderNode(node.left, keyPrefix + 'left.'), (0, jsx_runtime_1.jsx)(SelectComponent, { value: node.operator, onChange: (event) => {
1581
- handleOperatorChange(event.target.value, node, keyPrefix);
1582
- }, options: [
1583
- // { label: `and`, value: "AND" },
1584
- // { label: `or`, value: "OR" },
1585
- ...((0, ast_1.isNumericColumnType)(columnType)
1586
- ? [
1587
- { label: 'equal to', value: '=' },
1588
- { label: 'not equal to', value: '!=' },
1589
- { label: 'greater than', value: '>' },
1590
- { label: 'less than', value: '<' },
1591
- { label: 'greater than or equal to', value: '>=' },
1592
- { label: 'less than or equal to', value: '<=' },
1593
- { label: 'is not null', value: 'IS NOT' },
1594
- { label: 'is null', value: 'IS' },
1595
- ]
1596
- : []),
1597
- ...((0, ast_1.isTextColumnType)(columnType)
1598
- ? [
1599
- { label: 'is exactly', value: 'LIKE' },
1600
- { label: 'is not exactly', value: 'NOT LIKE' },
1601
- { label: 'is', value: 'IN' },
1602
- { label: 'is not', value: 'NOT IN' },
1603
- { label: 'is not null', value: 'IS NOT' },
1604
- { label: 'is null', value: 'IS' },
1605
- ]
1606
- : []),
1607
- ...((0, ast_1.isDateishColumnType)(columnType)
1608
- ? [
1609
- { label: 'in the last', value: 'IN_THE_LAST' },
1610
- { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
1611
- { label: 'in the current', value: 'IN_THE_CURRENT' },
1612
- { label: 'equals', value: 'EQUALS' },
1613
- { label: 'is not null', value: 'IS NOT' },
1614
- { label: 'is null', value: 'IS' },
1615
- ]
1616
- : []),
1617
- // { label: `minus`, value: "-" },
1618
- // { label: `plus`, value: "+" },
1619
- ], width: 200 }), node.right && renderNode(node.right, keyPrefix + 'right.')] }, keyPrefix));
1620
- }
1621
- case 'column_ref': {
1622
- const options = getAllPossibleColumns().map((column) => ({
1623
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(column.displayName),
1624
- value: column.name,
1625
- }));
1626
- return ((0, jsx_runtime_1.jsx)(SelectComponent, { value: node.column ?? options[0]?.value, onChange: (event) => {
1627
- handleChange([
1628
- { value: event.target.value, path: keyPrefix + 'column' },
1629
- ]);
1630
- }, options: options, width: 200 }));
1631
- }
1632
- case 'expr_list': {
1633
- const len = node.value.length;
1634
- return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: 12 }, children: [node.value.map((elem, index) => {
1635
- if (elem.value) {
1636
- return ((0, jsx_runtime_1.jsx)(TextInputComponent, { id: `expr_list_${index}`, width: 200, value: elem.value, onChange: (e) => handleChange([
1637
- {
1638
- value: e.target.value,
1639
- path: keyPrefix + `value.${index}.`,
1640
- },
1641
- ]) }, `input_${index}`));
1642
- }
1643
- return renderNode(elem, keyPrefix + `value.${index}.`);
1644
- }), len > 1 && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: '-', onClick: () => handleDeleteVariant(keyPrefix + 'value') })), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleInsertVariant(keyPrefix + 'value'), label: '+' })] }, keyPrefix));
1645
- }
1646
- case 'double_quote_string':
1647
- case 'single_quote_string':
1648
- return ((0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'quoted_string', value: node.value.replaceAll('%', ''), width: 120, onChange: (e) => handleChange([
1649
- {
1650
- value: e.target.value,
1651
- path: keyPrefix + 'value',
1652
- },
1653
- ]) }));
1654
- case 'null':
1655
- return (0, jsx_runtime_1.jsx)("div", {});
1656
- case 'number':
1657
- return ((0, jsx_runtime_1.jsx)(TextInputComponent, { id: "quill_number_input", value: node.value, width: 120, onChange: (e) => {
1658
- handleChange([
1659
- {
1660
- value: e.target.value,
1661
- path: keyPrefix + 'value',
1662
- },
1663
- ]);
1664
- } }));
1665
- case 'bool':
1666
- return ((0, jsx_runtime_1.jsx)(SelectComponent, { value: node.value.toString(), onChange: (event) => {
1667
- let formatted = true;
1668
- if (event.target.value === 'false') {
1669
- formatted = false;
1670
- }
1671
- handleChange([
1672
- {
1673
- value: formatted,
1674
- path: keyPrefix + 'value',
1675
- },
1676
- ]);
1677
- }, options: [
1678
- { label: 'is true', value: 'true' },
1679
- { label: 'is false', value: 'false' },
1680
- ], width: 200 }));
1681
- case 'function':
1682
- if (!node.args) {
1683
- return (0, jsx_runtime_1.jsx)("label", {});
1684
- }
1685
- else if (node.args.type === 'expr_list' &&
1686
- node.args.value.length === 1) {
1687
- return ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'row' }, children: node.args.value[0] &&
1688
- renderNode(node.args.value[0], keyPrefix + 'args.value.0.') }));
1689
- }
1690
- else if (node.args.type === 'expr_list' &&
1691
- node.args.value.length === 2) {
1692
- return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: 20 }, children: [node.args.value[0] &&
1693
- renderNode(node.args.value[0], keyPrefix + 'args.value.0.'), node.args.value[1] &&
1694
- renderNode(node.args.value[1], keyPrefix + 'args.value.1.')] }));
1695
- }
1696
- return node.name;
1697
- case 'interval':
1698
- return ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', flexDirection: 'row', gap: 20 }, children: renderNode(node.expr, keyPrefix + 'expr.') }));
1699
- default:
1700
- return null;
1701
- }
1702
- };
1703
- const isValidPivot = (fields) => {
1704
- let validPivot = true;
1705
- if (pivot.rowField &&
1706
- !fields.find((field) => field.name === pivot.rowField)) {
1707
- validPivot = false;
1708
- }
1709
- if (pivot.valueField &&
1710
- !fields.find((field) => field.name === pivot.valueField)) {
1711
- validPivot = false;
1712
- }
1713
- if (pivot.columnField &&
1714
- !fields.find((field) => field.name === pivot.columnField)) {
1715
- validPivot = false;
1716
- }
1717
- return validPivot;
1718
- };
1719
761
  /**
1720
762
  * @param filterTree
1721
763
  * Returns a list of filters to be displayed
@@ -1811,9 +853,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1811
853
  ...constants_1.defaultAST,
1812
854
  ...baseAst,
1813
855
  ...(!baseAst?.columns && {
1814
- columns: getAllPossibleColumns().map((c) => {
856
+ columns: (0, astProcessing_1.getAllPossibleColumns)(baseAst, schema).map((c) => {
1815
857
  const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
1816
- newColumn.expr.column = c.name;
858
+ newColumn.expr.column = c.field;
1817
859
  return newColumn;
1818
860
  }),
1819
861
  }),
@@ -1838,9 +880,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1838
880
  ...constants_1.defaultAST,
1839
881
  ...baseAst,
1840
882
  ...(!baseAst?.columns && {
1841
- columns: getAllPossibleColumns().map((c) => {
883
+ columns: (0, astProcessing_1.getAllPossibleColumns)(baseAst, schema).map((c) => {
1842
884
  const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
1843
- newColumn.expr.column = c.name;
885
+ newColumn.expr.column = c.field;
1844
886
  return newColumn;
1845
887
  }),
1846
888
  }),
@@ -1873,9 +915,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1873
915
  ...constants_1.defaultAST,
1874
916
  ...baseAst,
1875
917
  ...(!baseAst?.columns && {
1876
- columns: getAllPossibleColumns().map((c) => {
918
+ columns: (0, astProcessing_1.getAllPossibleColumns)(baseAst, schema).map((c) => {
1877
919
  const newColumn = (0, util_1.deepCopy)(constants_1.defaultColumn);
1878
- newColumn.expr.column = c.name;
920
+ newColumn.expr.column = c.field;
1879
921
  return newColumn;
1880
922
  }),
1881
923
  }),
@@ -1891,38 +933,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1891
933
  }
1892
934
  }) }));
1893
935
  };
1894
- const getAllPossibleColumns = () => {
1895
- if (!baseAst || !baseAst.from) {
1896
- return schema.flatMap((table) => table.columns.map((c) => ({
1897
- ...c,
1898
- table: table.displayName,
1899
- })));
1900
- }
1901
- // TODO: support infinitely nested FROM table lookups.
1902
- // This currently only supports top-level table names in the FROM section
1903
- // of queries (eg. FROM "table_name", not "FROM (SELECT * FROM other) AS table_name")
1904
- const tableNamesInQuery = baseAst.from.map((tbl) => tbl.table);
1905
- return schema
1906
- .filter((t) => tableNamesInQuery.includes(t.displayName))
1907
- .flatMap((table) => table.columns
1908
- .map((c) => ({
1909
- ...c,
1910
- table: table.displayName,
1911
- }))
1912
- .sort((a, b) => {
1913
- const aIsId = a.name.toLowerCase() === 'id' ||
1914
- a.name.toLowerCase().endsWith('_id') ||
1915
- a.name.endsWith('Id');
1916
- const bIsId = b.name.toLowerCase() === 'id' ||
1917
- b.name.toLowerCase().endsWith('_id') ||
1918
- b.name.endsWith('Id');
1919
- if (aIsId && !bIsId)
1920
- return 1;
1921
- if (bIsId && !aIsId)
1922
- return -1;
1923
- return 0;
1924
- }));
1925
- };
1926
936
  /**
1927
937
  * Return whether all columns have been selected (used to hide select all
1928
938
  * and show clear button).
@@ -1946,497 +956,82 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1946
956
  },
1947
957
  as: null,
1948
958
  });
1949
- const AddConditionPopover = ({ onSave }) => {
1950
- return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [(0, jsx_runtime_1.jsx)("h1", { style: {
1951
- fontWeight: '600',
1952
- fontSize: 18,
1953
- margin: 0,
1954
- textAlign: 'left',
1955
- }, children: "Add condition" }), (0, jsx_runtime_1.jsx)(TabsComponent, { value: topLevelBinaryOperator, options: UiComponents_1.DEFAULT_TAB_OPTIONS, onChange: (event) => setTopLevelBinaryOperator(event.target.value) }), activeEditItem && renderNode(activeEditItem), (0, jsx_runtime_1.jsx)("div", { style: {
1956
- display: 'flex',
1957
- flexDirection: 'row',
1958
- gap: 8,
1959
- justifyContent: 'end',
1960
- }, children: (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: onSave, label: 'Add condition' }) })] }));
1961
- };
1962
- const fetchUponChange = async (baseAst, newFormData) => {
1963
- // if newFormData is null still use it
959
+ const fetchReportFromASTHelper = async (baseAst, newFormData, curPivot, curSchema, previousReport) => {
1964
960
  const curFormData = newFormData !== undefined ? newFormData : formData;
1965
- let rows;
1966
- if ((curFormData || baseAst) && !loading) {
1967
- try {
1968
- setLoading(true);
1969
- const hostedBody = {
1970
- metadata: {
1971
- clientId: client.publicKey,
1972
- ast: { ...baseAst, where: curFormData },
1973
- publicKey: client.publicKey,
1974
- orgId: client.customerId,
1975
- task: 'patterns',
1976
- getCustomFields: false,
1977
- customFields,
1978
- additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
1979
- useUpdatedDataGathering: true,
1980
- useNewNodeSql: true, // new flag
1981
- },
1982
- };
1983
- const tables = (0, ast_1.getTableNames)(baseAst);
1984
- const table = tables.length >= 1 ? tables[0] : initialTableName;
1985
- let newUniqueValues = uniqueValues;
1986
- let dateRangesTemp = dateRanges;
1987
- let curReport = tempReport;
1988
- if ((newUniqueValues && Object.keys(newUniqueValues).length === 0) ||
1989
- table !== currentTable) {
1990
- const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
1991
- if (tableInfo) {
1992
- newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
1993
- if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
1994
- setUniqueValues(newUniqueValues);
1995
- }
1996
- dateRangesTemp = await getDateRanges(tableInfo.columns, table);
1997
- setDateRanges(dateRangesTemp || {});
1998
- }
1999
- setCurrentTable(table);
2000
- }
2001
- const cloudBody = {};
2002
- const data2 = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
2003
- if (data2.success === false) {
2004
- throw new Error(data2.errorMessage);
2005
- }
2006
- if (client.databaseType &&
2007
- client.databaseType.toLowerCase() === 'bigquery') {
2008
- (0, dataProcessing_1.parseValueFromBigQueryDates)(data2.rows, columns);
2009
- }
2010
- rows = data2.rows;
2011
- if (data2.rowCount) {
2012
- setNumberOfRows(data2.rowCount);
2013
- }
2014
- if (data2.rows && data2.rows.length) {
2015
- if (pivot) {
2016
- // check if any of the pivot fields aren't in the data2.fields array
2017
- if (!isValidPivot(data2.fields)) {
2018
- const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
2019
- setPivot(null);
2020
- setPivotData(null);
2021
- setRows(data2.rows);
2022
- setColumns(processedFields);
2023
- if (data2.rowCount) {
2024
- const processedFormData = report
2025
- ? report
2026
- : (0, ChartBuilder_1.createInitialFormData)(processedFields);
2027
- setNumberOfRows(data2.rowCount);
2028
- curReport = {
2029
- ...formData,
2030
- ...processedFormData,
2031
- itemQuery: data2.itemQuery,
2032
- rowCount: data2.rowCount,
2033
- filtersApplied: [],
2034
- rows: data2.rows,
2035
- columns: processedFields,
2036
- };
2037
- setTempReport(curReport);
2038
- }
2039
- const formattedRows = formatRows(data2.rows, processedFields, false);
2040
- setFormattedRows(formattedRows);
2041
- return;
2042
- }
2043
- curReport = {
2044
- ...formData,
2045
- itemQuery: data2.itemQuery,
2046
- rowCount: data2.rowCount,
2047
- filtersApplied: [],
2048
- rows: data2.rows,
2049
- };
2050
- // Do all of this to make sure we have the right unique columns when applying a pivot
2051
- let dateBucket = undefined;
2052
- const tempDateRange = dateRangesTemp &&
2053
- pivot.rowField &&
2054
- dateRangesTemp[pivot.rowField];
2055
- if (tempDateRange) {
2056
- dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
2057
- }
2058
- let distinctValuesForQuery = {};
2059
- if (pivot.columnField) {
2060
- const sqlQuery = await fetchSqlQuery({ ...baseAst, where: curFormData }, null, false);
2061
- distinctValuesForQuery = await (0, tableProcessing_1.getUniqueValuesByColumns)([
2062
- {
2063
- field: pivot.columnField,
2064
- label: pivot.columnField,
2065
- format: 'string',
2066
- },
2067
- ], sqlQuery, [], client, customFields);
2068
- }
2069
- const pivotedData = await (0, PivotModal_1.generatePivotTable)(
2070
- // @ts-ignore
2071
- pivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, distinctValuesForQuery ? distinctValuesForQuery : undefined);
2072
- console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
2073
- const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
2074
- setPivotData(pivotedData);
2075
- setRows(data2.rows);
2076
- setColumns(processedFields);
2077
- if (data2.rowCount) {
2078
- const processedFormData = report
2079
- ? report
2080
- : (0, ChartBuilder_1.createInitialFormData)(processedFields);
2081
- setNumberOfRows(data2.rowCount);
2082
- setTempReport({
2083
- ...formData,
2084
- ...processedFormData,
2085
- itemQuery: data2.itemQuery,
2086
- rowCount: data2.rowCount,
2087
- filtersApplied: [],
2088
- rows: data2.rows,
2089
- columns: processedFields,
2090
- });
2091
- }
2092
- const formattedRows = formatRows(pivotedData.rows, processedFields, true, pivot.aggregationType);
2093
- setSelectedColumns(processedFields.map((column) => {
2094
- return `${table}.${column.field}`;
2095
- }));
2096
- setFormattedRows(formattedRows);
2097
- }
2098
- else {
2099
- const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
2100
- setRows(data2.rows);
2101
- setColumns(processedFields);
2102
- if (data2.rowCount) {
2103
- const processedFormData = report
2104
- ? report
2105
- : (0, ChartBuilder_1.createInitialFormData)(processedFields);
2106
- setNumberOfRows(data2.rowCount);
2107
- setTempReport({
2108
- ...formData,
2109
- ...processedFormData,
2110
- itemQuery: data2.itemQuery,
2111
- rowCount: data2.rowCount,
2112
- filtersApplied: [],
2113
- rows: data2.rows,
2114
- columns: processedFields,
2115
- });
2116
- }
2117
- setSelectedColumns(processedFields.map((column) => {
2118
- return `${table}.${column.field}`;
2119
- }));
2120
- const formattedRows = formatRows(data2.rows, processedFields, false);
2121
- setFormattedRows(formattedRows);
2122
- if (data2.errorMessage) {
2123
- setErrorMessage(`Error: ${data2.errorMessage}`);
2124
- }
2125
- }
2126
- }
2127
- else {
2128
- setRows([]);
2129
- setColumns([]);
2130
- setFormattedRows([]);
2131
- setPivotData(null);
2132
- }
2133
- setLoading(false);
2134
- setDataDisplayed(true);
2135
- return rows;
961
+ let reportBuilderInfo = undefined;
962
+ try {
963
+ setLoading(true);
964
+ reportBuilderInfo = await (0, report_1.fetchReportBuilderDataFromAST)(baseAst, curFormData, curSchema ?? schema, client, curPivot ?? pivot, formData, currentTable, { uniqueStrings: uniqueValues, dateRanges: dateRanges ?? {} }, previousReport ?? reportInfo ?? undefined, customFields);
965
+ if (reportBuilderInfo.error) {
966
+ throw new Error(reportBuilderInfo.error);
2136
967
  }
2137
- catch (e) {
2138
- setErrorMessage(e.message);
968
+ }
969
+ catch (err) {
970
+ if (err instanceof Error) {
971
+ setErrorMessage(err.message);
2139
972
  setLoading(false);
2140
- setDataDisplayed(true);
2141
- setRows([]);
2142
- setColumns([]);
2143
- setFormattedRows([]);
2144
- setPivotData(null);
2145
- return { error: true, message: e.message };
973
+ return { error: true, message: err.message, rows: [] };
2146
974
  }
975
+ setLoading(false);
976
+ setErrorMessage('Failed to fetch');
977
+ return { error: true, message: 'Failed to fetch', rows: [] };
2147
978
  }
2148
- };
2149
- // Returns whether a where-clause contains a nested subquery.
2150
- const isSubquery = (node) => {
2151
- if (!node)
2152
- return false;
2153
- if (node.ast)
2154
- return true;
2155
- if (node.left && isSubquery(node.left))
2156
- return true;
2157
- if (node.right && isSubquery(node.right))
2158
- return true;
2159
- if (node.value && Array.isArray(node.value)) {
2160
- for (const value of node.value) {
2161
- if (isSubquery(value))
2162
- return true;
2163
- }
979
+ if (!reportBuilderInfo) {
980
+ setErrorMessage('Failed to fetch');
981
+ return;
982
+ }
983
+ const reportTable = reportBuilderInfo.table;
984
+ const reportBuilderInfoColumns = reportBuilderInfo.columns.map((column) => {
985
+ return `${reportTable}.${column.field}`;
986
+ });
987
+ setRows(reportBuilderInfo.rows);
988
+ setColumns(reportBuilderInfo.columns);
989
+ setNumberOfRows(reportBuilderInfo.rowCount);
990
+ setPivot(reportBuilderInfo.pivot);
991
+ setPivotData(reportBuilderInfo.pivotData);
992
+ setFormattedRows(reportBuilderInfo.formattedRows);
993
+ setTempReport(reportBuilderInfo.report);
994
+ setSelectedColumns(reportBuilderInfoColumns);
995
+ setUniqueValues(reportBuilderInfo.uniqueValues);
996
+ updateFieldValuesMap(reportBuilderInfo.uniqueValues, reportBuilderInfo.table);
997
+ setDateRanges(reportBuilderInfo.dateRanges);
998
+ setLoading(false);
999
+ setDataDisplayed(true);
1000
+ setCurrentTable(reportBuilderInfo.table);
1001
+ setFormData(curFormData);
1002
+ if (reportBuilderInfo.pivot) {
1003
+ setPivotRowField(reportBuilderInfo.pivot.rowField);
1004
+ setPivotAggregation(reportBuilderInfo.pivot.aggregationType);
1005
+ setPivotColumnField(reportBuilderInfo.pivot.columnField);
1006
+ setPivotValueField(reportBuilderInfo.pivot.valueField);
2164
1007
  }
2165
- return false;
1008
+ setReportInfo(reportBuilderInfo.report);
2166
1009
  };
2167
- const handleAsk = async (overridePrompt = '') => {
2168
- if (!aiPrompt && !overridePrompt) {
1010
+ const fetchAstFromPromptHelper = async (overridePrompt) => {
1011
+ let astInfo = {};
1012
+ const prompt = overridePrompt || aiPrompt;
1013
+ if (!prompt) {
1014
+ setErrorMessage('Please supply a prompt.');
2169
1015
  return;
2170
1016
  }
2171
1017
  try {
2172
1018
  setLoading(true);
2173
- setAskedAQuestion(true);
2174
- setErrorMessage('');
2175
- let res, data, ast;
2176
- let numRetries = 0;
2177
- const MAX_RETRIES = 3;
2178
- // refetch the request if it comes back and we know it's invalid.
2179
- // TODO: remove this to allow joins later down the road
2180
- let isTableJoin = !ast || !ast.from || ast.from.length !== 1;
2181
- while (isTableJoin || isSubquery(ast?.where)) {
2182
- if (numRetries === MAX_RETRIES)
2183
- break;
2184
- if (!activeQuery || (ast && (isTableJoin || isSubquery(ast?.where)))) {
2185
- res = await fetch(`${exports.QUILL_SERVER}/magic`, {
2186
- method: 'POST',
2187
- headers: { 'Content-Type': 'application/json' },
2188
- body: JSON.stringify({
2189
- initialQuestion: aiPrompt || overridePrompt,
2190
- publicKey: client.publicKey,
2191
- useNewNodeSql: true, // new flag
2192
- }),
2193
- });
2194
- }
2195
- else {
2196
- res = await fetch(`${exports.QUILL_SERVER}/magic/edit`, {
2197
- method: 'POST',
2198
- headers: { 'Content-Type': 'application/json' },
2199
- body: JSON.stringify({
2200
- sqlQuery: activeQuery,
2201
- initialQuestion: aiPrompt,
2202
- publicKey: client.publicKey,
2203
- useNewNodeSql: true, // new flag
2204
- }),
2205
- });
2206
- }
2207
- data = await res.json();
2208
- ast = data?.ast?.length ? data?.ast[0] : data?.ast;
2209
- // TODO: Debug invalid table joins in handleAsk
2210
- isTableJoin =
2211
- ast?.type !== 'bigquery' &&
2212
- (!ast || !ast.from || ast.from.length !== 1);
2213
- numRetries += 1;
2214
- }
2215
- if (numRetries === MAX_RETRIES) {
2216
- console.error('[Error]: Max retries exceeded.');
2217
- console.info(`%c[Prompt]: ${aiPrompt}`, 'color: dimgray');
2218
- setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
2219
- return;
2220
- }
2221
- let currentSchema = schema;
2222
- if (currentSchema && currentSchema.length === 0) {
2223
- currentSchema = await fetchSchema();
2224
- }
2225
- let newAst, groupByPivot;
2226
- if (ast) {
2227
- // Unwrap the ast object, supporting many possible types
2228
- ast = ast.length ? ast[0] : ast;
2229
- newAst = (0, convert_1.convertBigQuery)(ast);
2230
- newAst = (0, convert_1.convertWildcardColumns)(newAst, currentSchema); // must go before groupby
2231
- ({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(newAst, pivot, currentSchema));
2232
- newAst = (0, convert_1.convertStringComparison)(newAst, client.databaseType);
2233
- newAst = (0, convert_1.convertRemoveSimpleParentheses)(newAst);
2234
- const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
2235
- const tableAlias = (0, ast_1.getTableAliases)(newAst)[0] ?? initialTableName;
2236
- newAst = (0, convert_1.convertUnaryToBinary)(newAst);
2237
- newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, tableAlias ?? table, getAllPossibleColumns().map((col) => col.name));
2238
- const procesedColumns = (0, util_1.deepCopy)(newAst).columns?.map((column) => {
2239
- if (column.expr.type === 'column_ref') {
2240
- const columnName = (0, ast_1.extractColumnish)(column.expr);
2241
- return `${table}.${columnName}`;
2242
- }
2243
- else if (column.as) {
2244
- return `${table}.${column.as}`;
2245
- }
2246
- return `${table}.${column.expr.value}`;
2247
- });
2248
- setSelectedColumns(procesedColumns);
2249
- if (groupByPivot) {
2250
- setBaseAst((0, util_1.deepCopy)({ ...newAst, orderby: null, limit: null }));
2251
- newAst = (0, util_1.deepCopy)({ ...newAst, orderby: null, limit: null });
2252
- }
2253
- else {
2254
- setBaseAst((0, util_1.deepCopy)({ ...newAst }));
2255
- }
2256
- setFormData((0, util_1.deepCopy)(newAst.where));
2257
- setTopLevelBinaryOperator(
2258
- // @ts-ignore
2259
- newAst?.where ? newAst?.where?.operator : 'AND');
2260
- }
2261
- ast = newAst; // so we fetch data for newAst later.
2262
- fetchSqlQuery(ast, undefined, false);
2263
- const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
2264
- const hostedBody = {
2265
- metadata: {
2266
- clientId: client.publicKey,
2267
- ast,
2268
- publicKey: client.publicKey,
2269
- orgId: client.customerId,
2270
- task: 'patterns',
2271
- additionalProcessing: { page: { currentPage: 0, rowsPerPage: 20 } },
2272
- useUpdatedDataGathering: true,
2273
- pivot: groupByPivot,
2274
- useNewNodeSql: true, // new flag
2275
- },
2276
- };
2277
- let currentUniqueValues = uniqueValues;
2278
- let dateRangesTemp = dateRanges;
2279
- if ((currentUniqueValues &&
2280
- currentUniqueValues[table] &&
2281
- Object.keys(currentUniqueValues[table]).length === 0) ||
2282
- table !== currentTable) {
2283
- const tableInfo = currentSchema.find((tableInfo) => tableInfo.name === table);
2284
- if (tableInfo) {
2285
- const newUniqueValues = await getUniqueStringValues(tableInfo.columns, table);
2286
- currentUniqueValues = newUniqueValues;
2287
- if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
2288
- setUniqueValues(newUniqueValues);
2289
- }
2290
- dateRangesTemp = await getDateRanges(tableInfo.columns, table);
2291
- setDateRanges(dateRangesTemp);
2292
- }
2293
- setCurrentTable(table);
2294
- }
2295
- const cloudBody = {};
2296
- const data2 = await (0, dataFetcher_1.getData)(client, 'patterns', 'same-origin', hostedBody, cloudBody);
2297
- if (!data2 || data2.status === 'error') {
2298
- throw new Error('Error querying data from patterns');
1019
+ astInfo = await (0, astProcessing_1.fetchAndProcessASTFromPrompt)(prompt, schema, client, pivot, activeQuery);
1020
+ if (astInfo.error) {
1021
+ throw new Error(astInfo.error);
2299
1022
  }
2300
- if (data2.rows && data2.rows.length) {
2301
- const processedFields = data2.fields
2302
- .map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem))
2303
- .map((elem) => {
2304
- const tableInfo = currentSchema.find((t) => t.name === table);
2305
- const columnInfo = tableInfo?.columns.find((column) => column.name === elem.field);
2306
- return columnInfo
2307
- ? (0, columnProcessing_1.convertColumnInfoToColumnInternal)(columnInfo)
2308
- : null;
2309
- })
2310
- .filter((elem) => elem);
2311
- let possiblePivot = true;
2312
- const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(processedFields, currentUniqueValues[table]);
2313
- if (groupByPivot &&
2314
- ((groupByPivot.columnField &&
2315
- !possibleColumns.columnFields.includes(groupByPivot?.columnField)) ||
2316
- (groupByPivot.rowField &&
2317
- !possibleColumns.rowFields.includes(groupByPivot?.rowField)) ||
2318
- (groupByPivot.valueField &&
2319
- !possibleColumns.valueFields.includes(groupByPivot?.valueField || '')))) {
2320
- possiblePivot = false;
2321
- let errorMessageEnding = '';
2322
- if (groupByPivot.columnField &&
2323
- !possibleColumns.columnFields.includes(groupByPivot?.columnField || '')) {
2324
- if (currentUniqueValues[table]?.[groupByPivot?.columnField || '']) {
2325
- errorMessageEnding = `The column ${groupByPivot?.columnField} has more than 24 unique values to pivot on.`;
2326
- }
2327
- else {
2328
- errorMessageEnding = `The column ${groupByPivot?.columnField} is not a proper column field.`;
2329
- }
2330
- }
2331
- else if (groupByPivot.rowField &&
2332
- !possibleColumns.rowFields.includes(groupByPivot?.rowField || '')) {
2333
- if (currentUniqueValues[table]?.[groupByPivot?.rowField || '']) {
2334
- errorMessageEnding = `The column ${groupByPivot?.rowField} has more than 36 unique values to pivot on.`;
2335
- }
2336
- else {
2337
- errorMessageEnding = `The column ${groupByPivot?.rowField} is not a proper row field.`;
2338
- }
2339
- }
2340
- else if (groupByPivot.valueField &&
2341
- !possibleColumns.valueFields.includes(groupByPivot?.valueField || '')) {
2342
- errorMessageEnding = `The column ${groupByPivot?.valueField} is not a proper value field.`;
2343
- }
2344
- setErrorMessage(`The requested pivot is not supported. ${errorMessageEnding}`);
2345
- }
2346
- if (groupByPivot && possiblePivot) {
2347
- let curReport = report ? report : undefined;
2348
- if (data2.rowCount) {
2349
- const processedFormData = report
2350
- ? report
2351
- : (0, ChartBuilder_1.createInitialFormData)(processedFields);
2352
- setNumberOfRows(data2.rowCount);
2353
- curReport = {
2354
- ...formData,
2355
- ...processedFormData,
2356
- itemQuery: data2.itemQuery,
2357
- rowCount: data2.rowCount,
2358
- filtersApplied: [],
2359
- rows: data2.rows,
2360
- columns: processedFields,
2361
- };
2362
- setTempReport(curReport || null);
2363
- }
2364
- let dateBucket = undefined;
2365
- const tempDateRange = dateRangesTemp &&
2366
- groupByPivot.rowField &&
2367
- dateRangesTemp[groupByPivot.rowField];
2368
- if (tempDateRange) {
2369
- dateBucket = (0, dates_1.getDateBucketFromRange)(tempDateRange.dateRange);
2370
- }
2371
- const pivotedData = await (0, PivotModal_1.generatePivotTable)(
2372
- // @ts-ignore
2373
- groupByPivot, data2.rows, undefined, false, -1, undefined, dateBucket, curReport, client, groupByPivot.columnField
2374
- ? currentUniqueValues[groupByPivot.columnField]
2375
- : undefined);
2376
- console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
2377
- setPivotData(pivotedData);
2378
- setPivot(groupByPivot);
2379
- if (client.databaseType &&
2380
- client.databaseType.toLowerCase() === 'bigquery') {
2381
- (0, dataProcessing_1.parseValueFromBigQueryDates)(data2.rows, processedFields);
2382
- }
2383
- setRows(data2.rows);
2384
- setPivotRowField(groupByPivot?.rowField);
2385
- setPivotColumnField(groupByPivot?.columnField);
2386
- setPivotValueField(groupByPivot?.valueField);
2387
- setPivotAggregation(groupByPivot?.aggregationType);
2388
- setColumns(processedFields);
2389
- const formattedRows = formatRows(pivotedData.rows, processedFields, true, groupByPivot.aggregationType);
2390
- setFormattedRows(formattedRows);
2391
- }
2392
- else {
2393
- const processedFields = data2.fields.map((elem) => (0, columnProcessing_1.convertPostgresColumn)(elem));
2394
- if (client.databaseType &&
2395
- client.databaseType.toLowerCase() === 'bigquery') {
2396
- (0, dataProcessing_1.parseValueFromBigQueryDates)(data2.rows, processedFields);
2397
- }
2398
- setRows(data2.rows);
2399
- setColumns(processedFields);
2400
- if (data2.rowCount) {
2401
- setNumberOfRows(data2.rowCount);
2402
- setTempReport({
2403
- ...formData,
2404
- itemQuery: data2.itemQuery,
2405
- rowCount: data2.rowCount,
2406
- filtersApplied: [],
2407
- rows: data2.rows,
2408
- columns: processedFields,
2409
- });
2410
- }
2411
- const formattedRows = formatRows(data2.rows, processedFields, false);
2412
- setFormattedRows(formattedRows);
2413
- }
2414
- return data2.rows;
2415
- }
2416
- else {
2417
- setPivotData([]);
2418
- setRows([]);
2419
- setColumns([]);
2420
- setFormattedRows([]);
2421
- }
2422
- if (data2.query) {
2423
- setActiveQuery(data2.query);
2424
- }
2425
- else {
2426
- setActiveQuery('');
2427
- }
2428
- if (data2.errorMessage) {
2429
- setErrorMessage(`Error: Couldn't process your request, please re-word your prompt.`);
2430
- }
2431
- }
2432
- catch (e) {
2433
- console.error(e);
2434
- setErrorMessage(`Error: Couldn't process your request, please re-word your prompt.`);
2435
1023
  }
2436
- finally {
2437
- setLoading(false);
2438
- setDataDisplayed(true);
1024
+ catch (err) {
1025
+ if (err instanceof Error) {
1026
+ setErrorMessage(err.message);
1027
+ setLoading(false);
1028
+ }
1029
+ return;
2439
1030
  }
1031
+ setBaseAst(astInfo.ast);
1032
+ setFormData(astInfo.whereAst);
1033
+ fetchSqlQuery(astInfo.ast, astInfo.whereAst, false);
1034
+ await fetchReportFromASTHelper(astInfo.ast, astInfo.whereAST, astInfo.pivot);
2440
1035
  };
2441
1036
  const handleDeleteColumn = (name) => {
2442
1037
  if (!baseAst || !baseAst.columns.length || selectedColumns.length === 1) {
@@ -2628,46 +1223,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
2628
1223
  setIsPending(false);
2629
1224
  const item = (0, astFilterProcessing_1.filterToAst)(filter, client.databaseType.toLowerCase());
2630
1225
  handleInsertion(item, 'AND', false);
2631
- }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
2632
- false && ( // temp removed the AddConditionPopover
2633
- (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2634
- if (!openPopover) {
2635
- setActiveEditItem((0, util_1.deepCopy)(constants_1.defaultEntry));
2636
- setOpenPopover('AddConditionPopover');
2637
- setActivePath('');
2638
- setIsPending(true);
2639
- }
2640
- }, label: "Add condition" }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddConditionPopover', setIsOpen: (isOpen) => {
2641
- if (!isOpen) {
2642
- setIsPending(false);
2643
- setTimeout(() => {
2644
- clearCheckboxes();
2645
- setActiveEditItem(null);
2646
- }, 300);
2647
- setActivePath(null);
2648
- setOpenPopover(null);
2649
- }
2650
- }, popoverTitle: "Add condition", popoverChildren: (0, jsx_runtime_1.jsx)(AddConditionPopover, { onSave: () => {
2651
- if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2652
- setIsPending(false);
2653
- setTimeout(() => {
2654
- setActiveEditItem(null);
2655
- clearCheckboxes();
2656
- }, 300);
2657
- setActivePath(null);
2658
- setOpenPopover(null);
2659
- }
2660
- else {
2661
- setIsPending(false);
2662
- handleInsertion(activeEditItem, topLevelBinaryOperator, true);
2663
- setTimeout(() => {
2664
- setActiveEditItem(null);
2665
- clearCheckboxes();
2666
- }, 300);
2667
- setActivePath(null);
2668
- setOpenPopover(null);
2669
- }
2670
- } }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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: () => {
1226
+ }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, SecondaryButtonComponent: SecondaryButtonComponent, MultiSelectComponent: MultiSelectComponent }) }) })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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: () => {
2671
1227
  setPivot(null);
2672
1228
  setPivotData(null);
2673
1229
  const formattedRows = formatRows(rows, columns, false);
@@ -2676,7 +1232,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
2676
1232
  // TODOs
2677
1233
  selectPivot: () => {
2678
1234
  return;
2679
- }, 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 && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
1235
+ }, 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 ?? reportInfo }), pivot && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: columns, uniqueValues: uniqueValues[currentTable], setPivotRowField: (value) => {
2680
1236
  setPivotRowField(value);
2681
1237
  }, setPivotColumnField: setPivotColumnField, setPivotValueField: setPivotValueField, setPivotAggregation: setPivotAggregation, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotValueField: pivotValueField, pivotAggregation: pivotAggregation, onDelete: () => {
2682
1238
  setPivot(null);
@@ -2822,9 +1378,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
2822
1378
  display: 'flex',
2823
1379
  flexDirection: 'row',
2824
1380
  gap: '12px',
2825
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } }), !hideCopySQL && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => copySQLToClipboard(), label: isCopying ? '✅ Copied' : 'Copy SQL' })), (0, jsx_runtime_1.jsx)(ButtonComponent, { label: report ? 'Save changes' : 'Add to dashboard', onClick: () => { } })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] }));
1381
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } }), !hideCopySQL && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => copySQLToClipboard(), label: isCopying ? '✅ Copied' : 'Copy SQL' })), (0, jsx_runtime_1.jsx)(ButtonComponent, { label: reportInfo ? 'Save changes' : 'Add to dashboard', onClick: () => { } })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] }));
2826
1382
  }
2827
- return ((0, jsx_runtime_1.jsxs)("div", { style: { backgroundColor: theme.backgroundColor, ...containerStyle }, className: className, children: [(!isChartBuilderHorizontalView ||
1383
+ return ((0, jsx_runtime_1.jsxs)("div", { style: { backgroundColor: theme?.backgroundColor, ...containerStyle }, className: className, children: [(!isChartBuilderHorizontalView ||
2828
1384
  (isChartBuilderHorizontalView && !isChartBuilderOpen)) && ((0, jsx_runtime_1.jsxs)("div", { ref: parentRef, style: {
2829
1385
  display: 'flex',
2830
1386
  flexDirection: 'row',
@@ -2909,47 +1465,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
2909
1465
  setIsPending(false);
2910
1466
  const item = (0, astFilterProcessing_1.filterToAst)(filter, client.databaseType.toLowerCase());
2911
1467
  handleInsertion(item, 'AND', false);
2912
- }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent }) }) }), baseAst?.where &&
2913
- false && ( // temp removed the AddConditionPopover
2914
- (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2915
- if (!openPopover) {
2916
- setActiveEditItem((0, util_1.deepCopy)(constants_1.defaultEntry));
2917
- setOpenPopover('AddConditionPopover');
2918
- setActivePath('');
2919
- setIsPending(true);
2920
- }
2921
- }, label: 'Add condition' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddConditionPopover', setIsOpen: (isOpen) => {
2922
- if (!isOpen) {
2923
- // delay onClose callback so onClick no-ops
2924
- setTimeout(() => {
2925
- setIsPending(false);
2926
- setActiveEditItem(null);
2927
- setActivePath(null);
2928
- setOpenPopover(null);
2929
- clearCheckboxes();
2930
- }, 200);
2931
- }
2932
- }, popoverChildren: (0, jsx_runtime_1.jsx)(AddConditionPopover, { onSave: () => {
2933
- if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2934
- setIsPending(false);
2935
- setTimeout(() => {
2936
- setActiveEditItem(null);
2937
- }, 300);
2938
- setActivePath(null);
2939
- setOpenPopover(null);
2940
- clearCheckboxes();
2941
- }
2942
- else {
2943
- setIsPending(false);
2944
- handleInsertion(activeEditItem, topLevelBinaryOperator, true);
2945
- setTimeout(() => {
2946
- setActiveEditItem(null);
2947
- }, 300);
2948
- setActivePath(null);
2949
- setOpenPopover(null);
2950
- clearCheckboxes();
2951
- }
2952
- } }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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: () => {
1468
+ }, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent }) }) })] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.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: () => {
2953
1469
  setPivot(null);
2954
1470
  setPivotData(null);
2955
1471
  const formattedRows = formatRows(rows, columns, false);
@@ -3244,7 +1760,9 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
3244
1760
  ? askAIInputWidth
3245
1761
  : askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: askedAQuestion
3246
1762
  ? 'Ask a follow-up question...'
3247
- : 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading: tableLoading ||
1763
+ : 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => {
1764
+ fetchAstFromPromptHelper();
1765
+ }, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading: tableLoading ||
3248
1766
  (loading && errorMessage.length === 0) ||
3249
1767
  initialChartLoad, rows: formattedRows, rowCount: pivot ? undefined : numberOfRows, columns: pivot
3250
1768
  ? pivotData?.columns || emptyPivotColumns()
@@ -3265,15 +1783,17 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
3265
1783
  width: '100%',
3266
1784
  gap: 12,
3267
1785
  alignItems: 'center',
3268
- }, children: [(0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: errorMessage }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [!hideCopySQL && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => {
1786
+ }, children: [(0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: errorMessage }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
1787
+ fetchAstFromPromptHelper();
1788
+ }, label: 'Retry' })] })) : ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } })), baseAst && dataDisplayed && !initialChartLoad && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [!hideCopySQL && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => {
3269
1789
  setIsChartBuilderOpen(true);
3270
- }, disabled: !!errorMessage, label: report ? 'Save changes' : 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { report: report
1790
+ }, disabled: !!errorMessage, label: reportId ? 'Save changes' : 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { report: reportInfo
3271
1791
  ? {
3272
- ...report,
1792
+ ...reportInfo,
3273
1793
  ...tempReport,
3274
1794
  pivot: pivot,
3275
- yAxisFields: report.pivot && !pivot ? [] : report.yAxisFields,
3276
- columns: report.columns.filter((col) => {
1795
+ yAxisFields: reportInfo.pivot && !pivot ? [] : reportInfo.yAxisFields,
1796
+ columns: reportInfo.columns.filter((col) => {
3277
1797
  return columns.find((c) => {
3278
1798
  return col.field === c.field;
3279
1799
  });
@@ -3281,6 +1801,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
3281
1801
  queryString: activeQuery,
3282
1802
  rows: rows,
3283
1803
  }
3284
- : 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 }))] }));
1804
+ : tempReport, rows: rows, columns: columns, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: reportId ? 'Save changes' : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: reportId ? 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: !!reportId ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement, rowCount: numberOfRows, onPageChange: onPageChange, onSortChange: onSortChange, isLoading: tableLoading }))] }));
3285
1805
  }
3286
1806
  exports.default = ReportBuilder;