@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
@@ -1,17 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useContext, useEffect, useRef, useState } from 'react';
2
+ import { useContext, useEffect, useRef, useState, } from 'react';
3
3
  import { MemoizedButton, MemoizedCheckbox, MemoizedHeader, MemoizedLabel, MemoizedPopover, MemoizedSecondaryButton, MemoizedText, } from './components/UiComponents';
4
4
  import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
5
5
  import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
6
6
  import { CSS as DND_CSS } from '@dnd-kit/utilities';
7
7
  import { getQuarter } from 'date-fns';
8
8
  import { ClientContext, ThemeContext } from './Context';
9
- import { getTableNames, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
9
+ import { getTableAliases, getTableNames, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
10
10
  import { ChartBuilderWithModal } from './ChartBuilder';
11
- import { QuillPopover, QuillSelect, QuillTabs, QuillTextInput, QuillSidebar, CustomContainer, QuillHandleButton, QuillSelectColumn, QuillDraggableColumn, QuillButtonLoadingState, QuillTableLoadingState, QuillSidebarHeading, QuillSidebarSubHeading, QuillFilterPopover, QuillSortPopover, DEFAULT_TAB_OPTIONS, TagWrapper, EditPopover, AddFilterPopover, } from './components/ReportBuilder/ui';
11
+ import { QuillPopover, QuillTabs, QuillTextInput, QuillSidebar, CustomContainer, QuillHandleButton, QuillSelectColumn, QuillDraggableColumn, QuillButtonLoadingState, QuillTableLoadingState, QuillSidebarHeading, QuillSidebarSubHeading, QuillFilterPopover, QuillSortPopover, DEFAULT_TAB_OPTIONS, TagWrapper, EditPopover, AddFilterPopover, } from './components/ReportBuilder/ui';
12
12
  import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
13
13
  import { convertBigQuery, convertGroupBy, convertRemoveSimpleParentheses, convertStringComparison, convertWildcardColumns, } from './components/ReportBuilder/convert';
14
- import { deepCopy, formatDateComparisonNode, getDateFilterInfo, getInTheCurrentIntervalSentence, getInTheLastIntervalSentence, getInThePreviousIntervalSentence, getPostgresBasicType, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, isTopLevelBoolean, showNodeAsRow, tryConvertDateEquality, } from './components/ReportBuilder/util';
14
+ import { deepCopy, formatDateComparisonNode, getDateFilterInfo, getInTheCurrentIntervalSentence, getInTheLastIntervalSentence, getInThePreviousIntervalSentence, getPostgresBasicType, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, isTopLevelBoolean, showNodeAsRow, tryConvertDateEquality, removeNonSelectedTableReferences, } from './components/ReportBuilder/util';
15
15
  import { getDefaultOperatorSubtrees, OPERATOR_GROUPS, } from './components/ReportBuilder/operators';
16
16
  import { hashCode } from './utils/crypto';
17
17
  import { DATE_FMT, DAY_OF_WEEK, defaultAST, defaultColumn, defaultEntry, defaultNumericComparison, defaultTable, defaultVariant, MONTH_OF_YEAR, } from './components/ReportBuilder/constants';
@@ -20,6 +20,9 @@ import { AddSortPopover, SortSentence, } from './components/ReportBuilder/AddSor
20
20
  import { PivotModal, generatePivotTable, } from './internals/ReportBuilder/PivotModal';
21
21
  import { PivotCard } from './internals/ReportBuilder/PivotList';
22
22
  import QuillTable from './components/QuillTable';
23
+ import { QuillSelectComponent } from './components/QuillSelect';
24
+ import { snakeCaseToTitleCase } from './utils/textProcessing';
25
+ import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddLimitPopover';
23
26
  /**
24
27
  * Quill Report Builder
25
28
  *
@@ -28,7 +31,7 @@ import QuillTable from './components/QuillTable';
28
31
  * they can click a button and add that report to their dashboard or export it
29
32
  * as a CSV.
30
33
  */
31
- export default function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, TextInput = QuillTextInput, Select = QuillSelect, Table = QuillTable, Popover = QuillPopover, Tabs = QuillTabs, Checkbox = MemoizedCheckbox, Sidebar = QuillSidebar, Container = CustomContainer, HandleButton = QuillHandleButton, SelectColumn = QuillSelectColumn, DraggableColumn = QuillDraggableColumn, ButtonLoadingState = QuillButtonLoadingState, TableLoadingState = QuillTableLoadingState, SidebarHeading = QuillSidebarHeading, SidebarSubHeading = QuillSidebarSubHeading, FilterPopover = QuillFilterPopover, SortPopover = QuillSortPopover, Label = MemoizedLabel, Header = MemoizedHeader, Text = MemoizedText, PivotPopover = MemoizedPopover, admin = false, hideAi = false, }) {
34
+ export default function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, TextInput = QuillTextInput, Select = QuillSelectComponent, Table = QuillTable, Popover = QuillPopover, Tabs = QuillTabs, Checkbox = MemoizedCheckbox, Sidebar = QuillSidebar, Container = CustomContainer, HandleButton = QuillHandleButton, SelectColumn = QuillSelectColumn, DraggableColumn = QuillDraggableColumn, ButtonLoadingState = QuillButtonLoadingState, TableLoadingState = QuillTableLoadingState, SidebarHeading = QuillSidebarHeading, SidebarSubHeading = QuillSidebarSubHeading, FilterPopover = QuillFilterPopover, SortPopover = QuillSortPopover, Label = MemoizedLabel, Header = MemoizedHeader, Text = MemoizedText, PivotPopover = MemoizedPopover, admin = false, hideAi = false, containerStyle, }) {
32
35
  const [aiPrompt, setAiPrompt] = useState('');
33
36
  const [errorMessage, setErrorMessage] = useState('');
34
37
  const [baseAst, setBaseAst] = useState(null);
@@ -84,7 +87,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
84
87
  return columns.map((col) => ({
85
88
  label: col,
86
89
  name: col,
87
- displayName: col,
90
+ displayName: snakeCaseToTitleCase(col),
88
91
  field: col,
89
92
  format: getPostgresBasicType(fields.find((f) => f.name === col))?.replace('number', 'whole_number') || 'string',
90
93
  fieldType: schemaTables
@@ -116,6 +119,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
116
119
  // setUniqueValues({});
117
120
  setPivot(null);
118
121
  setPivotData(null);
122
+ setRecommendedPivots([]);
119
123
  }, 0);
120
124
  };
121
125
  useEffect(() => {
@@ -243,14 +247,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
243
247
  'Content-Type': 'application/json',
244
248
  },
245
249
  body: JSON.stringify({
246
- orgId: 2,
250
+ orgId: client.customerId,
247
251
  publicKey: client.publicKey,
248
252
  query: query,
249
253
  }),
250
254
  });
