@quillsql/react 2.11.21 → 2.11.24

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 (201) hide show
  1. package/dist/cjs/Chart.d.ts.map +1 -1
  2. package/dist/cjs/Chart.js +32 -16
  3. package/dist/cjs/ChartBuilder.d.ts +55 -2
  4. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  5. package/dist/cjs/ChartBuilder.js +235 -201
  6. package/dist/cjs/ChartEditor.d.ts +49 -2
  7. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  8. package/dist/cjs/ChartEditor.js +9 -3
  9. package/dist/cjs/Dashboard.d.ts +5 -1
  10. package/dist/cjs/Dashboard.d.ts.map +1 -1
  11. package/dist/cjs/Dashboard.js +42 -18
  12. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  13. package/dist/cjs/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  14. package/dist/cjs/DateRangePicker/QuillDateRangePicker.js +4 -3
  15. package/dist/cjs/ReportBuilder.d.ts +59 -2
  16. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  17. package/dist/cjs/ReportBuilder.js +979 -684
  18. package/dist/cjs/SQLEditor.d.ts +83 -2
  19. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  20. package/dist/cjs/SQLEditor.js +10 -2
  21. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  22. package/dist/cjs/components/Chart/BarChart.js +8 -6
  23. package/dist/cjs/components/Chart/BarList.d.ts.map +1 -1
  24. package/dist/cjs/components/Chart/BarList.js +0 -153
  25. package/dist/cjs/components/Chart/ChartError.d.ts +1 -1
  26. package/dist/cjs/components/Chart/ChartError.d.ts.map +1 -1
  27. package/dist/cjs/components/Chart/ChartError.js +13 -7
  28. package/dist/cjs/components/Chart/ChartTooltip.d.ts +1 -0
  29. package/dist/cjs/components/Chart/ChartTooltip.d.ts.map +1 -1
  30. package/dist/cjs/components/Chart/ChartTooltip.js +6 -7
  31. package/dist/cjs/components/Chart/LineChart.d.ts +1 -1
  32. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  33. package/dist/cjs/components/Chart/LineChart.js +32 -31
  34. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts +1 -1
  35. package/dist/cjs/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  36. package/dist/cjs/components/Dashboard/DashboardFilter.js +21 -21
  37. package/dist/cjs/components/Dashboard/DataLoader.d.ts +24 -0
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  39. package/dist/cjs/components/Dashboard/DataLoader.js +84 -0
  40. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  41. package/dist/cjs/components/Dashboard/MetricComponent.js +4 -1
  42. package/dist/cjs/components/QuillSelect.js +1 -1
  43. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  44. package/dist/cjs/components/QuillTable.js +11 -12
  45. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  46. package/dist/cjs/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  47. package/dist/cjs/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +12 -8
  48. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  49. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +1 -1
  50. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  51. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  52. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +5 -5
  53. package/dist/cjs/components/ReportBuilder/ast.d.ts +6 -0
  54. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  55. package/dist/cjs/components/ReportBuilder/ast.js +13 -2
  56. package/dist/cjs/components/ReportBuilder/constants.d.ts +13 -0
  57. package/dist/cjs/components/ReportBuilder/constants.d.ts.map +1 -1
  58. package/dist/cjs/components/ReportBuilder/constants.js +14 -1
  59. package/dist/cjs/components/ReportBuilder/convert.d.ts +18 -1
  60. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  61. package/dist/cjs/components/ReportBuilder/convert.js +14 -3
  62. package/dist/cjs/components/ReportBuilder/operators.d.ts +15 -23
  63. package/dist/cjs/components/ReportBuilder/operators.d.ts.map +1 -1
  64. package/dist/cjs/components/ReportBuilder/operators.js +19 -27
  65. package/dist/cjs/components/ReportBuilder/pivot.d.ts +2 -0
  66. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  67. package/dist/cjs/components/ReportBuilder/ui.d.ts +3 -2
  68. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  69. package/dist/cjs/components/ReportBuilder/ui.js +54 -28
  70. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -1
  71. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  72. package/dist/cjs/components/ReportBuilder/util.js +3 -0
  73. package/dist/cjs/components/UiComponents.d.ts +34 -4
  74. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  75. package/dist/cjs/components/UiComponents.js +165 -68
  76. package/dist/cjs/hooks/useQuill.d.ts +1 -0
  77. package/dist/cjs/hooks/useQuill.d.ts.map +1 -1
  78. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts +1 -2
  79. package/dist/cjs/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  80. package/dist/cjs/internals/ReportBuilder/PivotList.js +5 -7
  81. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +31 -5
  82. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  83. package/dist/cjs/internals/ReportBuilder/PivotModal.js +437 -282
  84. package/dist/cjs/utils/axisFormatter.js +3 -3
  85. package/dist/cjs/utils/getDomain.d.ts.map +1 -1
  86. package/dist/cjs/utils/getDomain.js +3 -0
  87. package/dist/cjs/utils/merge.d.ts.map +1 -1
  88. package/dist/cjs/utils/merge.js +2 -0
  89. package/dist/cjs/utils/pivotProcessing.d.ts +20 -0
  90. package/dist/cjs/utils/pivotProcessing.d.ts.map +1 -0
  91. package/dist/cjs/utils/pivotProcessing.js +177 -0
  92. package/dist/cjs/utils/queryConstructor.d.ts +2 -0
  93. package/dist/cjs/utils/queryConstructor.d.ts.map +1 -0
  94. package/dist/cjs/utils/queryConstructor.js +11 -0
  95. package/dist/cjs/utils/tableProcessing.d.ts +7 -0
  96. package/dist/cjs/utils/tableProcessing.d.ts.map +1 -0
  97. package/dist/cjs/utils/tableProcessing.js +84 -0
  98. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  99. package/dist/cjs/utils/valueFormatter.js +40 -8
  100. package/dist/esm/Chart.d.ts.map +1 -1
  101. package/dist/esm/Chart.js +33 -17
  102. package/dist/esm/ChartBuilder.d.ts +55 -2
  103. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  104. package/dist/esm/ChartBuilder.js +237 -203
  105. package/dist/esm/ChartEditor.d.ts +49 -2
  106. package/dist/esm/ChartEditor.d.ts.map +1 -1
  107. package/dist/esm/ChartEditor.js +10 -4
  108. package/dist/esm/Dashboard.d.ts +5 -1
  109. package/dist/esm/Dashboard.d.ts.map +1 -1
  110. package/dist/esm/Dashboard.js +21 -20
  111. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts +2 -1
  112. package/dist/esm/DateRangePicker/QuillDateRangePicker.d.ts.map +1 -1
  113. package/dist/esm/DateRangePicker/QuillDateRangePicker.js +4 -3
  114. package/dist/esm/ReportBuilder.d.ts +59 -2
  115. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  116. package/dist/esm/ReportBuilder.js +981 -687
  117. package/dist/esm/SQLEditor.d.ts +83 -2
  118. package/dist/esm/SQLEditor.d.ts.map +1 -1
  119. package/dist/esm/SQLEditor.js +11 -3
  120. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  121. package/dist/esm/components/Chart/BarChart.js +8 -6
  122. package/dist/esm/components/Chart/BarList.d.ts.map +1 -1
  123. package/dist/esm/components/Chart/BarList.js +0 -153
  124. package/dist/esm/components/Chart/ChartError.d.ts +1 -1
  125. package/dist/esm/components/Chart/ChartError.d.ts.map +1 -1
  126. package/dist/esm/components/Chart/ChartError.js +13 -7
  127. package/dist/esm/components/Chart/ChartTooltip.d.ts +1 -0
  128. package/dist/esm/components/Chart/ChartTooltip.d.ts.map +1 -1
  129. package/dist/esm/components/Chart/ChartTooltip.js +6 -7
  130. package/dist/esm/components/Chart/LineChart.d.ts +1 -1
  131. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  132. package/dist/esm/components/Chart/LineChart.js +32 -31
  133. package/dist/esm/components/Dashboard/DashboardFilter.d.ts +1 -1
  134. package/dist/esm/components/Dashboard/DashboardFilter.d.ts.map +1 -1
  135. package/dist/esm/components/Dashboard/DashboardFilter.js +21 -21
  136. package/dist/esm/components/Dashboard/DataLoader.d.ts +24 -0
  137. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  138. package/dist/esm/components/Dashboard/DataLoader.js +82 -0
  139. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  140. package/dist/esm/components/Dashboard/MetricComponent.js +4 -1
  141. package/dist/esm/components/QuillSelect.js +1 -1
  142. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  143. package/dist/esm/components/QuillTable.js +11 -12
  144. package/dist/esm/components/ReportBuilder/{AddColumnPopover.d.ts → AddColumnModal.d.ts} +3 -2
  145. package/dist/esm/components/ReportBuilder/AddColumnModal.d.ts.map +1 -0
  146. package/dist/esm/components/ReportBuilder/{AddColumnPopover.js → AddColumnModal.js} +11 -7
  147. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  148. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +1 -1
  149. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +1 -1
  150. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  151. package/dist/esm/components/ReportBuilder/AddSortPopover.js +5 -5
  152. package/dist/esm/components/ReportBuilder/ast.d.ts +6 -0
  153. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  154. package/dist/esm/components/ReportBuilder/ast.js +11 -1
  155. package/dist/esm/components/ReportBuilder/constants.d.ts +13 -0
  156. package/dist/esm/components/ReportBuilder/constants.d.ts.map +1 -1
  157. package/dist/esm/components/ReportBuilder/constants.js +13 -0
  158. package/dist/esm/components/ReportBuilder/convert.d.ts +18 -1
  159. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  160. package/dist/esm/components/ReportBuilder/convert.js +14 -3
  161. package/dist/esm/components/ReportBuilder/operators.d.ts +15 -23
  162. package/dist/esm/components/ReportBuilder/operators.d.ts.map +1 -1
  163. package/dist/esm/components/ReportBuilder/operators.js +19 -27
  164. package/dist/esm/components/ReportBuilder/pivot.d.ts +2 -0
  165. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  166. package/dist/esm/components/ReportBuilder/ui.d.ts +3 -2
  167. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  168. package/dist/esm/components/ReportBuilder/ui.js +55 -29
  169. package/dist/esm/components/ReportBuilder/util.d.ts +1 -1
  170. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  171. package/dist/esm/components/ReportBuilder/util.js +3 -0
  172. package/dist/esm/components/UiComponents.d.ts +34 -4
  173. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  174. package/dist/esm/components/UiComponents.js +155 -66
  175. package/dist/esm/hooks/useQuill.d.ts +1 -0
  176. package/dist/esm/hooks/useQuill.d.ts.map +1 -1
  177. package/dist/esm/internals/ReportBuilder/PivotList.d.ts +1 -2
  178. package/dist/esm/internals/ReportBuilder/PivotList.d.ts.map +1 -1
  179. package/dist/esm/internals/ReportBuilder/PivotList.js +5 -7
  180. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +31 -5
  181. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  182. package/dist/esm/internals/ReportBuilder/PivotModal.js +438 -284
  183. package/dist/esm/utils/axisFormatter.js +3 -3
  184. package/dist/esm/utils/getDomain.d.ts.map +1 -1
  185. package/dist/esm/utils/getDomain.js +3 -0
  186. package/dist/esm/utils/merge.d.ts.map +1 -1
  187. package/dist/esm/utils/merge.js +2 -0
  188. package/dist/esm/utils/pivotProcessing.d.ts +20 -0
  189. package/dist/esm/utils/pivotProcessing.d.ts.map +1 -0
  190. package/dist/esm/utils/pivotProcessing.js +170 -0
  191. package/dist/esm/utils/queryConstructor.d.ts +2 -0
  192. package/dist/esm/utils/queryConstructor.d.ts.map +1 -0
  193. package/dist/esm/utils/queryConstructor.js +7 -0
  194. package/dist/esm/utils/tableProcessing.d.ts +7 -0
  195. package/dist/esm/utils/tableProcessing.d.ts.map +1 -0
  196. package/dist/esm/utils/tableProcessing.js +80 -0
  197. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  198. package/dist/esm/utils/valueFormatter.js +41 -9
  199. package/package.json +1 -1
  200. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
  201. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +0 -1
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QUILL_SERVER = void 0;
6
7
  const jsx_runtime_1 = require("react/jsx-runtime");
7
8
  /* eslint-disable no-unused-vars */
8
9
  const react_1 = require("react");
@@ -22,7 +23,7 @@ const util_1 = require("./components/ReportBuilder/util");
22
23
  const operators_1 = require("./components/ReportBuilder/operators");
23
24
  const crypto_1 = require("./utils/crypto");
24
25
  const constants_1 = require("./components/ReportBuilder/constants");
25
- const AddColumnPopover_1 = __importDefault(require("./components/ReportBuilder/AddColumnPopover"));
26
+ const AddColumnModal_1 = __importDefault(require("./components/ReportBuilder/AddColumnModal"));
26
27
  const AddSortPopover_1 = require("./components/ReportBuilder/AddSortPopover");
27
28
  const PivotModal_1 = require("./internals/ReportBuilder/PivotModal");
28
29
  const PivotList_1 = require("./internals/ReportBuilder/PivotList");
@@ -32,6 +33,12 @@ const width_1 = require("./utils/width");
32
33
  const QuillSelect_1 = require("./components/QuillSelect");
33
34
  const QuillCard_1 = require("./components/QuillCard");
34
35
  const SQLEditor_1 = require("./SQLEditor");
36
+ const dataFetcher_1 = require("./utils/dataFetcher");
37
+ const valueFormatter_1 = require("./utils/valueFormatter");
38
+ const pivotProcessing_1 = require("./utils/pivotProcessing");
39
+ const tableProcessing_1 = require("./utils/tableProcessing");
40
+ const useQuill_1 = require("./hooks/useQuill");
41
+ exports.QUILL_SERVER = process.env.QUILL_SERVER_HOST ?? 'https://quill-344421.uc.r.appspot.com';
35
42
  /**
36
43
  * Quill Report Builder
37
44
  *
@@ -63,7 +70,8 @@ const SQLEditor_1 = require("./SQLEditor");
63
70
  * ### Report Builder API
64
71
  * @see https://docs.quillsql.com/components/report-builder
65
72
  */
