@quillsql/react 2.11.9 → 2.11.13

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 (167) hide show
  1. package/dist/cjs/BarList.d.ts +2 -1
  2. package/dist/cjs/BarList.d.ts.map +1 -1
  3. package/dist/cjs/BarList.js +9 -3
  4. package/dist/cjs/Chart.d.ts +11 -5
  5. package/dist/cjs/Chart.d.ts.map +1 -1
  6. package/dist/cjs/Chart.js +57 -20
  7. package/dist/cjs/ChartBuilder.d.ts +16 -1
  8. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  9. package/dist/cjs/ChartBuilder.js +423 -281
  10. package/dist/cjs/ChartEditor.d.ts.map +1 -1
  11. package/dist/cjs/ChartEditor.js +1 -0
  12. package/dist/cjs/Dashboard.d.ts +2 -1
  13. package/dist/cjs/Dashboard.d.ts.map +1 -1
  14. package/dist/cjs/Dashboard.js +6 -20
  15. package/dist/cjs/PieChart.d.ts.map +1 -1
  16. package/dist/cjs/PieChart.js +2 -1
  17. package/dist/cjs/QuillProvider.d.ts.map +1 -1
  18. package/dist/cjs/QuillProvider.js +15 -1
  19. package/dist/cjs/ReportBuilder.d.ts +4 -3
  20. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  21. package/dist/cjs/ReportBuilder.js +238 -108
  22. package/dist/cjs/SQLEditor.d.ts +2 -1
  23. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  24. package/dist/cjs/SQLEditor.js +61 -90
  25. package/dist/cjs/components/Chart/BarChart.d.ts +2 -1
  26. package/dist/cjs/components/Chart/BarChart.d.ts.map +1 -1
  27. package/dist/cjs/components/Chart/BarChart.js +10 -3
  28. package/dist/cjs/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
  29. package/dist/cjs/components/Chart/ChartTooltipFrame.js +1 -0
  30. package/dist/cjs/components/Chart/LineChart.d.ts +3 -4
  31. package/dist/cjs/components/Chart/LineChart.d.ts.map +1 -1
  32. package/dist/cjs/components/Chart/LineChart.js +35 -15
  33. package/dist/cjs/components/Dashboard/ChartComponent.d.ts.map +1 -1
  34. package/dist/cjs/components/Dashboard/ChartComponent.js +0 -3
  35. package/dist/cjs/components/Dashboard/DashboardSection.js +4 -4
  36. package/dist/cjs/components/Dashboard/DashboardSectionContainer.js +1 -1
  37. package/dist/cjs/components/Dashboard/DataLoader.d.ts +8 -1
  38. package/dist/cjs/components/Dashboard/DataLoader.d.ts.map +1 -1
  39. package/dist/cjs/components/Dashboard/DataLoader.js +12 -3
  40. package/dist/cjs/components/Dashboard/MetricComponent.d.ts +12 -1
  41. package/dist/cjs/components/Dashboard/MetricComponent.d.ts.map +1 -1
  42. package/dist/cjs/components/Dashboard/MetricComponent.js +105 -9
  43. package/dist/cjs/components/Dashboard/TableComponent.d.ts +1 -1
  44. package/dist/cjs/components/Dashboard/TableComponent.d.ts.map +1 -1
  45. package/dist/cjs/components/Dashboard/TableComponent.js +78 -3
  46. package/dist/cjs/components/QuillSelect.d.ts.map +1 -1
  47. package/dist/cjs/components/QuillSelect.js +7 -1
  48. package/dist/cjs/components/QuillTable.d.ts.map +1 -1
  49. package/dist/cjs/components/QuillTable.js +3 -1
  50. package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +3 -3
  51. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +3 -0
  52. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -0
  53. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +43 -0
  54. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  55. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +14 -7
  56. package/dist/cjs/components/ReportBuilder/ast.d.ts +4 -0
  57. package/dist/cjs/components/ReportBuilder/ast.d.ts.map +1 -1
  58. package/dist/cjs/components/ReportBuilder/ast.js +10 -1
  59. package/dist/cjs/components/ReportBuilder/bigDateMap.d.ts.map +1 -1
  60. package/dist/cjs/components/ReportBuilder/bigDateMap.js +2 -1
  61. package/dist/cjs/components/ReportBuilder/convert.d.ts +4 -1
  62. package/dist/cjs/components/ReportBuilder/convert.d.ts.map +1 -1
  63. package/dist/cjs/components/ReportBuilder/convert.js +45 -13
  64. package/dist/cjs/components/ReportBuilder/pivot.d.ts +3 -0
  65. package/dist/cjs/components/ReportBuilder/pivot.d.ts.map +1 -1
  66. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  67. package/dist/cjs/components/ReportBuilder/ui.js +7 -5
  68. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -0
  69. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  70. package/dist/cjs/components/ReportBuilder/util.js +55 -6
  71. package/dist/cjs/components/UiComponents.d.ts +3 -1
  72. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  73. package/dist/cjs/components/UiComponents.js +4 -4
  74. package/dist/cjs/hooks/useQuill.js +1 -1
  75. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts +2 -1
  76. package/dist/cjs/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  77. package/dist/cjs/internals/ReportBuilder/PivotModal.js +91 -91
  78. package/dist/cjs/utils/axisFormatter.js +74 -30
  79. package/dist/cjs/utils/dataFetcher.d.ts.map +1 -1
  80. package/dist/cjs/utils/dataFetcher.js +10 -0
  81. package/dist/cjs/utils/getDomain.js +25 -4
  82. package/dist/cjs/utils/valueFormatter.d.ts +2 -1
  83. package/dist/cjs/utils/valueFormatter.d.ts.map +1 -1
  84. package/dist/esm/BarList.d.ts +2 -1
  85. package/dist/esm/BarList.d.ts.map +1 -1
  86. package/dist/esm/BarList.js +9 -3
  87. package/dist/esm/Chart.d.ts +11 -5
  88. package/dist/esm/Chart.d.ts.map +1 -1
  89. package/dist/esm/Chart.js +57 -20
  90. package/dist/esm/ChartBuilder.d.ts +16 -1
  91. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  92. package/dist/esm/ChartBuilder.js +421 -280
  93. package/dist/esm/ChartEditor.d.ts.map +1 -1
  94. package/dist/esm/ChartEditor.js +1 -0
  95. package/dist/esm/Dashboard.d.ts +2 -1
  96. package/dist/esm/Dashboard.d.ts.map +1 -1
  97. package/dist/esm/Dashboard.js +6 -20
  98. package/dist/esm/PieChart.d.ts.map +1 -1
  99. package/dist/esm/PieChart.js +2 -1
  100. package/dist/esm/QuillProvider.d.ts.map +1 -1
  101. package/dist/esm/QuillProvider.js +16 -2
  102. package/dist/esm/ReportBuilder.d.ts +4 -3
  103. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  104. package/dist/esm/ReportBuilder.js +242 -112
  105. package/dist/esm/SQLEditor.d.ts +2 -1
  106. package/dist/esm/SQLEditor.d.ts.map +1 -1
  107. package/dist/esm/SQLEditor.js +62 -91
  108. package/dist/esm/components/Chart/BarChart.d.ts +2 -1
  109. package/dist/esm/components/Chart/BarChart.d.ts.map +1 -1
  110. package/dist/esm/components/Chart/BarChart.js +10 -3
  111. package/dist/esm/components/Chart/ChartTooltipFrame.d.ts.map +1 -1
  112. package/dist/esm/components/Chart/ChartTooltipFrame.js +1 -0
  113. package/dist/esm/components/Chart/LineChart.d.ts +3 -4
  114. package/dist/esm/components/Chart/LineChart.d.ts.map +1 -1
  115. package/dist/esm/components/Chart/LineChart.js +35 -15
  116. package/dist/esm/components/Dashboard/ChartComponent.d.ts.map +1 -1
  117. package/dist/esm/components/Dashboard/ChartComponent.js +0 -3
  118. package/dist/esm/components/Dashboard/DashboardSection.js +4 -4
  119. package/dist/esm/components/Dashboard/DashboardSectionContainer.js +1 -1
  120. package/dist/esm/components/Dashboard/DataLoader.d.ts +8 -1
  121. package/dist/esm/components/Dashboard/DataLoader.d.ts.map +1 -1
  122. package/dist/esm/components/Dashboard/DataLoader.js +13 -4
  123. package/dist/esm/components/Dashboard/MetricComponent.d.ts +12 -1
  124. package/dist/esm/components/Dashboard/MetricComponent.d.ts.map +1 -1
  125. package/dist/esm/components/Dashboard/MetricComponent.js +101 -8
  126. package/dist/esm/components/Dashboard/TableComponent.d.ts +1 -1
  127. package/dist/esm/components/Dashboard/TableComponent.d.ts.map +1 -1
  128. package/dist/esm/components/Dashboard/TableComponent.js +74 -2
  129. package/dist/esm/components/QuillSelect.d.ts.map +1 -1
  130. package/dist/esm/components/QuillSelect.js +7 -1
  131. package/dist/esm/components/QuillTable.d.ts.map +1 -1
  132. package/dist/esm/components/QuillTable.js +3 -1
  133. package/dist/esm/components/ReportBuilder/AddColumnPopover.js +3 -3
  134. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +3 -0
  135. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -0
  136. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +38 -0
  137. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  138. package/dist/esm/components/ReportBuilder/AddSortPopover.js +15 -8
  139. package/dist/esm/components/ReportBuilder/ast.d.ts +4 -0
  140. package/dist/esm/components/ReportBuilder/ast.d.ts.map +1 -1
  141. package/dist/esm/components/ReportBuilder/ast.js +8 -0
  142. package/dist/esm/components/ReportBuilder/bigDateMap.d.ts.map +1 -1
  143. package/dist/esm/components/ReportBuilder/bigDateMap.js +2 -1
  144. package/dist/esm/components/ReportBuilder/convert.d.ts +4 -1
  145. package/dist/esm/components/ReportBuilder/convert.d.ts.map +1 -1
  146. package/dist/esm/components/ReportBuilder/convert.js +45 -13
  147. package/dist/esm/components/ReportBuilder/pivot.d.ts +3 -0
  148. package/dist/esm/components/ReportBuilder/pivot.d.ts.map +1 -1
  149. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  150. package/dist/esm/components/ReportBuilder/ui.js +7 -5
  151. package/dist/esm/components/ReportBuilder/util.d.ts +1 -0
  152. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  153. package/dist/esm/components/ReportBuilder/util.js +53 -5
  154. package/dist/esm/components/UiComponents.d.ts +3 -1
  155. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  156. package/dist/esm/components/UiComponents.js +4 -4
  157. package/dist/esm/hooks/useQuill.js +1 -1
  158. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts +2 -1
  159. package/dist/esm/internals/ReportBuilder/PivotModal.d.ts.map +1 -1
  160. package/dist/esm/internals/ReportBuilder/PivotModal.js +91 -91
  161. package/dist/esm/utils/axisFormatter.js +74 -30
  162. package/dist/esm/utils/dataFetcher.d.ts.map +1 -1
  163. package/dist/esm/utils/dataFetcher.js +10 -0
  164. package/dist/esm/utils/getDomain.js +25 -4
  165. package/dist/esm/utils/valueFormatter.d.ts +2 -1
  166. package/dist/esm/utils/valueFormatter.d.ts.map +1 -1
  167. package/package.json +2 -2
