@quillsql/react 2.14.16 → 2.15.0

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 (253) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +12 -0
  3. package/dist/cjs/ChartBuilder.d.ts +3 -2
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +112 -18
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/ChartEditor.js +2 -0
  8. package/dist/cjs/Context.d.ts +6 -2
  9. package/dist/cjs/Context.d.ts.map +1 -1
  10. package/dist/cjs/Context.js +160 -33
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +99 -19
  13. package/dist/cjs/QuillProvider.d.ts +38 -1
  14. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  15. package/dist/cjs/QuillProvider.js +2 -2
  16. package/dist/cjs/ReportBuilder.d.ts +7 -2
  17. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  18. package/dist/cjs/ReportBuilder.js +104 -1271
  19. package/dist/cjs/SQLEditor.d.ts +9 -2
  20. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  21. package/dist/cjs/SQLEditor.js +67 -10
  22. package/dist/cjs/Table.d.ts.map +1 -1
  23. package/dist/cjs/Table.js +12 -0
  24. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
  25. package/dist/cjs/components/Chart/InternalChart.js +24 -1
  26. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  27. package/dist/cjs/components/Dashboard/DashboardTemplate.js +2 -1
  28. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  29. package/dist/cjs/components/Dashboard/DataLoader.js +73 -2
  30. package/dist/cjs/components/Dashboard/util.d.ts +2 -1
  31. package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
  32. package/dist/cjs/components/Dashboard/util.js +12 -1
  33. package/dist/cjs/components/QuillTable.d.ts +2 -1
  34. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  35. package/dist/cjs/components/QuillTable.js +2 -2
  36. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts +2 -1
  37. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  38. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +28 -3
  39. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts +49 -0
  40. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts.map +1 -0
  41. package/dist/cjs/components/ReportBuilder/ColumnComponent.js +46 -0
  42. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts +65 -0
  43. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts.map +1 -0
  44. package/dist/cjs/components/ReportBuilder/FilterComponent.js +51 -0
  45. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts +42 -0
  46. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/LimitComponent.js +50 -0
  48. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts +66 -0
  49. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts.map +1 -0
  50. package/dist/cjs/components/ReportBuilder/PivotComponent.js +47 -0
  51. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts +162 -0
  52. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts.map +1 -0
  53. package/dist/cjs/components/ReportBuilder/SaveReport.js +31 -0
  54. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts +42 -0
  55. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts.map +1 -0
  56. package/dist/cjs/components/ReportBuilder/SortComponent.js +50 -0
  57. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts +28 -0
  58. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts.map +1 -0
  59. package/dist/cjs/components/ReportBuilder/TableComponent.js +24 -0
  60. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  61. package/dist/cjs/components/ReportBuilder/ui.js +3 -1
  62. package/dist/cjs/components/UiComponents.d.ts +5 -2
  63. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  64. package/dist/cjs/components/UiComponents.js +7 -5
  65. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  66. package/dist/cjs/hooks/useAskQuill.js +38 -0
  67. package/dist/cjs/hooks/useDashboard.d.ts +1 -1
  68. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  69. package/dist/cjs/hooks/useDashboard.js +62 -6
  70. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  71. package/dist/cjs/hooks/useExport.js +5 -2
  72. package/dist/cjs/hooks/useLongLoading.d.ts +13 -0
  73. package/dist/cjs/hooks/useLongLoading.d.ts.map +1 -0
  74. package/dist/cjs/hooks/useLongLoading.js +67 -0
  75. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  76. package/dist/cjs/hooks/useQuill.js +25 -1
  77. package/dist/cjs/hooks/useReportBuilder.d.ts +178 -0
  78. package/dist/cjs/hooks/useReportBuilder.d.ts.map +1 -0
  79. package/dist/cjs/hooks/useReportBuilder.js +1495 -0
  80. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  81. package/dist/cjs/hooks/useVirtualTables.js +27 -2
  82. package/dist/cjs/index.d.ts +11 -0
  83. package/dist/cjs/index.d.ts.map +1 -1
  84. package/dist/cjs/index.js +17 -1
  85. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +14 -1
  86. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  87. package/dist/cjs/internals/ReportBuilder/PivotForm.js +86 -3
  88. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  89. package/dist/cjs/internals/ReportBuilder/PivotList.js +3 -3
  90. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +18 -2
  91. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  92. package/dist/cjs/internals/ReportBuilder/PivotModal.js +438 -147
  93. package/dist/cjs/models/Filter.d.ts +1 -1
  94. package/dist/cjs/models/Filter.d.ts.map +1 -1
  95. package/dist/cjs/models/Filter.js +3 -3
  96. package/dist/cjs/utils/astFilterProcessing.d.ts.map +1 -1
  97. package/dist/cjs/utils/astFilterProcessing.js +25 -4
  98. package/dist/cjs/utils/astProcessing.d.ts +4 -2
  99. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  100. package/dist/cjs/utils/astProcessing.js +25 -2
  101. package/dist/cjs/utils/client.d.ts +2 -1
  102. package/dist/cjs/utils/client.d.ts.map +1 -1
  103. package/dist/cjs/utils/client.js +12 -1
  104. package/dist/cjs/utils/dashboard.d.ts +3 -1
  105. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  106. package/dist/cjs/utils/dashboard.js +44 -3
  107. package/dist/cjs/utils/filterProcessing.d.ts +2 -1
  108. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  109. package/dist/cjs/utils/filterProcessing.js +12 -1
  110. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  111. package/dist/cjs/utils/pivotConstructor.js +15 -10
  112. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  113. package/dist/cjs/utils/pivotProcessing.js +13 -3
  114. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  115. package/dist/cjs/utils/queryConstructor.js +30 -16
  116. package/dist/cjs/utils/report.d.ts +10 -5
  117. package/dist/cjs/utils/report.d.ts.map +1 -1
  118. package/dist/cjs/utils/report.js +55 -7
  119. package/dist/cjs/utils/reportBuilder.d.ts.map +1 -1
  120. package/dist/cjs/utils/reportBuilder.js +5 -2
  121. package/dist/cjs/utils/schema.d.ts +5 -2
  122. package/dist/cjs/utils/schema.d.ts.map +1 -1
  123. package/dist/cjs/utils/schema.js +14 -2
  124. package/dist/cjs/utils/tableProcessing.d.ts +17 -10
  125. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  126. package/dist/cjs/utils/tableProcessing.js +99 -17
  127. package/dist/esm/Chart.d.ts.map +1 -1
  128. package/dist/esm/Chart.js +13 -1
  129. package/dist/esm/ChartBuilder.d.ts +3 -2
  130. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  131. package/dist/esm/ChartBuilder.js +114 -20
  132. package/dist/esm/ChartEditor.d.ts.map +1 -1
  133. package/dist/esm/ChartEditor.js +3 -1
  134. package/dist/esm/Context.d.ts +6 -2
  135. package/dist/esm/Context.d.ts.map +1 -1
  136. package/dist/esm/Context.js +159 -32
  137. package/dist/esm/Dashboard.d.ts.map +1 -1
  138. package/dist/esm/Dashboard.js +100 -20
  139. package/dist/esm/QuillProvider.d.ts +38 -1
  140. package/dist/esm/QuillProvider.d.ts.map +1 -1
  141. package/dist/esm/QuillProvider.js +2 -2
  142. package/dist/esm/ReportBuilder.d.ts +7 -2
  143. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  144. package/dist/esm/ReportBuilder.js +107 -1271
  145. package/dist/esm/SQLEditor.d.ts +9 -2
  146. package/dist/esm/SQLEditor.d.ts.map +1 -1
  147. package/dist/esm/SQLEditor.js +68 -11
  148. package/dist/esm/Table.d.ts.map +1 -1
  149. package/dist/esm/Table.js +13 -1
  150. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  151. package/dist/esm/components/Chart/InternalChart.js +25 -2
  152. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  153. package/dist/esm/components/Dashboard/DashboardTemplate.js +3 -2
  154. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  155. package/dist/esm/components/Dashboard/DataLoader.js +74 -3
  156. package/dist/esm/components/Dashboard/util.d.ts +2 -1
  157. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  158. package/dist/esm/components/Dashboard/util.js +12 -1
  159. package/dist/esm/components/QuillTable.d.ts +2 -1
  160. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  161. package/dist/esm/components/QuillTable.js +2 -2
  162. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts +2 -1
  163. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  164. package/dist/esm/components/ReportBuilder/AddColumnModal.js +29 -4
  165. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts +49 -0
  166. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts.map +1 -0
  167. package/dist/esm/components/ReportBuilder/ColumnComponent.js +39 -0
  168. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts +65 -0
  169. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts.map +1 -0
  170. package/dist/esm/components/ReportBuilder/FilterComponent.js +44 -0
  171. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts +42 -0
  172. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts.map +1 -0
  173. package/dist/esm/components/ReportBuilder/LimitComponent.js +46 -0
  174. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts +66 -0
  175. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts.map +1 -0
  176. package/dist/esm/components/ReportBuilder/PivotComponent.js +40 -0
  177. package/dist/esm/components/ReportBuilder/SaveReport.d.ts +162 -0
  178. package/dist/esm/components/ReportBuilder/SaveReport.d.ts.map +1 -0
  179. package/dist/esm/components/ReportBuilder/SaveReport.js +31 -0
  180. package/dist/esm/components/ReportBuilder/SortComponent.d.ts +42 -0
  181. package/dist/esm/components/ReportBuilder/SortComponent.d.ts.map +1 -0
  182. package/dist/esm/components/ReportBuilder/SortComponent.js +46 -0
  183. package/dist/esm/components/ReportBuilder/TableComponent.d.ts +28 -0
  184. package/dist/esm/components/ReportBuilder/TableComponent.d.ts.map +1 -0
  185. package/dist/esm/components/ReportBuilder/TableComponent.js +20 -0
  186. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  187. package/dist/esm/components/ReportBuilder/ui.js +4 -2
  188. package/dist/esm/components/UiComponents.d.ts +5 -2
  189. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  190. package/dist/esm/components/UiComponents.js +7 -5
  191. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  192. package/dist/esm/hooks/useAskQuill.js +39 -1
  193. package/dist/esm/hooks/useDashboard.d.ts +1 -1
  194. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  195. package/dist/esm/hooks/useDashboard.js +63 -7
  196. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  197. package/dist/esm/hooks/useExport.js +6 -3
  198. package/dist/esm/hooks/useLongLoading.d.ts +13 -0
  199. package/dist/esm/hooks/useLongLoading.d.ts.map +1 -0
  200. package/dist/esm/hooks/useLongLoading.js +64 -0
  201. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  202. package/dist/esm/hooks/useQuill.js +26 -2
  203. package/dist/esm/hooks/useReportBuilder.d.ts +178 -0
  204. package/dist/esm/hooks/useReportBuilder.d.ts.map +1 -0
  205. package/dist/esm/hooks/useReportBuilder.js +1490 -0
  206. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  207. package/dist/esm/hooks/useVirtualTables.js +28 -3
  208. package/dist/esm/index.d.ts +11 -0
  209. package/dist/esm/index.d.ts.map +1 -1
  210. package/dist/esm/index.js +8 -0
  211. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +14 -1
  212. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  213. package/dist/esm/internals/ReportBuilder/PivotForm.js +87 -4
  214. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  215. package/dist/esm/internals/ReportBuilder/PivotList.js +3 -3
  216. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +18 -2
  217. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  218. package/dist/esm/internals/ReportBuilder/PivotModal.js +440 -149
  219. package/dist/esm/models/Filter.d.ts +1 -1
  220. package/dist/esm/models/Filter.d.ts.map +1 -1
  221. package/dist/esm/models/Filter.js +3 -3
  222. package/dist/esm/utils/astFilterProcessing.d.ts.map +1 -1
  223. package/dist/esm/utils/astFilterProcessing.js +25 -4
  224. package/dist/esm/utils/astProcessing.d.ts +4 -2
  225. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  226. package/dist/esm/utils/astProcessing.js +25 -2
  227. package/dist/esm/utils/client.d.ts +2 -1
  228. package/dist/esm/utils/client.d.ts.map +1 -1
  229. package/dist/esm/utils/client.js +12 -1
  230. package/dist/esm/utils/dashboard.d.ts +3 -1
  231. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  232. package/dist/esm/utils/dashboard.js +44 -3
  233. package/dist/esm/utils/filterProcessing.d.ts +2 -1
  234. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  235. package/dist/esm/utils/filterProcessing.js +12 -1
  236. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  237. package/dist/esm/utils/pivotConstructor.js +15 -10
  238. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  239. package/dist/esm/utils/pivotProcessing.js +13 -3
  240. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  241. package/dist/esm/utils/queryConstructor.js +30 -16
  242. package/dist/esm/utils/report.d.ts +10 -5
  243. package/dist/esm/utils/report.d.ts.map +1 -1
  244. package/dist/esm/utils/report.js +55 -7
  245. package/dist/esm/utils/reportBuilder.d.ts.map +1 -1
  246. package/dist/esm/utils/reportBuilder.js +5 -2
  247. package/dist/esm/utils/schema.d.ts +5 -2
  248. package/dist/esm/utils/schema.d.ts.map +1 -1
  249. package/dist/esm/utils/schema.js +14 -2
  250. package/dist/esm/utils/tableProcessing.d.ts +17 -10
  251. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  252. package/dist/esm/utils/tableProcessing.js +99 -17
  253. package/package.json +1 -1