66
- function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, ModalComponent = UiComponents_1.MemoizedModal, TextInputComponent = UiComponents_2.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, TableComponent = UiComponents_1.QuillTableComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.MemoizedCheckbox, SidebarComponent = ui_1.QuillSidebar, ContainerComponent = ui_1.CustomContainer, SelectColumnComponent = ui_1.QuillSelectColumn, DraggableColumnComponent = ui_1.QuillDraggableColumn, SidebarHeadingComponent = ui_1.QuillSidebarHeading, FilterPopoverComponent = ui_1.QuillFilterPopover, SortPopoverComponent = ui_1.QuillSortPopover, LimitPopoverComponent = ui_1.QuillLimitPopover, CardComponent = QuillCard_1.QuillCard, LabelComponent = UiComponents_1.MemoizedLabel, HeaderComponent = UiComponents_1.MemoizedHeader, TextComponent = UiComponents_1.MemoizedText, isAdminEnabled = false, isAIEnabled = true, containerStyle, className, }) {
73
+ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = (_) => void null, destinationDashboard = undefined, organizationName = '', ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, DeleteButtonComponent = UiComponents_1.MemoizedDeleteButton, ModalComponent = UiComponents_1.MemoizedModal, TextInputComponent = UiComponents_2.QuillTextInput, SelectComponent = QuillSelect_1.QuillSelectComponent, TableComponent = UiComponents_1.QuillTableComponent, PopoverComponent = UiComponents_1.MemoizedPopover, TabsComponent = UiComponents_1.QuillTabs, CheckboxComponent = UiComponents_1.MemoizedCheckbox, SidebarComponent = ui_1.QuillSidebar, ContainerComponent = ui_1.CustomContainer, SelectColumnComponent = ui_1.QuillSelectColumn, DraggableColumnComponent = ui_1.QuillDraggableColumn, SidebarHeadingComponent = ui_1.QuillSidebarHeading, FilterPopoverComponent = ui_1.QuillFilterPopover, SortPopoverComponent = ui_1.QuillSortPopover, LimitPopoverComponent = ui_1.QuillLimitPopover, CardComponent = QuillCard_1.QuillCard, LabelComponent = UiComponents_1.MemoizedLabel, HeaderComponent = UiComponents_1.MemoizedHeader, SubHeaderComponent = UiComponents_1.MemoizedSubHeader, TextComponent = UiComponents_1.MemoizedText, ErrorMessageComponent = UiComponents_1.QuillErrorMessageComponent, ChartBuilderInputRowContainer = UiComponents_1.QuillChartBuilderInputRowContainer, ChartBuilderInputColumnContainer = UiComponents_1.QuillChartBuilderInputColumnContainer, PivotRowContainer = UiComponents_1.QuillPivotRowContainer, PivotColumnContainer = UiComponents_1.QuillPivotColumnContainer, ColumnSearchEmptyState = UiComponents_1.QuillColumnSearchEmptyState, ChartBuilderFormContainer = UiComponents_1.QuillChartBuilderFormContainer, isAdminEnabled = false, isAIEnabled = true, showChartBuilderTableFormatOptions = true, containerStyle, className, pivotRecommendationsEnabled = true, initialChartId, }) {
74
+ const { data: initialData } = (0, useQuill_1.useQuill)(initialChartId || '');
67
75
  const [aiPrompt, setAiPrompt] = (0, react_1.useState)('');
68
76
  const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
69
77
  const [baseAst, setBaseAst] = (0, react_1.useState)(null);
@@ -76,12 +84,14 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
76
84
  const [activeEditItem, setActiveEditItem] = (0, react_1.useState)(null);
77
85
  const [activePath, setActivePath] = (0, react_1.useState)(null);
78
86
  const [openPopover, setOpenPopover] = (0, react_1.useState)(null);
79
- const [loading, setLoading] = (0, react_1.useState)(false);
87
+ const [loading, setLoading] = (0, react_1.useState)(!!initialTableName);
80
88
  const [loadingSchema, setLoadingSchema] = (0, react_1.useState)(false);
81
89
  const [isChartBuilderOpen, setIsChartBuilderOpen] = (0, react_1.useState)(false);
82
90
  const [isPending, setIsPending] = (0, react_1.useState)(false);
83
91
  const [isCopying, setIsCopying] = (0, react_1.useState)(false);
92
+ const [dataDisplayed, setDataDisplayed] = (0, react_1.useState)(false);
84
93
  const [rows, setRows] = (0, react_1.useState)([]);
94
+ const [formattedRows, setFormattedRows] = (0, react_1.useState)([]);
85
95
  const [fields, setFields] = (0, react_1.useState)([]);
86
96
  const [topLevelBinaryOperator, setTopLevelBinaryOperator] = (0, react_1.useState)('AND');
87
97
  const [editPopoverKey, setEditPopoverKey] = (0, react_1.useState)(null);
@@ -90,17 +100,17 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
90
100
  const [pivotData, setPivotData] = (0, react_1.useState)(null);
91
101
  const [createdPivots, setCreatedPivots] = (0, react_1.useState)([]);
92
102
  const [recommendedPivots, setRecommendedPivots] = (0, react_1.useState)([]);
93
- const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add Pivot');
103
+ const [pivotPopUpTitle, setPivotPopUpTitle] = (0, react_1.useState)('Add pivot');
94
104
  const [showPivotPopover, setShowPivotPopover] = (0, react_1.useState)(false);
95
105
  const [isEdittingPivot, setIsEdittingPivot] = (0, react_1.useState)(false);
96
106
  const [selectedPivotIndex, setSelectedPivotIndex] = (0, react_1.useState)(-1);
97
- const [initialLoad, setInitialLoad] = (0, react_1.useState)(true);
107
+ const [initialLoad, setInitialLoad] = (0, react_1.useState)(!!initialTableName || !!initialChartId);
98
108
  const [currentTable, setCurrentTable] = (0, react_1.useState)(initialTableName || '');
99
109
  const parentRef = (0, react_1.useRef)(null);
100
110
  const askAIContainerRef = (0, react_1.useRef)(null);
101
111
  const askAILoadingContainerRef = (0, react_1.useRef)(null);
102
- const [askAIInputWidth, setAskAIInputWidth] = (0, react_1.useState)(200);
103
- const [askAILoadingContainerWidth, setAskAILoadingContainerWidth] = (0, react_1.useState)(200);
112
+ const [askAIInputWidth, setAskAIInputWidth] = (0, react_1.useState)(-1);
113
+ const [askAILoadingContainerWidth, setAskAILoadingContainerWidth] = (0, react_1.useState)(-1);
104
114
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
105
115
  const [pivotRowField, setPivotRowField] = (0, react_1.useState)(undefined);
106
116
  const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(undefined);
@@ -108,6 +118,17 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
108
118
  const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(undefined);
109
119
  // eslint-disable-next-line no-unused-vars
110
120
  const [client, _setClient] = (0, react_1.useContext)(Context_1.ClientContext);
121
+ // JANK: This is temp and stupid
122
+ const [overrideRecommendations, setOverrideRecommendations] = (0, react_1.useState)(true);
123
+ (0, react_1.useEffect)(() => {
124
+ if (client.publicKey === '663416663aa9bc716e59a89d') {
125
+ setOverrideRecommendations(false);
126
+ }
127
+ }, [client.publicKey]);
128
+ (0, react_1.useEffect)(() => {
129
+ (0, width_1.updateFirstChildWidth)(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
130
+ (0, width_1.updateFirstChildWidth)(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
131
+ }, [dataDisplayed]);
111
132
  (0, react_1.useEffect)(() => {
112
133
  // Since the TextInput component takes a required numeric width parameter,
113
134
  // we dynamically calculate the width of this component here.
@@ -120,7 +141,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
120
141
  return () => {
121
142
  window.removeEventListener('resize', handleResize);
122
143
  };
123
- }, [baseAst, loading]);
144
+ }, []);
124
145
  const enforceOrderOnColumns = (columnNames) => {
125
146
  if (pivot) {
126
147
  const rowName = pivot.rowField;
@@ -134,39 +155,6 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
134
155
  return columnNames.sort((a, b) => selectedOrderedColumns.indexOf(a) - selectedOrderedColumns.indexOf(b));
135
156
  // return columnNames;
136
157
  };
137
- /**
138
- * Transforms an array of column names into an array of columnInfo objects
139
- * with label, field, format, and fieldType keys.
140
- */
141
- const processColumnsForPivotModal = (columns) => {
142
- return columns.map((col) => ({
143
- label: col,
144
- name: col,
145
- displayName: (0, textProcessing_1.snakeCaseToTitleCase)(col),
146
- field: col,
147
- format: (0, util_1.getPostgresBasicType)(fields.find((f) => f.name === col))?.replace('number', 'whole_number') || 'string',
148
- fieldType: schemaTables
149
- .flatMap((t) => t.columns)
150
- .find((c) => c.name === col)?.fieldType || 'text',
151
- }));
152
- };
153
- /**
154
- * Transforms an array of column names into an array of columnInfo objects
155
- * with label, field, format, and fieldType keys.
156
- */
157
- const processColumnsForChartBuilder = (columns) => {
158
- return columns.map((col) => ({
159
- label: col,
160
- name: col,
161
- displayName: (0, textProcessing_1.snakeCaseToTitleCase)(col),
162
- field: col,
163
- format: (0, SQLEditor_1.convertPostgresColumn)(fields.find((f) => f.name === col)).format ||
164
- 'string',
165
- fieldType: schemaTables
166
- .flatMap((t) => t.columns)
167
- .find((c) => c.name === col)?.fieldType || 'text',
168
- }));
169
- };
170
158
  const clearAllState = () => {
171
159
  // We're trying to not block the main thread while resetting all the state.
172
160
  // This shouldn't be an issue since the dispatches shouldn't block, but
@@ -184,11 +172,13 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
184
172
  setOpenPopover(null);
185
173
  setLoading(false);
186
174
  setIsPending(false);
175
+ setDataDisplayed(false);
187
176
  setRows([]);
188
177
  setFields([]);
189
178
  setTopLevelBinaryOperator('AND');
190
179
  setEditPopoverKey(null);
191
180
  setErrorMessage('');
181
+ setFormattedRows([]);
192
182
  // setUniqueValues({});
193
183
  setPivot(null);
194
184
  setPivotData(null);
@@ -196,8 +186,10 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
196
186
  }, 0);
197
187
  };