@@ -25,6 +25,9 @@ const AddSortPopover_1 = require("./components/ReportBuilder/AddSortPopover");
25
25
  const PivotModal_1 = require("./internals/ReportBuilder/PivotModal");
26
26
  const PivotList_1 = require("./internals/ReportBuilder/PivotList");
27
27
  const QuillTable_1 = __importDefault(require("./components/QuillTable"));
28
+ const QuillSelect_1 = require("./components/QuillSelect");
29
+ const textProcessing_1 = require("./utils/textProcessing");
30
+ const AddLimitPopover_1 = require("./components/ReportBuilder/AddLimitPopover");
28
31
  /**
29
32
  * Quill Report Builder
30
33
  *
@@ -33,7 +36,7 @@ const QuillTable_1 = __importDefault(require("./components/QuillTable"));
33
36
  * they can click a button and add that report to their dashboard or export it
34
37
  * as a CSV.
35
38
  */
36
- function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, TextInput = ui_1.QuillTextInput, Select = ui_1.QuillSelect, Table = QuillTable_1.default, Popover = ui_1.QuillPopover, Tabs = ui_1.QuillTabs, Checkbox = UiComponents_1.MemoizedCheckbox, Sidebar = ui_1.QuillSidebar, Container = ui_1.CustomContainer, HandleButton = ui_1.QuillHandleButton, SelectColumn = ui_1.QuillSelectColumn, DraggableColumn = ui_1.QuillDraggableColumn, ButtonLoadingState = ui_1.QuillButtonLoadingState, TableLoadingState = ui_1.QuillTableLoadingState, SidebarHeading = ui_1.QuillSidebarHeading, SidebarSubHeading = ui_1.QuillSidebarSubHeading, FilterPopover = ui_1.QuillFilterPopover, SortPopover = ui_1.QuillSortPopover, Label = UiComponents_1.MemoizedLabel, Header = UiComponents_1.MemoizedHeader, Text = UiComponents_1.MemoizedText, PivotPopover = UiComponents_1.MemoizedPopover, admin = false, hideAi = false, }) {
39
+ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, TextInput = ui_1.QuillTextInput, Select = QuillSelect_1.QuillSelectComponent, Table = QuillTable_1.default, Popover = ui_1.QuillPopover, Tabs = ui_1.QuillTabs, Checkbox = UiComponents_1.MemoizedCheckbox, Sidebar = ui_1.QuillSidebar, Container = ui_1.CustomContainer, HandleButton = ui_1.QuillHandleButton, SelectColumn = ui_1.QuillSelectColumn, DraggableColumn = ui_1.QuillDraggableColumn, ButtonLoadingState = ui_1.QuillButtonLoadingState, TableLoadingState = ui_1.QuillTableLoadingState, SidebarHeading = ui_1.QuillSidebarHeading, SidebarSubHeading = ui_1.QuillSidebarSubHeading, FilterPopover = ui_1.QuillFilterPopover, SortPopover = ui_1.QuillSortPopover, Label = UiComponents_1.MemoizedLabel, Header = UiComponents_1.MemoizedHeader, Text = UiComponents_1.MemoizedText, PivotPopover = UiComponents_1.MemoizedPopover, admin = false, hideAi = false, containerStyle, }) {
37
40
  const [aiPrompt, setAiPrompt] = (0, react_1.useState)('');
38
41
  const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
39
42
  const [baseAst, setBaseAst] = (0, react_1.useState)(null);
@@ -89,7 +92,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
89
92
  return columns.map((col) => ({
90
93
  label: col,
91
94
  name: col,
92
- displayName: col,
95
+ displayName: (0, textProcessing_1.snakeCaseToTitleCase)(col),
93
96
  field: col,
94
97
  format: (0, util_1.getPostgresBasicType)(fields.find((f) => f.name === col))?.replace('number', 'whole_number') || 'string',
95
98
  fieldType: schemaTables
@@ -121,6 +124,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
121
124
  // setUniqueValues({});
122
125
  setPivot(null);
123
126
  setPivotData(null);
127
+ setRecommendedPivots([]);
124
128
  }, 0);
125
129
  };
126
130
  (0, react_1.useEffect)(() => {
@@ -248,14 +252,14 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
248
252
  'Content-Type': 'application/json',
249
253
  },
250
254
  body: JSON.stringify({
251
- orgId: 2,
255
+ orgId: client.customerId,
252
256
  publicKey: client.publicKey,
253
257
  query: query,
254
258
  }),
255
259
  });