@@ -1,7 +1,4 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.default = ReportBuilder;
7
4
  const jsx_runtime_1 = require("react/jsx-runtime");
@@ -11,34 +8,19 @@ const Context_1 = require("./Context");
11
8
  const ChartBuilder_1 = require("./ChartBuilder");
12
9
  const UiComponents_2 = require("./components/UiComponents");
13
10
  const ui_1 = require("./components/ReportBuilder/ui");
14
- const AddSortPopover_1 = require("./components/ReportBuilder/AddSortPopover");
15
- const PivotModal_1 = require("./internals/ReportBuilder/PivotModal");
16
- const textProcessing_1 = require("./utils/textProcessing");
17
- const AddLimitPopover_1 = require("./components/ReportBuilder/AddLimitPopover");
18
11
  const width_1 = require("./utils/width");
19
12
  const QuillSelect_1 = require("./components/QuillSelect");
20
13
  const QuillCard_1 = require("./components/QuillCard");
21
- const pivotProcessing_1 = require("./utils/pivotProcessing");
22
- const tableProcessing_1 = require("./utils/tableProcessing");
23
- const astProcessing_1 = require("./utils/astProcessing");
24
- const PivotForm_1 = __importDefault(require("./internals/ReportBuilder/PivotForm"));
25
- const FilterModal_1 = __importDefault(require("./components/ReportBuilder/FilterModal"));
26
14
  const QuillMultiSelectWithCombo_1 = require("./components/QuillMultiSelectWithCombo");
27
- const paginationProcessing_1 = require("./utils/paginationProcessing");
28
- const report_1 = require("./utils/report");
29
- const Report_1 = require("./models/Report");
30
- const FilterStack_1 = __importDefault(require("./components/ReportBuilder/FilterStack"));
31
15
  const constants_1 = require("./utils/constants");
32
- const convert_1 = require("./components/ReportBuilder/convert");
33
- const dashboard_1 = require("./utils/dashboard");
34
- const useDashboard_1 = require("./hooks/useDashboard");
35
- const ReportBuilder_1 = require("./models/ReportBuilder");
36
- const DraggableColumns_1 = __importDefault(require("./components/ReportBuilder/DraggableColumns"));
37
- const AddColumnModal_1 = __importDefault(require("./components/ReportBuilder/AddColumnModal"));
38
- const reportBuilder_1 = require("./utils/reportBuilder");
39
- const dataFetcher_1 = require("./utils/dataFetcher");
40
- const schema_1 = require("./utils/schema");
41
- const filterProcessing_1 = require("./utils/filterProcessing");
16
+ const useReportBuilder_1 = require("./hooks/useReportBuilder");
17
+ const ColumnComponent_1 = require("./components/ReportBuilder/ColumnComponent");
18
+ const FilterComponent_1 = require("./components/ReportBuilder/FilterComponent");
19
+ const PivotComponent_1 = require("./components/ReportBuilder/PivotComponent");
20
+ const LimitComponent_1 = require("./components/ReportBuilder/LimitComponent");
21
+ const SortComponent_1 = require("./components/ReportBuilder/SortComponent");
22
+ const SaveReport_1 = require("./components/ReportBuilder/SaveReport");
23
+ const TableComponent_1 = require("./components/ReportBuilder/TableComponent");
42
24
  /**
43
25
  * Quill Report Builder
44
26
  *
@@ -70,7 +52,7 @@ const filterProcessing_1 = require("./utils/filterProcessing");
70
52
  * ### Report Builder API
71
53
  * @see https://docs.quillsql.com/components/report-builder
72
54
  */
