@quillsql/react 2.14.14 → 2.14.16

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 (233) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +0 -12
  3. package/dist/cjs/ChartBuilder.d.ts +2 -3
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +23 -107
  6. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  7. package/dist/cjs/ChartEditor.js +0 -2
  8. package/dist/cjs/Context.d.ts +2 -6
  9. package/dist/cjs/Context.d.ts.map +1 -1
  10. package/dist/cjs/Context.js +32 -159
  11. package/dist/cjs/Dashboard.d.ts.map +1 -1
  12. package/dist/cjs/Dashboard.js +16 -93
  13. package/dist/cjs/QuillProvider.d.ts +1 -38
  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 +1 -4
  17. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  18. package/dist/cjs/ReportBuilder.js +1270 -103
  19. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  20. package/dist/cjs/SQLEditor.js +6 -50
  21. package/dist/cjs/Table.d.ts.map +1 -1
  22. package/dist/cjs/Table.js +0 -12
  23. package/dist/cjs/components/Chart/InternalChart.d.ts.map +1 -1
  24. package/dist/cjs/components/Chart/InternalChart.js +1 -24
  25. package/dist/cjs/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  26. package/dist/cjs/components/Dashboard/DashboardTemplate.js +1 -2
  27. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  28. package/dist/cjs/components/Dashboard/DataLoader.js +2 -73
  29. package/dist/cjs/components/Dashboard/util.d.ts +1 -2
  30. package/dist/cjs/components/Dashboard/util.d.ts.map +1 -1
  31. package/dist/cjs/components/Dashboard/util.js +1 -12
  32. package/dist/cjs/components/QuillTable.d.ts +1 -2
  33. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  34. package/dist/cjs/components/QuillTable.js +2 -2
  35. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  36. package/dist/cjs/components/ReportBuilder/AddColumnModal.js +1 -7
  37. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  38. package/dist/cjs/components/ReportBuilder/ui.js +1 -3
  39. package/dist/cjs/components/UiComponents.d.ts +2 -5
  40. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  41. package/dist/cjs/components/UiComponents.js +5 -6
  42. package/dist/cjs/hooks/useAskQuill.d.ts.map +1 -1
  43. package/dist/cjs/hooks/useAskQuill.js +0 -38
  44. package/dist/cjs/hooks/useDashboard.d.ts.map +1 -1
  45. package/dist/cjs/hooks/useDashboard.js +4 -60
  46. package/dist/cjs/hooks/useExport.d.ts.map +1 -1
  47. package/dist/cjs/hooks/useExport.js +2 -5
  48. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  49. package/dist/cjs/hooks/useQuill.js +1 -25
  50. package/dist/cjs/hooks/useVirtualTables.d.ts.map +1 -1
  51. package/dist/cjs/hooks/useVirtualTables.js +2 -27
  52. package/dist/cjs/index.d.ts +0 -11
  53. package/dist/cjs/index.d.ts.map +1 -1
  54. package/dist/cjs/index.js +1 -17
  55. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts +1 -14
  56. package/dist/cjs/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  57. package/dist/cjs/internals/ReportBuilder/PivotForm.js +4 -87
  58. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +2 -18
  59. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  60. package/dist/cjs/internals/ReportBuilder/PivotModal.js +141 -420
  61. package/dist/cjs/utils/astProcessing.d.ts +2 -4
  62. package/dist/cjs/utils/astProcessing.d.ts.map +1 -1
  63. package/dist/cjs/utils/astProcessing.js +2 -25
  64. package/dist/cjs/utils/client.d.ts +1 -2
  65. package/dist/cjs/utils/client.d.ts.map +1 -1
  66. package/dist/cjs/utils/client.js +1 -12
  67. package/dist/cjs/utils/dashboard.d.ts +1 -3
  68. package/dist/cjs/utils/dashboard.d.ts.map +1 -1
  69. package/dist/cjs/utils/dashboard.js +3 -44
  70. package/dist/cjs/utils/filterProcessing.d.ts +1 -2
  71. package/dist/cjs/utils/filterProcessing.d.ts.map +1 -1
  72. package/dist/cjs/utils/filterProcessing.js +1 -12
  73. package/dist/cjs/utils/pivotConstructor.d.ts.map +1 -1
  74. package/dist/cjs/utils/pivotConstructor.js +21 -15
  75. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -1
  76. package/dist/cjs/utils/pivotProcessing.js +3 -1
  77. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -1
  78. package/dist/cjs/utils/queryConstructor.js +19 -11
  79. package/dist/cjs/utils/report.d.ts +5 -10
  80. package/dist/cjs/utils/report.d.ts.map +1 -1
  81. package/dist/cjs/utils/report.js +7 -51
  82. package/dist/cjs/utils/reportBuilder.d.ts.map +1 -1
  83. package/dist/cjs/utils/reportBuilder.js +2 -5
  84. package/dist/cjs/utils/schema.d.ts +2 -5
  85. package/dist/cjs/utils/schema.d.ts.map +1 -1
  86. package/dist/cjs/utils/schema.js +2 -14
  87. package/dist/cjs/utils/tableProcessing.d.ts +10 -17
  88. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -1
  89. package/dist/cjs/utils/tableProcessing.js +17 -99
  90. package/dist/esm/Chart.d.ts.map +1 -1
  91. package/dist/esm/Chart.js +1 -13
  92. package/dist/esm/ChartBuilder.d.ts +2 -3
  93. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  94. package/dist/esm/ChartBuilder.js +25 -109
  95. package/dist/esm/ChartEditor.d.ts.map +1 -1
  96. package/dist/esm/ChartEditor.js +1 -3
  97. package/dist/esm/Context.d.ts +2 -6
  98. package/dist/esm/Context.d.ts.map +1 -1
  99. package/dist/esm/Context.js +31 -158
  100. package/dist/esm/Dashboard.d.ts.map +1 -1
  101. package/dist/esm/Dashboard.js +17 -94
  102. package/dist/esm/QuillProvider.d.ts +1 -38
  103. package/dist/esm/QuillProvider.d.ts.map +1 -1
  104. package/dist/esm/QuillProvider.js +2 -2
  105. package/dist/esm/ReportBuilder.d.ts +1 -4
  106. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  107. package/dist/esm/ReportBuilder.js +1270 -106
  108. package/dist/esm/SQLEditor.d.ts.map +1 -1
  109. package/dist/esm/SQLEditor.js +7 -51
  110. package/dist/esm/Table.d.ts.map +1 -1
  111. package/dist/esm/Table.js +1 -13
  112. package/dist/esm/components/Chart/InternalChart.d.ts.map +1 -1
  113. package/dist/esm/components/Chart/InternalChart.js +2 -25
  114. package/dist/esm/components/Dashboard/DashboardTemplate.d.ts.map +1 -1
  115. package/dist/esm/components/Dashboard/DashboardTemplate.js +2 -3
  116. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  117. package/dist/esm/components/Dashboard/DataLoader.js +3 -74
  118. package/dist/esm/components/Dashboard/util.d.ts +1 -2
  119. package/dist/esm/components/Dashboard/util.d.ts.map +1 -1
  120. package/dist/esm/components/Dashboard/util.js +1 -12
  121. package/dist/esm/components/QuillTable.d.ts +1 -2
  122. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  123. package/dist/esm/components/QuillTable.js +2 -2
  124. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -1
  125. package/dist/esm/components/ReportBuilder/AddColumnModal.js +1 -7
  126. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  127. package/dist/esm/components/ReportBuilder/ui.js +2 -4
  128. package/dist/esm/components/UiComponents.d.ts +2 -5
  129. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  130. package/dist/esm/components/UiComponents.js +5 -6
  131. package/dist/esm/hooks/useAskQuill.d.ts.map +1 -1
  132. package/dist/esm/hooks/useAskQuill.js +1 -39
  133. package/dist/esm/hooks/useDashboard.d.ts.map +1 -1
  134. package/dist/esm/hooks/useDashboard.js +5 -61
  135. package/dist/esm/hooks/useExport.d.ts.map +1 -1
  136. package/dist/esm/hooks/useExport.js +3 -6
  137. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  138. package/dist/esm/hooks/useQuill.js +2 -26
  139. package/dist/esm/hooks/useVirtualTables.d.ts.map +1 -1
  140. package/dist/esm/hooks/useVirtualTables.js +3 -28
  141. package/dist/esm/index.d.ts +0 -11
  142. package/dist/esm/index.d.ts.map +1 -1
  143. package/dist/esm/index.js +0 -8
  144. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts +1 -14
  145. package/dist/esm/internals/ReportBuilder/PivotForm.d.ts.map +1 -1
  146. package/dist/esm/internals/ReportBuilder/PivotForm.js +5 -88
  147. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +2 -18
  148. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  149. package/dist/esm/internals/ReportBuilder/PivotModal.js +143 -422
  150. package/dist/esm/utils/astProcessing.d.ts +2 -4
  151. package/dist/esm/utils/astProcessing.d.ts.map +1 -1
  152. package/dist/esm/utils/astProcessing.js +2 -25
  153. package/dist/esm/utils/client.d.ts +1 -2
  154. package/dist/esm/utils/client.d.ts.map +1 -1
  155. package/dist/esm/utils/client.js +1 -12
  156. package/dist/esm/utils/dashboard.d.ts +1 -3
  157. package/dist/esm/utils/dashboard.d.ts.map +1 -1
  158. package/dist/esm/utils/dashboard.js +3 -44
  159. package/dist/esm/utils/filterProcessing.d.ts +1 -2
  160. package/dist/esm/utils/filterProcessing.d.ts.map +1 -1
  161. package/dist/esm/utils/filterProcessing.js +1 -12
  162. package/dist/esm/utils/pivotConstructor.d.ts.map +1 -1
  163. package/dist/esm/utils/pivotConstructor.js +21 -15
  164. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -1
  165. package/dist/esm/utils/pivotProcessing.js +3 -1
  166. package/dist/esm/utils/queryConstructor.d.ts.map +1 -1
  167. package/dist/esm/utils/queryConstructor.js +19 -11
  168. package/dist/esm/utils/report.d.ts +5 -10
  169. package/dist/esm/utils/report.d.ts.map +1 -1
  170. package/dist/esm/utils/report.js +7 -51
  171. package/dist/esm/utils/reportBuilder.d.ts.map +1 -1
  172. package/dist/esm/utils/reportBuilder.js +2 -5
  173. package/dist/esm/utils/schema.d.ts +2 -5
  174. package/dist/esm/utils/schema.d.ts.map +1 -1
  175. package/dist/esm/utils/schema.js +2 -14
  176. package/dist/esm/utils/tableProcessing.d.ts +10 -17
  177. package/dist/esm/utils/tableProcessing.d.ts.map +1 -1
  178. package/dist/esm/utils/tableProcessing.js +17 -99
  179. package/package.json +1 -1
  180. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts +0 -48
  181. package/dist/cjs/components/ReportBuilder/ColumnComponent.d.ts.map +0 -1
  182. package/dist/cjs/components/ReportBuilder/ColumnComponent.js +0 -46
  183. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts +0 -65
  184. package/dist/cjs/components/ReportBuilder/FilterComponent.d.ts.map +0 -1
  185. package/dist/cjs/components/ReportBuilder/FilterComponent.js +0 -51
  186. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts +0 -42
  187. package/dist/cjs/components/ReportBuilder/LimitComponent.d.ts.map +0 -1
  188. package/dist/cjs/components/ReportBuilder/LimitComponent.js +0 -50
  189. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts +0 -66
  190. package/dist/cjs/components/ReportBuilder/PivotComponent.d.ts.map +0 -1
  191. package/dist/cjs/components/ReportBuilder/PivotComponent.js +0 -47
  192. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts +0 -162
  193. package/dist/cjs/components/ReportBuilder/SaveReport.d.ts.map +0 -1
  194. package/dist/cjs/components/ReportBuilder/SaveReport.js +0 -31
  195. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts +0 -42
  196. package/dist/cjs/components/ReportBuilder/SortComponent.d.ts.map +0 -1
  197. package/dist/cjs/components/ReportBuilder/SortComponent.js +0 -50
  198. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts +0 -28
  199. package/dist/cjs/components/ReportBuilder/TableComponent.d.ts.map +0 -1
  200. package/dist/cjs/components/ReportBuilder/TableComponent.js +0 -24
  201. package/dist/cjs/hooks/useLongLoading.d.ts +0 -13
  202. package/dist/cjs/hooks/useLongLoading.d.ts.map +0 -1
  203. package/dist/cjs/hooks/useLongLoading.js +0 -67
  204. package/dist/cjs/hooks/useReportBuilder.d.ts +0 -178
  205. package/dist/cjs/hooks/useReportBuilder.d.ts.map +0 -1
  206. package/dist/cjs/hooks/useReportBuilder.js +0 -1476
  207. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts +0 -48
  208. package/dist/esm/components/ReportBuilder/ColumnComponent.d.ts.map +0 -1
  209. package/dist/esm/components/ReportBuilder/ColumnComponent.js +0 -39
  210. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts +0 -65
  211. package/dist/esm/components/ReportBuilder/FilterComponent.d.ts.map +0 -1
  212. package/dist/esm/components/ReportBuilder/FilterComponent.js +0 -44
  213. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts +0 -42
  214. package/dist/esm/components/ReportBuilder/LimitComponent.d.ts.map +0 -1
  215. package/dist/esm/components/ReportBuilder/LimitComponent.js +0 -46
  216. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts +0 -66
  217. package/dist/esm/components/ReportBuilder/PivotComponent.d.ts.map +0 -1
  218. package/dist/esm/components/ReportBuilder/PivotComponent.js +0 -40
  219. package/dist/esm/components/ReportBuilder/SaveReport.d.ts +0 -162
  220. package/dist/esm/components/ReportBuilder/SaveReport.d.ts.map +0 -1
  221. package/dist/esm/components/ReportBuilder/SaveReport.js +0 -31
  222. package/dist/esm/components/ReportBuilder/SortComponent.d.ts +0 -42
  223. package/dist/esm/components/ReportBuilder/SortComponent.d.ts.map +0 -1
  224. package/dist/esm/components/ReportBuilder/SortComponent.js +0 -46
  225. package/dist/esm/components/ReportBuilder/TableComponent.d.ts +0 -28
  226. package/dist/esm/components/ReportBuilder/TableComponent.d.ts.map +0 -1
  227. package/dist/esm/components/ReportBuilder/TableComponent.js +0 -20
  228. package/dist/esm/hooks/useLongLoading.d.ts +0 -13
  229. package/dist/esm/hooks/useLongLoading.d.ts.map +0 -1
  230. package/dist/esm/hooks/useLongLoading.js +0 -64
  231. package/dist/esm/hooks/useReportBuilder.d.ts +0 -178
  232. package/dist/esm/hooks/useReportBuilder.d.ts.map +0 -1
  233. package/dist/esm/hooks/useReportBuilder.js +0 -1471
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.default = ReportBuilder;
4
7
  const jsx_runtime_1 = require("react/jsx-runtime");