256
260
  const data = await response.json();
257
261
  if (data.errorMessage) {
258
- console.error(data.errorMessage);
262
+ // console.error(data.errorMessage);
259
263
  return null;
260
264
  }
261
265
  const options = data.rows.map((r) => r[column]);
@@ -272,19 +276,36 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
272
276
  };
273
277
  const fetchSchema = async () => {
274
278
  try {
275
- const response = await fetch(`https://quill-344421.uc.r.appspot.com/schema2/${client.publicKey}`).then((res) => res.json());
279
+ const response = await fetch(`${client.queryEndpoint}`, {
280
+ method: 'POST',
281
+ headers: {
282
+ ...client.queryHeaders,
283
+ 'Content-Type': 'application/json',
284
+ },
285
+ body: JSON.stringify({
286
+ metadata: {
287
+ clientId: client.publicKey,
288
+ publicKey: client.publicKey,
289
+ task: 'schema',
290
+ removeCustomerField: true,
291
+ },
292
+ }),
293
+ });
294
+ const results = await response.json();
276
295
  // Filter out hidden columns on tables back from schema2.
277
- const tables = response?.tables;
278
- for (const table of tables) {
279
- table.columns = table.columns.filter((column) =>
280
- // Quick and dirty fix for removing org ids from response.
281
- // TODO: Fix this on the backend or something.
282
- column.isVisible && column.displayName !== 'pm_company_id');
283
- }
296
+ const tables = results.data.tables || results.data.data.tables;
284
297
  setSchemaTables(tables ?? []);
285
- setOrderedColumnNames((tables ?? [])
286
- // .filter((t: any) => t.displayName === initialTableName)
287
- .flatMap((table) => table.columns.map((c) => `${table.displayName}.${c.displayName}`)));
298
+ setOrderedColumnNames((tables ?? []).flatMap((table) => table.columns
299
+ .map((c) => `${table.name}.${c.name}`)
300
+ .sort((a, b) => {
301
+ const aIsId = a.endsWith('.id') || a.endsWith('_id');
302
+ const bIsId = b.endsWith('.id') || b.endsWith('_id');
303
+ if (aIsId && !bIsId)
304
+ return 1;
305
+ if (bIsId && !aIsId)
306
+ return -1;
307
+ return 0;
308
+ })));
288
309
  // Fetch all the unique values in parallel
289
310
  const pendingFetches = [];
290
311
  for (let table of tables ?? []) {
@@ -309,6 +330,12 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
309
330
  if ((0, crypto_1.hashCode)(uniqueValues) !== (0, crypto_1.hashCode)(newUniqueValues)) {
310
331
  setUniqueValues(newUniqueValues);
311
332
  }
333
+ if (initialTableName) {
334
+ const columnsForTable = tables
335
+ .find((t) => t.name === initialTableName)
336
+ ?.columns.map((c) => c.name);
337
+ await handleAsk(`get ${columnsForTable} from ${initialTableName}`);
338
+ }
312
339
  }
313
340
  catch (error) {
314
341
  console.error(error);
@@ -611,6 +638,9 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
611
638
  };
612
639
  // Function to handle operator changes
613
640
  const handleOperatorChange = (value, node, keyPrefix, column = null) => {
641
+ if (!keyPrefix) {
642
+ setTopLevelBinaryOperator(value);
643
+ }
614
644
  if (isPending) {
615
645
  updateActiveItem([{ path: keyPrefix + 'operator', value }], { column });
616
646
  }
@@ -708,7 +738,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
708
738
  'node.right.args.value.1.column') ??
709
739
  (node.right?.args?.value[1]?.value &&
710
740
  'node.right.args.value.1.value');
711
- return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: 20 }, children: [(0, jsx_runtime_1.jsx)(Select, { value: dateColumn, onChange: (value) => {
741
+ return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: 20 }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: dateColumn, onChange: (value) => {
712
742
  const columnType = getColumnTypeByName(value);
713
743
  if ((0, ast_1.isDateishColumnType)(columnType)) {
714
744
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -725,9 +755,9 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
725
755
  handleReplaceSubtree(keyPrefix, newSubtree);
726
756
  }
727
757
  }, options: getAllPossibleColumns().map((column) => ({
728
- label: column.displayName,
758
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(column.displayName),
729
759
  value: column.name,
730
- })) }), (0, jsx_runtime_1.jsx)(Select, { value: dateFilterType, onChange: (value) => {
760
+ })) }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
731
761
  if (value === dateFilterType)
732
762
  return null;
733
763
  let newSubtree = {};
@@ -773,7 +803,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
773
803
  path: keyPrefix + intervalPath,
774
804
  },
775
805
  ]));