73
- function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, onSubmitSaveQuery = () => void null, onDiscardChanges = undefined, onSaveChanges = undefined, onCloseChartBuilder = undefined, destinationDashboard, destinationSection, chartBuilderTitle = 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.QuillTableReportBuilderComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.QuillChartBuilderCheckboxComponent, 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, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, }) {
55
+ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void null, onSubmitCreateReport = () => void null, onSubmitSaveQuery = () => void null, onDiscardChanges = undefined, onSaveChanges = undefined, onCloseChartBuilder = undefined, destinationDashboard, destinationSection, chartBuilderTitle = 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.QuillTableReportBuilderComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.QuillChartBuilderCheckboxComponent, 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, containerStyle, className, pivotRecommendationsEnabled = true, reportId, hideCopySQL = true, isChartBuilderHorizontalView = true, onClickChartElement, onRequestAddVirtualTable, }) {
74
56
  /**
75
57
  * The state of the ReportBuilder is based off of an AST, which is a representation of a sql query
76
58
  * ASTs for the same query can vary between database types, so we create a layer of abstraction on top of it
@@ -110,928 +92,45 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
110
92
  // isChartBuilderHorizontalView: whether the chart builder is in horizontal view mode
111
93
  // onClickChartElement: a callback function triggered when a chart element is clicked
112
94
  // Contexts
113
- const { allReportsById } = (0, useDashboard_1.useAllReports)();
114
- const [schemaData] = (0, react_1.useContext)(Context_1.SchemaDataContext);
115
- const { dashboards } = (0, useDashboard_1.useDashboards)();
116
- const { data, isLoading: dashboardIsLoading, reload, } = (0, useDashboard_1.useDashboardInternal)(destinationDashboard);
117
- const { getToken } = (0, react_1.useContext)(Context_1.FetchContext);
118
- const destinationDashboardConfig = (0, react_1.useMemo)(() => {
119
- return dashboards?.find((d) => d.name === destinationDashboard);
120
- }, [dashboards, destinationDashboard]);
121
- const filteredSchema = (0, react_1.useMemo)(() => {
122
- return schemaData.schemaWithCustomFields?.filter((table) => {
123
- return (destinationDashboardConfig?.tenantKeys?.[0] === constants_1.SINGLE_TENANT ||
124
- !table.ownerTenantFields ||
125
- table.ownerTenantFields?.length === 0 ||
126
- table.ownerTenantFields?.includes(destinationDashboardConfig?.tenantKeys?.[0] ?? ''));
127
- });
128
- }, [
129
- schemaData.schemaWithCustomFields,
130
- destinationDashboardConfig?.tenantKeys,
131
- ]);
132
- const { tenants } = (0, react_1.useContext)(Context_1.TenantContext);
133
95
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
134
- const [client] = (0, react_1.useContext)(Context_1.ClientContext);
135
96
  // Refs
136
97
  const parentRef = (0, react_1.useRef)(null);
137
- // Consts
138
- const REPORT_BUILDER_PAGINATION = {
139
- page: 0,
140
- rowsPerPage: 20,
141
- rowsPerRequest: 100,
142
- };
143
- // ReportBuilder UI States
98
+ const askAIContainerRef = (0, react_1.useRef)(null);
99
+ const [askAIInputWidth, setAskAIInputWidth] = (0, react_1.useState)(-1);
100
+ // UI
101
+ const [isCopying, setIsCopying] = (0, react_1.useState)(false);
144
102
  const [isChartBuilderOpen, setIsChartBuilderOpen] = (0, react_1.useState)(false);
145
- const [filtersEnabled, setFiltersEnabled] = (0, react_1.useState)(!!reportId);
146
103
  const [isSaveQueryModalOpen, setIsSaveQueryModalOpen] = (0, react_1.useState)(false);
147
- const [openPopover, setOpenPopover] = (0, react_1.useState)(null);
148
- const [aiPrompt, setAiPrompt] = (0, react_1.useState)('');
149
- const [reportBuilderLoading, setReportBuilderLoading] = (0, react_1.useState)(false);
150
- const [tableLoading, setTableLoading] = (0, react_1.useState)(false);
151
- const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
152
- const [unresolvedReportMessage, setUnresolvedReportMessage] = (0, react_1.useState)('');
153
- // Core Report states
154
- // Table order matters for joins. For now, assumed to have one 'primary' table (the first one)
155
- const [tables, setTables] = (0, react_1.useState)([]);
156
- const [columns, setColumns] = (0, react_1.useState)([]);
157
- const [filterStack, setFilterStack] = (0, react_1.useState)([]);
158
- const [pivot, setPivot] = (0, react_1.useState)(null);
159
- const [sort, setSort] = (0, react_1.useState)([]);
160
- const [limit, setLimit] = (0, react_1.useState)(null);
161
- const reportBuilderState = (0, react_1.useMemo)(() => {
162
- return {
163
- tables,
164
- columns,
165
- filterStack,
166
- pivot,
167
- sort,
168
- limit,
169
- };
170
- }, [columns, filterStack, limit, pivot, sort, tables]);
171
- // For undo/redo
172
- const [stateStack, setStateStack] = (0, react_1.useState)([]);
173
- const [poppedStateStack, setPoppedStateStack] = (0, react_1.useState)([]);
174
- // Other Report states
175
- const [activeQuery, setActiveQuery] = (0, react_1.useState)('');
176
- const [queryOutOfSync, setQueryOutOfSync] = (0, react_1.useState)(false);
177
- const [unfilteredUniqueValues, setUnfilteredUniqueValues] = (0, react_1.useState)({}); // unique values before filtering
178
- const [unfilteredUniqueValuesIsLoading, setUnfilteredUniqueValuesIsLoading] = (0, react_1.useState)(false);
179
- const [filteredUniqueValues, setFilteredUniqueValues] = (0, react_1.useState)(null); // unique values after filtering
180
- const [filteredUniqueValuesIsLoading, setFilteredUniqueValuesIsLoading] = (0, react_1.useState)(false);
181
- const [columnUniqueValues, setColumnUniqueValues] = (0, react_1.useState)({});
182
- const [dateRanges, setDateRanges] = (0, react_1.useState)(null);
183
- const [tempReport, setTempReport] = (0, react_1.useState)({
184
- ...report_1.EMPTY_INTERNAL_REPORT,
185
- pagination: REPORT_BUILDER_PAGINATION,
186
- });
187
- const [currentProcessing, setCurrentProcessing] = (0, react_1.useState)({
188
- page: REPORT_BUILDER_PAGINATION,
104
+ // Main
105
+ const reportBuilder = (0, useReportBuilder_1.useReportBuilderInternal)({
106
+ reportId,
107
+ initialTableName,
108
+ destinationDashboard,
109
+ pivotRecommendationsEnabled,
110
+ onSaveChanges,
189
111
  });
190
- const [previousPage, setPreviousPage] = (0, react_1.useState)(0);
191
- const [isCopying, setIsCopying] = (0, react_1.useState)(false);
192
- const [sortOrLimitWasReset, setSortOrLimitWasReset] = (0, react_1.useState)(false);
193
- // Table display states
194
- const [reportColumns, setReportColumns] = (0, react_1.useState)([]);
195
- const [reportRows, setReportRows] = (0, react_1.useState)([]);
196
- const [formattedRows, setFormattedRows] = (0, react_1.useState)([]);
197
- const [pivotData, setPivotData] = (0, react_1.useState)(null);
198
- const [numberOfRows, setNumberOfRows] = (0, react_1.useState)(0);
199
- const [rowCountIsLoading, setRowCountIsLoading] = (0, react_1.useState)(false);
200
- const reportColumnsToStateColumns = (0, react_1.useMemo)(() => {
201
- const positionMap = {};
202
- columns.forEach((column, index) => {
203
- positionMap[column.field] = index;
204
- if (column.alias) {
205
- positionMap[column.alias] = index;
206
- }
207
- });
208
- // Sort reportColumns based on the position in columns
209
- return [...reportColumns]
210
- .filter((reportColumn) => positionMap[reportColumn.field] !== undefined)
211
- .sort((a, b) => {
212
- const posA = positionMap[a.field];
213
- const posB = positionMap[b.field];
214
- if (posA !== undefined && posB !== undefined) {
215
- return posA - posB;
216
- }
217
- else {
218
- return 0;
219
- }
220
- });
221
- }, [columns, reportColumns]);
222
- // Pivot form states
223
- const [pivotRowField, setPivotRowField] = (0, react_1.useState)(undefined);
224
- const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(undefined);
225
- const [pivotAggregations, setPivotAggregations] = (0, react_1.useState)([]);
226
- const [pivotHint, setPivotHint] = (0, react_1.useState)('');
227
- const [pivotError, setPivotError] = (0, react_1.useState)('');
228
- const [createdPivots, setCreatedPivots] = (0, react_1.useState)([]);
229
- const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)([]);
230
- const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
231
- const [showPivotPopover, setShowPivotPopover] = (0, react_1.useState)(false);
232
- const [isEditingPivot, setIsEditingPivot] = (0, react_1.useState)(false);
233
- const [selectedPivotIndex, setSelectedPivotIndex] = (0, react_1.useState)(-1);
234
- const [pivotRecommendationsEnabledState, setPivotRecommendationsEnabledState,] = (0, react_1.useState)(pivotRecommendationsEnabled);
235
- // Ask AI
236
- const [askAILoading, setAskAILoading] = (0, react_1.useState)(false);
237
- const askAIContainerRef = (0, react_1.useRef)(null);
238
- const [askAIInputWidth, setAskAIInputWidth] = (0, react_1.useState)(-1);
239
- const loading = reportBuilderLoading || tableLoading;
240
- const isSelectStar = (0, react_1.useMemo)(() => {
241
- if (tables.length === 1) {
242
- // Check if all columns are selected
243
- const totalColumnLength = tables.reduce((acc, table) => {
244
- const tableColumns = filteredSchema.find((t) => t.name === table.name)?.columns.length ??
245
- 0;
246
- return acc + tableColumns;
247
- }, 0);
248
- return totalColumnLength === columns.length;
249
- }
250
- else {
251
- // TODO: Implement this to work with joins
252
- // SELECT * won't work if joined table has shared column name
253
- return false;
254
- }
255
- }, [tables, columns, filteredSchema]);
256
- const mssqlSortWarning = (0, react_1.useMemo)(() => {
257
- if (!client || client?.databaseType !== 'mssql') {
258
- return undefined;
259
- }
260
- else if (!pivot && !limit) {
261
- return 'Please add a limit.';
262
- }
263
- }, [client, limit, pivot]);
264
- const foreignKeyMap = (0, react_1.useMemo)(() => {
265
- return (0, schema_1.getSchemaForeignKeyMapping)(filteredSchema);
266
- }, [filteredSchema]);
267
- // State changing functions
268
- const clearAllState = (resetStateStack = true) => {
269
- setActiveQuery('');
270
- setQueryOutOfSync(false);
271
- handleMultiStateChange({
272
- state: ReportBuilder_1.EMPTY_REPORT_BUILDER_STATE,
273
- fetchData: false,
274
- updateStateStack: true,
275
- });
276
- if (resetStateStack) {
277
- setStateStack([]);
278
- setPoppedStateStack([]);
279
- }
280
- setFilteredUniqueValues(null);
281
- setUnfilteredUniqueValues({});
282
- setColumnUniqueValues({});
283
- setDateRanges(null);
284
- setTempReport({
285
- ...report_1.EMPTY_INTERNAL_REPORT,
286
- pagination: REPORT_BUILDER_PAGINATION,
287
- });
288
- resetProcessing();
289
- setReportColumns([]);
290
- setReportRows([]);
291
- setFormattedRows([]);
292
- setPivotData(null);
293
- setNumberOfRows(0);
294
- setRowCountIsLoading(false);
295
- setPivotRowField(undefined);
296
- setPivotColumnField(undefined);
297
- setPivotAggregations([]);
298
- setCreatedPivots([]);
299
- setRecommendedPivots([]);
300
- setSelectedPivotIndex(-1);
301
- setAskAILoading(false);
302
- setReportBuilderLoading(false);
303
- setTableLoading(false);
304
- setPivotError('');
305
- setErrorMessage('');
306
- setUnresolvedReportMessage('');
307
- setPivotHint('');
308
- };
112
+ const {
113
+ // Core state
114
+ columns, tables, activeQuery, tempReport, stateStack, poppedStateStack,
115
+ // UI state
116
+ errorMessage, unresolvedReportMessage, loading, tableLoading, askAILoading,
117
+ // Pivot state and handlers
118
+ pivot, pivotData, pivotError,
119
+ // Schema and client info
120
+ // foreignKeyMap,
121
+ // AI features
122
+ aiPrompt, setAiPrompt, fetchAstFromPromptHelper,
123
+ // Action handlers
124
+ clearAllState,
125
+ // handleMultiStateChange,
126
+ // handleColumnsChange,
127
+ handleUndo, handleRedo, onSaveQuery, onSaveReport, } = reportBuilder;
309
128
  const copySQLToClipboard = () => {
310
129
  const query = pivot && pivotData ? pivotData.pivotQuery : activeQuery;
311
130
  setIsCopying(true);
312
131
  navigator.clipboard.writeText(query);
313
132
  setTimeout(() => setIsCopying(false), 800);
314
133
  };
315
- const handleTablesChange = (newTables, updateStateStack = true) => {
316
- setTables(newTables);
317
- if (updateStateStack) {
318
- setStateStack((prevStack) => [
319
- ...prevStack,
320
- { ...reportBuilderState, tables: newTables },
321
- ]);
322
- setPoppedStateStack([]);
323
- }
324
- };
325
- const handleColumnsChange = (newColumns, fetchData, updateStateStack = true, bypassConfirmation = false) => {
326
- const validReportBuilderState = bypassConfirmation
327
- ? { ...reportBuilderState, columns: newColumns }
328
- : (0, reportBuilder_1.validatedReportBuilderState)({
329
- ...reportBuilderState,
330
- columns: newColumns,
331
- }, foreignKeyMap);
332
- if (validReportBuilderState.tables.length === 0 && !bypassConfirmation) {
333
- if (!confirm('Removing all columns will clear all state. Are you sure you want to continue?')) {
334
- return;
335
- }
336
- else {
337
- handleMultiStateChange({
338
- state: ReportBuilder_1.EMPTY_REPORT_BUILDER_STATE,
339
- fetchData: false,
340
- updateStateStack: true,
341
- });
342
- return;
343
- }
344
- }
345
- const tablesAffected = tables.length - validReportBuilderState.tables.length >= 2;
346
- const filtersAffected = validReportBuilderState.filterStack.length !== filterStack.length;
347
- const deletedTables = tables
348
- .filter((table) => {
349
- return !validReportBuilderState.tables.some((t) => t.name === table.name);
350
- })
351
- .map((table) => table.name);
352
- const deletedFilters = filterStack
353
- .filter((filter) => filter.value)
354
- .filter((filter) => {
355
- return deletedTables.some((table) => table === filter.value.table);
356
- })
357
- .map((filter) => (0, filterProcessing_1.filterSentence)(filter.value));
358
- if (tablesAffected && filtersAffected) {
359
- if (!confirm(`Removing this column will remove the following table${deletedTables.length > 1 ? 's' : ''}:
360
- ${deletedTables.join(', ')}.
361
- It will also remove the following filter${deletedFilters.length > 1 ? 's' : ''}:
362
- ${deletedFilters.join(', ')}.
363
- Are you sure you want to continue?
364
- `
365
- .replace(/\s+/g, ' ')
366
- .trim())) {
367
- return;
368
- }
369
- }
370
- else if (tablesAffected) {
371
- if (!confirm(`Removing this column will remove the following table${deletedTables.length > 1 ? 's' : ''}:
372
- ${deletedTables.join(', ')}.
373
- Are you sure you want to continue?
374
- `
375
- .replace(/\s+/g, ' ')
376
- .trim())) {
377
- return;
378
- }
379
- }
380
- else if (filtersAffected) {
381
- if (!confirm(`Removing this column will remove the following filter${deletedFilters.length > 1 ? 's' : ''}:
382
- ${deletedFilters.join(', ')}.
383
- Are you sure you want to continue?
384
- `
385
- .replace(/\s+/g, ' ')
386
- .trim())) {
387
- return;
388
- }
389
- }
390
- if (validReportBuilderState.tables.length !== tables.length) {
391
- handleTablesChange(validReportBuilderState.tables, false);
392
- fetchData = true;
393
- }
394
- if (validReportBuilderState.filterStack.length !== filterStack.length) {
395
- handleFilterStackChange(validReportBuilderState.filterStack, false, false);
396
- fetchData = true;
397
- }
398
- if (validReportBuilderState.sort.length !== sort.length) {
399
- handleSortChange(validReportBuilderState.sort, false, false);
400
- fetchData = true;
401
- }
402
- if (pivot && !validReportBuilderState.pivot) {
403
- handlePivotChange(validReportBuilderState.pivot, false, false);
404
- }
405
- setColumns(validReportBuilderState.columns);
406
- if (updateStateStack) {
407
- setStateStack((prevStack) => [...prevStack, validReportBuilderState]);
408
- setPoppedStateStack([]);
409
- }
410
- if (fetchData) {
411
- fetchDataFromReportBuilderState(validReportBuilderState);
412
- }
413
- else {
414
- setQueryOutOfSync(true);
415
- }
416
- };
417
- const handleFilterInsertion = (newFilter) => {
418
- const newFilterStack = [...filterStack];
419
- if (newFilterStack.length > 0) {
420
- const tabNode = {
421
- leaf: false,
422
- operator: 'and',
423
- leftNode: null,
424
- rightNode: null,
425
- };
426
- newFilterStack.push(tabNode);
427
- }
428
- const newItem = {
429
- leaf: true,
430
- operator: null,
431
- leftNode: null,
432
- rightNode: null,
433
- value: newFilter,
434
- };
435
- newFilterStack.push(newItem);
436
- handleFilterStackChange(newFilterStack, true);
437
- };
438
- const handleFilterStackChange = (newFilterStack, fetchData, updateStateStack = true) => {
439
- setFilterStack(newFilterStack);
440
- if (newFilterStack.length === 0) {
441
- setFilteredUniqueValues(null);
442
- }
443
- if (updateStateStack) {
444
- setStateStack((prevStack) => [
445
- ...prevStack,
446
- { ...reportBuilderState, filterStack: newFilterStack },
447
- ]);
448
- setPoppedStateStack([]);
449
- }
450
- if (fetchData) {
451
- fetchDataFromReportBuilderState({
452
- ...reportBuilderState,
453
- filterStack: newFilterStack,
454
- }, true);
455
- }
456
- };
457
- const handlePivotChange = (newPivot, fetchData, updateStateStack = true) => {
458
- setPivot(newPivot ? (0, reportBuilder_1.setTypesOnPivot)(newPivot, reportColumns) : null);
459
- setPivotHint('');
460
- setPivotError('');
461
- if (!newPivot) {
462
- setPivotData(null);
463
- if (!fetchData) {
464
- const formattedRows = (0, reportBuilder_1.formatRows)(reportRows, reportColumns, false);
465
- setFormattedRows(formattedRows);
466
- }
467
- }
468
- let resetSortAndLimit = false;
469
- if (!pivot && newPivot && (sort.length > 0 || limit)) {
470
- setSort([]);
471
- setLimit(null);
472
- resetSortAndLimit = true;
473
- }
474
- setSortOrLimitWasReset(resetSortAndLimit);
475
- if (updateStateStack) {
476
- setStateStack((prevStack) => [
477
- ...prevStack,
478
- {
479
- ...reportBuilderState,
480
- pivot: newPivot,
481
- sort: resetSortAndLimit ? [] : sort,
482
- limit: resetSortAndLimit ? null : limit,
483
- },
484
- ]);
485
- setPoppedStateStack([]);
486
- }
487
- if (fetchData) {
488
- fetchDataFromReportBuilderState({
489
- ...reportBuilderState,
490
- pivot: newPivot,
491
- sort: resetSortAndLimit ? [] : sort,
492
- limit: resetSortAndLimit ? null : limit,
493
- }, false, resetSortAndLimit);
494
- }
495
- };
496
- const updatePivot = async (changeField, fieldKey) => {
497
- if (!client || !pivot) {
498
- return;
499
- }
500
- let newPivot = { ...pivot };
501
- setPivotError('');
502
- // @ts-ignore
503
- newPivot[fieldKey] = changeField;
504
- newPivot.rowLimit = undefined;
505
- newPivot.sort = undefined;
506
- newPivot.sortDirection = undefined;
507
- newPivot.sortField = undefined;
508
- newPivot.sortFieldType = undefined;
509
- if (fieldKey === 'rowField') {
510
- if (changeField === '' || changeField === undefined) {
511
- setPivotColumnField(undefined);
512
- // set all percentage aggregations to undefined
513
- setPivotAggregations(pivotAggregations.map((agg) => ({
514
- ...agg,
515
- aggregationType: agg.aggregationType === 'percentage'
516
- ? undefined
517
- : agg.aggregationType,
518
- })));
519
- }
520
- }
521
- newPivot = (0, reportBuilder_1.setTypesOnPivot)(newPivot, reportColumns);
522
- if (newPivot.aggregations?.length === 0 ||
523
- newPivot.aggregations?.some((agg) => !agg.aggregationType) ||
524
- newPivot.aggregations?.some((agg) => !agg.valueField && agg.aggregationType !== 'count')) {
525
- return;
526
- }
527
- const { valid, reason } = (0, pivotProcessing_1.isValidPivot)(newPivot);
528
- if (!valid) {
529
- setPivotError(reason);
530
- return;
531
- }
532
- handlePivotChange(newPivot, true);
533
- };
534
- const handleSortChange = (newSort, fetchData, updateStateStack = true) => {
535
- setSort(newSort);
536
- if (updateStateStack) {
537
- setStateStack((prevStack) => [
538
- ...prevStack,
539
- { ...reportBuilderState, sort: newSort },
540
- ]);
541
- setPoppedStateStack([]);
542
- }
543
- if (fetchData) {
544
- fetchDataFromReportBuilderState({
545
- ...reportBuilderState,
546
- sort: newSort,
547
- });
548
- }
549
- };
550
- const handleLimitChange = (newLimit, fetchData, updateStateStack = true) => {
551
- setLimit(newLimit);
552
- if (updateStateStack) {
553
- setStateStack((prevStack) => [
554
- ...prevStack,
555
- { ...reportBuilderState, limit: newLimit },
556
- ]);
557
- setPoppedStateStack([]);
558
- }
559
- if (fetchData) {
560
- fetchDataFromReportBuilderState({
561
- ...reportBuilderState,
562
- limit: newLimit,
563
- }, false, true);
564
- }
565
- };
566
- const handleMultiStateChange = ({ state, fetchData, updateStateStack = true, report, skipPivotColumnFetch = false, }) => {
567
- if (state.tables !== undefined) {
568
- handleTablesChange(state.tables, false);
569
- }
570
- if (state.columns !== undefined) {
571
- handleColumnsChange(state.columns, false, false, true);
572
- }
573
- if (state.filterStack !== undefined) {
574
- handleFilterStackChange(state.filterStack, false, false);
575
- }
576
- if (state.pivot !== undefined) {
577
- handlePivotChange(state.pivot, false, false);
578
- }
579
- if (state.sort !== undefined) {
580
- handleSortChange(state.sort, false, false);
581
- }
582
- if (state.limit !== undefined) {
583
- handleLimitChange(state.limit, false, false);
584
- }
585
- if (updateStateStack) {
586
- setStateStack((prevStack) => [
587
- ...prevStack,
588
- { ...reportBuilderState, ...state },
589
- ]);
590
- setPoppedStateStack([]);
591
- }
592
- if (fetchData) {
593
- fetchDataFromReportBuilderState({ ...reportBuilderState, ...state }, !!state.filterStack, !!state.limit, !!state.tables, report, skipPivotColumnFetch);
594
- }
595
- };
596
- const handleUndo = () => {
597
- if (stateStack.length <= 1) {
598
- return;
599
- }
600
- const previousState = stateStack[stateStack.length - 2];
601
- setPoppedStateStack((prevStack) => [
602
- ...prevStack,
603
- stateStack[stateStack.length - 1],
604
- ]);
605
- setStateStack((prevStack) => prevStack.slice(0, -1));
606
- // Only fetch data if the previous state has columns
607
- handleMultiStateChange({
608
- state: previousState,
609
- fetchData: previousState.columns.length > 0,
610
- updateStateStack: false,
611
- });
612
- };
613
- const handleRedo = () => {
614
- if (poppedStateStack.length === 0) {
615
- return;
616
- }
617
- const lastState = poppedStateStack[poppedStateStack.length - 1];
618
- setStateStack((prevStack) => [...prevStack, lastState]);
619
- setPoppedStateStack((prevStack) => prevStack.slice(0, -1));
620
- // Only fetch data if the last state has columns
621
- handleMultiStateChange({
622
- state: lastState,
623
- fetchData: lastState.columns.length > 0,
624
- updateStateStack: false,
625
- });
626
- };
627
- const fetchDataFromReportBuilderState = (state, filtersChanged, limitChanged, tablesChanged, report, skipPivotColumnFetch) => {
628
- if (!client) {
629
- return;
630
- }
631
- const ast = (0, reportBuilder_1.reportBuilderStateToAst)(state, client.databaseType?.toLowerCase() || 'postgresql');
632
- fetchReportFromASTHelper({
633
- ast,
634
- pivot: state.pivot,
635
- previousReport: report,
636
- requiresNewFilteredUniqueValues: filtersChanged || limitChanged,
637
- requiresNewUnfilteredUniqueValues: tablesChanged,
638
- skipPivotColumnFetch,
639
- });
640
- };
641
- const fetchReportFromASTHelper = async ({ ast, pivot, previousReport = tempReport, requiresNewFilteredUniqueValues = false, requiresNewUnfilteredUniqueValues = false, skipPivotColumnFetch = false, }) => {
642
- let reportBuilderInfo = undefined;
643
- setErrorMessage('');
644
- const schema = filteredSchema;
645
- try {
646
- if (!client || reportBuilderLoading) {
647
- return;
648
- }
649
- setReportBuilderLoading(true);
650
- reportBuilderInfo = await (0, report_1.fetchReportBuilderDataFromAST)({
651
- baseAst: ast,
652
- schema,
653
- client,
654
- tenants,
655
- pivot: pivot ?? undefined,
656
- skipPivotColumnFetch,
657
- previousRelevant: {
658
- uniqueStringsByTable: unfilteredUniqueValues,
659
- dateRanges: dateRanges ?? {},
660
- uniqueStringsByColumn: requiresNewFilteredUniqueValues
661
- ? {}
662
- : columnUniqueValues,
663
- },
664
- requiresNewFilteredUniqueValues,
665
- report: previousReport,
666
- customFields: schemaData.customFields,
667
- skipUniqueValues: true,
668
- skipRowCount: true,
669
- processing: { page: REPORT_BUILDER_PAGINATION },
670
- dashboardName: destinationDashboard,
671
- getToken,
672
- });
673
- if (reportBuilderInfo.error) {
674
- throw new Error(reportBuilderInfo.error);
675
- }
676
- }
677
- catch (err) {
678
- if (err instanceof Error) {
679
- setErrorMessage(err.message);
680
- setReportBuilderLoading(false);
681
- return { error: true, message: err.message, rows: [] };
682
- }
683
- setReportBuilderLoading(false);
684
- setErrorMessage('Failed to fetch');
685
- return { error: true, message: 'Failed to fetch', rows: [] };
686
- }
687
- if (!reportBuilderInfo) {
688
- setReportBuilderLoading(false);
689
- setErrorMessage('Failed to fetch');
690
- return;
691
- }
692
- const cleanedReport = await (0, dashboard_1.cleanDashboardItem)({
693
- item: reportBuilderInfo.report,
694
- dashboardFilters: [],
695
- getToken,
696
- client,
697
- customFields: schemaData.customFields,
698
- skipPivotFetch: true,
699
- tenants,
700
- });
701
- // set tempReport
702
- setTempReport({
703
- ...cleanedReport,
704
- pagination: REPORT_BUILDER_PAGINATION,
705
- });
706
- setActiveQuery(reportBuilderInfo.query);
707
- setQueryOutOfSync(false);
708
- // table data
709
- fetchRowCountFromAST(ast, ast.where);
710
- setReportRows(reportBuilderInfo.rows);
711
- setFormattedRows(reportBuilderInfo.formattedRows);
712
- resetProcessing();
713
- if (!(client.databaseType?.toLowerCase() === 'bigquery') ||
714
- (reportBuilderInfo.rows && reportBuilderInfo.rows.length > 0)) {
715
- setReportColumns(reportBuilderInfo.columns);
716
- }
717
- setPivotData(reportBuilderInfo.pivotData);
718
- if (reportBuilderInfo.pivot) {
719
- setPivotRowField(reportBuilderInfo.pivot.rowField);
720
- setPivotColumnField(reportBuilderInfo.pivot.columnField);
721
- setPivotAggregations(reportBuilderInfo.pivot.aggregations ?? [
722
- {
723
- valueField: reportBuilderInfo.pivot.valueField,
724
- valueField2: reportBuilderInfo.pivot.valueField2,
725
- aggregationType: reportBuilderInfo.pivot.aggregationType,
726
- },
727
- ]);
728
- }
729
- setPivot(reportBuilderInfo.pivot);
730
- setPivotHint(reportBuilderInfo.pivotHint);
731
- setDateRanges(reportBuilderInfo.dateRanges);
732
- const tableNames = reportBuilderInfo.tables;
733
- const columnInfo = tableNames.flatMap((table) => {
734
- const tableInfo = schema.find((tableInfo) => tableInfo.name === table);
735
- if (!tableInfo) {
736
- return [];
737
- }
738
- return tableInfo.columns.map((col) => ({ ...col, table }));
739
- });
740
- setReportBuilderLoading(false);
741
- // fetch unique values after everything else since it is the most expensive
742
- try {
743
- let uniqueStrings = filteredUniqueValues ?? unfilteredUniqueValues;
744
- let uniqueValuesByColumn = columnUniqueValues;
745
- if (requiresNewUnfilteredUniqueValues) {
746
- fetchGlobalUniqueValues(columnInfo, tableNames);
747
- }
748
- if (requiresNewFilteredUniqueValues) {
749
- if (reportBuilderInfo.pivot) {
750
- // if there's a pivot, these values would have had to been fetched
751
- uniqueStrings = reportBuilderInfo.uniqueStringsByTable;
752
- uniqueValuesByColumn = reportBuilderInfo.uniqueStringsByColumn;
753
- }
754
- else {
755
- setFilteredUniqueValuesIsLoading(true);
756
- const starQuery = await (0, dataFetcher_1.fetchSqlQuery)((0, astProcessing_1.createSelectStarFromAst)(ast), client, getToken);
757
- uniqueStrings = await (0, tableProcessing_1.getUniqueStringValuesByTable)({
758
- columns: columnInfo,
759
- tables: tableNames,
760
- client,
761
- tenants,
762
- customFields: schemaData.customFields ?? undefined,
763
- withExceededColumns: true,
764
- dashboardName: destinationDashboard,
765
- queryTemplate: starQuery.query,
766
- getToken,
767
- });
768
- uniqueValuesByColumn = {};
769
- reportBuilderInfo.reportBuilderColumns.forEach((col) => {
770
- uniqueValuesByColumn[col.alias || col.field] =
771
- uniqueStrings[col.table || '']?.[col.field] ?? [];
772
- });
773
- }
774
- }
775
- setFilteredUniqueValues(uniqueStrings);
776
- setFilteredUniqueValuesIsLoading(false);
777
- setColumnUniqueValues(uniqueValuesByColumn);
778
- }
779
- catch (err) {
780
- if (err instanceof Error) {
781
- setErrorMessage(err.message);
782
- return { error: true, message: err.message, rows: [] };
783
- }
784
- setErrorMessage('Failed to fetch unique values');
785
- return {
786
- error: true,
787
- message: 'Failed to fetch unique values',
788
- rows: [],
789
- };
790
- }
791
- };
792
- const fetchRowCountFromAST = async (ast, where) => {
793
- setRowCountIsLoading(true);
794
- if (!client) {
795
- return;
796
- }
797
- const tableData = await (0, tableProcessing_1.fetchTableByAST)({ ...ast, where }, client, getToken, tenants, destinationDashboard, { page: REPORT_BUILDER_PAGINATION }, schemaData.customFields, false, true);
798
- if (tableData.rowCount) {
799
- setNumberOfRows(tableData.rowCount);
800
- // @ts-ignore
801
- setTempReport((tempReport) => ({
802
- ...tempReport,
803
- rowCount: tableData.rowCount,
804
- }));
805
- }
806
- setRowCountIsLoading(false);
807
- };
808
- const fetchAstFromPromptHelper = async (overridePrompt) => {
809
- let astInfo = {};
810
- const prompt = overridePrompt || aiPrompt;
811
- if (!client) {
812
- return;
813
- }
814
- if (!prompt) {
815
- setErrorMessage('Please supply a prompt.');
816
- return;
817
- }
818
- try {
819
- setReportBuilderLoading(true);
820
- setAskAILoading(true);
821
- setErrorMessage('');
822
- astInfo = await (0, astProcessing_1.fetchAndProcessASTFromPrompt)({
823
- aiPrompt: prompt,
824
- schema: filteredSchema,
825
- client,
826
- prevPivot: pivot ?? undefined,
827
- currentQuery: activeQuery,
828
- prevTable: tables?.[0]?.name,
829
- dashboardName: destinationDashboard,
830
- tenants,
831
- getToken,
832
- });
833
- if (astInfo.error) {
834
- throw new Error(astInfo.error);
835
- }
836
- }
837
- catch (err) {
838
- if (err instanceof Error) {
839
- setErrorMessage(err.message);
840
- }
841
- setReportBuilderLoading(false);
842
- setAskAILoading(false);
843
- return;
844
- }
845
- // check if pivot works with ReportBuilder constraints
846
- if (Object.keys(columnUniqueValues).length > 0 &&
847
- astInfo.pivot &&
848
- !(0, reportBuilder_1.isValidPivotForReport)(astInfo.pivot, columnUniqueValues, reportColumns)) {
849
- astInfo.pivot = null;
850
- astInfo.ast.groupby = null;
851
- }
852
- setAskAILoading(false);
853
- const newState = (0, reportBuilder_1.astToReportBuilderState)(astInfo.ast, client.databaseType || 'postgresql', filteredSchema);
854
- handleMultiStateChange({
855
- state: { ...newState, pivot: astInfo.pivot },
856
- fetchData: true,
857
- });
858
- };
859
- const fetchGlobalUniqueValues = async (columns, tables) => {
860
- if (!client) {
861
- return;
862
- }
863
- setUnfilteredUniqueValuesIsLoading(true);
864
- const uniqueStrings = await (0, tableProcessing_1.getUniqueStringValuesByTable)({
865
- columns,
866
- tables,
867
- client,
868
- getToken,
869
- tenants,
870
- customFields: schemaData.customFields ?? undefined,
871
- withExceededColumns: true,
872
- dashboardName: destinationDashboard,
873
- });
874
- setUnfilteredUniqueValues(uniqueStrings);
875
- setUnfilteredUniqueValuesIsLoading(false);
876
- };
877
- const fetchQueryFromReportBuilderState = async (state) => {
878
- if (!client) {
879
- return '';
880
- }
881
- const ast = (0, reportBuilder_1.reportBuilderStateToAst)(state, client.databaseType?.toLowerCase() || 'postgresql');
882
- const query = await (0, dataFetcher_1.fetchSqlQuery)(ast, client, getToken);
883
- setActiveQuery(query.query);
884
- return query.query;
885
- };
886
- const resetProcessing = () => {
887
- setCurrentProcessing({ page: REPORT_BUILDER_PAGINATION });
888
- setPreviousPage(0);
889
- };
890
- const handlePagination = async (processing) => {
891
- try {
892
- if (!client) {
893
- return;
894
- }
895
- const isPivotPagination = !!(pivot && pivotData);
896
- setErrorMessage('');
897
- setTableLoading(true);
898
- const tableInfo = await (0, tableProcessing_1.fetchResultsByQuery)({
899
- query: isPivotPagination ? pivotData.pivotQuery : activeQuery,
900
- comparisonQuery: pivot && pivotData ? pivotData.comparisonPivotQuery : undefined,
901
- client,
902
- tenants,
903
- processing,
904
- customFields: schemaData.customFields,
905
- rowsOnly: true,
906
- dashboardName: destinationDashboard,
907
- pivot: pivot,
908
- getPivotRowCount: false,
909
- getToken,
910
- });
911
- if (tableInfo.error) {
912
- throw new Error(tableInfo.error);
913
- }
914
- else if (tableInfo.rows.length === 0) {
915
- throw new Error('No data found');
916
- }
917
- if (!isPivotPagination) {
918
- const tempRows = [...reportRows, ...tableInfo.rows];
919
- setReportRows(tempRows);
920
- setFormattedRows((0, report_1.formatRowsFromReport)({ rows: tempRows, columns: tableInfo.columns }));
921
- setTempReport((tempReport) => ({
922
- ...tempReport,
923
- rows: tempRows,
924
- rowCount: tableInfo.rowCount ?? tempReport.rowCount,
925
- }));
926
- }
927
- else {
928
- const tempRows = [...pivotData.rows, ...tableInfo.rows];
929
- setPivotData((oldPivotData) => {
930
- if (oldPivotData) {
931
- return {
932
- ...oldPivotData,
933
- rows: tempRows,
934
- columns: tableInfo.columns,
935
- };
936
- }
937
- return null;
938
- });
939
- setFormattedRows((0, report_1.formatRowsFromReport)({ rows: tempRows, columns: tableInfo.columns }));
940
- }
941
- setTableLoading(false);
942
- }
943
- catch (e) {
944
- setTableLoading(false);
945
- setErrorMessage('Failed to run SQL query: ' + e.message);
946
- setReportRows([]);
947
- setReportColumns([]);
948
- return;
949
- }
950
- };
951
- const onPageChange = (page, initiator = 'ReportBuilder') => {
952
- const pagination = initiator === 'ReportBuilder'
953
- ? REPORT_BUILDER_PAGINATION
954
- : paginationProcessing_1.DEFAULT_PAGINATION;
955
- if (currentProcessing.page &&
956
- (0, paginationProcessing_1.shouldFetchMore)(pagination, page, previousPage, pivotData ? pivotData.rows.length : reportRows.length)) {
957
- const newPagination = { ...currentProcessing.page, page };
958
- const updatedProcessing = { ...currentProcessing, page: newPagination };
959
- setCurrentProcessing(updatedProcessing);
960
- handlePagination(updatedProcessing);
961
- }
962
- if (page > previousPage) {
963
- setPreviousPage(page);
964
- }
965
- };
966
- const onSortChange = (newSort, isDelete) => {
967
- if (!newSort.field) {
968
- return;
969
- }
970
- if (pivot) {
971
- let newPivot = null;
972
- if (isDelete) {
973
- newPivot = {
974
- ...pivot,
975
- sort: undefined,
976
- sortField: undefined,
977
- sortDirection: undefined,
978
- sortFieldType: undefined,
979
- };
980
- }
981
- else {
982
- newPivot = {
983
- ...pivot,
984
- sort: true,
985
- sortField: newSort.field,
986
- sortDirection: newSort.direction,
987
- sortFieldType: reportColumns.find((col) => col.field === newSort.field)?.fieldType,
988
- };
989
- }
990
- handlePivotChange(newPivot, true);
991
- }
992
- else {
993
- const updatedSort = [...sort];
994
- const existingSortIndex = updatedSort.findIndex((item) => item.field === newSort.field);
995
- if (isDelete) {
996
- if (existingSortIndex !== -1) {
997
- updatedSort.splice(existingSortIndex, 1);
998
- }
999
- }
1000
- else if (existingSortIndex !== -1) {
1001
- updatedSort[existingSortIndex] = {
1002
- field: newSort.field,
1003
- direction: newSort.direction,
1004
- };
1005
- }
1006
- else {
1007
- updatedSort.push({
1008
- field: newSort.field,
1009
- direction: newSort.direction,
1010
- });
1011
- }
1012
- handleSortChange(updatedSort, true);
1013
- }
1014
- };
1015
- const onLimitChange = (limit) => {
1016
- if (limit) {
1017
- if (pivot) {
1018
- const newPivot = { ...pivot, rowLimit: limit };
1019
- handlePivotChange(newPivot, true);
1020
- }
1021
- else {
1022
- handleLimitChange({ value: limit }, true);
1023
- }
1024
- }
1025
- else {
1026
- if (pivot) {
1027
- const newPivot = { ...pivot, rowLimit: undefined };
1028
- handlePivotChange(newPivot, true);
1029
- }
1030
- else {
1031
- handleLimitChange(null, true);
1032
- }
1033
- }
1034
- };
1035
134
  (0, react_1.useEffect)(() => {
1036
135
  // Since the TextInput component takes a required numeric width parameter,
1037
136
  // we dynamically calculate the width of this component here.
@@ -1044,81 +143,6 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1044
143
  window.removeEventListener('resize', handleResize);
1045
144
  };
1046
145
  }, []);
1047
- (0, react_1.useEffect)(() => {
1048
- if (!client) {
1049
- return;
1050
- }
1051
- if (client.featureFlags?.['recommendedPivotsDisabled'] !== undefined) {
1052
- setPivotRecommendationsEnabledState(!client.featureFlags?.['recommendedPivotsDisabled']);
1053
- }
1054
- if (!initialTableName && !reportId && client.publicKey) {
1055
- clearAllState();
1056
- }
1057
- }, [client]);
1058
- // Initialize ReportBuilder with a report
1059
- (0, react_1.useEffect)(() => {
1060
- const loadChart = async () => {
1061
- let report;
1062
- if (!client) {
1063
- return;
1064
- }
1065
- try {
1066
- if (!reportId) {
1067
- throw new Error('Report ID is required');
1068
- }
1069
- report = allReportsById[reportId];
1070
- if (!report) {
1071
- console.log('no report');
1072
- throw new Error('Report not found');
1073
- }
1074
- const { ast: newAst, pivot: newPivot } = await (0, astProcessing_1.fetchASTFromQuillReport)(report, client, filteredSchema, getToken);
1075
- const initialState = (0, reportBuilder_1.astToReportBuilderState)(newAst, client.databaseType || 'postgresql', filteredSchema);
1076
- setTempReport(report);
1077
- handleMultiStateChange({
1078
- state: {
1079
- ...initialState,
1080
- pivot: newPivot ?? null,
1081
- },
1082
- fetchData: true,
1083
- report,
1084
- skipPivotColumnFetch: true,
1085
- });
1086
- }
1087
- catch (err) {
1088
- console.error(err);
1089
- setErrorMessage('Error when loading chart');
1090
- }
1091
- };
1092
- if (reportId && client) {
1093
- loadChart();
1094
- }
1095
- }, [allReportsById[reportId || ''], client]);
1096
- (0, react_1.useEffect)(() => {
1097
- if (initialTableName) {
1098
- const tableColumns = filteredSchema.find((table) => {
1099
- return table.name === initialTableName;
1100
- })?.columns ?? [];
1101
- if (tableColumns.length > 0) {
1102
- handleMultiStateChange({
1103
- state: {
1104
- ...ReportBuilder_1.EMPTY_REPORT_BUILDER_STATE,
1105
- tables: [{ name: initialTableName }],
1106
- columns: tableColumns.map((col) => ({
1107
- field: col.field,
1108
- table: initialTableName,
1109
- })),
1110
- },
1111
- fetchData: true,
1112
- });
1113
- }
1114
- }
1115
- }, [filteredSchema, initialTableName]);
1116
- (0, react_1.useEffect)(() => {
1117
- if (!data && !dashboardIsLoading) {
1118
- // need dashboard to be in Context for filteredSchema
1119
- reload();
1120
- }
1121
- }, [data, dashboardIsLoading]);
1122
146
  (0, react_1.useEffect)(() => {
1123
147
  if (isChartBuilderOpen === false) {
1124
148
  onCloseChartBuilder && onCloseChartBuilder();
@@ -1135,136 +159,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1135
159
  : '100%',
1136
160
  overscrollBehavior: 'none',
1137
161
  ...containerStyle,
1138
- }, className: className, children: [(0, jsx_runtime_1.jsxs)(SidebarComponent, { children: [(0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Columns" }), (0, jsx_runtime_1.jsx)(DraggableColumns_1.default, { columns: columns, DraggableColumnComponent: DraggableColumnComponent, onColumnOrderChange: handleColumnsChange, loading: loading }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
1139
- if (!openPopover) {
1140
- setOpenPopover('AddColumnModal');
1141
- }
1142
- }, label: "Select columns", disabled: loading }), (0, jsx_runtime_1.jsx)(ModalComponent, { isOpen: openPopover === 'AddColumnModal', setIsOpen: (isOpen) => {
1143
- if (!isOpen) {
1144
- // delay onClose callback so onClick no-ops
1145
- setTimeout(() => {
1146
- setOpenPopover(null);
1147
- }, 100);
1148
- }
1149
- }, title: "Select columns", children: (0, jsx_runtime_1.jsx)(AddColumnModal_1.default, { onSave: (tables, columns) => {
1150
- handleMultiStateChange({
1151
- state: {
1152
- ...ReportBuilder_1.EMPTY_REPORT_BUILDER_STATE,
1153
- tables,
1154
- columns,
1155
- },
1156
- fetchData: true,
1157
- });
1158
- setOpenPopover(null);
1159
- }, selectedTables: tables, selectedColumns: columns, schema: filteredSchema, foreignKeyMap: foreignKeyMap, schemaLoading: schemaData.isSchemaLoading, TextInputComponent: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), filterStack.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
1160
- display: 'flex',
1161
- flexDirection: 'column',
1162
- gap: 8,
1163
- marginBottom: 12,
1164
- }, children: (0, jsx_runtime_1.jsx)(FilterStack_1.default, { client: client, filterStack: filterStack, handleFilterStackChange: handleFilterStackChange, schemaData: schemaData, uniqueValues: unfilteredUniqueValues, uniqueValuesIsLoading: unfilteredUniqueValuesIsLoading, tables: tables, TabsComponent: TabsComponent, FilterPopoverComponent: FilterPopoverComponent, FilterModal: FilterModal_1.default, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, actionsEnabled: !loading, dashboardName: destinationDashboard, getToken: getToken, reportBuilderColumns: columns }) })), (0, jsx_runtime_1.jsxs)("div", { style: {
1165
- display: 'flex',
1166
- flexDirection: 'column',
1167
- alignItems: 'flex-start',
1168
- }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: columns.length === 0 || loading, onClick: () => {
1169
- if (!openPopover) {
1170
- setOpenPopover('AddFilterPopover');
1171
- }
1172
- }, label: 'Add filter' }), (0, jsx_runtime_1.jsx)("div", { style: {
1173
- position: 'relative',
1174
- ...(openPopover === 'AddFilterPopover' && { top: 12 }),
1175
- }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddFilterPopover', setIsOpen: (isOpen) => {
1176
- if (!isOpen) {
1177
- setOpenPopover(null);
1178
- }
1179
- }, popoverTitle: "Add filter", popoverChildren: (0, jsx_runtime_1.jsx)(FilterModal_1.default, { schema: filteredSchema, tables: tables.map((table) => table.name), fieldValuesMap: filteredUniqueValues ?? unfilteredUniqueValues, fieldValuesMapIsLoading: filteredUniqueValuesIsLoading ||
1180
- unfilteredUniqueValuesIsLoading, onSubmitFilter: (filter) => {
1181
- setOpenPopover(null);
1182
- handleFilterInsertion(filter);
1183
- }, hideTableName: tables.length === 1, onDeleteFilter: () => { }, ButtonComponent: ButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, reportBuilderColumns: columns }) }) })] })] }), (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, pivotAggregations: pivotAggregations, setPivotAggregations: setPivotAggregations, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SubheaderComponent: SubHeaderComponent, DeleteButtonComponent: DeleteButtonComponent, 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: reportRows, columns: reportColumnsToStateColumns, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
1184
- handlePivotChange(null, sortOrLimitWasReset);
1185
- }, selectPivot: async (selectedPivot) => {
1186
- if (!selectedPivot)
1187
- return;
1188
- handlePivotChange(selectedPivot, true);
1189
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: undefined, pivotCountRequest: 4, query: activeQuery, initialUniqueValues: columnUniqueValues, uniqueValuesIsLoading: filteredUniqueValuesIsLoading ||
1190
- unfilteredUniqueValuesIsLoading, disabled: !columns.length || tableLoading || loading, pivotRecommendationsEnabled: pivotRecommendationsEnabledState, report: tempReport, dashboardName: destinationDashboard }), pivot && ((0, jsx_runtime_1.jsx)(PivotForm_1.default, { columns: reportColumnsToStateColumns, uniqueValues: columnUniqueValues, uniqueValuesIsLoading: filteredUniqueValuesIsLoading ||
1191
- unfilteredUniqueValuesIsLoading, setPivotRowField: (value) => {
1192
- setPivotRowField(value);
1193
- updatePivot(value, 'rowField');
1194
- }, setPivotColumnField: (value) => {
1195
- setPivotColumnField(value);
1196
- updatePivot(value, 'columnField');
1197
- }, setPivotAggregations: (value) => {
1198
- setPivotAggregations(value);
1199
- updatePivot(value, 'aggregations');
1200
- }, onDelete: () => {
1201
- handlePivotChange(null, sortOrLimitWasReset);
1202
- }, isLoading: tableLoading || loading, pivotRowField: pivotRowField, pivotColumnField: pivotColumnField, pivotAggregations: pivotAggregations, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, PivotColumnContainer: PivotColumnContainer, DeleteButtonComponent: DeleteButtonComponent, pivotHint: pivotHint }))] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Sort" }), pivot && pivot.sort && pivot.sortField && ((0, jsx_runtime_1.jsx)("div", { style: {
1203
- display: 'flex',
1204
- flexDirection: 'column',
1205
- gap: 8,
1206
- marginBottom: 12,
1207
- }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortField: pivot.sortField, sortDirection: pivot.sortDirection || 'ASC', columns: pivotData?.columns ?? [], setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: async () => {
1208
- onSortChange({
1209
- field: pivot.sortField ?? '',
1210
- direction: pivot.sortDirection ?? 'ASC',
1211
- }, true);
1212
- }, onSave: async (column, direction) => {
1213
- onSortChange({ field: column, direction });
1214
- }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, disabled: tableLoading || loading }, `sort-sentence-pivot`) })), sort && sort.length > 0 && ((0, jsx_runtime_1.jsx)("div", { style: {
1215
- display: 'flex',
1216
- flexDirection: 'column',
1217
- gap: 8,
1218
- marginBottom: 12,
1219
- }, children: sort.map((sortData, id) => ((0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortField: sortData.field, sortDirection: sortData.direction, columns: reportColumnsToStateColumns, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
1220
- onSortChange(sortData, true);
1221
- }, onSave: (column, direction) => {
1222
- onSortChange({ field: column, direction });
1223
- }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, disabled: tableLoading || loading }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: columns.length === 0 ||
1224
- loading ||
1225
- tableLoading ||
1226
- !!mssqlSortWarning, onClick: () => {
1227
- if (!openPopover) {
1228
- setOpenPopover('AddSortPopover');
1229
- }
1230
- }, label: 'Add sort', tooltipText: mssqlSortWarning }), (0, jsx_runtime_1.jsx)("div", { style: {
1231
- position: 'relative',
1232
- ...(openPopover === 'AddSortPopover' && { top: 12 }),
1233
- }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
1234
- if (!isOpen) {
1235
- setOpenPopover(null);
1236
- }
1237
- }, popoverTitle: "Sort by", popoverChildren: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: pivotData
1238
- ? pivotData.columns
1239
- : reportColumnsToStateColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: async (column, direction) => {
1240
- onSortChange({ field: column, direction });
1241
- setOpenPopover(null);
1242
- } }) }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), limit || pivot?.rowLimit ? ((0, jsx_runtime_1.jsx)("div", { style: {
1243
- display: 'flex',
1244
- flexDirection: 'column',
1245
- gap: 8,
1246
- marginBottom: 12,
1247
- }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.LimitSentence, { limit: limit?.value || pivot?.rowLimit || 0, setOpenPopover: setOpenPopover, LimitPopover: LimitPopoverComponent, EditPopover: AddLimitPopover_1.AddLimitPopover, handleDelete: () => {
1248
- onLimitChange(null);
1249
- setOpenPopover(null);
1250
- }, onSave: (limit) => {
1251
- onLimitChange(limit);
1252
- setOpenPopover(null);
1253
- }, TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, disabled: tableLoading || loading }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: columns.length === 0 || loading || tableLoading, onClick: () => {
1254
- if (!openPopover) {
1255
- setOpenPopover('AddLimitPopover');
1256
- }
1257
- }, label: 'Add limit' }), (0, jsx_runtime_1.jsx)("div", { style: {
1258
- position: 'relative',
1259
- ...(openPopover === 'AddLimitPopover' && { top: 12 }),
1260
- }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
1261
- if (!isOpen) {
1262
- setOpenPopover(null);
1263
- }
1264
- }, popoverTitle: "Add limit", popoverChildren: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.AddLimitPopover, { TextInputComponent: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (limit) => {
1265
- onLimitChange(limit);
1266
- setOpenPopover(null);
1267
- } }) }) })] }))] }), (0, jsx_runtime_1.jsx)("div", { style: { width: '100%', minHeight: '30vh' } })] }), (0, jsx_runtime_1.jsxs)(ContainerComponent, { children: [isAIEnabled && ((0, jsx_runtime_1.jsx)("form", { ref: askAIContainerRef, onSubmit: (event) => {
162
+ }, className: className, children: [(0, jsx_runtime_1.jsxs)(SidebarComponent, { children: [(0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Columns" }), (0, jsx_runtime_1.jsx)(ColumnComponent_1.AddColumns, { reportBuilder: reportBuilder, ModalComponent: ModalComponent, ButtonComponent: ButtonComponent, DraggableColumnComponent: DraggableColumnComponent, TextInputComponent: TextInputComponent, SelectColumnComponent: SelectColumnComponent, SecondaryButtonComponent: SecondaryButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState, LoadingComponent: LoadingComponent, onRequestAddVirtualTable: onRequestAddVirtualTable })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), (0, jsx_runtime_1.jsx)(FilterComponent_1.AddFilters, { reportBuilder: reportBuilder, TabsComponent: TabsComponent, FilterPopoverComponent: FilterPopoverComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, MultiSelectComponent: MultiSelectComponent, PopoverComponent: PopoverComponent })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotComponent_1.AddPivot, { reportBuilder: reportBuilder, parentRef: parentRef, SubHeaderComponent: SubHeaderComponent, DeleteButtonComponent: DeleteButtonComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, LoadingComponent: LoadingComponent, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Sort" }), (0, jsx_runtime_1.jsx)(SortComponent_1.AddSort, { reportBuilder: reportBuilder, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, SelectComponent: SelectComponent, PopoverComponent: PopoverComponent, SortPopoverComponent: SortPopoverComponent })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), (0, jsx_runtime_1.jsx)(LimitComponent_1.AddLimit, { reportBuilder: reportBuilder, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, TextInputComponent: TextInputComponent, PopoverComponent: PopoverComponent, LimitPopoverComponent: LimitPopoverComponent })] }), (0, jsx_runtime_1.jsx)("div", { style: { width: '100%', minHeight: '30vh' } })] }), (0, jsx_runtime_1.jsxs)(ContainerComponent, { children: [isAIEnabled && ((0, jsx_runtime_1.jsx)("form", { ref: askAIContainerRef, onSubmit: (event) => {
1268
163
  event.preventDefault();
1269
164
  }, style: {
1270
165
  display: 'flex',
@@ -1280,18 +175,7 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1280
175
  if (tables.length <= 1) {
1281
176
  fetchAstFromPromptHelper();
1282
177
  }
1283
- }, isLoading: askAILoading && columns.length === 0, label: 'Ask AI' }) }), !reportId && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: () => clearAllState(false), disabled: columns.length === 0 || loading }))] }) })), columns.length > 0 && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading: tableLoading || (loading && errorMessage.length === 0), rows: formattedRows, rowCount: pivot ? pivotData?.rowCount : numberOfRows, rowCountIsLoading: rowCountIsLoading, rowsPerPage: 20, columns: pivot
1284
- ? pivotData?.columns || []
1285
- : reportColumnsToStateColumns.map((col) => {
1286
- return {
1287
- field: col.field,
1288
- label: (0, textProcessing_1.snakeAndCamelCaseToTitleCase)(col.field),
1289
- };
1290
- }), onPageChange: onPageChange, onSortChange: (sort) => {
1291
- onSortChange(sort);
1292
- }, disableSort: !!mssqlSortWarning, containerStyle: {
1293
- maxHeight: Math.max(window.innerHeight - 290, 75 + Math.min(Math.max(10, reportRows.length), 20) * 37),
1294
- } })), (0, jsx_runtime_1.jsxs)("div", { style: {
178
+ }, isLoading: askAILoading && columns.length === 0, label: 'Ask AI' }) }), !reportId && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: () => clearAllState(false), disabled: columns.length === 0 || loading }))] }) })), columns.length > 0 && ((0, jsx_runtime_1.jsx)(TableComponent_1.ReportTable, { reportBuilder: reportBuilder, TableComponent: TableComponent })), (0, jsx_runtime_1.jsxs)("div", { style: {
1295
179
  display: 'flex',
1296
180
  flexDirection: 'row',
1297
181
  gap: '12px',
@@ -1308,132 +192,81 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
1308
192
  }, children: [(0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: errorMessage || pivotError }), aiPrompt.trim().length > 500 && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
1309
193
  fetchAstFromPromptHelper();
1310
194
  }, label: 'Retry' })), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => clearAllState(false), label: 'Reset' })] })) : ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } })), stateStack.length > 0 && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: handleUndo, label: "", icon: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", className: "size-6", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3" }) }), disabled: stateStack.length <= 1 || loading })), stateStack.length > 0 && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: handleRedo, label: "", icon: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", className: "size-6", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3" }) }), disabled: poppedStateStack.length < 1 || loading })), columns.length > 0 && activeQuery && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [onDiscardChanges && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: onDiscardChanges, label: "Discard changes" })), !hideCopySQL && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: isCopying ? 'Copied' : 'Copy SQL', onClick: () => copySQLToClipboard() })), !isAdminEnabled || reportId ? null : ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: async () => {
1311
- let tempReportQuery = activeQuery;
1312
- if (queryOutOfSync) {
1313
- tempReportQuery =
1314
- await fetchQueryFromReportBuilderState(reportBuilderState);
1315
- }
1316
- const tempReportColumns = columns
1317
- .map((column) => {
1318
- return reportColumnsToStateColumns.find((col) => col.field === (column.alias || column.field));
1319
- })
1320
- .filter((col) => col !== undefined);
1321
- let customFieldColumns = [];
1322
- if (client && isSelectStar && schemaData.customFields) {
1323
- customFieldColumns = tables.flatMap((table) => {
1324
- return (schemaData.customFields?.[table.name || ''] || []).map((field) => field.field);
1325
- });
1326
- }
1327
- setTempReport({
1328
- ...tempReport,
1329
- ...(pivot
1330
- ? (0, pivotProcessing_1.pivotFormData)(pivot, reportColumnsToStateColumns, tempReport, tempReport.chartType, pivotData ?? undefined)
1331
- : {}),
1332
- id: Report_1.TEMP_REPORT_ID,
1333
- dashboardName: destinationDashboard,
1334
- pivot: pivot,
1335
- yAxisFields: tempReport?.pivot && !pivot
1336
- ? []
1337
- : tempReport?.yAxisFields,
1338
- columns: isSelectStar
1339
- ? // if SELECT *, filter out custom fields from tabular view
1340
- // so Automatic Custom Fields can be applied
1341
- tempReportColumns.filter((col) => {
1342
- return !customFieldColumns.includes(col.field);
1343
- })
1344
- : tempReportColumns,
1345
- columnInternal: isSelectStar
1346
- ? // if SELECT *, filter out custom fields from tabular view
1347
- // so Automatic Custom Fields can be applied
1348
- tempReportColumns.filter((col) => {
1349
- return !customFieldColumns.includes(col.field);
1350
- })
1351
- : tempReportColumns,
1352
- queryString: isSelectStar
1353
- ? (0, convert_1.convertQueryToSelectStar)(tempReportQuery)
1354
- : tempReportQuery,
1355
- includeCustomFields: isSelectStar,
1356
- rows: reportRows,
1357
- pivotRows: pivotData?.rows,
1358
- pivotColumns: pivotData?.columns,
1359
- pivotRowCount: pivotData?.rowCount,
1360
- pivotQuery: pivotData?.pivotQuery,
1361
- comparisonPivotQuery: pivotData?.comparisonPivotQuery,
1362
- flags: tempReport?.flags,
1363
- chartType: 'table',
1364
- });
195
+ onSaveQuery();
1365
196
  setIsSaveQueryModalOpen(true);
1366
197
  }, disabled: !!errorMessage ||
1367
198
  !!pivotError ||
1368
199
  tableLoading ||
1369
200
  loading ||
1370
201
  !!unresolvedReportMessage, label: 'Save query', tooltipText: unresolvedReportMessage })), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: async () => {
1371
- let tempReportQuery = activeQuery;
1372
- if (queryOutOfSync) {
1373
- tempReportQuery =
1374
- await fetchQueryFromReportBuilderState(reportBuilderState);
1375
- }
1376
- onSaveChanges && onSaveChanges();
1377
- const tempReportColumns = columns
1378
- .map((column) => {
1379
- return reportColumnsToStateColumns.find((col) => col.field === (column.alias || column.field));
1380
- })
1381
- .filter((col) => col !== undefined);
1382
- let customFieldColumns = [];
1383
- if (client && isSelectStar && schemaData.customFields) {
1384
- customFieldColumns = tables.flatMap((table) => {
1385
- return (schemaData.customFields?.[table.name || ''] || []).map((field) => field.field);
1386
- });
1387
- }
1388
- setTempReport({
1389
- ...tempReport,
1390
- ...(pivot
1391
- ? (0, pivotProcessing_1.pivotFormData)(pivot, reportColumnsToStateColumns, tempReport, tempReport.chartType, pivotData ?? undefined)
1392
- : {}),
1393
- id: Report_1.TEMP_REPORT_ID,
1394
- dashboardName: destinationDashboard,
1395
- pivot: pivot,
1396
- yAxisFields: tempReport?.pivot && !pivot
1397
- ? []
1398
- : tempReport?.yAxisFields,
1399
- columns: isSelectStar
1400
- ? // if SELECT *, filter out custom fields from tabular view
1401
- // so Automatic Custom Fields can be applied
1402
- tempReportColumns.filter((col) => {
1403
- return !customFieldColumns.includes(col.field);
1404
- })
1405
- : tempReportColumns,
1406
- columnInternal: isSelectStar
1407
- ? // if SELECT *, filter out custom fields from tabular view
1408
- // so Automatic Custom Fields can be applied
1409
- tempReportColumns.filter((col) => {
1410
- return !customFieldColumns.includes(col.field);
1411
- })
1412
- : tempReportColumns,
1413
- queryString: isSelectStar
1414
- ? (0, convert_1.convertQueryToSelectStar)(tempReportQuery)
1415
- : tempReportQuery,
1416
- includeCustomFields: isSelectStar,
1417
- rows: reportRows,
1418
- pivotRows: pivotData?.rows,
1419
- pivotColumns: pivotData?.columns,
1420
- pivotRowCount: pivotData?.rowCount,
1421
- pivotQuery: pivotData?.pivotQuery,
1422
- comparisonPivotQuery: pivotData?.comparisonPivotQuery,
1423
- flags: tempReport?.flags,
1424
- });
202
+ onSaveReport();
1425
203
  setIsChartBuilderOpen(true);
1426
204
  }, disabled: !!errorMessage ||
1427
205
  !!pivotError ||
1428
206
  tableLoading ||
1429
207
  loading ||
1430
- !!unresolvedReportMessage, label: reportId ? 'Save changes' : 'Add to dashboard', tooltipText: unresolvedReportMessage })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { tempReport: tempReport, reportId: reportId, isAdmin: isAdminEnabled, title: chartBuilderTitle
1431
- ? chartBuilderTitle
1432
- : reportId
1433
- ? 'Save changes'
1434
- : 'Add to dashboard', isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: reportId ? onSubmitEditReport : onSubmitCreateReport, destinationDashboard: destinationDashboard, destinationSection: destinationSection, organizationName: organizationName, initialUniqueValues: columnUniqueValues, initialUniqueValuesIsLoading: filteredUniqueValuesIsLoading || unfilteredUniqueValuesIsLoading, pivotRecommendationsEnabled: pivotRecommendationsEnabledState, 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, CheckboxComponent: CheckboxComponent, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true, hideDeleteButton: true, buttonLabel: !!reportId ? 'Save changes' : 'Add to dashboard', onClickChartElement: onClickChartElement, filtersEnabled: filtersEnabled, onFiltersEnabledChanged: (enabled) => {
1435
- setFiltersEnabled(enabled);
1436
- }, isEditingMode: true, runQueryOnMount: filtersEnabled })), isSaveQueryModalOpen && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { isHorizontalView: false, hideTableView: true, hideChartView: true, hidePivotForm: true, hideChartType: true, isOpen: isSaveQueryModalOpen, setIsOpen: setIsSaveQueryModalOpen, onAddToDashboardComplete: onSubmitSaveQuery, destinationDashboard: constants_1.SAVED_QUERIES_DASHBOARD, destinationSection: destinationSection, isAdmin: false, title: 'Save query', buttonLabel: 'Save query', tempReport: tempReport, reportId: reportId, organizationName: organizationName, CardComponent: CardComponent, TableComponent: TableComponent, ModalComponent: ModalComponent, ButtonComponent: ButtonComponent, TextInputComponent: TextInputComponent, SelectComponent: SelectComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, PopoverComponent: PopoverComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, FormContainer: ChartBuilderFormContainer, CheckboxComponent: CheckboxComponent, hideDateRangeFilter: true, hideDeleteButton: true, hideDiscardChanges: true, hideSQLQuery: false, onClickChartElement: onClickChartElement,
1437
- // hide filters table, make it a table chart etc
1438
- filtersEnabled: filtersEnabled, onFiltersEnabledChanged: (enabled) => setFiltersEnabled(enabled), isEditingMode: true }))] }));
208
+ !!unresolvedReportMessage, label: reportId ? 'Save changes' : 'Add to dashboard', tooltipText: unresolvedReportMessage })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] })), (!isChartBuilderHorizontalView || isChartBuilderOpen) && ((0, jsx_runtime_1.jsx)(SaveReport_1.SaveReport
209
+ // The reason this isn't just using the default trigger and
210
+ // directly replacing the Add To Dashboard button above is because
211
+ // that button is in a div with overflow: hidden
212
+ , {
213
+ // The reason this isn't just using the default trigger and
214
+ // directly replacing the Add To Dashboard button above is because
215
+ // that button is in a div with overflow: hidden
216
+ SaveTrigger: null, reportBuilder: reportBuilder, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, isAdminEnabled: isAdminEnabled, chartBuilderTitle: chartBuilderTitle, onSubmitEditReport: onSubmitEditReport, onSubmitCreateReport: onSubmitCreateReport, destinationSection: destinationSection, ModalComponent: ChartBuilderModalComponent, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, CheckboxComponent: CheckboxComponent, ChartBuilderFormContainer: ChartBuilderFormContainer, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, onClickChartElement: onClickChartElement })
217
+ // <ChartBuilderWithModal
218
+ // tempReport={tempReport}
219
+ // reportId={reportId}
220
+ // isAdmin={isAdminEnabled}
221
+ // title={
222
+ // chartBuilderTitle
223
+ // ? chartBuilderTitle
224
+ // : reportId
225
+ // ? 'Save changes'
226
+ // : 'Add to dashboard'
227
+ // }
228
+ // isHorizontalView={true}
229
+ // isOpen={isChartBuilderOpen}
230
+ // setIsOpen={setIsChartBuilderOpen}
231
+ // onAddToDashboardComplete={
232
+ // reportId ? onSubmitEditReport : onSubmitCreateReport
233
+ // }
234
+ // destinationDashboard={destinationDashboard}
235
+ // destinationSection={destinationSection}
236
+ // organizationName={organizationName}
237
+ // initialUniqueValues={columnUniqueValues}
238
+ // initialUniqueValuesIsLoading={
239
+ // filteredUniqueValuesIsLoading || unfilteredUniqueValuesIsLoading
240
+ // }
241
+ // pivotRecommendationsEnabled={pivotRecommendationsEnabled}
242
+ // SelectComponent={SelectComponent}
243
+ // TextInputComponent={TextInputComponent}
244
+ // ButtonComponent={ButtonComponent}
245
+ // SecondaryButtonComponent={SecondaryButtonComponent}
246
+ // HeaderComponent={HeaderComponent}
247
+ // SubHeaderComponent={SubHeaderComponent}
248
+ // LabelComponent={LabelComponent}
249
+ // TextComponent={TextComponent}
250
+ // CardComponent={CardComponent}
251
+ // ModalComponent={ChartBuilderModalComponent}
252
+ // PopoverComponent={PopoverComponent}
253
+ // TableComponent={TableComponent}
254
+ // DeleteButtonComponent={DeleteButtonComponent}
255
+ // LoadingComponent={LoadingComponent}
256
+ // ChartBuilderInputRowContainer={ChartBuilderInputRowContainer}
257
+ // ChartBuilderInputColumnContainer={ChartBuilderInputColumnContainer}
258
+ // CheckboxComponent={CheckboxComponent}
259
+ // FormContainer={ChartBuilderFormContainer}
260
+ // hideDateRangeFilter={true}
261
+ // hideDeleteButton={true}
262
+ // buttonLabel={!!reportId ? 'Save changes' : 'Add to dashboard'}
263
+ // onClickChartElement={onClickChartElement}
264
+ // filtersEnabled={filtersEnabled}
265
+ // onFiltersEnabledChanged={(enabled: boolean) => {
266
+ // setFiltersEnabled(enabled);
267
+ // }}
268
+ // isEditingMode={true}
269
+ // runQueryOnMount={filtersEnabled}
270
+ // />
271
+ ), isSaveQueryModalOpen && ((0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { isHorizontalView: false, hideTableView: true, hideChartView: true, hidePivotForm: true, hideChartType: true, isOpen: isSaveQueryModalOpen, setIsOpen: setIsSaveQueryModalOpen, onAddToDashboardComplete: onSubmitSaveQuery, destinationDashboard: constants_1.SAVED_QUERIES_DASHBOARD, destinationSection: destinationSection, isAdmin: false, title: 'Save query', buttonLabel: 'Save query', tempReport: tempReport, reportId: reportId, organizationName: organizationName, CardComponent: CardComponent, TableComponent: TableComponent, ModalComponent: ModalComponent, ButtonComponent: ButtonComponent, TextInputComponent: TextInputComponent, SelectComponent: SelectComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, PopoverComponent: PopoverComponent, DeleteButtonComponent: DeleteButtonComponent, LoadingComponent: LoadingComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, FormContainer: ChartBuilderFormContainer, CheckboxComponent: CheckboxComponent, hideDateRangeFilter: true, hideDeleteButton: true, hideDiscardChanges: true, hideSQLQuery: false, onClickChartElement: onClickChartElement, isEditingMode: true }))] }));
1439
272
  }