198
188
  (0, react_1.useEffect)(() => {
199
- clearAllState();
200
- }, [client]);
189
+ if (!initialLoad && client.publicKey) {
190
+ clearAllState();
191
+ }
192
+ }, [client.publicKey, client.customerId]);
201
193
  (0, react_1.useEffect)(() => {
202
194
  if (activePath !== null) {
203
195
  // update the modal with the new subtree
@@ -260,7 +252,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
260
252
  setErrorMessage('');
261
253
  try {
262
254
  const where = formData ? formData : ast?.where || null;
263
- const response = await fetch(`https://quill-344421.uc.r.appspot.com/sqlify`, {
255
+ const response = await fetch(`${exports.QUILL_SERVER}/sqlify`, {
264
256
  method: 'POST',
265
257
  headers: {
266
258
  'Content-Type': 'application/json',
@@ -273,7 +265,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
273
265
  const data = await response.json();
274
266
  setActiveQuery(data.query);
275
267
  if (fetchData) {
276
- fetchUponChange(ast, formData);
268
+ fetchUponChange(ast, formData, data.query);
277
269
  }
278
270
  }
279
271
  catch (error) {
@@ -301,43 +293,84 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
301
293
  result.push(valueField, rowField);
302
294
  return result.filter(Boolean);
303
295
  };
304
- const fetchDistinctHelper = async (column, table) => {
296
+ const fetchDistinctStrings = async (query, table) => {
305
297
  try {
306
- const query = `SELECT DISTINCT ${column} FROM ${table};`;
307
- const response = await fetch(`https://quill-344421.uc.r.appspot.com/dashquery`, {
308
- method: 'POST',
309
- headers: {
310
- 'Content-Type': 'application/json',
298
+ const hostedBody = {
299
+ metadata: {
300
+ query,
301
+ task: 'query',
302
+ orgId: client.customerId || '*',
303
+ clientId: client.publicKey,
304
+ databaseType: client?.databaseType,
311
305
  },
312
- body: JSON.stringify({
313
- orgId: client.customerId,
314
- publicKey: client.publicKey,
315
- query: query,
316
- }),
317
- });
318
- const data = await response.json();
306
+ };
307
+ const cloudBody = { query };
308
+ const data = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
319
309
  if (data.errorMessage) {
320
- // console.error(data.errorMessage);
321
310
  return null;
322
311
  }
323
- const options = data.rows.map((r) => r[column]);
324
- const newCheckboxValues = options.reduce((obj, col) => {
325
- obj[col] = false;
326
- return obj;
327
- }, {});
328
- return { table, column, values: newCheckboxValues };
312
+ const results = data.rows.map((columnInfo) => {
313
+ const column = columnInfo.field;
314
+ if (!columnInfo.string_values) {
315
+ return { table, column, values: {} };
316
+ }
317
+ const values = columnInfo.string_values.reduce((result, value) => {
318
+ result[value] = false;
319
+ return result;
320
+ }, {});
321
+ return { table, column, values };
322
+ });
323
+ return results;
329
324
  }
330
325
  catch (e) {
331
326
  console.error(e);
332
327
  return null;
333
328
  }
334
329
  };
330
+ (0, react_1.useEffect)(() => {
331
+ const loadChart = async () => {
332
+ if (!initialData || initialData.referencedTables.length !== 1) {
333
+ return;
334
+ }
335
+ const initialRows = await handleAsk(initialData.queryString);
336
+ if (initialData.pivot) {
337
+ // @ts-ignore
338
+ setPivotRowField(initialData.pivot.rowField);
339
+ // @ts-ignore
340
+ setPivotAggregation(initialData.pivot.aggregationType);
341
+ // @ts-ignore
342
+ setPivotColumnField(initialData.pivot.columnField);
343
+ // @ts-ignore
344
+ setPivotValueField(initialData.pivot.valueField);
345
+ setPivot(initialData.pivot);
346
+ const pivotedData = (0, PivotModal_1.generatePivotTable)(
347
+ //@ts-ignore
348
+ initialData.pivot, initialRows, [null, null, null], false);
349
+ setPivotData(pivotedData || []);
350
+ }
351
+ };
352
+ if (initialData && initialData.referencedTables.length === 1) {
353
+ loadChart();
354
+ }
355
+ }, [initialData]);
335
356
  (0, react_1.useEffect)(() => {
336
357
  const loadTable = async (tables) => {
337
358
  if (!tables)
338
359
  return;
339
360
  setLoading(true);
340
- await getDistinctValues(initialTableName, tables);
361
+ const tableInfo = schemaTables.find((tableInfo) => tableInfo.name === initialTableName);
362
+ if (tableInfo) {
363
+ const stringColumns = tableInfo.columns.filter((column) => {
364
+ return (0, ast_1.isTextColumnType)(column.fieldType);
365
+ });
366
+ const stringNames = stringColumns.map((column) => column.name);
367
+ const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(stringColumns, `Select ${stringNames.join(', ')} from ${initialTableName}`, [], client);
368
+ const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
369
+ joinedUniqueValues[initialTableName] = newUniqueValues;
370
+ if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(joinedUniqueValues)) {
371
+ setUniqueValues(joinedUniqueValues);
372
+ }
373
+ }
341
374
  const columnsForTable = tables
342
375
  .find((t) => t.name === initialTableName)
343
376
  ?.columns.map((c) => c.name)
@@ -398,10 +431,11 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
398
431
  return -1;
399
432
  return 0;
400
433
  })));
401
- if (initialTableName && initialLoad) {
434
+ if (initialTableName && initialLoad && !initialChartId) {
402
435
  await loadTable(tables);
403
436
  }
404
437
  setLoadingSchema(false);
438
+ setInitialLoad(false);
405
439
  }
406
440
  catch (error) {
407
441
  console.error(error);
@@ -409,9 +443,8 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
409
443
  };
410
444
  if (schemaTables.length === 0) {
411
445
  fetchSchema();
412
- setInitialLoad(false);
413
446
  }
414
- }, [schemaTables, initialTableName]);
447
+ }, [schemaTables, initialTableName, initialLoad]);
415
448
  const updateFormData = (updates, { isDeletion = false, isInsertion = false, isReplaceSubtree = false, isAddVariant = false, isDeleteVariant = false, topLevelBinOp = 'OR', isCondition = undefined, }) => {
416
449
  // Function to immutably update or delete nodes based on their path
417
450
  // TODO: fix the following horible code
@@ -841,6 +874,11 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
841
874
  newSubtree.left.column = event.target.value;
842
875
  handleReplaceSubtree(keyPrefix, newSubtree);
843
876
  }
877
+ else if ((0, ast_1.isBoolColumnType)(columnType)) {
878
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
879
+ newSubtree.left.column = event.target.value;
880
+ handleReplaceSubtree(keyPrefix, newSubtree);
881
+ }
844
882
  else {
845
883
  const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
846
884
  newSubtree.left.args.value[0].column = event.target.value;
@@ -900,7 +938,8 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
900
938
  },
901
939
  ]));
902
940
  } })), (0, jsx_runtime_1.jsx)(SelectComponent, { value: intervalType, onChange: (event) => {
903
- if (intervalPaths.length === 1) {
941
+ if (intervalPaths.length === 1 &&
942
+ dateFilterType !== 'in the previous') {
904
943
  handleChangeText([
905
944
  {
906
945
  value: intervalCount !== null
@@ -912,7 +951,14 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
912
951
  return;
913
952
  }
914
953
  let newSubtree;
915
- if (dateFilterType === 'equals') {
954
+ if (dateFilterType === 'in the previous') {
955
+ newSubtree = (0, postgres_1.generatePreviousPeriodPostgres)({
956
+ dateField: dateColumn,
957
+ intervalPeriod: `${intervalCount ?? 1} ${event.target.value}`,
958
+ currentPeriod: event.target.value,
959
+ });
960
+ }
961
+ else if (dateFilterType === 'equals') {
916
962
  newSubtree = (0, postgres_1.generateEqualsPostgres)({
917
963
  dateField: dateColumn,
918
964
  currentPeriod: event.target.value,
@@ -926,14 +972,23 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
926
972
  });
927
973
  }
928
974
  handleReplaceSubtree(keyPrefix, newSubtree);
929
- }, options: [
930
- { label: `year${isPlural}`, value: 'year' },
931
- { label: `quarter${isPlural}`, value: 'quarter' },
932
- { label: `month${isPlural}`, value: 'month' },
933
- { label: `week${isPlural}`, value: 'week' },
934
- { label: `day${isPlural}`, value: 'day' },
935
- { label: `hour${isPlural}`, value: 'hour' },
936
- ], width: 200 }), dateFilterType === 'equals' && ((0, jsx_runtime_1.jsx)(TextInputComponent, { id: "date_filter_equals_raw_date", value: rawDateStringEquals, width: 120, onChange: (e) => {
975
+ }, options: dateFilterType === 'in the previous' ||
976
+ dateFilterType === 'in the last'
977
+ ? [
978
+ { label: `year${isPlural}`, value: 'year' },
979
+ { label: `month${isPlural}`, value: 'month' },
980
+ { label: `week${isPlural}`, value: 'week' },
981
+ { label: `day${isPlural}`, value: 'day' },
982
+ { label: `hour${isPlural}`, value: 'hour' },
983
+ ]
984
+ : [
985
+ { label: `year${isPlural}`, value: 'year' },
986
+ { label: `quarter${isPlural}`, value: 'quarter' },
987
+ { label: `month${isPlural}`, value: 'month' },
988
+ { label: `week${isPlural}`, value: 'week' },
989
+ { label: `day${isPlural}`, value: 'day' },
990
+ { label: `hour${isPlural}`, value: 'hour' },
991
+ ], width: 200 }), dateFilterType === 'equals' && ((0, jsx_runtime_1.jsx)(TextInputComponent, { id: "date_filter_equals_raw_date", value: rawDateStringEquals, width: 120, onChange: (e) => {
937
992
  handleChangeText([
938
993
  {
939
994
  value: e.target.value,
@@ -965,6 +1020,11 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
965
1020
  newSubtree.left.column = event.target.value;
966
1021
  handleReplaceSubtree(keyPrefix, newSubtree);
967
1022
  }
1023
+ else if ((0, ast_1.isBoolColumnType)(columnType)) {
1024
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1025
+ newSubtree.left.column = event.target.value;
1026
+ handleReplaceSubtree(keyPrefix, newSubtree);
1027
+ }
968
1028
  else {
969
1029
  const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
970
1030
  newSubtree.left.args.value[0].column = event.target.value;
@@ -979,7 +1039,6 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
979
1039
  { label: 'equals', value: 'EQUALS' },
980
1040
  { label: 'is not null', value: 'IS NOT' },
981
1041
  { label: 'is null', value: 'IS' },
982
- // { label: 'equals', value: 'equals' },
983
1042
  ], width: 200 }), (0, jsx_runtime_1.jsx)(TextInputComponent, { id: 'date_window_interval_count', value: node.right.args.value[1].expr.value, width: 120, onChange: (e) => {
984
1043
  handleChange([
985
1044
  {
@@ -1021,6 +1080,11 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1021
1080
  newSubtree.left.column = event.target.value;
1022
1081
  handleReplaceSubtree(keyPrefix, newSubtree);
1023
1082
  }
1083
+ else if ((0, ast_1.isBoolColumnType)(columnType)) {
1084
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1085
+ newSubtree.left.column = event.target.value;
1086
+ handleReplaceSubtree(keyPrefix, newSubtree);
1087
+ }
1024
1088
  else {
1025
1089
  const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1026
1090
  newSubtree.left.args.value[0].column = event.target.value;
@@ -1075,6 +1139,11 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1075
1139
  newSubtree.left.column = event.target.value;
1076
1140
  handleReplaceSubtree(keyPrefix, newSubtree);
1077
1141
  }
1142
+ else if ((0, ast_1.isBoolColumnType)(columnType)) {
1143
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1144
+ newSubtree.left.column = event.target.value;
1145
+ handleReplaceSubtree(keyPrefix, newSubtree);
1146
+ }
1078
1147
  else {
1079
1148
  const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1080
1149
  newSubtree.left.args.value[0].column = event.target.value;
@@ -1139,6 +1208,11 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1139
1208
  newSubtree.left.column = event.target.value;
1140
1209
  handleReplaceSubtree(keyPrefix, newSubtree);
1141
1210
  }
1211
+ else if ((0, ast_1.isBoolColumnType)(columnType)) {
1212
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1213
+ newSubtree.left.column = event.target.value;
1214
+ handleReplaceSubtree(keyPrefix, newSubtree);
1215
+ }
1142
1216
  else {
1143
1217
  const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1144
1218
  newSubtree.left.args.value[0].column = event.target.value;
@@ -1223,8 +1297,6 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1223
1297
  },
1224
1298
  { label: 'in the current', value: 'IN_THE_CURRENT' },
1225
1299
  { label: 'equals', value: 'equals' },
1226
- { label: 'is not null', value: 'IS NOT' },
1227
- { label: 'is null', value: 'IS' },
1228
1300
  ]
1229
1301
  : []),
1230
1302
  ];
@@ -1251,6 +1323,11 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1251
1323
  newSubtree.left.column = event.target.value;
1252
1324
  handleReplaceSubtree(keyPrefix, newSubtree);
1253
1325
  }
1326
+ else if ((0, ast_1.isBoolColumnType)(columnType)) {
1327
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultBoolComparison);
1328
+ newSubtree.left.column = event.target.value;
1329
+ handleReplaceSubtree(keyPrefix, newSubtree);
1330
+ }
1254
1331
  else {
1255
1332
  const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
1256
1333
  newSubtree.left.args.value[0].column = event.target.value;
@@ -1373,6 +1450,22 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1373
1450
  },
1374
1451
  ]);
1375
1452
  } }));
1453
+ case 'bool':
1454
+ return ((0, jsx_runtime_1.jsx)(SelectComponent, { value: node.value.toString(), onChange: (event) => {
1455
+ let formatted = true;
1456
+ if (event.target.value === 'false') {
1457
+ formatted = false;
1458
+ }
1459
+ handleChange([
1460
+ {
1461
+ value: formatted,
1462
+ path: keyPrefix + 'value',
1463
+ },
1464
+ ]);
1465
+ }, options: [
1466
+ { label: 'is true', value: 'true' },
1467
+ { label: 'is false', value: 'false' },
1468
+ ], width: 200 }));
1376
1469
  case 'function':
1377
1470
  if (!node.args) {
1378
1471
  return (0, jsx_runtime_1.jsx)("label", {});
@@ -1436,7 +1529,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1436
1529
  'NOT IN': 'is not',
1437
1530
  'NOT LIKE': 'is not exactly',
1438
1531
  '!=': 'is not exactly',
1439
- '=': 'is exactly',
1532
+ '=': 'is',
1440
1533
  '<': 'is less than',
1441
1534
  '>': 'is greater than',
1442
1535
  '<=': 'is less than or equal to',
@@ -1448,7 +1541,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1448
1541
  };
1449
1542
  switch (node.type) {
1450
1543
  case 'binary_expr':
1451
- return ((0, jsx_runtime_1.jsx)(ui_1.TagWrapper, { keyPrefix: keyPrefix, formData: formData, activeEditItem: activeEditItem, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setCheckboxes: setCheckboxes, handleReplaceSubtree: handleReplaceSubtree, FilterPopover: FilterPopoverComponent, setActivePath: setActivePath, setOpenPopover: setOpenPopover, setIsPending: setIsPending, clearCheckboxes: clearCheckboxes, handleDelete: handleDelete, editPopoverKey: editPopoverKey, isCard: isCard, isRow: isRow, getByKey: getByKey, EditPopover: ui_1.EditPopover, Button: ButtonComponent, renderNode: renderNode, children: dateComparisonPartialMatch ??
1544
+ return ((0, jsx_runtime_1.jsx)(ui_1.TagWrapper, { keyPrefix: keyPrefix, formData: formData, activeEditItem: activeEditItem, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setCheckboxes: setCheckboxes, handleReplaceSubtree: handleReplaceSubtree, FilterPopover: FilterPopoverComponent, setActivePath: setActivePath, setOpenPopover: setOpenPopover, setIsPending: setIsPending, clearCheckboxes: clearCheckboxes, handleDelete: handleDelete, editPopoverKey: editPopoverKey, isCard: isCard, isRow: isRow, getByKey: getByKey, EditPopover: ui_1.EditPopover, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, renderNode: renderNode, children: dateComparisonPartialMatch ??
1452
1545
  dateEqualityPartialMatch ??
1453
1546
  uniqueSentence ?? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [node.left &&
1454
1547
  renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : isTopLevel || topLevelBinaryOperator === 'OR' ? ((0, jsx_runtime_1.jsx)(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: SelectComponent })) : null, node.right &&
@@ -1473,6 +1566,8 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1473
1566
  return node.value;
1474
1567
  case 'null':
1475
1568
  return 'null';
1569
+ case 'bool':
1570
+ return node.value.toString();
1476
1571
  case 'interval':
1477
1572
  if (node.unit) {
1478
1573
  // eg. `INTERVAL '90' DAY` -> "90 days"
@@ -1584,39 +1679,61 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1584
1679
  justifyContent: 'end',
1585
1680
  }, children: (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: onSave, label: 'Add condition' }) })] }));
1586
1681
  };
1587
- const fetchUponChange = async (baseAst, newFormData) => {
1682
+ const fetchUponChange = async (baseAst, newFormData, query) => {
1588
1683
  // if newFormData is null still use it
1589
1684
  const curFormData = newFormData !== undefined ? newFormData : formData;
1590
1685
  if ((curFormData || baseAst) && !loading) {
1591
1686
  try {
1592
1687
  setLoading(true);
1593
- const res2 = await fetch('https://quill-344421.uc.r.appspot.com/patterns', {
1594
- method: 'POST',
1595
- headers: {
1596
- 'Content-Type': 'application/json',
1597
- },
1598
- body: JSON.stringify({
1688
+ const hostedBody = {
1689
+ metadata: {
1690
+ clientId: client.publicKey,
1599
1691
  ast: { ...baseAst, where: curFormData },
1600
1692
  publicKey: client.publicKey,
1601
1693
  orgId: client.customerId,
1602
- }),
1603
- });
1694
+ task: 'patterns',
1695
+ },
1696
+ };
1697
+ const cloudBody = {};
1698
+ const data2 = await (0, dataFetcher_1.getData)(client, 'dashquery', 'same-origin', hostedBody, cloudBody);
1604
1699
  const tables = (0, ast_1.getTableNames)(baseAst);
1605
1700
  const table = tables.length >= 1 ? tables[0] : initialTableName;
1606
1701
  if (table !== currentTable) {
1607
- await getDistinctValues(table);
1702
+ const tableInfo = schemaTables.find((tableInfo) => tableInfo.name === table);
1703
+ if (tableInfo) {
1704
+ const stringColumns = tableInfo.columns.filter((column) => {
1705
+ return (0, ast_1.isTextColumnType)(column.fieldType);
1706
+ });
1707
+ const stringNames = stringColumns.map((column) => column.name);
1708
+ const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(stringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client);
1709
+ const joinedUniqueValues = (0, util_1.deepCopy)(uniqueValues);
1710
+ joinedUniqueValues[table] = newUniqueValues;
1711
+ if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(joinedUniqueValues)) {
1712
+ setUniqueValues(joinedUniqueValues);
1713
+ }
1714
+ }
1608
1715
  setCurrentTable(table);
1609
1716
  }
1610
- const data2 = await res2.json();
1611
1717
  if (data2.rows && data2.rows.length) {
1612
- const tables = (0, ast_1.getTableNames)(baseAst);
1613
1718
  if (pivot) {
1614
1719
  // check if any of the pivot fields aren't in the data2.fields array
1615
1720
  if (!isValidPivot(data2.fields)) {
1721
+ const processedFields = data2.fields.map((elem) => (0, SQLEditor_1.convertPostgresColumn)(elem));
1616
1722
  setPivot(null);
1617
1723
  setPivotData(null);
1618
1724
  setRows(data2.rows);
1619
- setFields(data2.fields);
1725
+ setFields(processedFields);
1726
+ setFormattedRows(data2.rows.map((row) => {
1727
+ return processedFields.reduce((formattedRow, column) => {
1728
+ // Apply the format function to each field in the row
1729
+ const formattedValue = (0, valueFormatter_1.quillFormat)({
1730
+ value: row[column.field],
1731
+ format: column.format,
1732
+ });
1733
+ formattedRow[column.field] = formattedValue;
1734
+ return formattedRow;
1735
+ }, {});
1736
+ }));
1620
1737
  return;
1621
1738
  }
1622
1739
  // Do all of this to make sure we have the right unique columns when applying a pivot
@@ -1628,13 +1745,37 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1628
1745
  uniqueFormatted[pivot.columnField] = uniqueRecords;
1629
1746
  const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, data2.rows, [null, null, null], false);
1630
1747
  console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
1748
+ const processedFields = data2.fields.map((elem) => (0, SQLEditor_1.convertPostgresColumn)(elem));
1631
1749
  setPivotData(pivotedData || []);
1632
1750
  setRows(data2.rows);
1633
- setFields(data2.fields);
1751
+ setFields(processedFields);
1752
+ setFormattedRows(data2.rows.map((row) => {
1753
+ return processedFields.reduce((formattedRow, column) => {
1754
+ // Apply the format function to each field in the row
1755
+ const formattedValue = (0, valueFormatter_1.quillFormat)({
1756
+ value: row[column.field],
1757
+ format: column.format,
1758
+ });
1759
+ formattedRow[column.field] = formattedValue;
1760
+ return formattedRow;
1761
+ }, {});
1762
+ }));
1634
1763
  }
1635
1764
  else {
1765
+ const processedFields = data2.fields.map((elem) => (0, SQLEditor_1.convertPostgresColumn)(elem));
1636
1766
  setRows(data2.rows);
1637
- setFields(data2.fields);
1767
+ setFields(processedFields);
1768
+ setFormattedRows(data2.rows.map((row) => {
1769
+ return processedFields.reduce((formattedRow, column) => {
1770
+ // Apply the format function to each field in the row
1771
+ const formattedValue = (0, valueFormatter_1.quillFormat)({
1772
+ value: row[column.field],
1773
+ format: column.format,
1774
+ });
1775
+ formattedRow[column.field] = formattedValue;
1776
+ return formattedRow;
1777
+ }, {});
1778
+ }));
1638
1779
  if (data2.errorMessage) {
1639
1780
  setErrorMessage(`Error: ${data2.errorMessage}`);
1640
1781
  }
@@ -1643,6 +1784,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1643
1784
  else {
1644
1785
  setRows([]);
1645
1786
  setFields([]);
1787
+ setFormattedRows([]);
1646
1788
  setPivotData(null);
1647
1789
  }
1648
1790
  }
@@ -1651,6 +1793,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1651
1793
  }
1652
1794
  finally {
1653
1795
  setLoading(false);
1796
+ setDataDisplayed(true);
1654
1797
  }
1655
1798
  }
1656
1799
  };
@@ -1721,6 +1864,14 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1721
1864
  return x ?? 0.0;
1722
1865
  };
1723
1866
  }
1867
+ else if (formatType === 'boolean') {
1868
+ columnFormatters[field.name] = (x) => {
1869
+ if (x) {
1870
+ return 'True';
1871
+ }
1872
+ return 'False';
1873
+ };
1874
+ }
1724
1875
  else {
1725
1876
  columnFormatters[field.name] = (x) => x;
1726
1877
  }
@@ -1751,39 +1902,14 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1751
1902
  }