776
- } })), (0, jsx_runtime_1.jsx)(Select, { value: intervalType, onChange: (value) => {
806
+ } })), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: intervalType, onChange: (value) => {
777
807
  if (intervalPaths.length === 1) {
778
808
  handleChangeText([
779
809
  {
@@ -819,7 +849,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
819
849
  else if ((0, util_1.isInTheLastInterval)(node, client.databaseType)) {
820
850
  const { dateColumn, dateFilterType, intervalCount, intervalType } = (0, util_1.getDateFilterInfo)(node);
821
851
  const options = getAllPossibleColumns().map((column) => ({
822
- label: column.displayName,
852
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(column.displayName),
823
853
  value: column.name,
824
854
  }));
825
855
  const plural = node.right.args.value[1].expr.value > 1 ? 's' : '';
@@ -828,7 +858,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
828
858
  flexDirection: 'row',
829
859
  alignItems: 'center',
830
860
  gap: 20,
831
- }, children: [(0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Select, { value: node.left.column, onChange: (value) => {
861
+ }, children: [(0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.column, onChange: (value) => {
832
862
  const columnType = getColumnTypeByName(value);
833
863
  if ((0, ast_1.isDateishColumnType)(columnType)) {
834
864
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -844,7 +874,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
844
874
  newSubtree.left.args.value[0].column = value;
845
875
  handleReplaceSubtree(keyPrefix, newSubtree);
846
876
  }
847
- }, options: options }) }), (0, jsx_runtime_1.jsx)(Select, { value: dateFilterType, onChange: (value) => {
877
+ }, options: options }) }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
848
878
  handleOperatorChange(value, node, keyPrefix, dateColumn);
849
879
  }, options: [
850
880
  { label: 'in the last', value: 'IN_THE_LAST' },
@@ -858,7 +888,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
858
888
  path: keyPrefix + 'right.args.value||1.expr.value',
859
889
  },
860
890
  ]);
861
- } }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Select, { value: node.right.args.value[1].unit, onChange: (value) => handleChange([
891
+ } }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.right.args.value[1].unit, onChange: (value) => handleChange([
862
892
  { value, path: keyPrefix + 'right.args.value||1.unit' },
863
893
  ]), options: [
864
894
  { label: `year${plural}`, value: '* 365 DAY' },
@@ -870,7 +900,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
870
900
  else if ((0, util_1.isTheCurrentInterval)(node, client.databaseType)) {
871
901
  const { dateFilterType } = (0, util_1.getDateFilterInfo)(node);
872
902
  const options = getAllPossibleColumns().map((column) => ({
873
- label: column.displayName,
903
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(column.displayName),
874
904
  value: column.name,
875
905
  }));
876
906
  return ((0, jsx_runtime_1.jsxs)("div", { style: {
@@ -878,7 +908,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
878
908
  flexDirection: 'row',
879
909
  alignItems: 'center',
880
910
  gap: 20,
881
- }, children: [(0, jsx_runtime_1.jsx)(Select, { value: node.left.column, onChange: (value) => {
911
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.column, onChange: (value) => {
882
912
  const columnType = getColumnTypeByName(value);
883
913
  if ((0, ast_1.isDateishColumnType)(columnType)) {
884
914
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -894,14 +924,14 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
894
924
  newSubtree.left.args.value[0].column = value;
895
925
  handleReplaceSubtree(keyPrefix, newSubtree);
896
926
  }
897
- }, options: options }), (0, jsx_runtime_1.jsx)(Select, { value: 'IN_THE_CURRENT', onChange: (value) => {
927
+ }, options: options }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: 'IN_THE_CURRENT', onChange: (value) => {
898
928
  handleOperatorChange(value, node, keyPrefix, node.left.column);
899
929
  }, options: [
900
930
  { label: 'in the last', value: 'IN_THE_LAST' },
901
931
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
902
932
  { label: 'in the current', value: 'IN_THE_CURRENT' },
903
933
  // { label: 'equals', value: 'equals' },
904
- ] }), (0, jsx_runtime_1.jsx)(Select, { value: node.left.args.value[1].column, onChange: (value) => {
934
+ ] }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
905
935
  handleChange([
906
936
  { value, path: 'right.args.value||1.column' },
907
937
  { value, path: 'left.args.value||1.column' },
@@ -915,7 +945,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
915
945
  }
916
946
  else if ((0, util_1.isThePreviousInterval)(node, client.databaseType)) {
917
947
  const options = getAllPossibleColumns().map((column) => ({
918
- label: column.displayName,
948
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(column.displayName),
919
949
  value: column.name,
920
950
  }));
921
951
  return ((0, jsx_runtime_1.jsxs)("div", { style: {
@@ -923,7 +953,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
923
953
  flexDirection: 'row',
924
954
  alignItems: 'center',
925
955
  gap: 20,
926
- }, children: [(0, jsx_runtime_1.jsx)(Select, { value: node.left.column, onChange: (value) => {
956
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.column, onChange: (value) => {
927
957
  const columnType = getColumnTypeByName(value);
928
958
  if ((0, ast_1.isDateishColumnType)(columnType)) {
929
959
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -939,14 +969,14 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
939
969
  newSubtree.left.args.value[0].column = value;
940
970
  handleReplaceSubtree(keyPrefix, newSubtree);
941
971
  }
942
- }, opt: true, options: options }), (0, jsx_runtime_1.jsx)(Select, { value: 'IN_THE_PREVIOUS', onChange: (value) => {
972
+ }, opt: true, options: options }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: 'IN_THE_PREVIOUS', onChange: (value) => {
943
973
  handleOperatorChange(value, node, keyPrefix, node.left.column);
944
974
  }, options: [
945
975
  { label: 'in the last', value: 'IN_THE_LAST' },
946
976
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
947
977
  { label: 'in the current', value: 'IN_THE_CURRENT' },
948
978
  // { label: 'equals', value: 'equals' },
949
- ] }), (0, jsx_runtime_1.jsx)(Select, { value: node.left.args.value[1].column, onChange: (value) => {
979
+ ] }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
950
980
  const dayConversion = {
951
981
  YEAR: 365,
952
982
  QUARTER: 90,
@@ -976,7 +1006,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
976
1006
  }
977
1007
  else if ((0, util_1.isColumnComparison)(node)) {
978
1008
  const options = getAllPossibleColumns().map((column) => ({
979
- label: column.displayName,
1009
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(column.displayName),
980
1010
  value: column.name,
981
1011
  }));
982
1012
  // grab the value of the left child of the column comparison
@@ -1030,6 +1060,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1030
1060
  gap: 12,
1031
1061
  flexDirection: 'column',
1032
1062
  width: '100%',
1063
+ padding: '6px 0px',
1033
1064
  }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
1034
1065
  display: 'flex',
1035
1066
  gap: 20,
@@ -1038,7 +1069,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1038
1069
  ? 'row'
1039
1070
  : 'column',
1040
1071
  width: '100%',
1041
- }, children: [(0, jsx_runtime_1.jsx)(Select, { style: { width: 'min-content' }, value: leftChildValue, onChange: (value) => {
1072
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, style: { width: 'min-content' }, value: leftChildValue, onChange: (value) => {
1042
1073
  const columnType = getColumnTypeByName(value);
1043
1074
  if ((0, ast_1.isDateishColumnType)(columnType)) {
1044
1075
  handleOperatorChange('IN_THE_LAST', node, keyPrefix, value);
@@ -1053,7 +1084,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1053
1084
  newSubtree.left.args.value[0].column = value;
1054
1085
  handleReplaceSubtree(keyPrefix, newSubtree);
1055
1086
  }
1056
- }, options: options }), operatorOptions.length > 0 && ((0, jsx_runtime_1.jsx)(Select, { value: node.operator, onChange: (value) => {
1087
+ }, options: options }), operatorOptions.length > 0 && ((0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.operator, onChange: (value) => {
1057
1088
  handleOperatorChange(value, node, keyPrefix, leftChildValue);
1058
1089
  }, style: { width: 'min-content' }, options: operatorOptions })), node.right &&
1059
1090
  node.right.type !== 'expr_list' &&
@@ -1083,7 +1114,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1083
1114
  justifyContent: 'space-between',
1084
1115
  flexDirection: (0, util_1.showNodeAsRow)(node, formData) ? 'row' : 'column',
1085
1116
  width: '100%',
1086
- }, children: [node.left && renderNode(node.left, keyPrefix + 'left.'), (0, jsx_runtime_1.jsx)(Select, { value: node.operator, onChange: (value) => {
1117
+ }, children: [node.left && renderNode(node.left, keyPrefix + 'left.'), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.operator, onChange: (value) => {
1087
1118
  handleOperatorChange(value, node, keyPrefix);
1088
1119
  }, style: { width: `100%` }, options: [
1089
1120
  // { label: `and`, value: "AND" },
@@ -1125,10 +1156,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1125
1156
  }
1126
1157
  case 'column_ref': {
1127
1158
  const options = getAllPossibleColumns().map((column) => ({
1128
- label: column.displayName,
1159
+ label: (0, textProcessing_1.snakeCaseToTitleCase)(column.displayName),
1129
1160
  value: column.name,
1130
1161
  }));
1131
- return ((0, jsx_runtime_1.jsx)(Select, { style: { width: '120px' }, value: node.column ?? options[0]?.value, onChange: (value) => {
1162
+ return ((0, jsx_runtime_1.jsx)(Select, { theme: theme, style: { width: '120px' }, value: node.column ?? options[0]?.value, onChange: (value) => {
1132
1163
  handleChange([{ value, path: keyPrefix + 'column' }]);
1133
1164
  }, options: options }));
1134
1165
  }
@@ -1252,10 +1283,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1252
1283
  isInTheCurrentIntervalSentence ??
1253
1284
  isInTheLastIntervalSentence ??
1254
1285
  isInThePreviousIntervalSentence ?? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [node.left &&
1255
- renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : topLevelBinaryOperator === 'OR' ? ((0, jsx_runtime_1.jsx)(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: Select })) : null, node.right &&
1286
+ 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: Select })) : null, node.right &&
1256
1287
  renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
1257
1288
  case 'column_ref':
1258
- return node.column;
1289
+ return (0, textProcessing_1.snakeCaseToTitleCase)(node.column);
1259
1290
  case 'expr_list':
1260
1291
  if (node.value.length === 1) {
1261
1292
  const subQuery = renderSentence(formData, node.value[0]);
@@ -1287,10 +1318,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1287
1318
  if (node.args.value.length < 1)
1288
1319
  return null;
1289
1320
  if (node.args.value[0].value) {
1290
- return node.args.value[0].value.replaceAll('%', '');
1321
+ return (0, textProcessing_1.snakeCaseToTitleCase)(node.args.value[0].value.replaceAll('%', ''));
1291
1322
  }
1292
1323
  if (node.args.value[0].column)
1293
- return node.args.value[0].column.replaceAll('%', '');
1324
+ return (0, textProcessing_1.snakeCaseToTitleCase)(node.args.value[0].column.replaceAll('%', ''));
1294
1325
  return null;
1295
1326
  }
1296
1327
  if (node.name.toLowerCase() === 'current_date' ||
@@ -1327,10 +1358,22 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1327
1358
  const tableNamesInQuery = baseAst.from.map((tbl) => tbl.table);
1328
1359
  return schemaTables
1329
1360
  .filter((t) => tableNamesInQuery.includes(t.displayName))
1330
- .flatMap((table) => table.columns.map((c) => ({
1361
+ .flatMap((table) => table.columns
1362
+ .map((c) => ({
1331
1363
  ...c,
1332
1364
  table: table.displayName,
1333
- })));
1365
+ }))
1366
+ .sort((a, b) => {
1367
+ const aIsId = a.name.toLowerCase() === 'id' ||
1368
+ a.name.toLowerCase().endsWith('_id');
1369
+ const bIsId = b.name.toLowerCase() === 'id' ||
1370
+ b.name.toLowerCase().endsWith('_id');
1371
+ if (aIsId && !bIsId)
1372
+ return 1;
1373
+ if (bIsId && !aIsId)
1374
+ return -1;
1375
+ return 0;
1376
+ }));
1334
1377
  };
1335
1378
  const getDateColumns = () => {
1336
1379
  const allColumns = getAllPossibleColumns();
@@ -1381,26 +1424,6 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1381
1424
  },
1382
1425
  as: null,
1383
1426
  });
1384
- const SortableItem = ({ id, label, setSelectedColumns, selectedColumns, }) => {
1385
- const { attributes, listeners, setNodeRef, transform, transition } = (0, sortable_1.useSortable)({ id: id });
1386
- const style = {
1387
- transform: utilities_1.CSS.Transform.toString(transform),
1388
- transition,
1389
- };
1390
- const handleSelect = () => {
1391
- setSelectedColumns((selectedColumns) => {
1392
- if (selectedColumns.includes(id)) {
1393
- return selectedColumns.filter((column) => column !== id);
1394
- }
1395
- else {
1396
- return [...selectedColumns, id];
1397
- }
1398
- });
1399
- };
1400
- return ((0, jsx_runtime_1.jsx)("div", { style: { userSelect: 'none', ...style }, ref: setNodeRef, children: (0, jsx_runtime_1.jsx)(SelectColumn, { selected: selectedColumns?.includes(id), setSelected: handleSelect, label: label, children: (0, jsx_runtime_1.jsx)("div", { style: {
1401
- cursor: 'grab',
1402
- }, ...attributes, ...listeners, children: (0, jsx_runtime_1.jsx)(HandleButton, {}) }) }) }));
1403
- };
1404
1427
  const AddConditionPopover = ({ onSave }) => {
1405
1428
  return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [(0, jsx_runtime_1.jsx)("h1", { style: {
1406
1429
  fontWeight: '600',
@@ -1426,13 +1449,24 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1426
1449
  body: JSON.stringify({
1427
1450
  ast: { ...baseAst, where: formData },
1428
1451
  publicKey: client.publicKey,
1429
- orgId: '2',
1452
+ orgId: client.customerId,
1430
1453
  }),
1431
1454
  });
1432
1455
  const data2 = await res2.json();
1433
1456
  if (data2.rows && data2.rows.length) {
1434
1457
  const tables = (0, ast_1.getTableNames)(baseAst);
1435
1458
  const table = tables.length >= 1 ? tables[0] : initialTableName;
1459
+ const sortedFields = data2.fields.sort((a, b) => {
1460
+ const aIsId = a.name.toLowerCase() === 'id' ||
1461
+ a.name.toLowerCase().endsWith('_id');
1462
+ const bIsId = b.name.toLowerCase() === 'id' ||
1463
+ b.name.toLowerCase().endsWith('_id');
1464
+ if (aIsId && !bIsId)
1465
+ return 1;
1466
+ if (bIsId && !aIsId)
1467
+ return -1;
1468
+ return 0;
1469
+ });
1436
1470
  if (pivot) {
1437
1471
  // Do all of this to make sure we have the right unique columns when applying a pivot
1438
1472
  let uniqueFormatted = {};
@@ -1444,6 +1478,8 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1444
1478
  const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, data2.rows, [null, null, null], false);
1445
1479
  console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
1446
1480
  setPivotData(pivotedData);
1481
+ setRows(data2.rows);
1482
+ setFields(data2.fields);
1447
1483
  }
1448
1484
  else {
1449
1485
  setRows(data2.rows);
@@ -1564,8 +1600,8 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1564
1600
  }
1565
1601
  return false;
1566
1602
  };
1567
- const handleAsk = async () => {
1568
- if (!aiPrompt) {
1603
+ const handleAsk = async (overridePrompt = '') => {
1604
+ if (!aiPrompt && !overridePrompt) {
1569
1605
  return;
1570
1606
  }
1571
1607
  try {
@@ -1584,7 +1620,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1584
1620
  method: 'POST',
1585
1621
  headers: { 'Content-Type': 'application/json' },
1586
1622
  body: JSON.stringify({
1587
- initialQuestion: aiPrompt,
1623
+ initialQuestion: aiPrompt || overridePrompt,
1588
1624
  publicKey: client.publicKey,
1589
1625
  }),
1590
1626
  });
@@ -1621,11 +1657,21 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1621
1657
  newAst = (0, convert_1.convertBigQuery)(ast);
1622
1658
  newAst = (0, convert_1.convertWildcardColumns)(newAst, schemaTables); // must go before groupby
1623
1659
  ({ ast: newAst, pivot: groupByPivot } = (0, convert_1.convertGroupBy)(newAst, pivot, schemaTables));
1660
+ if (groupByPivot && !groupByPivot?.valueField) {
1661
+ setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
1662
+ return;
1663
+ }
1624
1664
  newAst = (0, convert_1.convertStringComparison)(newAst, client.databaseType);
1625
1665
  newAst = (0, convert_1.convertRemoveSimpleParentheses)(newAst);
1666
+ const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
1667
+ const tableAlias = (0, ast_1.getTableAliases)(newAst)[0] ?? initialTableName;
1668
+ newAst = (0, util_1.removeNonSelectedTableReferences)(newAst, tableAlias ?? table);
1626
1669
  // newAst = convertDateComparison(newAst); // TODO
1627
1670
  ast = newAst; // so we fetch data for newAst later.
1628
- const table = (0, ast_1.getTableNames)(newAst)[0] ?? initialTableName;
1671
+ setPivotRowField(groupByPivot?.rowField);
1672
+ setPivotColumnField(groupByPivot?.columnField);
1673
+ setPivotValueField(groupByPivot?.valueField);
1674
+ setPivotAggregation(groupByPivot?.aggregationType);
1629
1675
  setPivot(groupByPivot);
1630
1676
  setSelectedColumns((0, util_1.deepCopy)(newAst).columns?.map((column) => {
1631
1677
  if (column.expr.type === 'column_ref') {
@@ -1657,7 +1703,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1657
1703
  body: JSON.stringify({
1658
1704
  ast: ast,
1659
1705
  publicKey: client.publicKey,
1660
- orgId: '2',
1706
+ orgId: client.customerId,
1661
1707
  }),
1662
1708
  });
1663
1709
  const data2 = await res2.json();
@@ -1668,6 +1714,8 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1668
1714
  const pivotedData = (0, PivotModal_1.generatePivotTable)(pivot, data2.rows, [null, null, null], false);
1669
1715
  console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
1670
1716
  setPivotData(pivotedData);
1717
+ setRows(data2.rows);
1718
+ setFields(data2.fields);
1671
1719
  }
1672
1720
  else {
1673
1721
  setRows(data2.rows);
@@ -1731,7 +1779,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1731
1779
  transform: utilities_1.CSS.Transform.toString(transform),
1732
1780
  transition,
1733
1781
  };
1734
- return ((0, jsx_runtime_1.jsx)("div", { style: { ...style }, ref: setNodeRef, children: (0, jsx_runtime_1.jsx)(DraggableColumn, { label: label, onDelete: onDelete, children: (0, jsx_runtime_1.jsx)("div", { style: {
1782
+ return ((0, jsx_runtime_1.jsx)("div", { style: { ...style }, ref: setNodeRef, children: (0, jsx_runtime_1.jsx)(DraggableColumn, { label: (0, textProcessing_1.snakeCaseToTitleCase)(label), onDelete: onDelete, children: (0, jsx_runtime_1.jsx)("div", { style: {
1735
1783
  cursor: 'grab',
1736
1784
  }, ...attributes, ...listeners, children: (0, jsx_runtime_1.jsx)(HandleButton, {}) }) }) }));
1737
1785
  };
@@ -1792,24 +1840,17 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1792
1840
  gap: 8,
1793
1841
  }, children: [columnNamesInAst.map((name) => ((0, jsx_runtime_1.jsx)(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && (0, jsx_runtime_1.jsx)("div", { style: { height: 6 } })] }) }) }));
1794
1842
  }
1795
- const allNumericColumns = getNumericColumns().map((column) => ({
1796
- label: column.displayName,
1797
- value: column.name,
1798
- }));
1799
- const allNonNumericColumns = getNonNumericColumns().map((column) => ({
1800
- label: column.displayName,
1801
- value: column.name,
1802
- }));
1803
- const allStringColumns = getStringColumns().map((column) => ({
1804
- label: column.displayName,
1805
- value: column.name,
1806
- }));
1807
1843
  if (loading) {
1808
- return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', height: '100%' }, ref: parentRef, children: [(0, jsx_runtime_1.jsxs)(Sidebar, { children: [(0, jsx_runtime_1.jsx)(SidebarHeading, { label: "Columns" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddColumnPopover', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
1844
+ return ((0, jsx_runtime_1.jsxs)("div", { style: {
1845
+ display: 'flex',
1846
+ flexDirection: 'row',
1847
+ height: '100%',
1848
+ ...containerStyle,
1849
+ }, ref: parentRef, children: [(0, jsx_runtime_1.jsxs)(Sidebar, { children: [(0, jsx_runtime_1.jsx)(SidebarHeading, { label: "Columns" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddColumnPopover', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
1809
1850
  if (!openPopover) {
1810
1851
  setOpenPopover('AddColumnPopover');
1811
1852
  }
1812
- }, label: 'Select columns' }), title: "Select columns", onClose: () => {
1853
+ }, label: 'Select columns' }), label: "Select columns", onClose: () => {
1813
1854
  setIsPending(false);
1814
1855
  setActiveEditItem(null);
1815
1856
  setActivePath(null);
@@ -1922,7 +1963,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1922
1963
  newAst.orderby = null;
1923
1964
  setBaseAst(newAst); // trigger refetch
1924
1965
  setPivot(pivot);
1925
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
1966
+ }, selectPivotOnEdit: true, showTrigger: !pivot || !pivotData, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3, SecondaryButtonComponent: SecondaryButton }), pivot && pivotData && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
1926
1967
  pivot: pivot,
1927
1968
  rows: pivotData?.rows || [],
1928
1969
  columns: pivotData?.columns || [],
@@ -1981,7 +2022,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1981
2022
  const newAst = { ...baseAst };
1982
2023
  newAst.orderby.splice(id, 1);
1983
2024
  setBaseAst((0, util_1.deepCopy)(newAst));
1984
- } }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddSortPopover', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2025
+ } }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddSortPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
1985
2026
  if (!openPopover) {
1986
2027
  setOpenPopover('AddSortPopover');
1987
2028
  }
@@ -1990,12 +2031,45 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1990
2031
  setActiveEditItem(null);
1991
2032
  setActivePath(null);
1992
2033
  setOpenPopover(null);
1993
- }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: selectedColumns, Select: Select, Button: Button, onSave: () => { } }) })] }), (0, jsx_runtime_1.jsxs)(Container, { children: [(0, jsx_runtime_1.jsxs)("form", { style: {
2034
+ }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: selectedColumns, Select: Select, Button: Button, onSave: () => { } }) }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeading, { label: "Limit" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
2035
+ display: 'flex',
2036
+ flexDirection: 'column',
2037
+ gap: 8,
2038
+ marginBottom: 12,
2039
+ }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: SortPopover, EditPopover: AddLimitPopover_1.AddLimitPopover, handleDelete: () => {
2040
+ const newAst = { ...baseAst };
2041
+ newAst.limit = null;
2042
+ setBaseAst((0, util_1.deepCopy)(newAst));
2043
+ }, onSave: (limit) => {
2044
+ const newAst = { ...baseAst };
2045
+ newAst.limit = {
2046
+ seperator: '',
2047
+ value: [
2048
+ {
2049
+ type: 'number',
2050
+ value: limit,
2051
+ },
2052
+ ],
2053
+ };
2054
+ setOpenPopover(null);
2055
+ setBaseAst((0, util_1.deepCopy)(newAst));
2056
+ } }) })) : ((0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2057
+ if (!openPopover) {
2058
+ setOpenPopover('AddLimitPopover');
2059
+ }
2060
+ }, label: 'Add limit' }), title: "Limit", onClose: () => {
2061
+ setIsPending(false);
2062
+ setActiveEditItem(null);
2063
+ setActivePath(null);
2064
+ setOpenPopover(null);
2065
+ }, children: (0, jsx_runtime_1.jsx)(TextInput, { value: 0, type: "number", style: { width: 120, minHeight: 32 }, onChange: (e) => { } }) }))] }), (0, jsx_runtime_1.jsxs)(Container, { children: [!hideAi && ((0, jsx_runtime_1.jsxs)("form", { onSubmit: (event) => {
2066
+ event.preventDefault();
2067
+ }, style: {
1994
2068
  display: 'flex',
1995
2069
  flexDirection: 'row',
1996
2070
  gap: 12,
1997
2071
  padding: 1,
1998
- }, children: [(0, jsx_runtime_1.jsx)(TextInput, { placeholder: "Ask a question...", type: "text", style: { width: '100%', fontSize: 14 }, value: aiPrompt }), (0, jsx_runtime_1.jsx)(ButtonLoadingState, {}), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: clearAllState, label: "New report" }))] }), baseAst && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableLoadingState, {}), (0, jsx_runtime_1.jsxs)("div", { style: {
2072
+ }, children: [(0, jsx_runtime_1.jsx)(TextInput, { placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', type: "text", style: { width: '100%', fontSize: 14 }, value: aiPrompt }), (0, jsx_runtime_1.jsx)(Button, { onClick: () => { }, label: 'Ask AI' }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: clearAllState, label: "New report" }))] })), baseAst && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableLoadingState, {}), (0, jsx_runtime_1.jsxs)("div", { style: {
1999
2073
  display: 'flex',
2000
2074
  flexDirection: 'row',
2001
2075
  gap: '12px',
@@ -2006,6 +2080,8 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2006
2080
  flexDirection: 'row',
2007
2081
  height: '100%',
2008
2082
  overflowY: 'auto',
2083
+ boxSizing: 'border-box',
2084
+ ...containerStyle,
2009
2085
  }, children: [(0, jsx_runtime_1.jsxs)(Sidebar, { children: [(0, jsx_runtime_1.jsx)(SidebarHeading, { label: "Columns" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddColumnPopover', title: "Select columns", trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2010
2086
  if (!openPopover) {
2011
2087
  setOpenPopover('AddColumnPopover');
@@ -2118,7 +2194,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2118
2194
  setOpenPopover(null);
2119
2195
  clearCheckboxes();
2120
2196
  }
2121
- } }) }))] }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeading, { 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: Select, ButtonComponent: Button, PopoverComponent: PivotPopover, TextComponent: Text, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2197
+ } }) }))] }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeading, { 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: Select, ButtonComponent: Button, SecondaryButtonComponent: SecondaryButton, PopoverComponent: PivotPopover, TextComponent: Text, isOpen: showPivotPopover, setIsOpen: setShowPivotPopover, showUpdatePivot: isEdittingPivot, setShowUpdatePivot: setIsEdittingPivot, parentRef: parentRef, data: rows, columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), triggerButtonText: 'Add pivot', selectedPivotIndex: selectedPivotIndex, setSelectedPivotIndex: setSelectedPivotIndex, removePivot: () => {
2122
2198
  setPivot(null);
2123
2199
  setPivotData(null);
2124
2200
  }, selectPivot: (pivot) => {
@@ -2126,9 +2202,13 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2126
2202
  return;
2127
2203
  const newAst = { ...baseAst };
2128
2204
  newAst.orderby = null;
2205
+ if (pivot.rowFieldType === 'date') {
2206
+ pivot['sort'] = true;
2207
+ pivot['sortDirection'] = 'ASC';
2208
+ }
2129
2209
  setBaseAst(newAst); // trigger refetch
2130
2210
  setPivot(pivot);
2131
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
2211
+ }, selectPivotOnEdit: true, showTrigger: !pivot || !pivotData, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && pivotData && ((0, jsx_runtime_1.jsx)(PivotList_1.PivotCard, { pivotTable: {
2132
2212
  pivot: pivot,
2133
2213
  rows: pivotData?.rows || [],
2134
2214
  columns: pivotData?.columns || [],
@@ -2229,28 +2309,78 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2229
2309
  setActivePath(null);
2230
2310
  setOpenPopover(null);
2231
2311
  setBaseAst((0, util_1.deepCopy)(newAst));
2232
- } }) })] }), (0, jsx_runtime_1.jsxs)(Container, { children: [!hideAi && ((0, jsx_runtime_1.jsxs)("form", { onSubmit: handleAsk, style: {
2312
+ } }) }), (0, jsx_runtime_1.jsx)("div", { style: { height: 28, width: '100%' } }), (0, jsx_runtime_1.jsx)(SidebarHeading, { label: "Limit" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? ((0, jsx_runtime_1.jsx)("div", { style: {
2313
+ display: 'flex',
2314
+ flexDirection: 'column',
2315
+ gap: 8,
2316
+ marginBottom: 12,
2317
+ }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: SortPopover, EditPopover: AddLimitPopover_1.AddLimitPopover, handleDelete: () => {
2318
+ const newAst = { ...baseAst };
2319
+ newAst.limit = null;
2320
+ setBaseAst((0, util_1.deepCopy)(newAst));
2321
+ }, onSave: (limit) => {
2322
+ const newAst = { ...baseAst };
2323
+ newAst.limit = {
2324
+ seperator: '',
2325
+ value: [
2326
+ {
2327
+ type: 'number',
2328
+ value: limit,
2329
+ },
2330
+ ],
2331
+ };
2332
+ setOpenPopover(null);
2333
+ setBaseAst((0, util_1.deepCopy)(newAst));
2334
+ } }) })) : ((0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2335
+ if (!baseAst) {
2336
+ return;
2337
+ }
2338
+ if (!openPopover) {
2339
+ setOpenPopover('AddLimitPopover');
2340
+ }
2341
+ }, label: 'Add limit' }), title: "Limit", onClose: () => {
2342
+ setIsPending(false);
2343
+ setActiveEditItem(null);
2344
+ setActivePath(null);
2345
+ setOpenPopover(null);
2346
+ }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.AddLimitPopover, { TextInput: TextInput, onSave: (limit) => {
2347
+ const newAst = { ...baseAst };
2348
+ newAst.limit = {
2349
+ seperator: '',
2350
+ value: [
2351
+ {
2352
+ type: 'number',
2353
+ value: Number(limit),
2354
+ },
2355
+ ],
2356
+ };
2357
+ setOpenPopover(null);
2358
+ setBaseAst((0, util_1.deepCopy)(newAst));
2359
+ } }) }))] }), (0, jsx_runtime_1.jsxs)(Container, { children: [!hideAi && ((0, jsx_runtime_1.jsxs)("form", { onSubmit: (event) => {
2360
+ event.preventDefault();
2361
+ handleAsk();
2362
+ }, style: {
2233
2363
  display: 'flex',
2234
2364
  flexDirection: 'row',
2235
2365
  gap: 12,
2236
2366
  padding: 1,
2237
- }, children: [(0, jsx_runtime_1.jsx)(TextInput, { type: "text", value: aiPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), (0, jsx_runtime_1.jsx)(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [loading && errorMessage.length === 0 ? ((0, jsx_runtime_1.jsx)(TableLoadingState, {})) : ((0, jsx_runtime_1.jsx)(Table, { rows: applyFormatting({
2238
- rows: pivotData?.rows || rows,
2239
- fields: pivotData?.fields || fields,
2240
- }, baseAst?.columns ?? []), columns: pivotData?.columns ||
2241
- enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
2242
- return { label: c, field: c };
2243
- }), error: errorMessage, rowsPerPage: 20 })), (0, jsx_runtime_1.jsxs)("div", { style: {
2244
- display: 'flex',
2245
- flexDirection: 'row',
2246
- gap: '12px',
2247
- }, children: [errorMessage && ((0, jsx_runtime_1.jsx)("div", { style: {
2248
- color: 'red',
2249
- fontSize: 14,
2250
- padding: '12px',
2251
- whiteSpace: 'nowrap',
2252
- }, children: errorMessage })), (0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } }), (0, jsx_runtime_1.jsx)(SecondaryButton, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), (0, jsx_runtime_1.jsx)(Button, { onClick: () => {
2367
+ }, children: [(0, jsx_runtime_1.jsx)(TextInput, { type: "text", value: aiPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), (0, jsx_runtime_1.jsx)(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: loading && errorMessage.length === 0 ? ((0, jsx_runtime_1.jsx)(TableLoadingState, {})) : ((0, jsx_runtime_1.jsx)(Table, { rows: applyFormatting({
2368
+ rows: pivotData?.rows || rows,
2369
+ fields: pivotData?.fields || fields,
2370
+ }, baseAst?.columns ?? []), columns: pivotData?.columns ||
2371
+ enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
2372
+ return { label: (0, textProcessing_1.snakeCaseToTitleCase)(c), field: c };
2373
+ }), error: errorMessage, rowsPerPage: 20 })) })), (0, jsx_runtime_1.jsxs)("div", { style: {
2374
+ display: 'flex',
2375
+ flexDirection: 'row',
2376
+ gap: '12px',
2377
+ }, children: [errorMessage && ((0, jsx_runtime_1.jsx)("div", { style: {
2378
+ color: 'red',
2379
+ fontSize: 14,
2380
+ padding: '12px',
2381
+ whiteSpace: 'nowrap',
2382
+ }, 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)(SecondaryButton, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), (0, jsx_runtime_1.jsx)(Button, { onClick: () => {
2253
2383
  setIsChartBuilderOpen(true);
2254
- }, label: 'Add to dashboard' })] })] }))] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { rows: applyFormatting({ rows, fields }, baseAst?.columns ?? []), columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: admin ? true : false, showDateFieldOptions: admin ? true : false, showAccessControlOptions: admin ? true : false, title: "Add to dashboard", isEditMode: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, destinationDashboard: destinationDashboard, organizationName: organizationName })] }));
2384
+ }, label: 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { rows: applyFormatting({ rows, fields }, baseAst?.columns ?? []), columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: admin ? true : false, showDateFieldOptions: admin ? true : false, showAccessControlOptions: admin ? true : false, title: "Add to dashboard", isEditMode: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData })] }));
2255
2385
  }
2256
2386
  exports.default = ReportBuilder;