@quillsql/react 2.11.21 → 2.11.24

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