1752
1903
  return false;
1753
1904
  };
1754
- const getDistinctValues = async (table, overrideSchema) => {
1755
- const schemaInfo = overrideSchema || schemaTables;
1756
- const tableInfo = schemaInfo.find((tableInfo) => tableInfo.name === table);
1757
- if (tableInfo) {
1758
- const pendingFetches = [];
1759
- for (let column of tableInfo.columns) {
1760
- if (!(0, ast_1.isTextColumnType)(column.fieldType))
1761
- continue;
1762
- const fetchPromise = fetchDistinctHelper(column.name, tableInfo.displayName);
1763
- pendingFetches.push(fetchPromise);
1764
- }
1765
- const newUniqueValues = {};
1766
- const resolvedPromises = await Promise.all(pendingFetches);
1767
- for (const resolvedData of resolvedPromises) {
1768
- if (resolvedData) {
1769
- const { table, column, values } = resolvedData;
1770
- if (!newUniqueValues[table]) {
1771
- newUniqueValues[table] = {};
1772
- }
1773
- newUniqueValues[table][column] = values;
1774
- }
1775
- }
1776
- if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
1777
- setUniqueValues(newUniqueValues);
1778
- }
1779
- }
1780
- };
1781
1905
  const handleAsk = async (overridePrompt = '') => {
1782
1906
  if (!aiPrompt && !overridePrompt) {
1783
1907
  return;
1784
1908
  }
1785
1909
  try {
1910
+ let errored = false;
1786
1911
  setLoading(true);
1912
+ setErrorMessage('');
1787
1913
  let res, data, ast;
1788
1914
  let numRetries = 0;
1789
1915
  const MAX_RETRIES = 3;
@@ -1794,7 +1920,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1794
1920
  if (numRetries === MAX_RETRIES)
1795
1921
  break;
1796
1922
  if (!activeQuery || (ast && (isTableJoin || isSubquery(ast?.where)))) {
1797
- res = await fetch('https://quill-344421.uc.r.appspot.com/magic', {
1923
+ res = await fetch(`${exports.QUILL_SERVER}/magic`, {
1798
1924
  method: 'POST',
1799
1925
  headers: { 'Content-Type': 'application/json' },
1800
1926
  body: JSON.stringify({
@@ -1804,7 +1930,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1804
1930
  });
1805
1931
  }
1806
1932
  else {
1807
- res = await fetch('https://quill-344421.uc.r.appspot.com/magic/edit', {
1933
+ res = await fetch(`${exports.QUILL_SERVER}/magic/edit`, {
1808
1934
  method: 'POST',
1809
1935
  headers: { 'Content-Type': 'application/json' },
1810
1936
  body: JSON.stringify({
@@ -1844,15 +1970,6 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1844
1970
  const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
1845
1971
  const tableAlias = (0, ast_1.getTableAliases)(newAst)[0] ?? initialTableName;
1846
1972
  newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, tableAlias ?? table, getAllPossibleColumns().map((col) => col.name));
1847
- // newAst = convertDateComparison(newAst); // TODO
1848
- if (table !== currentTable) {
1849
- await getDistinctValues(table);
1850
- setCurrentTable(table);
1851
- }
1852
- setPivotRowField(groupByPivot?.rowField);
1853
- setPivotColumnField(groupByPivot?.columnField);
1854
- setPivotValueField(groupByPivot?.valueField);
1855
- setPivotAggregation(groupByPivot?.aggregationType);
1856
1973
  setSelectedColumns((0, util_1.deepCopy)(newAst).columns?.map((column) => {
1857
1974
  if (column.expr.type === 'column_ref') {
1858
1975
  return `${table}.${column.expr.column}`;
@@ -1875,21 +1992,78 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1875
1992
  newAst?.where ? newAst?.where?.operator : 'AND');
1876
1993
  }
1877
1994
  ast = newAst; // so we fetch data for newAst later.
1878
- const res2 = await fetch('https://quill-344421.uc.r.appspot.com/patterns', {
1879
- method: 'POST',
1880
- headers: {
1881
- 'Content-Type': 'application/json',
1882
- },
1883
- body: JSON.stringify({
1884
- ast: ast,
1995
+ const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
1996
+ const tableAlias = (0, ast_1.getTableAliases)(newAst)[0] ?? initialTableName;
1997
+ const hostedBody = {
1998
+ metadata: {
1999
+ clientId: client.publicKey,
2000
+ ast,
1885
2001
  publicKey: client.publicKey,
1886
2002
  orgId: client.customerId,
1887
- }),
1888
- });
1889
- const data2 = await res2.json();
2003
+ task: 'patterns',
2004
+ },
2005
+ };
2006
+ const cloudBody = {};
2007
+ const data2 = await (0, dataFetcher_1.getData)(client, 'patterns', 'same-origin', hostedBody, cloudBody);
2008
+ let currentUniqueValues = uniqueValues;
2009
+ if (table !== currentTable) {
2010
+ const tableInfo = schemaTables.find((tableInfo) => tableInfo.name === table);
2011
+ if (tableInfo) {
2012
+ const stringColumns = tableInfo.columns.filter((column) => {
2013
+ return (0, ast_1.isTextColumnType)(column.fieldType);
2014
+ });
2015
+ const stringNames = stringColumns.map((column) => column.name);
2016
+ const newUniqueValues = await (0, tableProcessing_1.getUniqueValuesByColumns)(stringColumns, `Select ${stringNames.join(', ')} from ${table}`, rows, client);
2017
+ currentUniqueValues[table] = newUniqueValues;
2018
+ if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(currentUniqueValues)) {
2019
+ setUniqueValues(currentUniqueValues);
2020
+ }
2021
+ }
2022
+ setCurrentTable(table);
2023
+ }
1890
2024
  if (data2.rows && data2.rows.length) {
1891
- const tables = (0, ast_1.getTableNames)(newAst);
1892
- if (groupByPivot) {
2025
+ const processedFields = data2.fields.map((elem) => (0, SQLEditor_1.convertPostgresColumn)(elem));
2026
+ let possiblePivot = true;
2027
+ const possibleColumns = (0, pivotProcessing_1.getPossiblePivotFieldOptions)(processedFields, currentUniqueValues[table]);
2028
+ if (groupByPivot &&
2029
+ ((groupByPivot.columnField &&
2030
+ !possibleColumns.columnFields.includes(groupByPivot?.columnField)) ||
2031
+ (groupByPivot.rowField &&
2032
+ !possibleColumns.rowFields.includes(groupByPivot?.rowField)) ||
2033
+ (groupByPivot.valueField &&
2034
+ !possibleColumns.valueFields.includes(groupByPivot?.valueField || '')))) {
2035
+ possiblePivot = false;
2036
+ let errorMessageEnding = '';
2037
+ if (groupByPivot.columnField &&
2038
+ !possibleColumns.columnFields.includes(groupByPivot?.columnField || '')) {
2039
+ if (currentUniqueValues[table][groupByPivot?.columnField || '']) {
2040
+ errorMessageEnding = `The column ${groupByPivot?.columnField} has more than 24 unique values to pivot on.`;
2041
+ }
2042
+ else {
2043
+ errorMessageEnding = `The column ${groupByPivot?.columnField} is not a proper column field.`;
2044
+ }
2045
+ }
2046
+ else if (groupByPivot.rowField &&
2047
+ !possibleColumns.rowFields.includes(groupByPivot?.rowField || '')) {
2048
+ if (currentUniqueValues[table][groupByPivot?.rowField || '']) {
2049
+ errorMessageEnding = `The column ${groupByPivot?.rowField} has more than 36 unique values to pivot on.`;
2050
+ }
2051
+ else {
2052
+ errorMessageEnding = `The column ${groupByPivot?.rowField} is not a proper row field.`;
2053
+ }
2054
+ }
2055
+ else if (groupByPivot.valueField &&
2056
+ !possibleColumns.valueFields.includes(groupByPivot?.valueField || '')) {
2057
+ errorMessageEnding = `The column ${groupByPivot?.valueField} is not a proper value field.`;
2058
+ }
2059
+ setErrorMessage(`The requested pivot is not supported. ${errorMessageEnding}`);
2060
+ errored = true;
2061
+ }
2062
+ if (groupByPivot && possiblePivot) {
2063
+ setPivotRowField(groupByPivot?.rowField);
2064
+ setPivotColumnField(groupByPivot?.columnField);
2065
+ setPivotValueField(groupByPivot?.valueField);
2066
+ setPivotAggregation(groupByPivot?.aggregationType);
1893
2067
  const pivotedData = (0, PivotModal_1.generatePivotTable)(
1894
2068
  // @ts-ignore
1895
2069
  groupByPivot, data2.rows, [null, null, null], false);
@@ -1897,17 +2071,42 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1897
2071
  setPivotData(pivotedData);
1898
2072
  setPivot(groupByPivot);
1899
2073
  setRows(data2.rows);
1900
- setFields(data2.fields);
2074
+ setFields(processedFields);
2075
+ setFormattedRows(data2.rows.map((row) => {
2076
+ return processedFields.reduce((formattedRow, column) => {
2077
+ // Apply the format function to each field in the row
2078
+ const formattedValue = (0, valueFormatter_1.quillFormat)({
2079
+ value: row[column.field],
2080
+ format: column.format,
2081
+ });
2082
+ formattedRow[column.field] = formattedValue;
2083
+ return formattedRow;
2084
+ }, {});
2085
+ }));
1901
2086
  }
1902
2087
  else {
2088
+ const processedFields = data2.fields.map((elem) => (0, SQLEditor_1.convertPostgresColumn)(elem));
1903
2089
  setRows(data2.rows);
1904
- setFields(data2.fields);
2090
+ setFields(processedFields);
2091
+ setFormattedRows(data2.rows.map((row) => {
2092
+ return processedFields.reduce((formattedRow, column) => {
2093
+ // Apply the format function to each field in the row
2094
+ const formattedValue = (0, valueFormatter_1.quillFormat)({
2095
+ value: row[column.field],
2096
+ format: column.format,
2097
+ });
2098
+ formattedRow[column.field] = formattedValue;
2099
+ return formattedRow;
2100
+ }, {});
2101
+ }));
1905
2102
  }
2103
+ return data2.rows;
1906
2104
  }
1907
2105
  else {
1908
2106
  setPivotData([]);
1909
2107
  setRows([]);
1910
2108
  setFields([]);
2109
+ setFormattedRows([]);
1911
2110
  }
1912
2111
  if (data2.query) {
1913
2112
  setActiveQuery(data2.query);
@@ -1918,9 +2117,6 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1918
2117
  if (data2.errorMessage) {
1919
2118
  setErrorMessage(`Error: ${data2.errorMessage}`);
1920
2119
  }
1921
- else {
1922
- setErrorMessage('');
1923
- }
1924
2120
  }
1925
2121
  catch (e) {
1926
2122
  console.error(e);
@@ -1928,7 +2124,7 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
1928
2124
  }
1929
2125
  finally {
1930
2126
  setLoading(false);
1931
- setAiPrompt('');
2127
+ setDataDisplayed(true);
1932
2128
  }
1933
2129
  };
1934
2130
  const handleDeleteColumn = (name) => {
@@ -2039,275 +2235,299 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
2039
2235
  flexDirection: 'row',
2040
2236
  height: '100%',
2041
2237
  ...containerStyle,
2042
- }, className: className, ref: parentRef, children: [(0, jsx_runtime_1.jsxs)(SidebarComponent, { children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Columns" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2043
- if (loadingSchema)
2044
- return;
2045
- if (!openPopover) {
2046
- setOpenPopover('AddColumnPopover');
2047
- }
2048
- }, label: 'Select columns' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddColumnPopover', setIsOpen: (isOpen) => {
2049
- if (!isOpen) {
2050
- setIsPending(false);
2051
- setActiveEditItem(null);
2052
- setActivePath(null);
2053
- setOpenPopover(null);
2054
- }
2055
- }, popoverTitle: "Select columns", popoverChildren: (0, jsx_runtime_1.jsx)(AddColumnPopover_1.default, { onSave: () => {
2056
- setActiveEditItem(null);
2057
- setActivePath(null);
2058
- setOpenPopover(null);
2059
- }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (newAst) => {
2060
- setBaseAst(newAst);
2061
- fetchSqlQuery(newAst);
2062
- }, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent }) }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
2063
- display: 'flex',
2064
- flexDirection: 'column',
2065
- gap: 8,
2066
- marginBottom: 12,
2067
- }, children: renderSentence(formData, formData, '', true) })), (0, jsx_runtime_1.jsxs)("div", { style: {
2068
- display: 'flex',
2069
- flexDirection: 'column',
2070
- gap: 2.5,
2071
- alignItems: 'flex-start',
2072
- }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2073
- if (!selectedColumns ||
2074
- selectedColumns.length === 0 ||
2075
- loading) {
2238
+ }, className: className, ref: parentRef, 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, {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2239
+ if (loadingSchema)
2076
2240
  return;
2077
- }
2078
2241
  if (!openPopover) {
2079
- const value = orderedColumnNames[0];
2080
- const [_table, column] = value.split('.');
2081
- const columnType = getColumnTypeByName(column);
2082
- if ((0, ast_1.isNumericColumnType)(columnType)) {
2083
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
2084
- newSubtree.left.column = column;
2085
- setActiveEditItem(newSubtree);
2086
- }
2087
- else {
2088
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
2089
- newSubtree.left.args.value[0].column = column;
2090
- setActiveEditItem(newSubtree);
2091
- }
2092
- setOpenPopover('AddFilterPopover');
2093
- setActivePath('');
2094
- setIsPending(true);
2242
+ setOpenPopover('AddColumnModal');
2095
2243
  }
2096
- }, label: 'Add filter' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddFilterPopover', setIsOpen: (isOpen) => {
2244
+ }, label: 'Select columns' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddColumnModal', setIsOpen: (isOpen) => {
2097
2245
  if (!isOpen) {
2098
2246
  setIsPending(false);
2247
+ setActiveEditItem(null);
2099
2248
  setActivePath(null);
2100
2249
  setOpenPopover(null);
2101
- clearCheckboxes();
2102
- setTimeout(() => {
2103
- setActiveEditItem(null);
2104
- }, 300);
2105
2250
  }
2106
- }, popoverTitle: 'Add filter', popoverChildren: (0, jsx_runtime_1.jsx)(ui_1.AddFilterPopover, { onSave: () => {
2107
- if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2108
- setIsPending(false);
2109
- setActivePath(null);
2110
- setOpenPopover(null);
2111
- clearCheckboxes();
2112
- setTimeout(() => {
2113
- setActiveEditItem(null);
2114
- }, 300);
2115
- }
2116
- else {
2117
- setIsPending(false);
2118
- handleInsertion(activeEditItem, 'AND', false);
2119
- setActivePath(null);
2120
- setOpenPopover(null);
2121
- clearCheckboxes();
2122
- setTimeout(() => {
2123
- setActiveEditItem(null);
2124
- }, 300);
2125
- }
2126
- }, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }), baseAst?.where &&
2127
- false && ( // temp removed the AddConditionPopover
2128
- (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2251
+ }, popoverTitle: "Select columns", popoverChildren: (0, jsx_runtime_1.jsx)(AddColumnModal_1.default, { onSave: () => {
2252
+ setActiveEditItem(null);
2253
+ setActivePath(null);
2254
+ setOpenPopover(null);
2255
+ }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (newAst) => {
2256
+ setBaseAst(newAst);
2257
+ fetchSqlQuery(newAst);
2258
+ }, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
2259
+ display: 'flex',
2260
+ flexDirection: 'column',
2261
+ gap: 8,
2262
+ marginBottom: 12,
2263
+ }, children: renderSentence(formData, formData, '', true) })), (0, jsx_runtime_1.jsxs)("div", { style: {
2264
+ display: 'flex',
2265
+ flexDirection: 'column',
2266
+ alignItems: 'flex-start',
2267
+ }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2268
+ if (!selectedColumns ||
2269
+ selectedColumns.length === 0 ||
2270
+ loading) {
2271
+ return;
2272
+ }
2129
2273
  if (!openPopover) {
2130
- setActiveEditItem((0, util_1.deepCopy)(constants_1.defaultEntry));
2131
- setOpenPopover('AddConditionPopover');
2274
+ const value = orderedColumnNames[0];
2275
+ const [_table, column] = value.split('.');
2276
+ const columnType = getColumnTypeByName(column);
2277
+ if ((0, ast_1.isNumericColumnType)(columnType)) {
2278
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
2279
+ newSubtree.left.column = column;
2280
+ setActiveEditItem(newSubtree);
2281
+ }
2282
+ else {
2283
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
2284
+ newSubtree.left.args.value[0].column = column;
2285
+ setActiveEditItem(newSubtree);
2286
+ }
2287
+ setOpenPopover('AddFilterPopover');
2132
2288
  setActivePath('');
2133
2289
  setIsPending(true);
2134
2290
  }
2135
- }, label: "Add condition" }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddConditionPopover', setIsOpen: (isOpen) => {
2136
- if (!isOpen) {
2137
- setIsPending(false);
2138
- setTimeout(() => {
2139
- setActiveEditItem(null);
2140
- }, 300);
2141
- setActivePath(null);
2142
- setOpenPopover(null);
2143
- clearCheckboxes();
2144
- }
2145
- }, popoverTitle: "Add condition", popoverChildren: (0, jsx_runtime_1.jsx)(AddConditionPopover, { onSave: () => {
2146
- if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2291
+ }, label: 'Add filter' }), (0, jsx_runtime_1.jsx)("div", { style: {
2292
+ position: 'relative',
2293
+ ...(openPopover === 'AddFilterPopover' && { top: 12 }),
2294
+ }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddFilterPopover', setIsOpen: (isOpen) => {
2295
+ if (!isOpen) {
2147
2296
  setIsPending(false);
2148
- setTimeout(() => {
2149
- setActiveEditItem(null);
2150
- }, 300);
2151
2297
  setActivePath(null);
2152
2298
  setOpenPopover(null);
2153
- clearCheckboxes();
2154
- }
2155
- else {
2156
- setIsPending(false);
2157
- handleInsertion(activeEditItem, topLevelBinaryOperator, true);
2158
2299
  setTimeout(() => {
2300
+ clearCheckboxes();
2159
2301
  setActiveEditItem(null);
2160
2302
  }, 300);
2161
- setActivePath(null);
2162
- setOpenPopover(null);
2163
- clearCheckboxes();
2164
2303
  }
2165
- } }) })] }))] }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, CardComponent: CardComponent, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processColumnsForPivotModal(Object.keys(rows[0] ?? {})), triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2166
- setPivot(null);
2167
- setPivotData(null);
2168
- },
2169
- // TODOs
2170
- selectPivot: (pivot) => {
2171
- if (!pivot)
2172
- return;
2173
- const newAst = { ...baseAst };
2174
- newAst.orderby = null;
2175
- setBaseAst(newAst); // trigger refetch
2176
- setPivot(pivot);
2177
- const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, rows, [null, null, null], false);
2178
- setPivotData(pivotedData || []);
2179
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: [null, null, null], recommendPivotCount: 3, SecondaryButtonComponent: SecondaryButtonComponent }), pivot && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
2180
- pivot: pivot,
2181
- rows: pivotData?.rows || [],
2182
- columns: pivotData?.columns || [],
2183
- }, theme: theme, index: 0, onSelectPivot: () => {
2184
- setIsEdittingPivot(true);
2185
- setShowPivotPopover(true);
2186
- setPivotRowField(pivot?.rowField);
2187
- setPivotColumnField(pivot?.columnField);
2188
- setPivotValueField(pivot?.valueField);
2189
- setPivotAggregation(pivot?.aggregationType);
2190
- setPivotPopUpTitle('Edit Pivot');
2191
- }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: () => {
2192
- setPivot(null);
2193
- setPivotData(null);
2194
- setBaseAst((0, util_1.deepCopy)(baseAst)); // trigger refetch
2195
- }, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent })), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Sort" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), pivot && pivot.sort && ((0, jsx_runtime_1.jsx)("div", { style: {
2196
- display: 'flex',
2197
- flexDirection: 'column',
2198
- gap: 8,
2199
- marginBottom: 12,
2200
- }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: {
2201
- type: pivot.sortDirection,
2202
- expr: { type: 'column_ref', column: pivot.rowField },
2203
- }, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2204
- setPivot({ ...pivot, sort: false });
2205
- setBaseAst((0, util_1.deepCopy)(baseAst));
2206
- if (!pivot) {
2207
- fetchSqlQuery(baseAst);
2208
- }
2209
- }, onSave: (column, direction) => {
2210
- setPivot({ ...pivot, sort: true, sortDirection: direction });
2211
- setOpenPopover(null);
2212
- setBaseAst((0, util_1.deepCopy)(baseAst));
2213
- if (!pivot) {
2214
- fetchSqlQuery(baseAst);
2215
- }
2216
- }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2217
- display: 'flex',
2218
- flexDirection: 'column',
2219
- gap: 8,
2220
- marginBottom: 12,
2221
- }, children: baseAst.orderby.map((sortData, id) => ((0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: sortData, columns: selectedColumns, onSave: (column, direction) => {
2222
- setIsPending(false);
2223
- setActiveEditItem(null);
2224
- setOpenPopover(null);
2225
- if (column === '')
2226
- return;
2227
- const newAst = { ...baseAst };
2228
- newAst.orderby[id] = {
2229
- expr: {
2230
- type: 'column_ref',
2231
- table: null,
2232
- column: column,
2233
- },
2234
- type: direction,
2235
- };
2236
- // look through the columns
2237
- setActivePath(null);
2238
- setOpenPopover(null);
2239
- setBaseAst((0, util_1.deepCopy)(newAst));
2240
- if (!pivot) {
2241
- fetchSqlQuery(newAst);
2242
- }
2243
- }, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2244
- const newAst = { ...baseAst };
2245
- newAst.orderby.splice(id, 1);
2246
- setBaseAst((0, util_1.deepCopy)(newAst));
2247
- if (!pivot) {
2248
- fetchSqlQuery(newAst);
2249
- }
2250
- }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2251
- if (!selectedColumns || selectedColumns.length === 0) {
2252
- return;
2253
- }
2254
- if (!openPopover) {
2255
- setOpenPopover('AddSortPopover');
2256
- }
2257
- }, label: "Add sort" }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
2258
- if (!isOpen) {
2259
- setIsPending(false);
2260
- setActiveEditItem(null);
2261
- setActivePath(null);
2262
- setOpenPopover(null);
2263
- }
2264
- }, popoverTitle: "Sort by", popoverChildren: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
2265
- display: 'flex',
2266
- flexDirection: 'column',
2267
- gap: 8,
2268
- marginBottom: 12,
2269
- }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: LimitPopoverComponent, EditPopover: AddLimitPopover_1.AddLimitPopover, handleDelete: () => {
2270
- const newAst = { ...baseAst };
2271
- newAst.limit = null;
2272
- setBaseAst((0, util_1.deepCopy)(newAst));
2273
- fetchSqlQuery(newAst);
2274
- }, onSave: (limit) => {
2275
- const newAst = { ...baseAst };
2276
- newAst.limit = {
2277
- seperator: '',
2278
- value: [
2279
- {
2280
- type: 'number',
2281
- value: limit,
2282
- },
2283
- ],
2284
- };
2285
- setOpenPopover(null);
2286
- setBaseAst((0, util_1.deepCopy)(newAst));
2287
- fetchSqlQuery(newAst);
2288
- }, TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2304
+ }, popoverTitle: 'Add filter', popoverChildren: (0, jsx_runtime_1.jsx)(ui_1.AddFilterPopover, { onSave: () => {
2305
+ if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2306
+ setIsPending(false);
2307
+ setActivePath(null);
2308
+ setOpenPopover(null);
2309
+ setTimeout(() => {
2310
+ clearCheckboxes();
2311
+ setActiveEditItem(null);
2312
+ }, 300);
2313
+ }
2314
+ else {
2315
+ setIsPending(false);
2316
+ handleInsertion(activeEditItem, 'AND', false);
2317
+ setActivePath(null);
2318
+ setOpenPopover(null);
2319
+ setTimeout(() => {
2320
+ clearCheckboxes();
2321
+ setActiveEditItem(null);
2322
+ }, 300);
2323
+ }
2324
+ }, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
2325
+ false && ( // temp removed the AddConditionPopover
2326
+ (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2327
+ if (!openPopover) {
2328
+ setActiveEditItem((0, util_1.deepCopy)(constants_1.defaultEntry));
2329
+ setOpenPopover('AddConditionPopover');
2330
+ setActivePath('');
2331
+ setIsPending(true);
2332
+ }
2333
+ }, label: "Add condition" }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddConditionPopover', setIsOpen: (isOpen) => {
2334
+ if (!isOpen) {
2335
+ setIsPending(false);
2336
+ setTimeout(() => {
2337
+ clearCheckboxes();
2338
+ setActiveEditItem(null);
2339
+ }, 300);
2340
+ setActivePath(null);
2341
+ setOpenPopover(null);
2342
+ }
2343
+ }, popoverTitle: "Add condition", popoverChildren: (0, jsx_runtime_1.jsx)(AddConditionPopover, { onSave: () => {
2344
+ if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2345
+ setIsPending(false);
2346
+ setTimeout(() => {
2347
+ setActiveEditItem(null);
2348
+ clearCheckboxes();
2349
+ }, 300);
2350
+ setActivePath(null);
2351
+ setOpenPopover(null);
2352
+ }
2353
+ else {
2354
+ setIsPending(false);
2355
+ handleInsertion(activeEditItem, topLevelBinaryOperator, true);
2356
+ setTimeout(() => {
2357
+ setActiveEditItem(null);
2358
+ clearCheckboxes();
2359
+ }, 300);
2360
+ setActivePath(null);
2361
+ setOpenPopover(null);
2362
+ }
2363
+ } }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, CardComponent: CardComponent, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: fields, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2364
+ setPivot(null);
2365
+ setPivotData(null);
2366
+ },
2367
+ // TODOs
2368
+ selectPivot: (pivot) => {
2369
+ if (!pivot)
2370
+ return;
2371
+ const newAst = { ...baseAst };
2372
+ newAst.orderby = null;
2373
+ setBaseAst(newAst); // trigger refetch
2374
+ setPivot(pivot);
2375
+ const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, rows, [null, null, null], false);
2376
+ setPivotData(pivotedData || []);
2377
+ }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: [null, null, null], pivotCountRequest: 4, SecondaryButtonComponent: SecondaryButtonComponent, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !loading && (!baseAst || !dataDisplayed), pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
2378
+ pivot: pivot,
2379
+ rows: pivotData?.rows || [],
2380
+ columns: pivotData?.columns || [],
2381
+ }, theme: theme, index: 0, onSelectPivot: () => {
2382
+ setIsEdittingPivot(true);
2383
+ setShowPivotPopover(true);
2384
+ setPivotRowField(pivot?.rowField);
2385
+ setPivotColumnField(pivot?.columnField);
2386
+ setPivotValueField(pivot?.valueField);
2387
+ setPivotAggregation(pivot?.aggregationType);
2388
+ setPivotPopUpTitle('Edit pivot');
2389
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, CardComponent: CardComponent, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, showEdit: false, onClose: () => {
2390
+ setPivot(null);
2391
+ setPivotData(null);
2392
+ setBaseAst((0, util_1.deepCopy)(baseAst)); // trigger refetch
2393
+ }, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }))] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Sort" }), pivot && pivot.sort && ((0, jsx_runtime_1.jsx)("div", { style: {
2394
+ display: 'flex',
2395
+ flexDirection: 'column',
2396
+ gap: 8,
2397
+ marginBottom: 12,
2398
+ }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: {
2399
+ type: pivot.sortDirection,
2400
+ expr: { type: 'column_ref', column: pivot.sortField },
2401
+ }, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2402
+ setPivot({ ...pivot, sort: false });
2403
+ setBaseAst((0, util_1.deepCopy)(baseAst));
2404
+ if (!pivot) {
2405
+ fetchSqlQuery(baseAst);
2406
+ }
2407
+ }, onSave: (column, direction) => {
2408
+ const sortFieldType = column === (pivot.valueField || 'count')
2409
+ ? 'number'
2410
+ : pivot.rowFieldType;
2411
+ setPivot({
2412
+ ...pivot,
2413
+ sort: true,
2414
+ sortDirection: direction,
2415
+ sortField: column,
2416
+ sortFieldType: sortFieldType,
2417
+ });
2418
+ setOpenPopover(null);
2419
+ setBaseAst((0, util_1.deepCopy)(baseAst));
2420
+ if (!pivot) {
2421
+ fetchSqlQuery(baseAst);
2422
+ }
2423
+ }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2424
+ display: 'flex',
2425
+ flexDirection: 'column',
2426
+ gap: 8,
2427
+ marginBottom: 12,
2428
+ }, children: baseAst.orderby.map((sortData, id) => ((0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: sortData, columns: selectedColumns, onSave: (column, direction) => {
2429
+ setIsPending(false);
2430
+ setActiveEditItem(null);
2431
+ setOpenPopover(null);
2432
+ if (column === '')
2433
+ return;
2434
+ const newAst = { ...baseAst };
2435
+ newAst.orderby[id] = {
2436
+ expr: {
2437
+ type: 'column_ref',
2438
+ table: null,
2439
+ column: column,
2440
+ },
2441
+ type: direction,
2442
+ };
2443
+ // look through the columns
2444
+ setActivePath(null);
2445
+ setOpenPopover(null);
2446
+ setBaseAst((0, util_1.deepCopy)(newAst));
2447
+ if (!pivot) {
2448
+ fetchSqlQuery(newAst);
2449
+ }
2450
+ }, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2451
+ const newAst = { ...baseAst };
2452
+ newAst.orderby.splice(id, 1);
2453
+ setBaseAst((0, util_1.deepCopy)(newAst));
2454
+ if (!pivot) {
2455
+ fetchSqlQuery(newAst);
2456
+ }
2457
+ }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2458
+ if (!selectedColumns ||
2459
+ selectedColumns.length === 0 ||
2460
+ loading) {
2461
+ return;
2462
+ }
2289
2463
  if (!openPopover) {
2290
- setOpenPopover('AddLimitPopover');
2464
+ setOpenPopover('AddSortPopover');
2291
2465
  }
2292
- }, label: 'Add limit' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
2466
+ }, label: "Add sort" }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
2293
2467
  if (!isOpen) {
2294
2468
  setIsPending(false);
2295
2469
  setActiveEditItem(null);
2296
2470
  setActivePath(null);
2297
2471
  setOpenPopover(null);
2298
2472
  }
