@quillsql/react 2.11.14 → 2.11.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/cjs/ChartBuilder.d.ts +7 -4
  2. package/dist/cjs/ChartBuilder.d.ts.map +1 -1
  3. package/dist/cjs/ChartBuilder.js +11 -10
  4. package/dist/cjs/Dashboard.d.ts +1 -0
  5. package/dist/cjs/Dashboard.d.ts.map +1 -1
  6. package/dist/cjs/Dashboard.js +3 -3
  7. package/dist/cjs/ReportBuilder.d.ts +18 -10
  8. package/dist/cjs/ReportBuilder.d.ts.map +1 -1
  9. package/dist/cjs/ReportBuilder.js +134 -72
  10. package/dist/cjs/SQLEditor.d.ts +1 -7
  11. package/dist/cjs/SQLEditor.d.ts.map +1 -1
  12. package/dist/cjs/SQLEditor.js +19 -4
  13. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts +24 -1
  14. package/dist/cjs/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  15. package/dist/cjs/components/ReportBuilder/AddColumnPopover.js +26 -9
  16. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts +13 -2
  17. package/dist/cjs/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  18. package/dist/cjs/components/ReportBuilder/AddLimitPopover.js +18 -8
  19. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts +2 -2
  20. package/dist/cjs/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  21. package/dist/cjs/components/ReportBuilder/AddSortPopover.js +8 -8
  22. package/dist/cjs/components/ReportBuilder/ui.d.ts +0 -1
  23. package/dist/cjs/components/ReportBuilder/ui.d.ts.map +1 -1
  24. package/dist/cjs/components/ReportBuilder/ui.js +31 -24
  25. package/dist/cjs/components/ReportBuilder/util.d.ts +1 -0
  26. package/dist/cjs/components/ReportBuilder/util.d.ts.map +1 -1
  27. package/dist/cjs/components/ReportBuilder/util.js +20 -1
  28. package/dist/cjs/components/UiComponents.d.ts +15 -14
  29. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  30. package/dist/cjs/components/UiComponents.js +26 -16
  31. package/dist/cjs/utils/width.d.ts +12 -0
  32. package/dist/cjs/utils/width.d.ts.map +1 -0
  33. package/dist/cjs/utils/width.js +25 -0
  34. package/dist/esm/ChartBuilder.d.ts +7 -4
  35. package/dist/esm/ChartBuilder.d.ts.map +1 -1
  36. package/dist/esm/ChartBuilder.js +11 -10
  37. package/dist/esm/Dashboard.d.ts +1 -0
  38. package/dist/esm/Dashboard.d.ts.map +1 -1
  39. package/dist/esm/Dashboard.js +3 -3
  40. package/dist/esm/ReportBuilder.d.ts +18 -10
  41. package/dist/esm/ReportBuilder.d.ts.map +1 -1
  42. package/dist/esm/ReportBuilder.js +136 -74
  43. package/dist/esm/SQLEditor.d.ts +1 -7
  44. package/dist/esm/SQLEditor.d.ts.map +1 -1
  45. package/dist/esm/SQLEditor.js +19 -4
  46. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts +24 -1
  47. package/dist/esm/components/ReportBuilder/AddColumnPopover.d.ts.map +1 -1
  48. package/dist/esm/components/ReportBuilder/AddColumnPopover.js +27 -10
  49. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts +13 -2
  50. package/dist/esm/components/ReportBuilder/AddLimitPopover.d.ts.map +1 -1
  51. package/dist/esm/components/ReportBuilder/AddLimitPopover.js +19 -9
  52. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts +2 -2
  53. package/dist/esm/components/ReportBuilder/AddSortPopover.d.ts.map +1 -1
  54. package/dist/esm/components/ReportBuilder/AddSortPopover.js +8 -8
  55. package/dist/esm/components/ReportBuilder/ui.d.ts +0 -1
  56. package/dist/esm/components/ReportBuilder/ui.d.ts.map +1 -1
  57. package/dist/esm/components/ReportBuilder/ui.js +31 -23
  58. package/dist/esm/components/ReportBuilder/util.d.ts +1 -0
  59. package/dist/esm/components/ReportBuilder/util.d.ts.map +1 -1
  60. package/dist/esm/components/ReportBuilder/util.js +18 -0
  61. package/dist/esm/components/UiComponents.d.ts +15 -14
  62. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  63. package/dist/esm/components/UiComponents.js +26 -16
  64. package/dist/esm/utils/width.d.ts +12 -0
  65. package/dist/esm/utils/width.d.ts.map +1 -0
  66. package/dist/esm/utils/width.js +21 -0
  67. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useContext, useEffect, useRef, useState, } from 'react';