251
255
  const data = await response.json();
252
256
  if (data.errorMessage) {
253
- console.error(data.errorMessage);
257
+ // console.error(data.errorMessage);
254
258
  return null;
255
259
  }
256
260
  const options = data.rows.map((r) => r[column]);
@@ -267,19 +271,36 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
267
271
  };
268
272
  const fetchSchema = async () => {
269
273
  try {
270
- const response = await fetch(`https://quill-344421.uc.r.appspot.com/schema2/${client.publicKey}`).then((res) => res.json());
274
+ const response = await fetch(`${client.queryEndpoint}`, {
275
+ method: 'POST',
276
+ headers: {
277
+ ...client.queryHeaders,
278
+ 'Content-Type': 'application/json',
279
+ },
280
+ body: JSON.stringify({
281
+ metadata: {
282
+ clientId: client.publicKey,
283
+ publicKey: client.publicKey,
284
+ task: 'schema',
285
+ removeCustomerField: true,
286
+ },
287
+ }),
288
+ });
289
+ const results = await response.json();
271
290
  // Filter out hidden columns on tables back from schema2.
272
- const tables = response?.tables;
273
- for (const table of tables) {
274
- table.columns = table.columns.filter((column) =>
275
- // Quick and dirty fix for removing org ids from response.
276
- // TODO: Fix this on the backend or something.
277
- column.isVisible && column.displayName !== 'pm_company_id');
278
- }
291
+ const tables = results.data.tables || results.data.data.tables;
279
292
  setSchemaTables(tables ?? []);
280
- setOrderedColumnNames((tables ?? [])
281
- // .filter((t: any) => t.displayName === initialTableName)
282
- .flatMap((table) => table.columns.map((c) => `${table.displayName}.${c.displayName}`)));
293
+ setOrderedColumnNames((tables ?? []).flatMap((table) => table.columns
294
+ .map((c) => `${table.name}.${c.name}`)
295
+ .sort((a, b) => {
296
+ const aIsId = a.endsWith('.id') || a.endsWith('_id');
297
+ const bIsId = b.endsWith('.id') || b.endsWith('_id');
298
+ if (aIsId && !bIsId)
299
+ return 1;
300
+ if (bIsId && !aIsId)
301
+ return -1;
302
+ return 0;
303
+ })));
283
304
  // Fetch all the unique values in parallel
284
305
  const pendingFetches = [];
285
306
  for (let table of tables ?? []) {
@@ -304,6 +325,12 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
304
325
  if (hashCode(uniqueValues) !== hashCode(newUniqueValues)) {
305
326
  setUniqueValues(newUniqueValues);
306
327
  }
328
+ if (initialTableName) {
329
+ const columnsForTable = tables
330
+ .find((t) => t.name === initialTableName)
331
+ ?.columns.map((c) => c.name);
332
+ await handleAsk(`get ${columnsForTable} from ${initialTableName}`);
333
+ }
307
334
  }
308
335
  catch (error) {
309
336
  console.error(error);
@@ -606,6 +633,9 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
606
633
  };
607
634
  // Function to handle operator changes
608
635
  const handleOperatorChange = (value, node, keyPrefix, column = null) => {
636
+ if (!keyPrefix) {
637
+ setTopLevelBinaryOperator(value);
638
+ }
609
639
  if (isPending) {
610
640
  updateActiveItem([{ path: keyPrefix + 'operator', value }], { column });
611
641
  }
@@ -703,7 +733,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
703
733
  'node.right.args.value.1.column') ??
704
734
  (node.right?.args?.value[1]?.value &&
705
735
  'node.right.args.value.1.value');
706
- return (_jsxs("div", { style: { display: 'flex', gap: 20 }, children: [_jsx(Select, { value: dateColumn, onChange: (value) => {
736
+ return (_jsxs("div", { style: { display: 'flex', gap: 20 }, children: [_jsx(Select, { theme: theme, value: dateColumn, onChange: (value) => {
707
737
  const columnType = getColumnTypeByName(value);
708
738
  if (isDateishColumnType(columnType)) {
709
739
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -720,9 +750,9 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
720
750
  handleReplaceSubtree(keyPrefix, newSubtree);
721
751
  }
722
752
  }, options: getAllPossibleColumns().map((column) => ({
723
- label: column.displayName,
753
+ label: snakeCaseToTitleCase(column.displayName),
724
754
  value: column.name,
725
- })) }), _jsx(Select, { value: dateFilterType, onChange: (value) => {
755
+ })) }), _jsx(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
726
756
  if (value === dateFilterType)
727
757
  return null;
728
758
  let newSubtree = {};
@@ -768,7 +798,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
768
798
  path: keyPrefix + intervalPath,
769
799
  },
770
800
  ]));
771
- } })), _jsx(Select, { value: intervalType, onChange: (value) => {
801
+ } })), _jsx(Select, { theme: theme, value: intervalType, onChange: (value) => {
772
802
  if (intervalPaths.length === 1) {
773
803
  handleChangeText([
774
804
  {
@@ -814,7 +844,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
814
844
  else if (isInTheLastInterval(node, client.databaseType)) {
815
845
  const { dateColumn, dateFilterType, intervalCount, intervalType } = getDateFilterInfo(node);
816
846
  const options = getAllPossibleColumns().map((column) => ({
817
- label: column.displayName,
847
+ label: snakeCaseToTitleCase(column.displayName),
818
848
  value: column.name,
819
849
  }));
820
850
  const plural = node.right.args.value[1].expr.value > 1 ? 's' : '';
@@ -823,7 +853,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
823
853
  flexDirection: 'row',
824
854
  alignItems: 'center',
825
855
  gap: 20,
826
- }, children: [_jsx("div", { children: _jsx(Select, { value: node.left.column, onChange: (value) => {
856
+ }, children: [_jsx("div", { children: _jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
827
857
  const columnType = getColumnTypeByName(value);
828
858
  if (isDateishColumnType(columnType)) {
829
859
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -839,7 +869,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
839
869
  newSubtree.left.args.value[0].column = value;
840
870
  handleReplaceSubtree(keyPrefix, newSubtree);
841
871
  }
842
- }, options: options }) }), _jsx(Select, { value: dateFilterType, onChange: (value) => {
872
+ }, options: options }) }), _jsx(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
843
873
  handleOperatorChange(value, node, keyPrefix, dateColumn);
844
874
  }, options: [
845
875
  { label: 'in the last', value: 'IN_THE_LAST' },
@@ -853,7 +883,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
853
883
  path: keyPrefix + 'right.args.value||1.expr.value',
854
884
  },
855
885
  ]);
856
- } }), _jsx("div", { children: _jsx(Select, { value: node.right.args.value[1].unit, onChange: (value) => handleChange([
886
+ } }), _jsx("div", { children: _jsx(Select, { theme: theme, value: node.right.args.value[1].unit, onChange: (value) => handleChange([
857
887
  { value, path: keyPrefix + 'right.args.value||1.unit' },
858
888
  ]), options: [
859
889
  { label: `year${plural}`, value: '* 365 DAY' },
@@ -865,7 +895,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
865
895
  else if (isTheCurrentInterval(node, client.databaseType)) {
866
896
  const { dateFilterType } = getDateFilterInfo(node);
867
897
  const options = getAllPossibleColumns().map((column) => ({
868
- label: column.displayName,
898
+ label: snakeCaseToTitleCase(column.displayName),
869
899
  value: column.name,
870
900
  }));
871
901
  return (_jsxs("div", { style: {
@@ -873,7 +903,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
873
903
  flexDirection: 'row',
874
904
  alignItems: 'center',
875
905
  gap: 20,
876
- }, children: [_jsx(Select, { value: node.left.column, onChange: (value) => {
906
+ }, children: [_jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
877
907
  const columnType = getColumnTypeByName(value);
878
908
  if (isDateishColumnType(columnType)) {
879
909
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -889,14 +919,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
889
919
  newSubtree.left.args.value[0].column = value;
890
920
  handleReplaceSubtree(keyPrefix, newSubtree);
891
921
  }
892
- }, options: options }), _jsx(Select, { value: 'IN_THE_CURRENT', onChange: (value) => {
922
+ }, options: options }), _jsx(Select, { theme: theme, value: 'IN_THE_CURRENT', onChange: (value) => {
893
923
  handleOperatorChange(value, node, keyPrefix, node.left.column);
894
924
  }, options: [
895
925
  { label: 'in the last', value: 'IN_THE_LAST' },
896
926
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
897
927
  { label: 'in the current', value: 'IN_THE_CURRENT' },
898
928
  // { label: 'equals', value: 'equals' },
899
- ] }), _jsx(Select, { value: node.left.args.value[1].column, onChange: (value) => {
929
+ ] }), _jsx(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
900
930
  handleChange([
901
931
  { value, path: 'right.args.value||1.column' },
902
932
  { value, path: 'left.args.value||1.column' },
@@ -910,7 +940,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
910
940
  }
911
941
  else if (isThePreviousInterval(node, client.databaseType)) {
912
942
  const options = getAllPossibleColumns().map((column) => ({
913
- label: column.displayName,
943
+ label: snakeCaseToTitleCase(column.displayName),
914
944
  value: column.name,
915
945
  }));
916
946
  return (_jsxs("div", { style: {
@@ -918,7 +948,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
918
948
  flexDirection: 'row',
919
949
  alignItems: 'center',
920
950
  gap: 20,
921
- }, children: [_jsx(Select, { value: node.left.column, onChange: (value) => {
951
+ }, children: [_jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
922
952
  const columnType = getColumnTypeByName(value);
923
953
  if (isDateishColumnType(columnType)) {
924
954
  // handleChange(value, keyPrefix + dateColumnPath, "text");
@@ -934,14 +964,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
934
964
  newSubtree.left.args.value[0].column = value;
935
965
  handleReplaceSubtree(keyPrefix, newSubtree);
936
966
  }
937
- }, opt: true, options: options }), _jsx(Select, { value: 'IN_THE_PREVIOUS', onChange: (value) => {
967
+ }, opt: true, options: options }), _jsx(Select, { theme: theme, value: 'IN_THE_PREVIOUS', onChange: (value) => {
938
968
  handleOperatorChange(value, node, keyPrefix, node.left.column);
939
969
  }, options: [
940
970
  { label: 'in the last', value: 'IN_THE_LAST' },
941
971
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
942
972
  { label: 'in the current', value: 'IN_THE_CURRENT' },
943
973
  // { label: 'equals', value: 'equals' },
944
- ] }), _jsx(Select, { value: node.left.args.value[1].column, onChange: (value) => {
974
+ ] }), _jsx(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
945
975
  const dayConversion = {
946
976
  YEAR: 365,
947
977
  QUARTER: 90,
@@ -971,7 +1001,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
971
1001
  }
972
1002
  else if (isColumnComparison(node)) {
973
1003
  const options = getAllPossibleColumns().map((column) => ({
974
- label: column.displayName,
1004
+ label: snakeCaseToTitleCase(column.displayName),
975
1005
  value: column.name,
976
1006
  }));
977
1007
  // grab the value of the left child of the column comparison
@@ -1025,6 +1055,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1025
1055
  gap: 12,
1026
1056
  flexDirection: 'column',
1027
1057
  width: '100%',
1058
+ padding: '6px 0px',
1028
1059
  }, children: [_jsxs("div", { style: {
1029
1060
  display: 'flex',
1030
1061
  gap: 20,
@@ -1033,7 +1064,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1033
1064
  ? 'row'
1034
1065
  : 'column',
1035
1066
  width: '100%',
1036
- }, children: [_jsx(Select, { style: { width: 'min-content' }, value: leftChildValue, onChange: (value) => {
1067
+ }, children: [_jsx(Select, { theme: theme, style: { width: 'min-content' }, value: leftChildValue, onChange: (value) => {
1037
1068
  const columnType = getColumnTypeByName(value);
1038
1069
  if (isDateishColumnType(columnType)) {
1039
1070
  handleOperatorChange('IN_THE_LAST', node, keyPrefix, value);
@@ -1048,7 +1079,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1048
1079
  newSubtree.left.args.value[0].column = value;
1049
1080
  handleReplaceSubtree(keyPrefix, newSubtree);
1050
1081
  }
1051
- }, options: options }), operatorOptions.length > 0 && (_jsx(Select, { value: node.operator, onChange: (value) => {
1082
+ }, options: options }), operatorOptions.length > 0 && (_jsx(Select, { theme: theme, value: node.operator, onChange: (value) => {
1052
1083
  handleOperatorChange(value, node, keyPrefix, leftChildValue);
1053
1084
  }, style: { width: 'min-content' }, options: operatorOptions })), node.right &&
1054
1085
  node.right.type !== 'expr_list' &&
@@ -1078,7 +1109,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1078
1109
  justifyContent: 'space-between',
1079
1110
  flexDirection: showNodeAsRow(node, formData) ? 'row' : 'column',
1080
1111
  width: '100%',
1081
- }, children: [node.left && renderNode(node.left, keyPrefix + 'left.'), _jsx(Select, { value: node.operator, onChange: (value) => {
1112
+ }, children: [node.left && renderNode(node.left, keyPrefix + 'left.'), _jsx(Select, { theme: theme, value: node.operator, onChange: (value) => {
1082
1113
  handleOperatorChange(value, node, keyPrefix);
1083
1114
  }, style: { width: `100%` }, options: [
1084
1115
  // { label: `and`, value: "AND" },
@@ -1120,10 +1151,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1120
1151
  }
1121
1152
  case 'column_ref': {
1122
1153
  const options = getAllPossibleColumns().map((column) => ({
1123
- label: column.displayName,
1154
+ label: snakeCaseToTitleCase(column.displayName),
1124
1155
  value: column.name,
1125
1156
  }));
1126
- return (_jsx(Select, { style: { width: '120px' }, value: node.column ?? options[0]?.value, onChange: (value) => {
1157
+ return (_jsx(Select, { theme: theme, style: { width: '120px' }, value: node.column ?? options[0]?.value, onChange: (value) => {
1127
1158
  handleChange([{ value, path: keyPrefix + 'column' }]);
1128
1159
  }, options: options }));
1129
1160
  }
@@ -1247,10 +1278,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1247
1278
  isInTheCurrentIntervalSentence ??
1248
1279
  isInTheLastIntervalSentence ??
1249
1280
  isInThePreviousIntervalSentence ?? (_jsxs(_Fragment, { children: [node.left &&
1250
- renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : topLevelBinaryOperator === 'OR' ? (_jsx(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: Select })) : null, node.right &&
1281
+ renderSentence(formData, node.left, keyPrefix + 'left.', false, false, isRow), isRow ? (' ' + OPS[node.operator] + ' ') : isTopLevel || topLevelBinaryOperator === 'OR' ? (_jsx(TopLevelBooleanSwitch, { node: node, keyPrefix: keyPrefix, handleOperatorChange: handleOperatorChange, Select: Select })) : null, node.right &&
1251
1282
  renderSentence(formData, node.right, keyPrefix + 'right.', false, false, isRow)] })) }));
1252
1283
  case 'column_ref':
1253
- return node.column;
1284
+ return snakeCaseToTitleCase(node.column);
1254
1285
  case 'expr_list':
1255
1286
  if (node.value.length === 1) {
1256
1287
  const subQuery = renderSentence(formData, node.value[0]);
@@ -1282,10 +1313,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1282
1313
  if (node.args.value.length < 1)
1283
1314
  return null;
1284
1315
  if (node.args.value[0].value) {
1285
- return node.args.value[0].value.replaceAll('%', '');
1316
+ return snakeCaseToTitleCase(node.args.value[0].value.replaceAll('%', ''));
1286
1317
  }
1287
1318
  if (node.args.value[0].column)
1288
- return node.args.value[0].column.replaceAll('%', '');
1319
+ return snakeCaseToTitleCase(node.args.value[0].column.replaceAll('%', ''));
1289
1320
  return null;
1290
1321
  }
1291
1322
  if (node.name.toLowerCase() === 'current_date' ||
@@ -1322,10 +1353,22 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1322
1353
  const tableNamesInQuery = baseAst.from.map((tbl) => tbl.table);
1323
1354
  return schemaTables
1324
1355
  .filter((t) => tableNamesInQuery.includes(t.displayName))
1325
- .flatMap((table) => table.columns.map((c) => ({
1356
+ .flatMap((table) => table.columns
1357
+ .map((c) => ({
1326
1358
  ...c,
1327
1359
  table: table.displayName,
1328
- })));
1360
+ }))
1361
+ .sort((a, b) => {
1362
+ const aIsId = a.name.toLowerCase() === 'id' ||
1363
+ a.name.toLowerCase().endsWith('_id');
1364
+ const bIsId = b.name.toLowerCase() === 'id' ||
1365
+ b.name.toLowerCase().endsWith('_id');
1366
+ if (aIsId && !bIsId)
1367
+ return 1;
1368
+ if (bIsId && !aIsId)
1369
+ return -1;
1370
+ return 0;
1371
+ }));
1329
1372
  };
1330
1373
  const getDateColumns = () => {
1331
1374
  const allColumns = getAllPossibleColumns();
@@ -1376,26 +1419,6 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1376
1419
  },
1377
1420
  as: null,
1378
1421
  });
1379
- const SortableItem = ({ id, label, setSelectedColumns, selectedColumns, }) => {
1380
- const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: id });
1381
- const style = {
1382
- transform: DND_CSS.Transform.toString(transform),
1383
- transition,
1384
- };
1385
- const handleSelect = () => {
1386
- setSelectedColumns((selectedColumns) => {
1387
- if (selectedColumns.includes(id)) {
1388
- return selectedColumns.filter((column) => column !== id);
1389
- }
1390
- else {
1391
- return [...selectedColumns, id];
1392
- }
1393
- });
1394
- };
1395
- return (_jsx("div", { style: { userSelect: 'none', ...style }, ref: setNodeRef, children: _jsx(SelectColumn, { selected: selectedColumns?.includes(id), setSelected: handleSelect, label: label, children: _jsx("div", { style: {
1396
- cursor: 'grab',
1397
- }, ...attributes, ...listeners, children: _jsx(HandleButton, {}) }) }) }));
1398
- };
1399
1422
  const AddConditionPopover = ({ onSave }) => {
1400
1423
  return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 2 }, children: [_jsx("h1", { style: {
1401
1424
  fontWeight: '600',
@@ -1421,13 +1444,24 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1421
1444
  body: JSON.stringify({
1422
1445
  ast: { ...baseAst, where: formData },
1423
1446
  publicKey: client.publicKey,
1424
- orgId: '2',
1447
+ orgId: client.customerId,
1425
1448
  }),
1426
1449
  });
1427
1450
  const data2 = await res2.json();
1428
1451
  if (data2.rows && data2.rows.length) {
1429
1452
  const tables = getTableNames(baseAst);
1430
1453
  const table = tables.length >= 1 ? tables[0] : initialTableName;
1454
+ const sortedFields = data2.fields.sort((a, b) => {
1455
+ const aIsId = a.name.toLowerCase() === 'id' ||
1456
+ a.name.toLowerCase().endsWith('_id');
1457
+ const bIsId = b.name.toLowerCase() === 'id' ||
1458
+ b.name.toLowerCase().endsWith('_id');
1459
+ if (aIsId && !bIsId)
1460
+ return 1;
1461
+ if (bIsId && !aIsId)
1462
+ return -1;
1463
+ return 0;
1464
+ });
1431
1465
  if (pivot) {
1432
1466
  // Do all of this to make sure we have the right unique columns when applying a pivot
1433
1467
  let uniqueFormatted = {};
@@ -1439,6 +1473,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1439
1473
  const pivotedData = generatePivotTable(pivot, data2.rows, [null, null, null], false);
1440
1474
  console.info(`%c[Pivot]: ${JSON.stringify(pivot)}`, 'color: dimgray');
1441
1475
  setPivotData(pivotedData);
1476
+ setRows(data2.rows);
1477
+ setFields(data2.fields);
1442
1478
  }
1443
1479
  else {
1444
1480
  setRows(data2.rows);
@@ -1559,8 +1595,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1559
1595
  }
1560
1596
  return false;
1561
1597
  };
1562
- const handleAsk = async () => {
1563
- if (!aiPrompt) {
1598
+ const handleAsk = async (overridePrompt = '') => {
1599
+ if (!aiPrompt && !overridePrompt) {
1564
1600
  return;
1565
1601
  }
1566
1602
  try {
@@ -1579,7 +1615,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1579
1615
  method: 'POST',
1580
1616
  headers: { 'Content-Type': 'application/json' },
1581
1617
  body: JSON.stringify({
1582
- initialQuestion: aiPrompt,
1618
+ initialQuestion: aiPrompt || overridePrompt,
1583
1619
  publicKey: client.publicKey,
1584
1620
  }),
1585
1621
  });
@@ -1616,11 +1652,21 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1616
1652
  newAst = convertBigQuery(ast);
1617
1653
  newAst = convertWildcardColumns(newAst, schemaTables); // must go before groupby
1618
1654
  ({ ast: newAst, pivot: groupByPivot } = convertGroupBy(newAst, pivot, schemaTables));
1655
+ if (groupByPivot && !groupByPivot?.valueField) {
1656
+ setErrorMessage("Error: Couldn't process your request, please re-word your prompt.");
1657
+ return;
1658
+ }
1619
1659
  newAst = convertStringComparison(newAst, client.databaseType);
1620
1660
  newAst = convertRemoveSimpleParentheses(newAst);
1661
+ const table = getTableNames(newAst)[0] ?? initialTableName;
1662
+ const tableAlias = getTableAliases(newAst)[0] ?? initialTableName;
1663
+ newAst = removeNonSelectedTableReferences(newAst, tableAlias ?? table);
1621
1664
  // newAst = convertDateComparison(newAst); // TODO
1622
1665
  ast = newAst; // so we fetch data for newAst later.
1623
- const table = getTableNames(newAst)[0] ?? initialTableName;
1666
+ setPivotRowField(groupByPivot?.rowField);
1667
+ setPivotColumnField(groupByPivot?.columnField);
1668
+ setPivotValueField(groupByPivot?.valueField);
1669
+ setPivotAggregation(groupByPivot?.aggregationType);
1624
1670
  setPivot(groupByPivot);
1625
1671
  setSelectedColumns(deepCopy(newAst).columns?.map((column) => {
1626
1672
  if (column.expr.type === 'column_ref') {
@@ -1652,7 +1698,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1652
1698
  body: JSON.stringify({
1653
1699
  ast: ast,
1654
1700
  publicKey: client.publicKey,
1655
- orgId: '2',
1701
+ orgId: client.customerId,
1656
1702
  }),
1657
1703
  });
1658
1704
  const data2 = await res2.json();
@@ -1663,6 +1709,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1663
1709
  const pivotedData = generatePivotTable(pivot, data2.rows, [null, null, null], false);
1664
1710
  console.info(`%c[Pivot]: ${JSON.stringify(groupByPivot)}`, 'color: dimgray');
1665
1711
  setPivotData(pivotedData);
1712
+ setRows(data2.rows);
1713
+ setFields(data2.fields);
1666
1714
  }
1667
1715
  else {
1668
1716
  setRows(data2.rows);
@@ -1726,7 +1774,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1726
1774
  transform: DND_CSS.Transform.toString(transform),
1727
1775
  transition,
1728
1776
  };
1729
- return (_jsx("div", { style: { ...style }, ref: setNodeRef, children: _jsx(DraggableColumn, { label: label, onDelete: onDelete, children: _jsx("div", { style: {
1777
+ return (_jsx("div", { style: { ...style }, ref: setNodeRef, children: _jsx(DraggableColumn, { label: snakeCaseToTitleCase(label), onDelete: onDelete, children: _jsx("div", { style: {
1730
1778
  cursor: 'grab',
1731
1779
  }, ...attributes, ...listeners, children: _jsx(HandleButton, {}) }) }) }));
1732
1780
  };
@@ -1787,24 +1835,17 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1787
1835
  gap: 8,
1788
1836
  }, children: [columnNamesInAst.map((name) => (_jsx(DraggableItem, { id: name, label: name, onDelete: () => handleDeleteColumn(name) }, name))), columnNamesInAst?.length > 0 && _jsx("div", { style: { height: 6 } })] }) }) }));
1789
1837
  }
1790
- const allNumericColumns = getNumericColumns().map((column) => ({
1791
- label: column.displayName,
1792
- value: column.name,
1793
- }));
1794
- const allNonNumericColumns = getNonNumericColumns().map((column) => ({
1795
- label: column.displayName,
1796
- value: column.name,
1797
- }));
1798
- const allStringColumns = getStringColumns().map((column) => ({
1799
- label: column.displayName,
1800
- value: column.name,
1801
- }));
1802
1838
  if (loading) {
1803
- return (_jsxs("div", { style: { display: 'flex', flexDirection: 'row', height: '100%' }, ref: parentRef, children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeading, { label: "Columns" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(DraggableColumns, {}), _jsx(Popover, { isOpen: openPopover === 'AddColumnPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
1839
+ return (_jsxs("div", { style: {
1840
+ display: 'flex',
1841
+ flexDirection: 'row',
1842
+ height: '100%',
1843
+ ...containerStyle,
1844
+ }, ref: parentRef, children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeading, { label: "Columns" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(DraggableColumns, {}), _jsx(Popover, { isOpen: openPopover === 'AddColumnPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
1804
1845
  if (!openPopover) {
1805
1846
  setOpenPopover('AddColumnPopover');
1806
1847
  }
1807
- }, label: 'Select columns' }), title: "Select columns", onClose: () => {
1848
+ }, label: 'Select columns' }), label: "Select columns", onClose: () => {
1808
1849
  setIsPending(false);
1809
1850
  setActiveEditItem(null);
1810
1851
  setActivePath(null);
@@ -1917,7 +1958,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1917
1958
  newAst.orderby = null;
1918
1959
  setBaseAst(newAst); // trigger refetch
1919
1960
  setPivot(pivot);
1920
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && (_jsx(PivotCard, { pivotTable: {
1961
+ }, selectPivotOnEdit: true, showTrigger: !pivot || !pivotData, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3, SecondaryButtonComponent: SecondaryButton }), pivot && pivotData && (_jsx(PivotCard, { pivotTable: {
1921
1962
  pivot: pivot,
1922
1963
  rows: pivotData?.rows || [],
1923
1964
  columns: pivotData?.columns || [],
@@ -1976,7 +2017,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1976
2017
  const newAst = { ...baseAst };
1977
2018
  newAst.orderby.splice(id, 1);
1978
2019
  setBaseAst(deepCopy(newAst));
1979
- } }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
2020
+ } }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
1980
2021
  if (!openPopover) {
1981
2022
  setOpenPopover('AddSortPopover');
1982
2023
  }
@@ -1985,12 +2026,45 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1985
2026
  setActiveEditItem(null);
1986
2027
  setActivePath(null);
1987
2028
  setOpenPopover(null);
1988
- }, children: _jsx(AddSortPopover, { columns: selectedColumns, Select: Select, Button: Button, onSave: () => { } }) })] }), _jsxs(Container, { children: [_jsxs("form", { style: {
2029
+ }, children: _jsx(AddSortPopover, { columns: selectedColumns, Select: Select, Button: Button, onSave: () => { } }) }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Limit" }), _jsx("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? (_jsx("div", { style: {
2030
+ display: 'flex',
2031
+ flexDirection: 'column',
2032
+ gap: 8,
2033
+ marginBottom: 12,
2034
+ }, children: _jsx(LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: SortPopover, EditPopover: AddLimitPopover, handleDelete: () => {
2035
+ const newAst = { ...baseAst };
2036
+ newAst.limit = null;
2037
+ setBaseAst(deepCopy(newAst));
2038
+ }, onSave: (limit) => {
2039
+ const newAst = { ...baseAst };
2040
+ newAst.limit = {
2041
+ seperator: '',
2042
+ value: [
2043
+ {
2044
+ type: 'number',
2045
+ value: limit,
2046
+ },
2047
+ ],
2048
+ };
2049
+ setOpenPopover(null);
2050
+ setBaseAst(deepCopy(newAst));
2051
+ } }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2052
+ if (!openPopover) {
2053
+ setOpenPopover('AddLimitPopover');
2054
+ }
2055
+ }, label: 'Add limit' }), title: "Limit", onClose: () => {
2056
+ setIsPending(false);
2057
+ setActiveEditItem(null);
2058
+ setActivePath(null);
2059
+ setOpenPopover(null);
2060
+ }, children: _jsx(TextInput, { value: 0, type: "number", style: { width: 120, minHeight: 32 }, onChange: (e) => { } }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { onSubmit: (event) => {
2061
+ event.preventDefault();
2062
+ }, style: {
1989
2063
  display: 'flex',
1990
2064
  flexDirection: 'row',
1991
2065
  gap: 12,
1992
2066
  padding: 1,
1993
- }, children: [_jsx(TextInput, { placeholder: "Ask a question...", type: "text", style: { width: '100%', fontSize: 14 }, value: aiPrompt }), _jsx(ButtonLoadingState, {}), baseAst && (_jsx(SecondaryButton, { onClick: clearAllState, label: "New report" }))] }), baseAst && (_jsxs(_Fragment, { children: [_jsx(TableLoadingState, {}), _jsxs("div", { style: {
2067
+ }, children: [_jsx(TextInput, { placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', type: "text", style: { width: '100%', fontSize: 14 }, value: aiPrompt }), _jsx(Button, { onClick: () => { }, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { onClick: clearAllState, label: "New report" }))] })), baseAst && (_jsxs(_Fragment, { children: [_jsx(TableLoadingState, {}), _jsxs("div", { style: {
1994
2068
  display: 'flex',
1995
2069
  flexDirection: 'row',
1996
2070
  gap: '12px',
@@ -2001,6 +2075,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2001
2075
  flexDirection: 'row',
2002
2076
  height: '100%',
2003
2077
  overflowY: 'auto',
2078
+ boxSizing: 'border-box',
2079
+ ...containerStyle,
2004
2080
  }, children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeading, { label: "Columns" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(DraggableColumns, {}), _jsx(Popover, { isOpen: openPopover === 'AddColumnPopover', title: "Select columns", trigger: _jsx(SecondaryButton, { onClick: () => {
2005
2081
  if (!openPopover) {
2006
2082
  setOpenPopover('AddColumnPopover');
@@ -2113,7 +2189,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2113
2189
  setOpenPopover(null);
2114
2190
  clearCheckboxes();
2115
2191
  }
2116
- } }) }))] }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Pivot" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(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: () => {
2192
+ } }) }))] }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Pivot" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(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: () => {
2117
2193
  setPivot(null);
2118
2194
  setPivotData(null);
2119
2195
  }, selectPivot: (pivot) => {
@@ -2121,9 +2197,13 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2121
2197
  return;
2122
2198
  const newAst = { ...baseAst };
2123
2199
  newAst.orderby = null;
2200
+ if (pivot.rowFieldType === 'date') {
2201
+ pivot['sort'] = true;
2202
+ pivot['sortDirection'] = 'ASC';
2203
+ }
2124
2204
  setBaseAst(newAst); // trigger refetch
2125
2205
  setPivot(pivot);
2126
- }, selectPivotOnEdit: true, showTrigger: !pivot, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && (_jsx(PivotCard, { pivotTable: {
2206
+ }, selectPivotOnEdit: true, showTrigger: !pivot || !pivotData, theme: theme, LabelComponent: Label, HeaderComponent: Header, dateRange: [null, null, null], recommendPivotCount: 3 }), pivot && pivotData && (_jsx(PivotCard, { pivotTable: {
2127
2207
  pivot: pivot,
2128
2208
  rows: pivotData?.rows || [],
2129
2209
  columns: pivotData?.columns || [],
@@ -2224,27 +2304,77 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2224
2304
  setActivePath(null);
2225
2305
  setOpenPopover(null);
2226
2306
  setBaseAst(deepCopy(newAst));
2227
- } }) })] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { onSubmit: handleAsk, style: {
2307
+ } }) }), _jsx("div", { style: { height: 28, width: '100%' } }), _jsx(SidebarHeading, { label: "Limit" }), _jsx("div", { style: { height: 4, width: '100%' } }), baseAst && baseAst.limit ? (_jsx("div", { style: {
2308
+ display: 'flex',
2309
+ flexDirection: 'column',
2310
+ gap: 8,
2311
+ marginBottom: 12,
2312
+ }, children: _jsx(LimitSentence, { limit: baseAst.limit, setOpenPopover: setOpenPopover, LimitPopover: SortPopover, EditPopover: AddLimitPopover, handleDelete: () => {
2313
+ const newAst = { ...baseAst };
2314
+ newAst.limit = null;
2315
+ setBaseAst(deepCopy(newAst));
2316
+ }, onSave: (limit) => {
2317
+ const newAst = { ...baseAst };
2318
+ newAst.limit = {
2319
+ seperator: '',
2320
+ value: [
2321
+ {
2322
+ type: 'number',
2323
+ value: limit,
2324
+ },
2325
+ ],
2326
+ };
2327
+ setOpenPopover(null);
2328
+ setBaseAst(deepCopy(newAst));
2329
+ } }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2330
+ if (!baseAst) {
2331
+ return;
2332
+ }
2333
+ if (!openPopover) {
2334
+ setOpenPopover('AddLimitPopover');
2335
+ }
2336
+ }, label: 'Add limit' }), title: "Limit", onClose: () => {
2337
+ setIsPending(false);
2338
+ setActiveEditItem(null);
2339
+ setActivePath(null);
2340
+ setOpenPopover(null);
2341
+ }, children: _jsx(AddLimitPopover, { TextInput: TextInput, onSave: (limit) => {
2342
+ const newAst = { ...baseAst };
2343
+ newAst.limit = {
2344
+ seperator: '',
2345
+ value: [
2346
+ {
2347
+ type: 'number',
2348
+ value: Number(limit),
2349
+ },
2350
+ ],
2351
+ };
2352
+ setOpenPopover(null);
2353
+ setBaseAst(deepCopy(newAst));
2354
+ } }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { onSubmit: (event) => {
2355
+ event.preventDefault();
2356
+ handleAsk();
2357
+ }, style: {
2228
2358
  display: 'flex',
2229
2359
  flexDirection: 'row',
2230
2360
  gap: 12,
2231
2361
  padding: 1,
2232
- }, children: [_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...' }), _jsx(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && (_jsxs(_Fragment, { children: [loading && errorMessage.length === 0 ? (_jsx(TableLoadingState, {})) : (_jsx(Table, { rows: applyFormatting({
2233
- rows: pivotData?.rows || rows,
2234
- fields: pivotData?.fields || fields,
2235
- }, baseAst?.columns ?? []), columns: pivotData?.columns ||
2236
- enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
2237
- return { label: c, field: c };
2238
- }), error: errorMessage, rowsPerPage: 20 })), _jsxs("div", { style: {
2239
- display: 'flex',
2240
- flexDirection: 'row',
2241
- gap: '12px',
2242
- }, children: [errorMessage && (_jsx("div", { style: {
2243
- color: 'red',
2244
- fontSize: 14,
2245
- padding: '12px',
2246
- whiteSpace: 'nowrap',
2247
- }, children: errorMessage })), _jsx("div", { style: { width: '100%' } }), _jsx(SecondaryButton, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), _jsx(Button, { onClick: () => {
2362
+ }, children: [_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...' }), _jsx(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && (_jsx(_Fragment, { children: loading && errorMessage.length === 0 ? (_jsx(TableLoadingState, {})) : (_jsx(Table, { rows: applyFormatting({
2363
+ rows: pivotData?.rows || rows,
2364
+ fields: pivotData?.fields || fields,
2365
+ }, baseAst?.columns ?? []), columns: pivotData?.columns ||
2366
+ enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
2367
+ return { label: snakeCaseToTitleCase(c), field: c };
2368
+ }), error: errorMessage, rowsPerPage: 20 })) })), _jsxs("div", { style: {
2369
+ display: 'flex',
2370
+ flexDirection: 'row',
2371
+ gap: '12px',
2372
+ }, children: [errorMessage && (_jsx("div", { style: {
2373
+ color: 'red',
2374
+ fontSize: 14,
2375
+ padding: '12px',
2376
+ whiteSpace: 'nowrap',
2377
+ }, children: errorMessage })), _jsx("div", { style: { width: '100%' } }), baseAst && (_jsxs(_Fragment, { children: [_jsx(SecondaryButton, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), _jsx(Button, { onClick: () => {
2248
2378
  setIsChartBuilderOpen(true);
2249
- }, label: 'Add to dashboard' })] })] }))] }), _jsx("style", { children: `body{margin:0;}` }), _jsx(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 })] }));
2379
+ }, label: 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` }), _jsx(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 })] }));
2250
2380
  }