@@ -8,19 +11,34 @@ const Context_1 = require("./Context");
8
11
  const ChartBuilder_1 = require("./ChartBuilder");
9
12
  const UiComponents_2 = require("./components/UiComponents");
10
13
  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");
11
18
  const width_1 = require("./utils/width");
12
19
  const QuillSelect_1 = require("./components/QuillSelect");
13
20
  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"));
14
26
  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"));
15
31
  const constants_1 = require("./utils/constants");
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");
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");
24
42
  /**
25
43
  * Quill Report Builder
26
44
  *
@@ -92,45 +110,928 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
92
110
  // isChartBuilderHorizontalView: whether the chart builder is in horizontal view mode
93
111
  // onClickChartElement: a callback function triggered when a chart element is clicked
94
112
  // 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);
95
133
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
134
+ const [client] = (0, react_1.useContext)(Context_1.ClientContext);
96
135
  // Refs
97
136
  const parentRef = (0, react_1.useRef)(null);
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);
137
+ // Consts
138
+ const REPORT_BUILDER_PAGINATION = {
139
+ page: 0,
140
+ rowsPerPage: 20,
141
+ rowsPerRequest: 100,
142
+ };
143
+ // ReportBuilder UI States
102
144
  const [isChartBuilderOpen, setIsChartBuilderOpen] = (0, react_1.useState)(false);
145
+ const [filtersEnabled, setFiltersEnabled] = (0, react_1.useState)(!!reportId);
103
146
  const [isSaveQueryModalOpen, setIsSaveQueryModalOpen] = (0, react_1.useState)(false);
104
- // Main
105
- const reportBuilder = (0, useReportBuilder_1.useReportBuilderInternal)({
106
- reportId,
107
- initialTableName,
108
- destinationDashboard,
109
- pivotRecommendationsEnabled,
110
- onSaveChanges,
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,
111
189
  });
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;
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
+ };
128
309
  const copySQLToClipboard = () => {
129
310
  const query = pivot && pivotData ? pivotData.pivotQuery : activeQuery;
130
311
  setIsCopying(true);
131
312
  navigator.clipboard.writeText(query);
132
313
  setTimeout(() => setIsCopying(false), 800);
133
314
  };
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
+ };
134
1035
  (0, react_1.useEffect)(() => {
135
1036
  // Since the TextInput component takes a required numeric width parameter,
136
1037
  // we dynamically calculate the width of this component here.
@@ -143,6 +1044,81 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
143
1044
  window.removeEventListener('resize', handleResize);
144
1045
  };
145
1046
  }, []);
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]);
146
1122
  (0, react_1.useEffect)(() => {
147
1123
  if (isChartBuilderOpen === false) {
148
1124
  onCloseChartBuilder && onCloseChartBuilder();
@@ -159,7 +1135,136 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
159
1135
  : '100%',
160
1136
  overscrollBehavior: 'none',
161
1137
  ...containerStyle,
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 })] }), (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) => {
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) => {
163
1268
  event.preventDefault();
164
1269
  }, style: {
165
1270
  display: 'flex',
@@ -175,7 +1280,18 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
175
1280
  if (tables.length <= 1) {
176
1281
  fetchAstFromPromptHelper();
177
1282
  }
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: {
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: {
179
1295
  display: 'flex',
180
1296
  flexDirection: 'row',
181
1297
  gap: '12px',
@@ -192,81 +1308,132 @@ function ReportBuilder({ initialTableName = '', onSubmitEditReport = () => void
192
1308
  }, children: [(0, jsx_runtime_1.jsx)(ErrorMessageComponent, { errorMessage: errorMessage || pivotError }), aiPrompt.trim().length > 500 && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
193
1309
  fetchAstFromPromptHelper();
194
1310
  }, 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 () => {
195
- onSaveQuery();
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
+ });
196
1365
  setIsSaveQueryModalOpen(true);
197
1366
  }, disabled: !!errorMessage ||
198
1367
  !!pivotError ||
199
1368
  tableLoading ||
200
1369
  loading ||
201
1370
  !!unresolvedReportMessage, label: 'Save query', tooltipText: unresolvedReportMessage })), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: async () => {
202
- onSaveReport();
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
+ });
203
1425
  setIsChartBuilderOpen(true);
204
1426
  }, disabled: !!errorMessage ||
205
1427
  !!pivotError ||
206
1428
  tableLoading ||
207
1429
  loading ||
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 }))] }));
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 }))] }));
272
1439
  }