2299
- }, popoverTitle: "Limit", popoverChildren: (0, jsx_runtime_1.jsx)(TextInputComponent, { id: "loading_input_limit", value: '0', width: 120, onChange: () => { } }) })] }))] }), (0, jsx_runtime_1.jsxs)(ContainerComponent, { children: [isAIEnabled && ((0, jsx_runtime_1.jsxs)("form", { ref: askAILoadingContainerRef, onSubmit: (event) => {
2473
+ }, popoverTitle: "Sort by", popoverChildren: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: selectedColumns, Select: SelectComponent, Button: ButtonComponent, onSave: () => { } }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
2474
+ display: 'flex',
2475
+ flexDirection: 'column',
2476
+ gap: 8,
2477
+ marginBottom: 12,
2478
+ }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: LimitPopoverComponent, EditPopover: AddLimitPopover_1.AddLimitPopover, handleDelete: () => {
2479
+ const newAst = { ...baseAst };
2480
+ newAst.limit = null;
2481
+ setBaseAst((0, util_1.deepCopy)(newAst));
2482
+ fetchSqlQuery(newAst);
2483
+ }, onSave: (limit) => {
2484
+ const newAst = { ...baseAst };
2485
+ newAst.limit = {
2486
+ seperator: '',
2487
+ value: [
2488
+ {
2489
+ type: 'number',
2490
+ value: limit,
2491
+ },
2492
+ ],
2493
+ };
2494
+ setOpenPopover(null);
2495
+ setBaseAst((0, util_1.deepCopy)(newAst));
2496
+ fetchSqlQuery(newAst);
2497
+ }, TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2498
+ if (!selectedColumns ||
2499
+ selectedColumns.length === 0 ||
2500
+ loading) {
2501
+ return;
2502
+ }
2503
+ if (!openPopover) {
2504
+ setOpenPopover('AddLimitPopover');
2505
+ }
2506
+ }, label: 'Add limit' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
2507
+ if (!isOpen) {
2508
+ setIsPending(false);
2509
+ setActiveEditItem(null);
2510
+ setActivePath(null);
2511
+ setOpenPopover(null);
2512
+ }
2513
+ }, popoverTitle: "Add limit", popoverChildren: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.AddLimitPopover, { TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: () => { } }) })] }))] })] }), (0, jsx_runtime_1.jsxs)(ContainerComponent, { children: [isAIEnabled && ((0, jsx_runtime_1.jsx)("form", { ref: askAILoadingContainerRef, onSubmit: (event) => {
2300
2514
  event.preventDefault();
2301
2515
  }, style: {
2302
2516
  display: 'flex',
2303
2517
  flexDirection: 'row',
2304
2518
  gap: 12,
2305
- padding: 1,
2306
- }, children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: "ask_ai_loading_bar", placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', width: askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => { }, label: "Ask AI" }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: clearAllState, label: "New report" }))] })), (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableComponent, { isLoading: true, rows: [], columns: [] }), (0, jsx_runtime_1.jsxs)("div", { style: {
2519
+ visibility: askAIInputWidth === -1 && askAILoadingContainerWidth === -1
2520
+ ? 'hidden'
2521
+ : 'visible',
2522
+ }, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: "ask_ai_loading_bar", placeholder: baseAst || initialLoad
2523
+ ? 'Ask a follow-up question...'
2524
+ : 'Ask a question...', width: askAIInputWidth !== -1
2525
+ ? askAIInputWidth
2526
+ : askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => { }, label: "Ask AI" }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => { }, label: "New report" }))] }) })), (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableComponent, { isLoading: true, rows: [], columns: [] }), baseAst && dataDisplayed && ((0, jsx_runtime_1.jsxs)("div", { style: {
2307
2527
  display: 'flex',
2308
2528
  flexDirection: 'row',
2309
2529
  gap: '12px',
2310
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => copyToClipboard(activeQuery), label: isCopying ? '✅ Copied' : 'Copy SQL' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { label: 'Add to dashboard', onClick: () => { } })] })] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] }));
2530
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => copyToClipboard(activeQuery), label: isCopying ? '✅ Copied' : 'Copy SQL' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { label: 'Add to dashboard', onClick: () => { } })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` })] }));
2311
2531
  }
2312
2532
  return ((0, jsx_runtime_1.jsxs)("div", { ref: parentRef, style: {
2313
2533
  display: 'flex',
@@ -2316,339 +2536,405 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
2316
2536
  overflowY: 'auto',
2317
2537
  boxSizing: 'border-box',
2318
2538
  ...containerStyle,
2319
- }, className: className, children: [(0, jsx_runtime_1.jsxs)(SidebarComponent, { children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Columns" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2320
- if (!orderedColumnNames) {
2321
- return;
2322
- }
2323
- if (!openPopover) {
2324
- setOpenPopover('AddColumnPopover');
2325
- }
2326
- }, label: "Select columns" }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddColumnPopover', setIsOpen: (isOpen) => {
2327
- if (!isOpen) {
2328
- // delay onClose callback so onClick no-ops
2329
- setTimeout(() => {
2330
- setIsPending(false);
2331
- setActiveEditItem(null);
2332
- setActivePath(null);
2333
- setOpenPopover(null);
2334
- }, 100);
2335
- }
2336
- }, popoverTitle: "Select columns", popoverChildren: (0, jsx_runtime_1.jsx)(AddColumnPopover_1.default, { onSave: () => {
2337
- setActiveEditItem(null);
2338
- setActivePath(null);
2339
- setOpenPopover(null);
2340
- }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
2341
- setBaseAst(ast);
2342
- fetchSqlQuery(ast);
2343
- }, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent }) }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
2344
- display: 'flex',
2345
- flexDirection: 'column',
2346
- gap: 8,
2347
- marginBottom: 12,
2348
- }, children: renderSentence(formData, formData, '', true) })), (0, jsx_runtime_1.jsxs)("div", { style: {
2349
- display: 'flex',
2350
- flexDirection: 'column',
2351
- gap: 2.5,
2352
- alignItems: 'flex-start',
2353
- }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2354
- if (!selectedColumns || selectedColumns.length === 0 || loading) {
2539
+ }, 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, {}), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2540
+ if (loadingSchema)
2541
+ return;
2542
+ if (!orderedColumnNames) {
2355
2543
  return;
2356
2544
  }
2357
2545
  if (!openPopover) {
2358
- const value = orderedColumnNames[0];
2359
- const [_table, column] = value.split('.');
2360
- const columnType = getColumnTypeByName(column);
2361
- if ((0, ast_1.isNumericColumnType)(columnType)) {
2362
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
2363
- newSubtree.left.column = column;
2364
- setActiveEditItem(newSubtree);
2365
- }
2366
- else {
2367
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
2368
- newSubtree.left.args.value[0].column = column;
2369
- setActiveEditItem(newSubtree);
2370
- }
2371
- setOpenPopover('AddFilterPopover');
2372
- setActivePath('');
2373
- setIsPending(true);
2546
+ setOpenPopover('AddColumnModal');
2374
2547
  }
2375
- }, label: 'Add filter' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddFilterPopover', setIsOpen: (isOpen) => {
2548
+ }, label: "Select columns" }), (0, jsx_runtime_1.jsx)(ModalComponent, { isOpen: openPopover === 'AddColumnModal', setIsOpen: (isOpen) => {
2376
2549
  if (!isOpen) {
2377
2550
  // delay onClose callback so onClick no-ops
2378
2551
  setTimeout(() => {
2379
2552
  setIsPending(false);
2380
- setActivePath(null);
2381
- setOpenPopover(null);
2382
- clearCheckboxes();
2383
2553
  setActiveEditItem(null);
2384
- }, 200);
2385
- }
2386
- }, popoverTitle: "Add filter", popoverChildren: (0, jsx_runtime_1.jsx)(ui_1.AddFilterPopover, { onSave: () => {
2387
- if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2388
- setIsPending(false);
2389
- setActivePath(null);
2390
- setOpenPopover(null);
2391
- clearCheckboxes();
2392
- setTimeout(() => {
2393
- setActiveEditItem(null);
2394
- }, 300);
2395
- }
2396
- else {
2397
- setIsPending(false);
2398
- handleInsertion(activeEditItem, 'AND', false);
2399
2554
  setActivePath(null);
2400
2555
  setOpenPopover(null);
2401
- clearCheckboxes();
2402
- setTimeout(() => {
2403
- setActiveEditItem(null);
2404
- }, 300);
2405
- }
2406
- }, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }), baseAst?.where &&
2407
- false && ( // temp removed the AddConditionPopover
2408
- (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2556
+ }, 100);
2557
+ }
2558
+ }, title: "Select columns", children: (0, jsx_runtime_1.jsx)(AddColumnModal_1.default, { onSave: () => {
2559
+ setActiveEditItem(null);
2560
+ setActivePath(null);
2561
+ setOpenPopover(null);
2562
+ }, orderedColumnNames: orderedColumnNames, setOrderedColumnNames: setOrderedColumnNames, selectedColumns: selectedColumns, setSelectedColumns: setSelectedColumns, isSelectedAllColumns: isSelectedAllColumns, clearAllState: clearAllState, nameToColumn: nameToColumn, baseAst: baseAst, setBaseAst: (ast) => {
2563
+ setBaseAst(ast);
2564
+ fetchSqlQuery(ast);
2565
+ }, pivot: pivot, initialTableName: initialTableName, defaultAST: constants_1.defaultAST, defaultTable: constants_1.defaultTable, setPivot: setPivot, TextInput: TextInputComponent, SelectColumn: SelectColumnComponent, SecondaryButton: SecondaryButtonComponent, Button: ButtonComponent, ColumnSearchEmptyState: ColumnSearchEmptyState }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Filters" }), formData && ((0, jsx_runtime_1.jsx)("div", { style: {
2566
+ display: 'flex',
2567
+ flexDirection: 'column',
2568
+ gap: 8,
2569
+ marginBottom: 12,
2570
+ }, children: renderSentence(formData, formData, '', true) })), (0, jsx_runtime_1.jsxs)("div", { style: {
2571
+ display: 'flex',
2572
+ flexDirection: 'column',
2573
+ alignItems: 'flex-start',
2574
+ }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: !baseAst || !dataDisplayed, onClick: () => {
2575
+ if (!selectedColumns ||
2576
+ selectedColumns.length === 0 ||
2577
+ loading) {
2578
+ return;
2579
+ }
2409
2580
  if (!openPopover) {
2410
- setActiveEditItem((0, util_1.deepCopy)(constants_1.defaultEntry));
2411
- setOpenPopover('AddConditionPopover');
2581
+ const value = orderedColumnNames[0];
2582
+ const [_table, column] = value.split('.');
2583
+ const columnType = getColumnTypeByName(column);
2584
+ if ((0, ast_1.isNumericColumnType)(columnType)) {
2585
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
2586
+ newSubtree.left.column = column;
2587
+ setActiveEditItem(newSubtree);
2588
+ }
2589
+ else {
2590
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
2591
+ newSubtree.left.args.value[0].column = column;
2592
+ setActiveEditItem(newSubtree);
2593
+ }
2594
+ setOpenPopover('AddFilterPopover');
2412
2595
  setActivePath('');
2413
2596
  setIsPending(true);
2414
2597
  }
2415
- }, label: 'Add condition' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddConditionPopover', setIsOpen: (isOpen) => {
2416
- if (!isOpen) {
2417
- // delay onClose callback so onClick no-ops
2418
- setTimeout(() => {
2419
- setIsPending(false);
2420
- setActiveEditItem(null);
2421
- setActivePath(null);
2422
- setOpenPopover(null);
2423
- clearCheckboxes();
2424
- }, 200);
2425
- }
2426
- }, popoverChildren: (0, jsx_runtime_1.jsx)(AddConditionPopover, { onSave: () => {
2427
- if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2428
- setIsPending(false);
2429
- setTimeout(() => {
2430
- setActiveEditItem(null);
2431
- }, 300);
2432
- setActivePath(null);
2598
+ }, label: 'Add filter' }), (0, jsx_runtime_1.jsx)("div", { style: {
2599
+ position: 'relative',
2600
+ ...(openPopover === 'AddFilterPopover' && { top: 12 }),
2601
+ }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddFilterPopover', setIsOpen: (isOpen) => {
2602
+ if (!isOpen) {
2603
+ // delay onClose callback so onClick no-ops
2433
2604
  setOpenPopover(null);
2434
- clearCheckboxes();
2435
- }
2436
- else {
2437
- setIsPending(false);
2438
- handleInsertion(activeEditItem, topLevelBinaryOperator, true);
2439
2605
  setTimeout(() => {
2606
+ setIsPending(false);
2607
+ setActivePath(null);
2608
+ clearCheckboxes();
2440
2609
  setActiveEditItem(null);
2441
2610
  }, 300);
2442
- setActivePath(null);
2443
- setOpenPopover(null);
2444
- clearCheckboxes();
2445
2611
  }
2446
- } }) })] }))] }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processColumnsForPivotModal(Object.keys(rows[0] ?? {})), triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2447
- setPivot(null);
2448
- setPivotData(null);
2449
- }, selectPivot: (pivot) => {
2450
- if (!pivot)
2451
- return;
2452
- const newAst = { ...baseAst };
2453
- newAst.orderby = null;
2454
- if (pivot.rowFieldType === 'date') {
2455
- pivot['sort'] = true;
2456
- pivot['sortDirection'] = 'ASC';
2457
- }
2458
- setBaseAst(newAst); // trigger refetch
2459
- setPivot(pivot);
2460
- const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, rows, [null, null, null], false);
2461
- setPivotData(pivotedData || []);
2462
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
2463
- pivot: pivot,
2464
- rows: pivotData?.rows || [],
2465
- columns: pivotData?.columns || [],
2466
- }, theme: theme, index: 0, onSelectPivot: () => {
2467
- setIsEdittingPivot(true);
2468
- setShowPivotPopover(true);
2469
- setPivotRowField(pivot?.rowField);
2470
- setPivotColumnField(pivot?.columnField);
2471
- setPivotValueField(pivot?.valueField);
2472
- setPivotAggregation(pivot?.aggregationType);
2473
- setPivotPopUpTitle('Edit Pivot');
2474
- }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent, showEdit: false, onClose: () => {
2475
- setPivot(null);
2476
- setPivotData(null);
2477
- setBaseAst((0, util_1.deepCopy)(baseAst));
2478
- }, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent })), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Sort" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), pivot && pivot.sort && ((0, jsx_runtime_1.jsx)("div", { style: {
2479
- display: 'flex',
2480
- flexDirection: 'column',
2481
- gap: 8,
2482
- marginBottom: 12,
2483
- }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: {
2484
- type: pivot.sortDirection,
2485
- expr: { type: 'column_ref', column: pivot.rowField },
2486
- }, columns: pivot ? [`.${pivot.rowField}`] : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2487
- if (pivot) {
2488
- setPivot({ ...pivot, sort: false });
2489
- const pivotedData = (0, PivotModal_1.generatePivotTable)({ ...pivot, sort: false }, rows, [null, null, null], false);
2490
- setPivotData(pivotedData || []);
2491
- return;
2492
- }
2493
- setBaseAst((0, util_1.deepCopy)(baseAst));
2494
- fetchSqlQuery((0, util_1.deepCopy)(baseAst));
2495
- }, onSave: (column, direction) => {
2496
- if (pivot) {
2497
- setPivot({ ...pivot, sort: true, sortDirection: direction });
2498
- const pivotedData = (0, PivotModal_1.generatePivotTable)({ ...pivot, sort: true, sortDirection: direction }, rows, [null, null, null], false);
2499
- setPivotData(pivotedData || []);
2500
- return;
2501
- }
2502
- setOpenPopover(null);
2503
- setBaseAst((0, util_1.deepCopy)(baseAst));
2504
- fetchSqlQuery((0, util_1.deepCopy)(baseAst));
2505
- }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2506
- display: 'flex',
2507
- flexDirection: 'column',
2508
- gap: 8,
2509
- marginBottom: 12,
2510
- }, children: baseAst.orderby.map((sortData, id) => ((0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2511
- if (pivot) {
2512
- setPivot({ ...pivot, sort: false });
2513
- return;
2514
- }
2515
- const newAst = { ...baseAst };
2516
- newAst.orderby.splice(id, 1);
2517
- setBaseAst((0, util_1.deepCopy)(newAst));
2518
- fetchSqlQuery((0, util_1.deepCopy)(newAst));
2519
- }, onSave: (column, direction) => {
2520
- if (pivot) {
2521
- setPivot({
2522
- ...pivot,
2523
- sort: true,
2524
- sortDirection: direction,
2525
- });
2526
- return;
2527
- }
2528
- setIsPending(false);
2529
- setActiveEditItem(null);
2530
- setOpenPopover(null);
2531
- if (column === '')
2532
- return;
2533
- const newAst = { ...baseAst };
2534
- newAst.orderby[id] = {
2535
- expr: {
2536
- type: 'column_ref',
2537
- table: null,
2538
- column: column,
2539
- },
2540
- type: direction,
2541
- };
2542
- // look through the columns
2543
- setActivePath(null);
2544
- setOpenPopover(null);
2545
- setBaseAst((0, util_1.deepCopy)(newAst));
2546
- fetchSqlQuery((0, util_1.deepCopy)(newAst));
2547
- }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2548
- if (!selectedColumns || selectedColumns.length === 0) {
2549
- return;
2550
- }
2551
- if (!openPopover) {
2552
- setOpenPopover('AddSortPopover');
2553
- }
2554
- }, label: 'Add sort' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
2555
- if (!isOpen) {
2556
- setIsPending(false);
2557
- setActiveEditItem(null);
2558
- setActivePath(null);
2559
- setOpenPopover(null);
2560
- }
2561
- }, popoverTitle: "Sort by", popoverChildren: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: pivot ? [`.${pivot.rowField}`] : selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
2562
- if (column === '')
2563
- return;
2564
- if (pivot) {
2565
- setPivot({ ...pivot, sort: true, sortDirection: direction });
2566
- const pivotedData = (0, PivotModal_1.generatePivotTable)({ ...pivot, sort: true, sortDirection: direction }, rows, [null, null, null], false);
2567
- setPivotData(pivotedData || []);
2568
- setActivePath(null);
2569
- setOpenPopover(null);
2570
- setBaseAst((0, util_1.deepCopy)(baseAst));
2571
- return;
2572
- }
2573
- const newAst = { ...baseAst };
2574
- if (!newAst.orderby)
2575
- newAst.orderby = [];
2576
- newAst.orderby.push({
2577
- expr: { type: 'column_ref', column },
2578
- type: direction,
2579
- });
2580
- // look through the columns
2581
- setActivePath(null);
2582
- setOpenPopover(null);
2583
- setBaseAst((0, util_1.deepCopy)(newAst));
2584
- fetchSqlQuery((0, util_1.deepCopy)(newAst));
2585
- } }) }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
2586
- display: 'flex',
2587
- flexDirection: 'column',
2588
- gap: 8,
2589
- marginBottom: 12,
2590
- }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: LimitPopoverComponent, EditPopover: AddLimitPopover_1.AddLimitPopover, handleDelete: () => {
2591
- const newAst = { ...baseAst };
2592
- newAst.limit = null;
2593
- setBaseAst((0, util_1.deepCopy)(newAst));
2594
- fetchSqlQuery((0, util_1.deepCopy)(newAst));
2595
- }, onSave: (limit) => {
2596
- const newAst = { ...baseAst };
2597
- newAst.limit = {
2598
- seperator: '',
2599
- value: [
2600
- {
2601
- type: 'number',
2602
- value: limit,
2603
- },
2604
- ],
2605
- };
2606
- setOpenPopover(null);
2607
- setBaseAst((0, util_1.deepCopy)(newAst));
2608
- fetchSqlQuery((0, util_1.deepCopy)(newAst));
2609
- }, TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2610
- if (!selectedColumns || selectedColumns.length === 0) {
2611
- return;
2612
- }
2613
- if (!baseAst) {
2612
+ }, popoverTitle: "Add filter", popoverChildren: (0, jsx_runtime_1.jsx)(ui_1.AddFilterPopover, { onSave: () => {
2613
+ if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2614
+ setOpenPopover(null);
2615
+ clearCheckboxes();
2616
+ setIsPending(false);
2617
+ setTimeout(() => {
2618
+ setActivePath(null);
2619
+ setActiveEditItem(null);
2620
+ }, 300);
2621
+ }
2622
+ else {
2623
+ setOpenPopover(null);
2624
+ setIsPending(false);
2625
+ handleInsertion(activeEditItem, 'AND', false);
2626
+ setActivePath(null);
2627
+ setTimeout(() => {
2628
+ clearCheckboxes();
2629
+ setActiveEditItem(null);
2630
+ }, 300);
2631
+ }
2632
+ }, Button: ButtonComponent, renderNode: renderNode, activeEditItem: activeEditItem }) }) }), baseAst?.where &&
2633
+ false && ( // temp removed the AddConditionPopover
2634
+ (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => {
2635
+ if (!openPopover) {
2636
+ setActiveEditItem((0, util_1.deepCopy)(constants_1.defaultEntry));
2637
+ setOpenPopover('AddConditionPopover');
2638
+ setActivePath('');
2639
+ setIsPending(true);
2640
+ }
2641
+ }, label: 'Add condition' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddConditionPopover', setIsOpen: (isOpen) => {
2642
+ if (!isOpen) {
2643
+ // delay onClose callback so onClick no-ops
2644
+ setTimeout(() => {
2645
+ setIsPending(false);
2646
+ setActiveEditItem(null);
2647
+ setActivePath(null);
2648
+ setOpenPopover(null);
2649
+ clearCheckboxes();
2650
+ }, 200);
2651
+ }
2652
+ }, popoverChildren: (0, jsx_runtime_1.jsx)(AddConditionPopover, { onSave: () => {
2653
+ if ((0, util_1.isNodeEmptyCollection)(activeEditItem)) {
2654
+ setIsPending(false);
2655
+ setTimeout(() => {
2656
+ setActiveEditItem(null);
2657
+ }, 300);
2658
+ setActivePath(null);
2659
+ setOpenPopover(null);
2660
+ clearCheckboxes();
2661
+ }
2662
+ else {
2663
+ setIsPending(false);
2664
+ handleInsertion(activeEditItem, topLevelBinaryOperator, true);
2665
+ setTimeout(() => {
2666
+ setActiveEditItem(null);
2667
+ }, 300);
2668
+ setActivePath(null);
2669
+ setOpenPopover(null);
2670
+ clearCheckboxes();
2671
+ }
2672
+ } }) })] }))] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Pivot" }), (0, jsx_runtime_1.jsx)(PivotModal_1.PivotModal, { pivotRowField: pivotRowField, setPivotRowField: setPivotRowField, pivotColumnField: pivotColumnField, setPivotColumnField: setPivotColumnField, pivotValueField: pivotValueField, setPivotValueField: setPivotValueField, pivotAggregation: pivotAggregation, setPivotAggregation: setPivotAggregation, createdPivots: createdPivots, setCreatedPivots: setCreatedPivots, recommendedPivots: recommendedPivots, setRecommendedPivots: setRecommendedPivots, popUpTitle: pivotPopUpTitle, setPopUpTitle: setPivotPopUpTitle, selectedTable: initialTableName, SelectComponent: SelectComponent, ButtonComponent: ButtonComponent, CardComponent: CardComponent, SecondaryButtonComponent: SecondaryButtonComponent, PopoverComponent: PopoverComponent, TextComponent: TextComponent, ErrorMessageComponent: ErrorMessageComponent, PivotRowContainer: PivotRowContainer, PivotColumnContainer: PivotColumnContainer, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: fields, triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2673
+ setPivot(null);
2674
+ setPivotData(null);
2675
+ }, selectPivot: (pivot) => {
2676
+ if (!pivot)
2614
2677
  return;
2678
+ const newAst = { ...baseAst };
2679
+ newAst.orderby = null;
2680
+ if (pivot.rowFieldType === 'date') {
2681
+ pivot['sort'] = true;
2682
+ pivot['sortDirection'] = 'ASC';
2615
2683
  }
2616
- if (!openPopover) {
2617
- setOpenPopover('AddLimitPopover');
2618
- }
2619
- }, label: 'Add limit' }), (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
2620
- if (!isOpen) {
2684
+ setBaseAst(newAst); // trigger refetch
2685
+ setPivot(pivot);
2686
+ const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, rows, [null, null, null], false);
2687
+ setPivotData(pivotedData || []);
2688
+ setErrorMessage('');
2689
+ }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: LabelComponent, HeaderComponent: HeaderComponent, dateRange: [null, null, null], pivotCountRequest: 4, query: activeQuery, initialUniqueValues: uniqueValues[currentTable], disabled: !baseAst || !dataDisplayed, pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations }), pivot && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
2690
+ pivot: pivot,
2691
+ rows: pivotData?.rows || [],
2692
+ columns: pivotData?.columns || [],
2693
+ }, theme: theme, index: 0, onSelectPivot: () => {
2694
+ setIsEdittingPivot(true);
2695
+ setShowPivotPopover(true);
2696
+ setPivotRowField(pivot?.rowField);
2697
+ setPivotColumnField(pivot?.columnField);
2698
+ setPivotValueField(pivot?.valueField);
2699
+ setPivotAggregation(pivot?.aggregationType);
2700
+ setPivotPopUpTitle('Edit pivot');
2701
+ }, selectedPivotIndex: -1, onEditPivot: () => { }, ButtonComponent: ButtonComponent, HeaderComponent: HeaderComponent, CardComponent: CardComponent, showEdit: false, onClose: () => {
2702
+ setPivot(null);
2703
+ setPivotData(null);
2704
+ setBaseAst((0, util_1.deepCopy)(baseAst));
2705
+ }, minHeight: 180, LabelComponent: LabelComponent, TextComponent: TextComponent }))] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Sort" }), pivot && pivot.sort && ((0, jsx_runtime_1.jsx)("div", { style: {
2706
+ display: 'flex',
2707
+ flexDirection: 'column',
2708
+ gap: 8,
2709
+ marginBottom: 12,
2710
+ }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: {
2711
+ type: pivot.sortDirection,
2712
+ expr: { type: 'column_ref', column: pivot.sortField },
2713
+ }, columns: pivot
2714
+ ? pivot.columnField
2715
+ ? [`.${pivot.rowField}`]
2716
+ : [
2717
+ `.${pivot.rowField}`,
2718
+ `.${pivot.valueField || 'count'}`,
2719
+ ]
2720
+ : selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2721
+ if (pivot) {
2722
+ setPivot({ ...pivot, sort: false });
2723
+ const pivotedData = (0, PivotModal_1.generatePivotTable)({ ...pivot, sort: false }, rows, [null, null, null], false);
2724
+ setPivotData(pivotedData || []);
2725
+ setErrorMessage('');
2726
+ return;
2727
+ }
2728
+ setBaseAst((0, util_1.deepCopy)(baseAst));
2729
+ fetchSqlQuery((0, util_1.deepCopy)(baseAst));
2730
+ }, onSave: (column, direction) => {
2731
+ if (pivot) {
2732
+ const sortFieldType = column === (pivot.valueField || 'count')
2733
+ ? 'number'
2734
+ : pivot.rowFieldType;
2735
+ setPivot({
2736
+ ...pivot,
2737
+ sort: true,
2738
+ sortDirection: direction,
2739
+ sortField: column,
2740
+ sortFieldType: sortFieldType,
2741
+ });
2742
+ const pivotedData = (0, PivotModal_1.generatePivotTable)({
2743
+ ...pivot,
2744
+ sort: true,
2745
+ sortDirection: direction,
2746
+ sortField: column,
2747
+ sortFieldType: sortFieldType,
2748
+ }, rows, [null, null, null], false);
2749
+ setPivotData(pivotedData || []);
2750
+ setErrorMessage('');
2751
+ return;
2752
+ }
2753
+ setOpenPopover(null);
2754
+ setBaseAst((0, util_1.deepCopy)(baseAst));
2755
+ fetchSqlQuery((0, util_1.deepCopy)(baseAst));
2756
+ }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2757
+ display: 'flex',
2758
+ flexDirection: 'column',
2759
+ gap: 8,
2760
+ marginBottom: 12,
2761
+ }, children: baseAst.orderby.map((sortData, id) => ((0, jsx_runtime_1.jsx)(AddSortPopover_1.SortSentence, { sortData: sortData, columns: selectedColumns, setIsPending: setIsPending, setEditPopoverKey: setEditPopoverKey, setActiveEditItem: setActiveEditItem, setActivePath: setActivePath, setOpenPopover: setOpenPopover, SortPopover: SortPopoverComponent, EditPopover: AddSortPopover_1.AddSortPopover, handleDelete: () => {
2762
+ if (pivot) {
2763
+ setPivot({ ...pivot, sort: false });
2764
+ return;
2765
+ }
2766
+ const newAst = { ...baseAst };
2767
+ newAst.orderby.splice(id, 1);
2768
+ setBaseAst((0, util_1.deepCopy)(newAst));
2769
+ fetchSqlQuery((0, util_1.deepCopy)(newAst));
2770
+ }, onSave: (column, direction) => {
2771
+ if (pivot) {
2772
+ const sortFieldType = column === (pivot.valueField || 'count')
2773
+ ? 'number'
2774
+ : pivot.rowFieldType;
2775
+ setPivot({
2776
+ ...pivot,
2777
+ sort: true,
2778
+ sortDirection: direction,
2779
+ sortField: column,
2780
+ sortFieldType: sortFieldType,
2781
+ });
2782
+ return;
2783
+ }
2621
2784
  setIsPending(false);
2622
2785
  setActiveEditItem(null);
2786
+ setOpenPopover(null);
2787
+ if (column === '')
2788
+ return;
2789
+ const newAst = { ...baseAst };
2790
+ newAst.orderby[id] = {
2791
+ expr: {
2792
+ type: 'column_ref',
2793
+ table: null,
2794
+ column: column,
2795
+ },
2796
+ type: direction,
2797
+ };
2798
+ // look through the columns
2623
2799
  setActivePath(null);
2624
2800
  setOpenPopover(null);
2801
+ setBaseAst((0, util_1.deepCopy)(newAst));
2802
+ fetchSqlQuery((0, util_1.deepCopy)(newAst));
2803
+ }, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: !baseAst || !dataDisplayed, onClick: () => {
2804
+ if (!selectedColumns || selectedColumns.length === 0) {
2805
+ return;
2806
+ }
2807
+ if (!openPopover) {
2808
+ setOpenPopover('AddSortPopover');
2625
2809
  }
2626
- }, popoverTitle: "Limit", popoverChildren: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.AddLimitPopover, { TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (limit) => {
2810
+ }, label: 'Add sort' }), (0, jsx_runtime_1.jsx)("div", { style: {
2811
+ position: 'relative',
2812
+ ...(openPopover === 'AddSortPopover' && { top: 12 }),
2813
+ }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddSortPopover', setIsOpen: (isOpen) => {
2814
+ if (!isOpen) {
2815
+ setIsPending(false);
2816
+ setActiveEditItem(null);
2817
+ setActivePath(null);
2818
+ setOpenPopover(null);
2819
+ }
2820
+ }, popoverTitle: "Sort by", popoverChildren: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: pivot
2821
+ ? pivot.columnField
2822
+ ? [`.${pivot.rowField}`]
2823
+ : [
2824
+ `.${pivot.rowField}`,
2825
+ `.${pivot.valueField || 'count'}`,
2826
+ ]
2827
+ : selectedColumns, Select: SelectComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (column, direction) => {
2828
+ if (column === '')
2829
+ return;
2830
+ if (pivot) {
2831
+ const sortFieldType = column === (pivot.valueField || 'count')
2832
+ ? 'number'
2833
+ : pivot.rowFieldType;
2834
+ setPivot({
2835
+ ...pivot,
2836
+ sort: true,
2837
+ sortDirection: direction,
2838
+ sortField: column,
2839
+ sortFieldType: sortFieldType,
2840
+ });
2841
+ const pivotedData = (0, PivotModal_1.generatePivotTable)({
2842
+ ...pivot,
2843
+ sort: true,
2844
+ sortDirection: direction,
2845
+ sortField: column,
2846
+ sortFieldType: sortFieldType,
2847
+ }, rows, [null, null, null], false);
2848
+ setErrorMessage('');
2849
+ setPivotData(pivotedData || []);
2850
+ setActivePath(null);
2851
+ setOpenPopover(null);
2852
+ setBaseAst((0, util_1.deepCopy)(baseAst));
2853
+ return;
2854
+ }
2855
+ const newAst = { ...baseAst };
2856
+ if (!newAst.orderby)
2857
+ newAst.orderby = [];
2858
+ newAst.orderby.push({
2859
+ expr: { type: 'column_ref', column },
2860
+ type: direction,
2861
+ });
2862
+ // look through the columns
2863
+ setActivePath(null);
2864
+ setOpenPopover(null);
2865
+ setBaseAst((0, util_1.deepCopy)(newAst));
2866
+ fetchSqlQuery((0, util_1.deepCopy)(newAst));
2867
+ } }) }) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { width: '100%' }, children: [(0, jsx_runtime_1.jsx)(SidebarHeadingComponent, { label: "Limit" }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
2868
+ display: 'flex',
2869
+ flexDirection: 'column',
2870
+ gap: 8,
2871
+ marginBottom: 12,
2872
+ }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: LimitPopoverComponent, EditPopover: AddLimitPopover_1.AddLimitPopover, handleDelete: () => {
2873
+ const newAst = { ...baseAst };
2874
+ newAst.limit = null;
2875
+ setBaseAst((0, util_1.deepCopy)(newAst));
2876
+ fetchSqlQuery((0, util_1.deepCopy)(newAst));
2877
+ }, onSave: (limit) => {
2627
2878
  const newAst = { ...baseAst };
2628
2879
  newAst.limit = {
2629
2880
  seperator: '',
2630
2881
  value: [
2631
2882
  {
2632
2883
  type: 'number',
2633
- value: Number(limit),
2884
+ value: limit,
2634
2885
  },
2635
2886
  ],
2636
2887
  };
2637
2888
  setOpenPopover(null);
2638
2889
  setBaseAst((0, util_1.deepCopy)(newAst));
2639
2890
  fetchSqlQuery((0, util_1.deepCopy)(newAst));
2640
- } }) })] }))] }), (0, jsx_runtime_1.jsxs)(ContainerComponent, { children: [isAIEnabled && ((0, jsx_runtime_1.jsxs)("form", { ref: askAIContainerRef, onSubmit: (event) => {
2891
+ }, TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { disabled: !baseAst || !dataDisplayed, onClick: () => {
2892
+ if (!selectedColumns || selectedColumns.length === 0) {
2893
+ return;
2894
+ }
2895
+ if (!baseAst) {
2896
+ return;
2897
+ }
2898
+ if (!openPopover) {
2899
+ setOpenPopover('AddLimitPopover');
2900
+ }
2901
+ }, label: 'Add limit' }), (0, jsx_runtime_1.jsx)("div", { style: {
2902
+ position: 'relative',
2903
+ ...(openPopover === 'AddLimitPopover' && { top: 12 }),
2904
+ }, children: (0, jsx_runtime_1.jsx)(PopoverComponent, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: (isOpen) => {
2905
+ if (!isOpen) {
2906
+ setIsPending(false);
2907
+ setActiveEditItem(null);
2908
+ setActivePath(null);
2909
+ setOpenPopover(null);
2910
+ }
2911
+ }, popoverTitle: "Add limit", popoverChildren: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.AddLimitPopover, { TextInput: TextInputComponent, Button: ButtonComponent, SecondaryButton: SecondaryButtonComponent, onSave: (limit) => {
2912
+ const newAst = { ...baseAst };
2913
+ newAst.limit = {
2914
+ seperator: '',
2915
+ value: [
2916
+ {
2917
+ type: 'number',
2918
+ value: Number(limit),
2919
+ },
2920
+ ],
2921
+ };
2922
+ setOpenPopover(null);
2923
+ setBaseAst((0, util_1.deepCopy)(newAst));
2924
+ fetchSqlQuery((0, util_1.deepCopy)(newAst));
2925
+ } }) }) })] }))] })] }), (0, jsx_runtime_1.jsxs)(ContainerComponent, { children: [isAIEnabled && ((0, jsx_runtime_1.jsx)("form", { ref: askAIContainerRef, onSubmit: (event) => {
2641
2926
  event.preventDefault();
2642
2927
  handleAsk();
2643
2928
  }, style: {
2644
2929
  display: 'flex',
2645
2930
  flexDirection: 'row',
2646
2931
  gap: 12,
2647
- padding: 1,
2648
- }, children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: "ask_ai_input_bar", value: aiPrompt, width: askAIInputWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading: loading && errorMessage.length === 0, rows: applyFormatting({
2649
- rows: pivotData?.rows || rows,
2650
- fields: pivotData?.fields || fields,
2651
- }, baseAst?.columns ?? []), columns: pivot
2932
+ visibility: askAIInputWidth === -1 && askAILoadingContainerWidth === -1
2933
+ ? 'hidden'
2934
+ : 'visible',
2935
+ }, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: "ask_ai_input_bar", value: aiPrompt, width: askAIInputWidth !== -1
2936
+ ? askAIInputWidth
2937
+ : askAILoadingContainerWidth, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleAsk, label: 'Ask AI' }), ((baseAst && dataDisplayed) || initialLoad) && ((0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: 'New report', onClick: clearAllState }))] }) })), baseAst && ((0, jsx_runtime_1.jsx)(TableComponent, { isLoading: loading && errorMessage.length === 0, rows: pivotData?.rows || formattedRows, columns: pivot
2652
2938
  ? pivotData?.columns || emptyPivotColumns()
2653
2939
  : enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
2654
2940
  return { label: (0, textProcessing_1.snakeCaseToTitleCase)(c), field: c };
@@ -2656,13 +2942,22 @@ function ReportBuilder({ initialTableName = '', onSubmitChartBuilder = () => voi
2656
2942
  display: 'flex',
2657
2943
  flexDirection: 'row',
2658
2944
  gap: '12px',
2659
- }, children: [errorMessage && ((0, jsx_runtime_1.jsx)("div", { style: {
2660
- color: 'red',
2661
- fontSize: 14,
2662
- padding: '12px',
2663
- whiteSpace: 'nowrap',
2664
- }, children: errorMessage })), (0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } }), baseAst && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => {
2945
+ width: '100%',
2946
+ }, children: [errorMessage ? ((0, jsx_runtime_1.jsxs)("div", { style: {
2947
+ display: 'flex',
2948
+ flexDirection: 'row',
2949
+ alignItems: 'center',
2950
+ overflow: 'hidden',
2951
+ width: '100%',
2952
+ gap: 12,
2953
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
2954
+ color: 'red',
2955
+ fontSize: 14,
2956
+ textOverflow: 'ellipsis',
2957
+ whiteSpace: 'nowrap',
2958
+ overflow: 'hidden',
2959
+ }, children: errorMessage }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: handleAsk, label: 'Retry' })] })) : ((0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } })), baseAst && dataDisplayed && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: () => {
2665
2960
  setIsChartBuilderOpen(true);
2666
- }, label: 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { rows: rows, columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: isAdminEnabled, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: "Add to dashboard", isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onSubmitChartBuilder, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent })] }));
2961
+ }, label: 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { rows: rows, columns: fields, fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: showChartBuilderTableFormatOptions, showDateFieldOptions: isAdminEnabled, showAccessControlOptions: isAdminEnabled, title: "Add to dashboard", isHorizontalView: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onSubmitChartBuilder, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, initialUniqueValues: uniqueValues[currentTable], pivotRecommendationsEnabled: pivotRecommendationsEnabled && overrideRecommendations, SelectComponent: SelectComponent, TextInputComponent: TextInputComponent, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, HeaderComponent: HeaderComponent, SubHeaderComponent: SubHeaderComponent, LabelComponent: LabelComponent, TextComponent: TextComponent, CardComponent: CardComponent, ModalComponent: ModalComponent, PopoverComponent: PopoverComponent, TableComponent: TableComponent, DeleteButtonComponent: DeleteButtonComponent, ChartBuilderInputRowContainer: ChartBuilderInputRowContainer, ChartBuilderInputColumnContainer: ChartBuilderInputColumnContainer, FormContainer: ChartBuilderFormContainer, hideDateRangeFilter: true })] }));
2667
2962
  }
2668
2963
  exports.default = ReportBuilder;