3
- import { MemoizedButton, MemoizedCheckbox, MemoizedHeader, MemoizedLabel, MemoizedPopover, MemoizedSecondaryButton, MemoizedText, } from './components/UiComponents';
3
+ import { MemoizedButton, MemoizedCheckbox, MemoizedDeleteButton, MemoizedHeader, MemoizedLabel, MemoizedPopover, MemoizedSecondaryButton, MemoizedText, } from './components/UiComponents';
4
4
  import { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
5
5
  import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
6
6
  import { CSS as DND_CSS } from '@dnd-kit/utilities';
@@ -8,7 +8,8 @@ import { getQuarter } from 'date-fns';
8
8
  import { ClientContext, ThemeContext } from './Context';
9
9
  import { getTableAliases, getTableNames, isDateishColumnType, isNumericColumnType, isTextColumnType, } from './components/ReportBuilder/ast';
10
10
  import { ChartBuilderWithModal } from './ChartBuilder';
11
- import { QuillPopover, QuillTabs, QuillTextInput, QuillSidebar, CustomContainer, QuillHandleButton, QuillSelectColumn, QuillDraggableColumn, QuillButtonLoadingState, QuillTableLoadingState, QuillSidebarHeading, QuillSidebarSubHeading, QuillFilterPopover, QuillSortPopover, DEFAULT_TAB_OPTIONS, TagWrapper, EditPopover, AddFilterPopover, } from './components/ReportBuilder/ui';
11
+ import { QuillTextInput } from './components/UiComponents';
12
+ import { QuillPopover, QuillTabs, QuillSidebar, CustomContainer, QuillHandleButton, QuillSelectColumn, QuillDraggableColumn, QuillButtonLoadingState, QuillTableLoadingState, QuillSidebarHeading, QuillSidebarSubHeading, QuillFilterPopover, QuillSortPopover, DEFAULT_TAB_OPTIONS, TagWrapper, EditPopover, AddFilterPopover, } from './components/ReportBuilder/ui';
12
13
  import { generateCurrentPeriodPostgres, generateEqualsPostgres, generateLastNPeriodsPostgres, generatePreviousPeriodPostgres, } from './components/ReportBuilder/postgres';
13
14
  import { convertBigQuery, convertGroupBy, convertRemoveSimpleParentheses, convertStringComparison, convertWildcardColumns, } from './components/ReportBuilder/convert';
14
15
  import { deepCopy, formatDateComparisonNode, getDateFilterInfo, getInTheCurrentIntervalSentence, getInTheLastIntervalSentence, getInThePreviousIntervalSentence, getPostgresBasicType, isColumnComparison, isDateTruncEquals, isInTheLastInterval, isNodeEmptyCollection, isTheCurrentInterval, isThePreviousInterval, isTopLevelBoolean, showNodeAsRow, tryConvertDateEquality, removeNonSelectedTableReferences, } from './components/ReportBuilder/util';
@@ -23,6 +24,7 @@ import QuillTable from './components/QuillTable';
23
24
  import { QuillSelectComponent } from './components/QuillSelect';
24
25
  import { snakeCaseToTitleCase } from './utils/textProcessing';
25
26
  import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddLimitPopover';
27
+ import { updateFirstChildWidth } from './utils/width';
26
28
  /**
27
29
  * Quill Report Builder
28
30
  *
@@ -31,7 +33,7 @@ import { AddLimitPopover, LimitSentence, } from './components/ReportBuilder/AddL
31
33
  * they can click a button and add that report to their dashboard or export it
32
34
  * as a CSV.
33
35
  */
34
- export default function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, TextInput = QuillTextInput, Select = QuillSelectComponent, Table = QuillTable, Popover = QuillPopover, Tabs = QuillTabs, Checkbox = MemoizedCheckbox, Sidebar = QuillSidebar, Container = CustomContainer, HandleButton = QuillHandleButton, SelectColumn = QuillSelectColumn, DraggableColumn = QuillDraggableColumn, ButtonLoadingState = QuillButtonLoadingState, TableLoadingState = QuillTableLoadingState, SidebarHeading = QuillSidebarHeading, SidebarSubHeading = QuillSidebarSubHeading, FilterPopover = QuillFilterPopover, SortPopover = QuillSortPopover, Label = MemoizedLabel, Header = MemoizedHeader, Text = MemoizedText, PivotPopover = MemoizedPopover, admin = false, hideAi = false, containerStyle, }) {
36
+ export default function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = MemoizedButton, SecondaryButton = MemoizedSecondaryButton, DeleteButton = MemoizedDeleteButton, TextInput = QuillTextInput, Select = QuillSelectComponent, Table = QuillTable, Popover = QuillPopover, Tabs = QuillTabs, Checkbox = MemoizedCheckbox, Sidebar = QuillSidebar, Container = CustomContainer, HandleButton = QuillHandleButton, SelectColumn = QuillSelectColumn, DraggableColumn = QuillDraggableColumn, ButtonLoadingState = QuillButtonLoadingState, TableLoadingState = QuillTableLoadingState, SidebarHeading = QuillSidebarHeading, SidebarSubHeading = QuillSidebarSubHeading, FilterPopover = QuillFilterPopover, SortPopover = QuillSortPopover, Label = MemoizedLabel, Header = MemoizedHeader, Text = MemoizedText, PivotPopover = MemoizedPopover, admin = false, hideAi = false, containerStyle, }) {
35
37
  const [aiPrompt, setAiPrompt] = useState('');
36
38
  const [errorMessage, setErrorMessage] = useState('');
37
39
  const [baseAst, setBaseAst] = useState(null);
@@ -44,6 +46,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
44
46
  const [activePath, setActivePath] = useState(null);
45
47
  const [openPopover, setOpenPopover] = useState(null);
46
48
  const [loading, setLoading] = useState(false);
49
+ const [loadingSchema, setLoadingSchema] = useState(false);
47
50
  const [isChartBuilderOpen, setIsChartBuilderOpen] = useState(false);
48
51
  const [isPending, setIsPending] = useState(false);
49
52
  const [isCopying, setIsCopying] = useState(false);
@@ -63,6 +66,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
63
66
  const [initialLoad, setInitialLoad] = useState(true);
64
67
  const [currentTable, setCurrentTable] = useState(initialTableName || '');
65
68
  const parentRef = useRef(null);
69
+ const askAIContainerRef = useRef(null);
70
+ const askAILoadingContainerRef = useRef(null);
71
+ const [askAIInputWidth, setAskAIInputWidth] = useState(200);
72
+ const [askAILoadingContainerWidth, setAskAILoadingContainerWidth] = useState(200);
66
73
  const [theme] = useContext(ThemeContext);
67
74
  const [pivotRowField, setPivotRowField] = useState(undefined);
68
75
  const [pivotColumnField, setPivotColumnField] = useState(undefined);
@@ -70,6 +77,19 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
70
77
  const [pivotAggregation, setPivotAggregation] = useState(undefined);
71
78
  // eslint-disable-next-line no-unused-vars
72
79
  const [client, _setClient] = useContext(ClientContext);
80
+ useEffect(() => {
81
+ // Since the TextInput component takes a required numeric width parameter,
82
+ // we dynamically calculate the width of this component here.
83
+ function handleResize() {
84
+ updateFirstChildWidth(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
85
+ updateFirstChildWidth(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
86
+ }
87
+ handleResize();
88
+ window.addEventListener('resize', handleResize);
89
+ return () => {
90
+ window.removeEventListener('resize', handleResize);
91
+ };
92
+ }, [baseAst, loading]);
73
93
  const enforceOrderOnColumns = (columnNames) => {
74
94
  if (pivot) {
75
95
  const rowName = pivot.rowField;
@@ -257,6 +277,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
257
277
  useEffect(() => {
258
278
  const fetchSchema = async () => {
259
279
  try {
280
+ setLoadingSchema(true);
260
281
  const response = await fetch(`${client.queryEndpoint}`, {
261
282
  method: 'POST',
262
283
  headers: {
@@ -296,6 +317,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
296
317
  ?.columns.map((c) => c.name);
297
318
  await handleAsk(`get ${columnsForTable} from ${initialTableName}`);
298
319
  }
320
+ setLoadingSchema(false);
299
321
  }
300
322
  catch (error) {
301
323
  console.error(error);
@@ -711,7 +733,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
711
733
  // see onChange callback handleChange
712
734
  // eslint-disable-next-line no-unused-vars
713
735
  dateColumnPath, dateFilterType, intervalCount, intervalType, intervalPaths, } = getDateFilterInfo(node);
714
- const isPlural = intervalCount && intervalCount > 1 ? 's' : '';
736
+ const isPlural = intervalCount !== 1 ? 's' : '';
715
737
  // Pull off the string literal date for "equals" comparisons
716
738
  const rawDateStringEquals = node.right?.value ??
717
739
  node.right?.args?.value[1]?.column ??
@@ -778,11 +800,15 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
778
800
  { label: 'in the previous', value: 'in the previous' },
779
801
  { label: 'in the current', value: 'in the current' },
780
802
  { label: 'equals', value: 'equals' },
781
- ] }), !['in the current', 'equals'].includes(dateFilterType) && (_jsx(TextInput, { value: intervalCount, type: "number", style: { width: '70px' }, onChange: (e) => {
782
- const isPluralNow = e.target.value > 1 ? 's' : '';
803
+ ] }), !['in the current', 'equals'].includes(dateFilterType) && (_jsx(TextInput, { id: "date_filter_interval_count", value: intervalCount, width: 70, onChange: (e) => {
804
+ if (Number.isNaN(parseFloat(e.target.value || '0'))) {
805
+ alert('Please input a number.');
806
+ return;
807
+ }
808
+ const isPluralNow = parseFloat(e.target.value || '0') !== 1 ? 's' : '';
783
809
  intervalPaths.forEach((intervalPath) => handleChangeText([
784
810
  {
785
- value: `${e.target.value} ${intervalType}${isPluralNow}`,
811
+ value: `${e.target.value || 0} ${intervalType}${isPluralNow}`,
786
812
  path: keyPrefix + intervalPath,
787
813
  },
788
814
  ]));
@@ -820,7 +846,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
820
846
  { label: `week${isPlural}`, value: 'week' },
821
847
  { label: `day${isPlural}`, value: 'day' },
822
848
  { label: `hour${isPlural}`, value: 'hour' },
823
- ] }), dateFilterType === 'equals' && (_jsx(TextInput, { value: rawDateStringEquals, type: "text", style: { width: '120px' }, onChange: (e) => {
849
+ ] }), dateFilterType === 'equals' && (_jsx(TextInput, { id: "date_filter_equals_raw_date", value: rawDateStringEquals, width: 120, onChange: (e) => {
824
850
  handleChangeText([
825
851
  {
826
852
  value: e.target.value,
@@ -835,36 +861,38 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
835
861
  label: snakeCaseToTitleCase(column.displayName),
836
862
  value: column.name,
837
863
  }));
838
- const plural = node.right.args.value[1].expr.value > 1 ? 's' : '';
864
+ const plural = node.right.args.value[1].expr.value !== 1 ? 's' : '';
839
865
  return (_jsxs("div", { style: {
840
866
  display: 'flex',
841
867
  flexDirection: 'row',
842
868
  alignItems: 'center',
843
869
  gap: 20,
844
- }, children: [_jsx("div", { children: _jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
845
- const columnType = getColumnTypeByName(value);
846
- if (isDateishColumnType(columnType)) {
847
- // handleChange(value, keyPrefix + dateColumnPath, "text");
848
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, value);
849
- }
850
- else if (isNumericColumnType(columnType)) {
851
- const newSubtree = deepCopy(defaultNumericComparison);
852
- newSubtree.left.column = value;
853
- handleReplaceSubtree(keyPrefix, newSubtree);
854
- }
855
- else {
856
- const newSubtree = deepCopy(defaultEntry);
857
- newSubtree.left.args.value[0].column = value;
858
- handleReplaceSubtree(keyPrefix, newSubtree);
859
- }
860
- }, options: options }) }), _jsx(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
870
+ }, children: [_jsx(Select, { theme: theme, value: node.left.column, onChange: (value) => {
871
+ const columnType = getColumnTypeByName(value);
872
+ if (isDateishColumnType(columnType)) {
873
+ // handleChange(value, keyPrefix + dateColumnPath, "text");
874
+ handleOperatorChange('IN_THE_LAST', node, keyPrefix, value);
875
+ }
876
+ else if (isNumericColumnType(columnType)) {
877
+ const newSubtree = deepCopy(defaultNumericComparison);
878
+ newSubtree.left.column = value;
879
+ handleReplaceSubtree(keyPrefix, newSubtree);
880
+ }
881
+ else {
882
+ const newSubtree = deepCopy(defaultEntry);
883
+ newSubtree.left.args.value[0].column = value;
884
+ handleReplaceSubtree(keyPrefix, newSubtree);
885
+ }
886
+ }, options: options }), _jsx(Select, { theme: theme, value: 'IN_THE_LAST', onChange: (value) => {
861
887
  handleOperatorChange(value, node, keyPrefix, dateColumn);
862
888
  }, options: [
863
889
  { label: 'in the last', value: 'IN_THE_LAST' },
864
890
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
865
891
  { label: 'in the current', value: 'IN_THE_CURRENT' },
892
+ { label: 'is not null', value: 'IS NOT' },
893
+ { label: 'is null', value: 'IS' },
866
894
  // { label: 'equals', value: 'equals' },
867
- ] }), _jsx(TextInput, { defaultValue: node.right.args.value[1].expr.value, type: "number", style: { width: '120px', height: '42px' }, min: 0, onBlur: (e) => {
895
+ ] }), _jsx(TextInput, { id: 'date_window_interval_count', value: node.right.args.value[1].expr.value, width: 120, onChange: (e) => {
868
896
  handleChange([
869
897
  {
870
898
  value: e.target.value,
@@ -913,6 +941,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
913
941
  { label: 'in the last', value: 'IN_THE_LAST' },
914
942
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
915
943
  { label: 'in the current', value: 'IN_THE_CURRENT' },
944
+ { label: 'is not null', value: 'IS NOT' },
945
+ { label: 'is null', value: 'IS' },
916
946
  // { label: 'equals', value: 'equals' },
917
947
  ] }), _jsx(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
918
948
  handleChange([
@@ -952,12 +982,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
952
982
  newSubtree.left.args.value[0].column = value;
953
983
  handleReplaceSubtree(keyPrefix, newSubtree);
954
984
  }
955
- }, opt: true, options: options }), _jsx(Select, { theme: theme, value: 'IN_THE_PREVIOUS', onChange: (value) => {
985
+ }, options: options }), _jsx(Select, { theme: theme, value: 'IN_THE_PREVIOUS', onChange: (value) => {
956
986
  handleOperatorChange(value, node, keyPrefix, node.left.column);
957
987
  }, options: [
958
988
  { label: 'in the last', value: 'IN_THE_LAST' },
959
989
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
960
990
  { label: 'in the current', value: 'IN_THE_CURRENT' },
991
+ { label: 'is not null', value: 'IS NOT' },
992
+ { label: 'is null', value: 'IS' },
961
993
  // { label: 'equals', value: 'equals' },
962
994
  ] }), _jsx(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
963
995
  const dayConversion = {
@@ -1001,7 +1033,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1001
1033
  const tables = getTableNames(baseAst);
1002
1034
  const table = tables.length === 1 ? tables[0] : initialTableName;
1003
1035
  const columnType = column?.fieldType;
1004
- const operatorOptions = [
1036
+ let operatorOptions = [
1005
1037
  ...(isNumericColumnType(columnType)
1006
1038
  ? [
1007
1039
  { label: 'equal to', value: '=' },
@@ -1038,6 +1070,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1038
1070
  ]
1039
1071
  : []),
1040
1072
  ];
1073
+ if (client.databaseType === 'BigQuery' &&
1074
+ isDateishColumnType(columnType)) {
1075
+ operatorOptions = operatorOptions.filter((option) => option.value !== 'equals');
1076
+ }
1041
1077
  return (_jsxs("div", { style: {
1042
1078
  display: 'flex',
1043
1079
  gap: 12,
@@ -1150,11 +1186,9 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1150
1186
  const len = node.value.length;
1151
1187
  return (_jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: 12 }, children: [node.value.map((elem, index) => {
1152
1188
  if (elem.value) {
1153
- return (_jsx(TextInput, { type: elem.type === 'number' ? 'number' : 'text', defaultValue: elem.value, onBlur: (e) => handleChange([
1189
+ return (_jsx(TextInput, { id: `expr_list_${index}`, width: 200, value: elem.value, onChange: (e) => handleChange([
1154
1190
  {
1155
- value: elem.type === 'number'
1156
- ? parseFloat(e.target.value)
1157
- : e.target.value,
1191
+ value: e.target.value,
1158
1192
  path: keyPrefix + `value.${index}.`,
1159
1193
  },
1160
1194
  ]) }, `input_${index}`));
@@ -1164,23 +1198,19 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1164
1198
  }
1165
1199
  case 'double_quote_string':
1166
1200
  case 'single_quote_string':
1167
- return (_jsx(TextInput, { type: "text", defaultValue: node.value.replaceAll('%', ''), style: { width: '120px' }, onBlur: (e) => handleChange([
1201
+ return (_jsx(TextInput, { id: 'quoted_string', value: node.value.replaceAll('%', ''), width: 120, onChange: (e) => handleChange([
1168
1202
  {
1169
- value: node.type === 'number'
1170
- ? parseFloat(e.target.value)
1171
- : e.target.value,
1203
+ value: e.target.value,
1172
1204
  path: keyPrefix + 'value',
1173
1205
  },
1174
1206
  ]) }));
1175
1207
  case 'null':
1176
1208
  return _jsx("div", {});
1177
1209
  case 'number':
1178
- return (_jsx(TextInput, { defaultValue: node.value, type: "number", style: { width: '120px' }, onBlur: (e) => {
1210
+ return (_jsx(TextInput, { id: "quill_number_input", value: node.value, width: 120, onChange: (e) => {
1179
1211
  handleChange([
1180
1212
  {
1181
- value: node.type === 'number'
1182
- ? parseFloat(e.target.value)
1183
- : e.target.value,
1213
+ value: e.target.value,
1184
1214
  path: keyPrefix + 'value',
1185
1215
  },
1186
1216
  ]);
@@ -1207,6 +1237,22 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1207
1237
  return null;
1208
1238
  }
1209
1239
  };
1240
+ const isValidPivot = (fields) => {
1241
+ let validPivot = true;
1242
+ if (pivot.rowField &&
1243
+ !fields.find((field) => field.name === pivot.rowField)) {
1244
+ validPivot = false;
1245
+ }
1246
+ if (pivot.valueField &&
1247
+ !fields.find((field) => field.name === pivot.valueField)) {
1248
+ validPivot = false;
1249
+ }
1250
+ if (pivot.columnField &&
1251
+ !fields.find((field) => field.name === pivot.columnField)) {
1252
+ validPivot = false;
1253
+ }
1254
+ return validPivot;
1255
+ };
1210
1256
  const renderSentence = (formData, node, keyPrefix = '',
1211
1257
  // @depreciated TODO: remove next update
1212
1258
  // eslint-disable-next-line no-unused-vars
@@ -1410,26 +1456,24 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1410
1456
  orgId: client.customerId,
1411
1457
  }),
1412
1458
  });
1459
+ const tables = getTableNames(baseAst);
1460
+ const table = tables.length >= 1 ? tables[0] : initialTableName;
1461
+ if (table !== currentTable) {
1462
+ await getDistinctValues(table);
1463
+ setCurrentTable(table);
1464
+ }
1413
1465
  const data2 = await res2.json();
1414
1466
  if (data2.rows && data2.rows.length) {
1415
1467
  const tables = getTableNames(baseAst);
1416
- const table = tables.length >= 1 ? tables[0] : initialTableName;
1417
- if (table !== currentTable) {
1418
- getDistinctValues(table);
1419
- setCurrentTable(table);
1420
- }
1421
- const sortedFields = data2.fields.sort((a, b) => {
1422
- const aIsId = a.name.toLowerCase() === 'id' ||
1423
- a.name.toLowerCase().endsWith('_id');
1424
- const bIsId = b.name.toLowerCase() === 'id' ||
1425
- b.name.toLowerCase().endsWith('_id');
1426
- if (aIsId && !bIsId)
1427
- return 1;
1428
- if (bIsId && !aIsId)
1429
- return -1;
1430
- return 0;
1431
- });
1432
1468
  if (pivot) {
1469
+ // check if any of the pivot fields aren't in the data2.fields array
1470
+ if (!isValidPivot(data2.fields)) {
1471
+ setPivot(null);
1472
+ setPivotData(null);
1473
+ setRows(data2.rows);
1474
+ setFields(data2.fields);
1475
+ return;
1476
+ }
1433
1477
  // Do all of this to make sure we have the right unique columns when applying a pivot
1434
1478
  let uniqueFormatted = {};
1435
1479
  const uniqueRecords = Array.from(new Set(data2.rows.map((row) => row[pivot.columnField]))).reduce((acc, curr) => {
@@ -1658,7 +1702,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1658
1702
  // newAst = convertDateComparison(newAst); // TODO
1659
1703
  ast = newAst; // so we fetch data for newAst later.
1660
1704
  if (table !== currentTable) {
1661
- getDistinctValues(table);
1705
+ await getDistinctValues(table);
1662
1706
  setCurrentTable(table);
1663
1707
  }
1664
1708
  setPivotRowField(groupByPivot?.rowField);
@@ -1847,6 +1891,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1847
1891
  height: '100%',
1848
1892
  ...containerStyle,
1849
1893
  }, ref: parentRef, children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeading, { label: "Columns" }), _jsx("div", { style: { height: 4, width: '100%' } }), _jsx(DraggableColumns, {}), _jsx(Popover, { isOpen: openPopover === 'AddColumnPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
1894
+ if (loadingSchema)
1895
+ return;
1850
1896
  if (!openPopover) {
1851
1897
  setOpenPopover('AddColumnPopover');
1852
1898
  }
@@ -1873,7 +1919,9 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
1873
1919
  gap: 2.5,
1874
1920
  alignItems: 'flex-start',
1875
1921
  }, children: [_jsx(Popover, { isOpen: openPopover === 'AddFilterPopover', title: 'Add filter', trigger: _jsx(SecondaryButton, { onClick: () => {
1876
- if (!selectedColumns || selectedColumns.length === 0) {
1922
+ if (!selectedColumns ||
1923
+ selectedColumns.length === 0 ||
1924
+ loading) {
1877
1925
  return;
1878
1926
  }
1879
1927
  if (!openPopover) {
@@ -2010,7 +2058,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2010
2058
  if (!pivot) {
2011
2059
  fetchSqlQuery(baseAst);
2012
2060
  }
2013
- } }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && (_jsx("div", { style: {
2061
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && (_jsx("div", { style: {
2014
2062
  display: 'flex',
2015
2063
  flexDirection: 'column',
2016
2064
  gap: 8,
@@ -2044,7 +2092,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2044
2092
  if (!pivot) {
2045
2093
  fetchSqlQuery(newAst);
2046
2094
  }
2047
- } }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2095
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2096
+ if (!selectedColumns || selectedColumns.length === 0) {
2097
+ return;
2098
+ }
2048
2099
  if (!openPopover) {
2049
2100
  setOpenPopover('AddSortPopover');
2050
2101
  }
@@ -2077,7 +2128,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2077
2128
  setOpenPopover(null);
2078
2129
  setBaseAst(deepCopy(newAst));
2079
2130
  fetchSqlQuery(newAst);
2080
- } }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2131
+ }, TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2081
2132
  if (!openPopover) {
2082
2133
  setOpenPopover('AddLimitPopover');
2083
2134
  }
@@ -2086,14 +2137,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2086
2137
  setActiveEditItem(null);
2087
2138
  setActivePath(null);
2088
2139
  setOpenPopover(null);
2089
- }, children: _jsx(TextInput, { value: 0, type: "number", style: { width: 120, minHeight: 32 }, onChange: (e) => { } }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { onSubmit: (event) => {
2140
+ }, children: _jsx(TextInput, { id: "loading_input_limit", value: 0, width: 120, onChange: () => { } }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { ref: askAILoadingContainerRef, onSubmit: (event) => {
2090
2141
  event.preventDefault();
2091
2142
  }, style: {
2092
2143
  display: 'flex',
2093
2144
  flexDirection: 'row',
2094
2145
  gap: 12,
2095
2146
  padding: 1,
2096
- }, children: [_jsx(TextInput, { placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', type: "text", style: { width: '100%', fontSize: 14 }, value: aiPrompt }), _jsx(Button, { onClick: () => { }, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { onClick: clearAllState, label: "New report" }))] })), _jsxs(_Fragment, { children: [_jsx(TableLoadingState, {}), _jsxs("div", { style: {
2147
+ }, children: [_jsx(TextInput, { id: "ask_ai_loading_bar", placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', width: askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), _jsx(Button, { onClick: () => { }, label: "Ask AI" }), baseAst && (_jsx(SecondaryButton, { onClick: clearAllState, label: "New report" }))] })), _jsxs(_Fragment, { children: [_jsx(TableLoadingState, {}), _jsxs("div", { style: {
2097
2148
  display: 'flex',
2098
2149
  flexDirection: 'row',
2099
2150
  gap: '12px',
@@ -2136,7 +2187,9 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2136
2187
  gap: 2.5,
2137
2188
  alignItems: 'flex-start',
2138
2189
  }, children: [_jsx(Popover, { title: 'Add filter', isOpen: openPopover === 'AddFilterPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
2139
- if (!selectedColumns || selectedColumns.length === 0) {
2190
+ if (!selectedColumns ||
2191
+ selectedColumns.length === 0 ||
2192
+ loading) {
2140
2193
  return;
2141
2194
  }
2142
2195
  if (!openPopover) {
@@ -2283,7 +2336,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2283
2336
  setOpenPopover(null);
2284
2337
  setBaseAst(deepCopy(baseAst));
2285
2338
  fetchSqlQuery(deepCopy(baseAst));
2286
- } }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && (_jsx("div", { style: {
2339
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && (_jsx("div", { style: {
2287
2340
  display: 'flex',
2288
2341
  flexDirection: 'column',
2289
2342
  gap: 8,
@@ -2325,7 +2378,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2325
2378
  setOpenPopover(null);
2326
2379
  setBaseAst(deepCopy(newAst));
2327
2380
  fetchSqlQuery(deepCopy(newAst));
2328
- } }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
2381
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-${id}`))) })), _jsx(Popover, { isOpen: openPopover === 'AddSortPopover', trigger: _jsx(SecondaryButton, { onClick: () => {
2382
+ if (!selectedColumns || selectedColumns.length === 0) {
2383
+ return;
2384
+ }
2329
2385
  if (!openPopover) {
2330
2386
  setOpenPopover('AddSortPopover');
2331
2387
  }
@@ -2334,7 +2390,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2334
2390
  setActiveEditItem(null);
2335
2391
  setActivePath(null);
2336
2392
  setOpenPopover(null);
2337
- }, children: _jsx(AddSortPopover, { columns: pivot ? [`.${pivot.rowField}`] : selectedColumns, Select: Select, Button: Button, onSave: (column, direction) => {
2393
+ }, children: _jsx(AddSortPopover, { columns: pivot ? [`.${pivot.rowField}`] : selectedColumns, Select: Select, Button: Button, SecondaryButton: SecondaryButton, onSave: (column, direction) => {
2338
2394
  if (column === '')
2339
2395
  return;
2340
2396
  if (pivot) {
@@ -2382,7 +2438,10 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2382
2438
  setOpenPopover(null);
2383
2439
  setBaseAst(deepCopy(newAst));
2384
2440
  fetchSqlQuery(deepCopy(newAst));
2385
- } }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2441
+ }, TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton }) })) : (_jsx(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: _jsx(SecondaryButton, { onClick: () => {
2442
+ if (!selectedColumns || selectedColumns.length === 0) {
2443
+ return;
2444
+ }
2386
2445
  if (!baseAst) {
2387
2446
  return;
2388
2447
  }
@@ -2394,7 +2453,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2394
2453
  setActiveEditItem(null);
2395
2454
  setActivePath(null);
2396
2455
  setOpenPopover(null);
2397
- }, children: _jsx(AddLimitPopover, { TextInput: TextInput, onSave: (limit) => {
2456
+ }, children: _jsx(AddLimitPopover, { TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton, onSave: (limit) => {
2398
2457
  const newAst = { ...baseAst };
2399
2458
  newAst.limit = {
2400
2459
  seperator: '',
@@ -2408,7 +2467,7 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2408
2467
  setOpenPopover(null);
2409
2468
  setBaseAst(deepCopy(newAst));
2410
2469
  fetchSqlQuery(deepCopy(newAst));
2411
- } }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { onSubmit: (event) => {
2470
+ } }) }))] }), _jsxs(Container, { children: [!hideAi && (_jsxs("form", { ref: askAIContainerRef, onSubmit: (event) => {
2412
2471
  event.preventDefault();
2413
2472
  handleAsk();
2414
2473
  }, style: {
@@ -2416,14 +2475,14 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2416
2475
  flexDirection: 'row',
2417
2476
  gap: 12,
2418
2477
  padding: 1,
2419
- }, children: [_jsx(TextInput, { type: "text", value: aiPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), _jsx(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && (_jsx(_Fragment, { children: loading && errorMessage.length === 0 ? (_jsx(TableLoadingState, {})) : (_jsx(Table, { rows: applyFormatting({
2478
+ }, children: [_jsx(TextInput, { 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(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && (_jsx(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && (_jsx(_Fragment, { children: loading && errorMessage.length === 0 ? (_jsx(TableLoadingState, {})) : (_jsx(Table, { rows: applyFormatting({
2420
2479
  rows: pivotData?.rows || rows,
2421
2480
  fields: pivotData?.fields || fields,
2422
2481
  }, baseAst?.columns ?? []), columns: pivot
2423
2482
  ? pivotData?.columns || emptyPivotColumns()
2424
2483
  : enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
2425
2484
  return { label: snakeCaseToTitleCase(c), field: c };
2426
- }), error: errorMessage, rowsPerPage: 20 })) })), _jsxs("div", { style: {
2485
+ }), rowsPerPage: 20 })) })), _jsxs("div", { style: {
2427
2486
  display: 'flex',
2428
2487
  flexDirection: 'row',
2429
2488
  gap: '12px',
@@ -2434,5 +2493,8 @@ export default function ReportBuilder({ initialTableName = '', onAddToDashboardC
2434
2493
  whiteSpace: 'nowrap',
2435
2494
  }, children: errorMessage })), _jsx("div", { style: { width: '100%' } }), baseAst && (_jsxs(_Fragment, { children: [_jsx(SecondaryButton, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), _jsx(Button, { onClick: () => {
2436
2495
  setIsChartBuilderOpen(true);
2437
- }, label: 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` }), _jsx(ChartBuilderWithModal, { rows: applyFormatting({ rows, fields }, baseAst?.columns ?? []), columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: admin ? true : false, showDateFieldOptions: admin ? true : false, showAccessControlOptions: admin ? true : false, title: "Add to dashboard", isEditMode: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData })] }));
2496
+ }, label: 'Add to dashboard' })] }))] })] }), _jsx("style", { children: `body{margin:0;}` }), _jsx(ChartBuilderWithModal, { rows: applyFormatting({ rows, fields }, baseAst?.columns ?? []), columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: admin ? true : false, showDateFieldOptions: admin ? true : false, showAccessControlOptions: admin ? true : false, title: "Add to dashboard", isEditMode: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, Select: Select, TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton, Header: Header, Label: Label, Text: Text,
2497
+ // TODO: Modal={Modal}
2498
+ // TODO: Popover={Popover}
2499
+ DeleteButton: DeleteButton })] }));
2438
2500
  }
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { ModalComponentProps, TableComponentProps } from './components/UiComponents';
2
+ import { ModalComponentProps, TableComponentProps, TextInputComponentProps } from './components/UiComponents';
3
3
  export declare function convertPostgresColumn(column: any): {
4
4
  label: any;
5
5
  field: any;
@@ -38,12 +38,6 @@ interface SQLEditorProps {
38
38
  organizationName?: string;
39
39
  chartBuilderHorizontalView?: boolean;
40
40
  }
41
- interface TextInputComponentProps {
42
- onChange: (e: any) => void;
43
- value: string;
44
- id: string;
45
- placeholder?: string;
46
- }
47
41
  export default function QueryEditor({ containerStyle, ButtonComponent, SecondaryButtonComponent, TextInputComponent, TableComponent, newQueryEnabled, LoadingComponent, ModalComponent, defaultQuery, onChangeQuery, onChangeData, onChangeColumns, onChangeFields, isEditMode, chartBuilderEnabled, showTableFormatOptions, showDateFieldOptions, showAccessControlOptions, destinationDashboard, chartBuilderTitle, chartBuilderButtonLabel, onAddToDashboardComplete, addToDashboardButtonLabel, dashboardItem, organizationName, chartBuilderHorizontalView, }: SQLEditorProps): import("react/jsx-runtime").JSX.Element;
48
42
  export declare const SchemaListComponent: ({ schema, theme, loading, LoadingComponent, width, onClick, }: {
49
43
  schema: any;
@@ -1 +1 @@
1
- {"version":3,"file":"SQLEditor.d.ts","sourceRoot":"","sources":["../../src/SQLEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AAQf,OAAO,EAGL,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,2BAA2B,CAAC;AAInC,wBAAgB,qBAAqB,CAAC,MAAM,KAAA;;;;;EAwE3C;AA2BD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;IAEpC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC/D,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAExE,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IACrE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC7D,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACrC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC9D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAQD,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAuCD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,cAAoC,EACpC,eAAgC,EAChC,wBAAkD,EAClD,kBAAmC,EACnC,cAA2B,EAC3B,eAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAkB,EAClB,mBAA2B,EAC3B,sBAA8B,EAC9B,oBAA4B,EAC5B,wBAAgC,EAChC,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,yBAA8C,EAC9C,aAAyB,EACzB,gBAA4B,EAC5B,0BAAkC,GACnC,EAAE,cAAc,2CA+WhB;AA6JD,eAAO,MAAM,mBAAmB;;;;;;;6CAuG/B,CAAC"}
1
+ {"version":3,"file":"SQLEditor.d.ts","sourceRoot":"","sources":["../../src/SQLEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAC;AAQf,OAAO,EAGL,mBAAmB,EACnB,mBAAmB,EAEnB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAKnC,wBAAgB,qBAAqB,CAAC,MAAM,KAAA;;;;;EAwE3C;AA2BD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;IAEpC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC/D,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAExE,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IACrE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC7D,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACrC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC9D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AA6CD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,cAAoC,EACpC,eAAgC,EAChC,wBAAkD,EAClD,kBAAmC,EACnC,cAA2B,EAC3B,eAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAkB,EAClB,mBAA2B,EAC3B,sBAA8B,EAC9B,oBAA4B,EAC5B,wBAAgC,EAChC,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,yBAA8C,EAC9C,aAAyB,EACzB,gBAA4B,EAC5B,0BAAkC,GACnC,EAAE,cAAc,2CAgYhB;AA6JD,eAAO,MAAM,mBAAmB;;;;;;;6CAuG/B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // @ts-nocheck
3
3
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
4
- import { useState, useContext, useEffect, } from 'react';
4
+ import { useState, useContext, useEffect, useRef, } from 'react';
5
5
  import MonacoEditor from '@monaco-editor/react';
6
6
  // import './nightOwlLight.css';
7
7
  import { ClientContext, SchemaContext, ThemeContext } from './Context';
@@ -9,7 +9,8 @@ import QuillTable from './components/QuillTable';
9
9
  import { getData, getDataFromCloud } from './utils/dataFetcher';
10
10
  import { ChartBuilderWithModal } from './ChartBuilder';
11
11
  import { MemoizedButton, MemoizedSecondaryButton, } from './components/UiComponents';
12
- import { QuillTextInput } from './components/ReportBuilder/ui';
12
+ import { QuillTextInput } from './components/UiComponents';
13
+ import { updateFirstChildWidth } from './utils/width';
13
14
  export function convertPostgresColumn(column) {
14
15
  let format;
15
16
  let fieldType;
@@ -139,6 +140,20 @@ export default function QueryEditor({ containerStyle = { height: '100vh' }, Butt
139
140
  const [schemaLoading, setSchemaLoading] = useState(false);
140
141
  const [isChartBuilderOpen, setIsChartBuilderOpen] = useState(false);
141
142
  const [displayTable, setDisplayTable] = useState(false);
143
+ const formRef = useRef(null);
144
+ const [searchBarWidth, setSearchBarWidth] = useState(200);
145
+ useEffect(() => {
146
+ // Since the TextInput component takes a required numeric width parameter,
147
+ // we dynamically calculate the width of this component here.
148
+ function handleResize() {
149
+ updateFirstChildWidth(formRef, setSearchBarWidth, { gap: 12 });
150
+ }
151
+ handleResize();
152
+ window.addEventListener('resize', handleResize);
153
+ return () => {
154
+ window.removeEventListener('resize', handleResize);
155
+ };
156
+ }, []);
142
157
  const getSchema = async (isSubscribed) => {
143
158
  setSchemaLoading(true);
144
159
  const { queryEndpoint, queryHeaders, publicKey } = client;
@@ -288,7 +303,7 @@ export default function QueryEditor({ containerStyle = { height: '100vh' }, Butt
288
303
  width: 'calc(100% - 290px)',
289
304
  height: '100%',
290
305
  overflowX: 'hidden',
291
- }, children: [_jsxs("form", { onSubmit: (e) => {
306
+ }, children: [_jsxs("form", { ref: formRef, onSubmit: (e) => {
292
307
  e.preventDefault();
293
308
  handleRunSqlPrompt();
294
309
  }, style: {
@@ -297,7 +312,7 @@ export default function QueryEditor({ containerStyle = { height: '100vh' }, Butt
297
312
  gap: 12,
298
313
  paddingTop: 16,
299
314
  paddingBottom: 16,
300
- }, children: [_jsx(TextInputComponent, { id: "ai-search", value: sqlPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setSqlPrompt(e.target.value), placeholder: "Ask a question..." }), (ButtonComponent && (_jsx(ButtonComponent, { onClick: handleRunSqlPrompt, label: "Ask AI" }))) || (_jsx(QuillButton, { theme: theme, onClick: handleRunSqlPrompt, label: "Ask AI" }))] }), _jsx("div", { style: { height: 'calc(50% - 40px)' }, children: _jsx(SQLEditorComponent, { query: query, setQuery: setQuery, handleRunQuery: handleRunQuery, handleFixWithAI: handleFixWithAI, newQueryEnabled: newQueryEnabled, handleClearQuery: handleClearQuery, theme: theme, defineEditorTheme: defineEditorTheme, setEditorTheme: setEditorTheme, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, loading: sqlResponseLoading, LoadingComponent: LoadingComponent }) }), _jsxs("div", { style: {
315
+ }, children: [_jsx(TextInputComponent, { id: "ai-search", value: sqlPrompt, width: searchBarWidth, onChange: (e) => setSqlPrompt(e.target.value), placeholder: "Ask a question..." }), (ButtonComponent && (_jsx(ButtonComponent, { onClick: handleRunSqlPrompt, label: "Ask AI" }))) || (_jsx(QuillButton, { theme: theme, onClick: handleRunSqlPrompt, label: "Ask AI" }))] }), _jsx("div", { style: { height: 'calc(50% - 40px)' }, children: _jsx(SQLEditorComponent, { query: query, setQuery: setQuery, handleRunQuery: handleRunQuery, handleFixWithAI: handleFixWithAI, newQueryEnabled: newQueryEnabled, handleClearQuery: handleClearQuery, theme: theme, defineEditorTheme: defineEditorTheme, setEditorTheme: setEditorTheme, ButtonComponent: ButtonComponent, SecondaryButtonComponent: SecondaryButtonComponent, loading: sqlResponseLoading, LoadingComponent: LoadingComponent }) }), _jsxs("div", { style: {
301
316
  display: 'flex',
302
317
  flexDirection: 'column',
303
318
  height: 'calc(50% - 108px)',