@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
@@ -13,6 +13,7 @@ const date_fns_1 = require("date-fns");
13
13
  const Context_1 = require("./Context");
14
14
  const ast_1 = require("./components/ReportBuilder/ast");
15
15
  const ChartBuilder_1 = require("./ChartBuilder");
16
+ const UiComponents_2 = require("./components/UiComponents");
16
17
  const ui_1 = require("./components/ReportBuilder/ui");
17
18
  const postgres_1 = require("./components/ReportBuilder/postgres");
18
19
  const convert_1 = require("./components/ReportBuilder/convert");
@@ -28,6 +29,7 @@ const QuillTable_1 = __importDefault(require("./components/QuillTable"));
28
29
  const QuillSelect_1 = require("./components/QuillSelect");
29
30
  const textProcessing_1 = require("./utils/textProcessing");
30
31
  const AddLimitPopover_1 = require("./components/ReportBuilder/AddLimitPopover");
32
+ const width_1 = require("./utils/width");
31
33
  /**
32
34
  * Quill Report Builder
33
35
  *
@@ -36,7 +38,7 @@ const AddLimitPopover_1 = require("./components/ReportBuilder/AddLimitPopover");
36
38
  * they can click a button and add that report to their dashboard or export it
37
39
  * as a CSV.
38
40
  */
39
- function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, TextInput = ui_1.QuillTextInput, Select = QuillSelect_1.QuillSelectComponent, Table = QuillTable_1.default, Popover = ui_1.QuillPopover, Tabs = ui_1.QuillTabs, Checkbox = UiComponents_1.MemoizedCheckbox, Sidebar = ui_1.QuillSidebar, Container = ui_1.CustomContainer, HandleButton = ui_1.QuillHandleButton, SelectColumn = ui_1.QuillSelectColumn, DraggableColumn = ui_1.QuillDraggableColumn, ButtonLoadingState = ui_1.QuillButtonLoadingState, TableLoadingState = ui_1.QuillTableLoadingState, SidebarHeading = ui_1.QuillSidebarHeading, SidebarSubHeading = ui_1.QuillSidebarSubHeading, FilterPopover = ui_1.QuillFilterPopover, SortPopover = ui_1.QuillSortPopover, Label = UiComponents_1.MemoizedLabel, Header = UiComponents_1.MemoizedHeader, Text = UiComponents_1.MemoizedText, PivotPopover = UiComponents_1.MemoizedPopover, admin = false, hideAi = false, containerStyle, }) {
41
+ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () => void null, destinationDashboard = undefined, organizationName = '', Button = UiComponents_1.MemoizedButton, SecondaryButton = UiComponents_1.MemoizedSecondaryButton, DeleteButton = UiComponents_1.MemoizedDeleteButton, TextInput = UiComponents_2.QuillTextInput, Select = QuillSelect_1.QuillSelectComponent, Table = QuillTable_1.default, Popover = ui_1.QuillPopover, Tabs = ui_1.QuillTabs, Checkbox = UiComponents_1.MemoizedCheckbox, Sidebar = ui_1.QuillSidebar, Container = ui_1.CustomContainer, HandleButton = ui_1.QuillHandleButton, SelectColumn = ui_1.QuillSelectColumn, DraggableColumn = ui_1.QuillDraggableColumn, ButtonLoadingState = ui_1.QuillButtonLoadingState, TableLoadingState = ui_1.QuillTableLoadingState, SidebarHeading = ui_1.QuillSidebarHeading, SidebarSubHeading = ui_1.QuillSidebarSubHeading, FilterPopover = ui_1.QuillFilterPopover, SortPopover = ui_1.QuillSortPopover, Label = UiComponents_1.MemoizedLabel, Header = UiComponents_1.MemoizedHeader, Text = UiComponents_1.MemoizedText, PivotPopover = UiComponents_1.MemoizedPopover, admin = false, hideAi = false, containerStyle, }) {
40
42
  const [aiPrompt, setAiPrompt] = (0, react_1.useState)('');
41
43
  const [errorMessage, setErrorMessage] = (0, react_1.useState)('');
42
44
  const [baseAst, setBaseAst] = (0, react_1.useState)(null);
@@ -49,6 +51,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
49
51
  const [activePath, setActivePath] = (0, react_1.useState)(null);
50
52
  const [openPopover, setOpenPopover] = (0, react_1.useState)(null);
51
53
  const [loading, setLoading] = (0, react_1.useState)(false);
54
+ const [loadingSchema, setLoadingSchema] = (0, react_1.useState)(false);
52
55
  const [isChartBuilderOpen, setIsChartBuilderOpen] = (0, react_1.useState)(false);
53
56
  const [isPending, setIsPending] = (0, react_1.useState)(false);
54
57
  const [isCopying, setIsCopying] = (0, react_1.useState)(false);
@@ -68,6 +71,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
68
71
  const [initialLoad, setInitialLoad] = (0, react_1.useState)(true);
69
72
  const [currentTable, setCurrentTable] = (0, react_1.useState)(initialTableName || '');
70
73
  const parentRef = (0, react_1.useRef)(null);
74
+ const askAIContainerRef = (0, react_1.useRef)(null);
75
+ const askAILoadingContainerRef = (0, react_1.useRef)(null);
76
+ const [askAIInputWidth, setAskAIInputWidth] = (0, react_1.useState)(200);
77
+ const [askAILoadingContainerWidth, setAskAILoadingContainerWidth] = (0, react_1.useState)(200);
71
78
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
72
79
  const [pivotRowField, setPivotRowField] = (0, react_1.useState)(undefined);
73
80
  const [pivotColumnField, setPivotColumnField] = (0, react_1.useState)(undefined);
@@ -75,6 +82,19 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
75
82
  const [pivotAggregation, setPivotAggregation] = (0, react_1.useState)(undefined);
76
83
  // eslint-disable-next-line no-unused-vars
77
84
  const [client, _setClient] = (0, react_1.useContext)(Context_1.ClientContext);
85
+ (0, react_1.useEffect)(() => {
86
+ // Since the TextInput component takes a required numeric width parameter,
87
+ // we dynamically calculate the width of this component here.
88
+ function handleResize() {
89
+ (0, width_1.updateFirstChildWidth)(askAIContainerRef, setAskAIInputWidth, { gap: 12 });
90
+ (0, width_1.updateFirstChildWidth)(askAILoadingContainerRef, setAskAILoadingContainerWidth, { gap: 12 });
91
+ }
92
+ handleResize();
93
+ window.addEventListener('resize', handleResize);
94
+ return () => {
95
+ window.removeEventListener('resize', handleResize);
96
+ };
97
+ }, [baseAst, loading]);
78
98
  const enforceOrderOnColumns = (columnNames) => {
79
99
  if (pivot) {
80
100
  const rowName = pivot.rowField;
@@ -262,6 +282,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
262
282
  (0, react_1.useEffect)(() => {
263
283
  const fetchSchema = async () => {
264
284
  try {
285
+ setLoadingSchema(true);
265
286
  const response = await fetch(`${client.queryEndpoint}`, {
266
287
  method: 'POST',
267
288
  headers: {
@@ -301,6 +322,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
301
322
  ?.columns.map((c) => c.name);
302
323
  await handleAsk(`get ${columnsForTable} from ${initialTableName}`);
303
324
  }
325
+ setLoadingSchema(false);
304
326
  }
305
327
  catch (error) {
306
328
  console.error(error);
@@ -716,7 +738,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
716
738
  // see onChange callback handleChange
717
739
  // eslint-disable-next-line no-unused-vars
718
740
  dateColumnPath, dateFilterType, intervalCount, intervalType, intervalPaths, } = (0, util_1.getDateFilterInfo)(node);
719
- const isPlural = intervalCount && intervalCount > 1 ? 's' : '';
741
+ const isPlural = intervalCount !== 1 ? 's' : '';
720
742
  // Pull off the string literal date for "equals" comparisons
721
743
  const rawDateStringEquals = node.right?.value ??
722
744
  node.right?.args?.value[1]?.column ??
@@ -783,11 +805,15 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
783
805
  { label: 'in the previous', value: 'in the previous' },
784
806
  { label: 'in the current', value: 'in the current' },
785
807
  { label: 'equals', value: 'equals' },
786
- ] }), !['in the current', 'equals'].includes(dateFilterType) && ((0, jsx_runtime_1.jsx)(TextInput, { value: intervalCount, type: "number", style: { width: '70px' }, onChange: (e) => {
787
- const isPluralNow = e.target.value > 1 ? 's' : '';
808
+ ] }), !['in the current', 'equals'].includes(dateFilterType) && ((0, jsx_runtime_1.jsx)(TextInput, { id: "date_filter_interval_count", value: intervalCount, width: 70, onChange: (e) => {
809
+ if (Number.isNaN(parseFloat(e.target.value || '0'))) {
810
+ alert('Please input a number.');
811
+ return;
812
+ }
813
+ const isPluralNow = parseFloat(e.target.value || '0') !== 1 ? 's' : '';
788
814
  intervalPaths.forEach((intervalPath) => handleChangeText([
789
815
  {
790
- value: `${e.target.value} ${intervalType}${isPluralNow}`,
816
+ value: `${e.target.value || 0} ${intervalType}${isPluralNow}`,
791
817
  path: keyPrefix + intervalPath,
792
818
  },
793
819
  ]));
@@ -825,7 +851,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
825
851
  { label: `week${isPlural}`, value: 'week' },
826
852
  { label: `day${isPlural}`, value: 'day' },
827
853
  { label: `hour${isPlural}`, value: 'hour' },
828
- ] }), dateFilterType === 'equals' && ((0, jsx_runtime_1.jsx)(TextInput, { value: rawDateStringEquals, type: "text", style: { width: '120px' }, onChange: (e) => {
854
+ ] }), dateFilterType === 'equals' && ((0, jsx_runtime_1.jsx)(TextInput, { id: "date_filter_equals_raw_date", value: rawDateStringEquals, width: 120, onChange: (e) => {
829
855
  handleChangeText([
830
856
  {
831
857
  value: e.target.value,
@@ -840,36 +866,38 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
840
866
  label: (0, textProcessing_1.snakeCaseToTitleCase)(column.displayName),
841
867
  value: column.name,
842
868
  }));
843
- const plural = node.right.args.value[1].expr.value > 1 ? 's' : '';
869
+ const plural = node.right.args.value[1].expr.value !== 1 ? 's' : '';
844
870
  return ((0, jsx_runtime_1.jsxs)("div", { style: {
845
871
  display: 'flex',
846
872
  flexDirection: 'row',
847
873
  alignItems: 'center',
848
874
  gap: 20,
849
- }, children: [(0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.column, onChange: (value) => {
850
- const columnType = getColumnTypeByName(value);
851
- if ((0, ast_1.isDateishColumnType)(columnType)) {
852
- // handleChange(value, keyPrefix + dateColumnPath, "text");
853
- handleOperatorChange('IN_THE_LAST', node, keyPrefix, value);
854
- }
855
- else if ((0, ast_1.isNumericColumnType)(columnType)) {
856
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
857
- newSubtree.left.column = value;
858
- handleReplaceSubtree(keyPrefix, newSubtree);
859
- }
860
- else {
861
- const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
862
- newSubtree.left.args.value[0].column = value;
863
- handleReplaceSubtree(keyPrefix, newSubtree);
864
- }
865
- }, options: options }) }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: dateFilterType, onChange: (value) => {
875
+ }, children: [(0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.column, onChange: (value) => {
876
+ const columnType = getColumnTypeByName(value);
877
+ if ((0, ast_1.isDateishColumnType)(columnType)) {
878
+ // handleChange(value, keyPrefix + dateColumnPath, "text");
879
+ handleOperatorChange('IN_THE_LAST', node, keyPrefix, value);
880
+ }
881
+ else if ((0, ast_1.isNumericColumnType)(columnType)) {
882
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultNumericComparison);
883
+ newSubtree.left.column = value;
884
+ handleReplaceSubtree(keyPrefix, newSubtree);
885
+ }
886
+ else {
887
+ const newSubtree = (0, util_1.deepCopy)(constants_1.defaultEntry);
888
+ newSubtree.left.args.value[0].column = value;
889
+ handleReplaceSubtree(keyPrefix, newSubtree);
890
+ }
891
+ }, options: options }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: 'IN_THE_LAST', onChange: (value) => {
866
892
  handleOperatorChange(value, node, keyPrefix, dateColumn);
867
893
  }, options: [
868
894
  { label: 'in the last', value: 'IN_THE_LAST' },
869
895
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
870
896
  { label: 'in the current', value: 'IN_THE_CURRENT' },
897
+ { label: 'is not null', value: 'IS NOT' },
898
+ { label: 'is null', value: 'IS' },
871
899
  // { label: 'equals', value: 'equals' },
872
- ] }), (0, jsx_runtime_1.jsx)(TextInput, { defaultValue: node.right.args.value[1].expr.value, type: "number", style: { width: '120px', height: '42px' }, min: 0, onBlur: (e) => {
900
+ ] }), (0, jsx_runtime_1.jsx)(TextInput, { id: 'date_window_interval_count', value: node.right.args.value[1].expr.value, width: 120, onChange: (e) => {
873
901
  handleChange([
874
902
  {
875
903
  value: e.target.value,
@@ -918,6 +946,8 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
918
946
  { label: 'in the last', value: 'IN_THE_LAST' },
919
947
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
920
948
  { label: 'in the current', value: 'IN_THE_CURRENT' },
949
+ { label: 'is not null', value: 'IS NOT' },
950
+ { label: 'is null', value: 'IS' },
921
951
  // { label: 'equals', value: 'equals' },
922
952
  ] }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
923
953
  handleChange([
@@ -957,12 +987,14 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
957
987
  newSubtree.left.args.value[0].column = value;
958
988
  handleReplaceSubtree(keyPrefix, newSubtree);
959
989
  }
960
- }, opt: true, options: options }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: 'IN_THE_PREVIOUS', onChange: (value) => {
990
+ }, options: options }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: 'IN_THE_PREVIOUS', onChange: (value) => {
961
991
  handleOperatorChange(value, node, keyPrefix, node.left.column);
962
992
  }, options: [
963
993
  { label: 'in the last', value: 'IN_THE_LAST' },
964
994
  { label: 'in the previous', value: 'IN_THE_PREVIOUS' },
965
995
  { label: 'in the current', value: 'IN_THE_CURRENT' },
996
+ { label: 'is not null', value: 'IS NOT' },
997
+ { label: 'is null', value: 'IS' },
966
998
  // { label: 'equals', value: 'equals' },
967
999
  ] }), (0, jsx_runtime_1.jsx)(Select, { theme: theme, value: node.left.args.value[1].column, onChange: (value) => {
968
1000
  const dayConversion = {
@@ -1006,7 +1038,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1006
1038
  const tables = (0, ast_1.getTableNames)(baseAst);
1007
1039
  const table = tables.length === 1 ? tables[0] : initialTableName;
1008
1040
  const columnType = column?.fieldType;
1009
- const operatorOptions = [
1041
+ let operatorOptions = [
1010
1042
  ...((0, ast_1.isNumericColumnType)(columnType)
1011
1043
  ? [
1012
1044
  { label: 'equal to', value: '=' },
@@ -1043,6 +1075,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1043
1075
  ]
1044
1076
  : []),
1045
1077
  ];
1078
+ if (client.databaseType === 'BigQuery' &&
1079
+ (0, ast_1.isDateishColumnType)(columnType)) {
1080
+ operatorOptions = operatorOptions.filter((option) => option.value !== 'equals');
1081
+ }
1046
1082
  return ((0, jsx_runtime_1.jsxs)("div", { style: {
1047
1083
  display: 'flex',
1048
1084
  gap: 12,
@@ -1155,11 +1191,9 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1155
1191
  const len = node.value.length;
1156
1192
  return ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', flexDirection: 'row', gap: 12 }, children: [node.value.map((elem, index) => {
1157
1193
  if (elem.value) {
1158
- return ((0, jsx_runtime_1.jsx)(TextInput, { type: elem.type === 'number' ? 'number' : 'text', defaultValue: elem.value, onBlur: (e) => handleChange([
1194
+ return ((0, jsx_runtime_1.jsx)(TextInput, { id: `expr_list_${index}`, width: 200, value: elem.value, onChange: (e) => handleChange([
1159
1195
  {
1160
- value: elem.type === 'number'
1161
- ? parseFloat(e.target.value)
1162
- : e.target.value,
1196
+ value: e.target.value,
1163
1197
  path: keyPrefix + `value.${index}.`,
1164
1198
  },
1165
1199
  ]) }, `input_${index}`));
@@ -1169,23 +1203,19 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1169
1203
  }
1170
1204
  case 'double_quote_string':
1171
1205
  case 'single_quote_string':
1172
- return ((0, jsx_runtime_1.jsx)(TextInput, { type: "text", defaultValue: node.value.replaceAll('%', ''), style: { width: '120px' }, onBlur: (e) => handleChange([
1206
+ return ((0, jsx_runtime_1.jsx)(TextInput, { id: 'quoted_string', value: node.value.replaceAll('%', ''), width: 120, onChange: (e) => handleChange([
1173
1207
  {
1174
- value: node.type === 'number'
1175
- ? parseFloat(e.target.value)
1176
- : e.target.value,
1208
+ value: e.target.value,
1177
1209
  path: keyPrefix + 'value',
1178
1210
  },
1179
1211
  ]) }));
1180
1212
  case 'null':
1181
1213
  return (0, jsx_runtime_1.jsx)("div", {});
1182
1214
  case 'number':
1183
- return ((0, jsx_runtime_1.jsx)(TextInput, { defaultValue: node.value, type: "number", style: { width: '120px' }, onBlur: (e) => {
1215
+ return ((0, jsx_runtime_1.jsx)(TextInput, { id: "quill_number_input", value: node.value, width: 120, onChange: (e) => {
1184
1216
  handleChange([
1185
1217
  {
1186
- value: node.type === 'number'
1187
- ? parseFloat(e.target.value)
1188
- : e.target.value,
1218
+ value: e.target.value,
1189
1219
  path: keyPrefix + 'value',
1190
1220
  },
1191
1221
  ]);
@@ -1212,6 +1242,22 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1212
1242
  return null;
1213
1243
  }
1214
1244
  };
1245
+ const isValidPivot = (fields) => {
1246
+ let validPivot = true;
1247
+ if (pivot.rowField &&
1248
+ !fields.find((field) => field.name === pivot.rowField)) {
1249
+ validPivot = false;
1250
+ }
1251
+ if (pivot.valueField &&
1252
+ !fields.find((field) => field.name === pivot.valueField)) {
1253
+ validPivot = false;
1254
+ }
1255
+ if (pivot.columnField &&
1256
+ !fields.find((field) => field.name === pivot.columnField)) {
1257
+ validPivot = false;
1258
+ }
1259
+ return validPivot;
1260
+ };
1215
1261
  const renderSentence = (formData, node, keyPrefix = '',
1216
1262
  // @depreciated TODO: remove next update
1217
1263
  // eslint-disable-next-line no-unused-vars
@@ -1415,26 +1461,24 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1415
1461
  orgId: client.customerId,
1416
1462
  }),
1417
1463
  });
1464
+ const tables = (0, ast_1.getTableNames)(baseAst);
1465
+ const table = tables.length >= 1 ? tables[0] : initialTableName;
1466
+ if (table !== currentTable) {
1467
+ await getDistinctValues(table);
1468
+ setCurrentTable(table);
1469
+ }
1418
1470
  const data2 = await res2.json();
1419
1471
  if (data2.rows && data2.rows.length) {
1420
1472
  const tables = (0, ast_1.getTableNames)(baseAst);
1421
- const table = tables.length >= 1 ? tables[0] : initialTableName;
1422
- if (table !== currentTable) {
1423
- getDistinctValues(table);
1424
- setCurrentTable(table);
1425
- }
1426
- const sortedFields = data2.fields.sort((a, b) => {
1427
- const aIsId = a.name.toLowerCase() === 'id' ||
1428
- a.name.toLowerCase().endsWith('_id');
1429
- const bIsId = b.name.toLowerCase() === 'id' ||
1430
- b.name.toLowerCase().endsWith('_id');
1431
- if (aIsId && !bIsId)
1432
- return 1;
1433
- if (bIsId && !aIsId)
1434
- return -1;
1435
- return 0;
1436
- });
1437
1473
  if (pivot) {
1474
+ // check if any of the pivot fields aren't in the data2.fields array
1475
+ if (!isValidPivot(data2.fields)) {
1476
+ setPivot(null);
1477
+ setPivotData(null);
1478
+ setRows(data2.rows);
1479
+ setFields(data2.fields);
1480
+ return;
1481
+ }
1438
1482
  // Do all of this to make sure we have the right unique columns when applying a pivot
1439
1483
  let uniqueFormatted = {};
1440
1484
  const uniqueRecords = Array.from(new Set(data2.rows.map((row) => row[pivot.columnField]))).reduce((acc, curr) => {
@@ -1663,7 +1707,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1663
1707
  // newAst = convertDateComparison(newAst); // TODO
1664
1708
  ast = newAst; // so we fetch data for newAst later.
1665
1709
  if (table !== currentTable) {
1666
- getDistinctValues(table);
1710
+ await getDistinctValues(table);
1667
1711
  setCurrentTable(table);
1668
1712
  }
1669
1713
  setPivotRowField(groupByPivot?.rowField);
@@ -1852,6 +1896,8 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1852
1896
  height: '100%',
1853
1897
  ...containerStyle,
1854
1898
  }, ref: parentRef, children: [(0, jsx_runtime_1.jsxs)(Sidebar, { children: [(0, jsx_runtime_1.jsx)(SidebarHeading, { label: "Columns" }), (0, jsx_runtime_1.jsx)("div", { style: { height: 4, width: '100%' } }), (0, jsx_runtime_1.jsx)(DraggableColumns, {}), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddColumnPopover', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
1899
+ if (loadingSchema)
1900
+ return;
1855
1901
  if (!openPopover) {
1856
1902
  setOpenPopover('AddColumnPopover');
1857
1903
  }
@@ -1878,7 +1924,9 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
1878
1924
  gap: 2.5,
1879
1925
  alignItems: 'flex-start',
1880
1926
  }, children: [(0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddFilterPopover', title: 'Add filter', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
1881
- if (!selectedColumns || selectedColumns.length === 0) {
1927
+ if (!selectedColumns ||
1928
+ selectedColumns.length === 0 ||
1929
+ loading) {
1882
1930
  return;
1883
1931
  }
1884
1932
  if (!openPopover) {
@@ -2015,7 +2063,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2015
2063
  if (!pivot) {
2016
2064
  fetchSqlQuery(baseAst);
2017
2065
  }
2018
- } }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2066
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2019
2067
  display: 'flex',
2020
2068
  flexDirection: 'column',
2021
2069
  gap: 8,
@@ -2049,7 +2097,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2049
2097
  if (!pivot) {
2050
2098
  fetchSqlQuery(newAst);
2051
2099
  }
2052
- } }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddSortPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2100
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddSortPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2101
+ if (!selectedColumns || selectedColumns.length === 0) {
2102
+ return;
2103
+ }
2053
2104
  if (!openPopover) {
2054
2105
  setOpenPopover('AddSortPopover');
2055
2106
  }
@@ -2082,7 +2133,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2082
2133
  setOpenPopover(null);
2083
2134
  setBaseAst((0, util_1.deepCopy)(newAst));
2084
2135
  fetchSqlQuery(newAst);
2085
- } }) })) : ((0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2136
+ }, TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton }) })) : ((0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2086
2137
  if (!openPopover) {
2087
2138
  setOpenPopover('AddLimitPopover');
2088
2139
  }
@@ -2091,14 +2142,14 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2091
2142
  setActiveEditItem(null);
2092
2143
  setActivePath(null);
2093
2144
  setOpenPopover(null);
2094
- }, children: (0, jsx_runtime_1.jsx)(TextInput, { value: 0, type: "number", style: { width: 120, minHeight: 32 }, onChange: (e) => { } }) }))] }), (0, jsx_runtime_1.jsxs)(Container, { children: [!hideAi && ((0, jsx_runtime_1.jsxs)("form", { onSubmit: (event) => {
2145
+ }, children: (0, jsx_runtime_1.jsx)(TextInput, { id: "loading_input_limit", value: 0, width: 120, onChange: () => { } }) }))] }), (0, jsx_runtime_1.jsxs)(Container, { children: [!hideAi && ((0, jsx_runtime_1.jsxs)("form", { ref: askAILoadingContainerRef, onSubmit: (event) => {
2095
2146
  event.preventDefault();
2096
2147
  }, style: {
2097
2148
  display: 'flex',
2098
2149
  flexDirection: 'row',
2099
2150
  gap: 12,
2100
2151
  padding: 1,
2101
- }, children: [(0, jsx_runtime_1.jsx)(TextInput, { placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', type: "text", style: { width: '100%', fontSize: 14 }, value: aiPrompt }), (0, jsx_runtime_1.jsx)(Button, { onClick: () => { }, label: 'Ask AI' }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: clearAllState, label: "New report" }))] })), (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableLoadingState, {}), (0, jsx_runtime_1.jsxs)("div", { style: {
2152
+ }, children: [(0, jsx_runtime_1.jsx)(TextInput, { id: "ask_ai_loading_bar", placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...', width: askAILoadingContainerWidth, value: aiPrompt, onChange: () => { } }), (0, jsx_runtime_1.jsx)(Button, { onClick: () => { }, label: "Ask AI" }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: clearAllState, label: "New report" }))] })), (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(TableLoadingState, {}), (0, jsx_runtime_1.jsxs)("div", { style: {
2102
2153
  display: 'flex',
2103
2154
  flexDirection: 'row',
2104
2155
  gap: '12px',
@@ -2141,7 +2192,9 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2141
2192
  gap: 2.5,
2142
2193
  alignItems: 'flex-start',
2143
2194
  }, children: [(0, jsx_runtime_1.jsx)(Popover, { title: 'Add filter', isOpen: openPopover === 'AddFilterPopover', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2144
- if (!selectedColumns || selectedColumns.length === 0) {
2195
+ if (!selectedColumns ||
2196
+ selectedColumns.length === 0 ||
2197
+ loading) {
2145
2198
  return;
2146
2199
  }
2147
2200
  if (!openPopover) {
@@ -2288,7 +2341,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2288
2341
  setOpenPopover(null);
2289
2342
  setBaseAst((0, util_1.deepCopy)(baseAst));
2290
2343
  fetchSqlQuery((0, util_1.deepCopy)(baseAst));
2291
- } }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2344
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-pivot`) })), baseAst && baseAst.orderby && ((0, jsx_runtime_1.jsx)("div", { style: {
2292
2345
  display: 'flex',
2293
2346
  flexDirection: 'column',
2294
2347
  gap: 8,
@@ -2330,7 +2383,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2330
2383
  setOpenPopover(null);
2331
2384
  setBaseAst((0, util_1.deepCopy)(newAst));
2332
2385
  fetchSqlQuery((0, util_1.deepCopy)(newAst));
2333
- } }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddSortPopover', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2386
+ }, Select: Select, Button: Button, SecondaryButton: SecondaryButton }, `sort-sentence-${id}`))) })), (0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddSortPopover', trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2387
+ if (!selectedColumns || selectedColumns.length === 0) {
2388
+ return;
2389
+ }
2334
2390
  if (!openPopover) {
2335
2391
  setOpenPopover('AddSortPopover');
2336
2392
  }
@@ -2339,7 +2395,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2339
2395
  setActiveEditItem(null);
2340
2396
  setActivePath(null);
2341
2397
  setOpenPopover(null);
2342
- }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: pivot ? [`.${pivot.rowField}`] : selectedColumns, Select: Select, Button: Button, onSave: (column, direction) => {
2398
+ }, children: (0, jsx_runtime_1.jsx)(AddSortPopover_1.AddSortPopover, { columns: pivot ? [`.${pivot.rowField}`] : selectedColumns, Select: Select, Button: Button, SecondaryButton: SecondaryButton, onSave: (column, direction) => {
2343
2399
  if (column === '')
2344
2400
  return;
2345
2401
  if (pivot) {
@@ -2387,7 +2443,10 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2387
2443
  setOpenPopover(null);
2388
2444
  setBaseAst((0, util_1.deepCopy)(newAst));
2389
2445
  fetchSqlQuery((0, util_1.deepCopy)(newAst));
2390
- } }) })) : ((0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2446
+ }, TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton }) })) : ((0, jsx_runtime_1.jsx)(Popover, { isOpen: openPopover === 'AddLimitPopover', setIsOpen: () => { }, trigger: (0, jsx_runtime_1.jsx)(SecondaryButton, { onClick: () => {
2447
+ if (!selectedColumns || selectedColumns.length === 0) {
2448
+ return;
2449
+ }
2391
2450
  if (!baseAst) {
2392
2451
  return;
2393
2452
  }
@@ -2399,7 +2458,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2399
2458
  setActiveEditItem(null);
2400
2459
  setActivePath(null);
2401
2460
  setOpenPopover(null);
2402
- }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.AddLimitPopover, { TextInput: TextInput, onSave: (limit) => {
2461
+ }, children: (0, jsx_runtime_1.jsx)(AddLimitPopover_1.AddLimitPopover, { TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton, onSave: (limit) => {
2403
2462
  const newAst = { ...baseAst };
2404
2463
  newAst.limit = {
2405
2464
  seperator: '',
@@ -2413,7 +2472,7 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2413
2472
  setOpenPopover(null);
2414
2473
  setBaseAst((0, util_1.deepCopy)(newAst));
2415
2474
  fetchSqlQuery((0, util_1.deepCopy)(newAst));
2416
- } }) }))] }), (0, jsx_runtime_1.jsxs)(Container, { children: [!hideAi && ((0, jsx_runtime_1.jsxs)("form", { onSubmit: (event) => {
2475
+ } }) }))] }), (0, jsx_runtime_1.jsxs)(Container, { children: [!hideAi && ((0, jsx_runtime_1.jsxs)("form", { ref: askAIContainerRef, onSubmit: (event) => {
2417
2476
  event.preventDefault();
2418
2477
  handleAsk();
2419
2478
  }, style: {
@@ -2421,14 +2480,14 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2421
2480
  flexDirection: 'row',
2422
2481
  gap: 12,
2423
2482
  padding: 1,
2424
- }, children: [(0, jsx_runtime_1.jsx)(TextInput, { type: "text", value: aiPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setAiPrompt(e.target.value), placeholder: baseAst ? 'Ask a follow-up question...' : 'Ask a question...' }), (0, jsx_runtime_1.jsx)(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: loading && errorMessage.length === 0 ? ((0, jsx_runtime_1.jsx)(TableLoadingState, {})) : ((0, jsx_runtime_1.jsx)(Table, { rows: applyFormatting({
2483
+ }, children: [(0, jsx_runtime_1.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...' }), (0, jsx_runtime_1.jsx)(Button, { onClick: handleAsk, label: 'Ask AI' }), baseAst && ((0, jsx_runtime_1.jsx)(SecondaryButton, { label: 'New report', onClick: clearAllState }))] })), baseAst && ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: loading && errorMessage.length === 0 ? ((0, jsx_runtime_1.jsx)(TableLoadingState, {})) : ((0, jsx_runtime_1.jsx)(Table, { rows: applyFormatting({
2425
2484
  rows: pivotData?.rows || rows,
2426
2485
  fields: pivotData?.fields || fields,
2427
2486
  }, baseAst?.columns ?? []), columns: pivot
2428
2487
  ? pivotData?.columns || emptyPivotColumns()
2429
2488
  : enforceOrderOnColumns(Object.keys(rows[0] ?? {})).map((c) => {
2430
2489
  return { label: (0, textProcessing_1.snakeCaseToTitleCase)(c), field: c };
2431
- }), error: errorMessage, rowsPerPage: 20 })) })), (0, jsx_runtime_1.jsxs)("div", { style: {
2490
+ }), rowsPerPage: 20 })) })), (0, jsx_runtime_1.jsxs)("div", { style: {
2432
2491
  display: 'flex',
2433
2492
  flexDirection: 'row',
2434
2493
  gap: '12px',
@@ -2439,6 +2498,9 @@ function ReportBuilder({ initialTableName = '', onAddToDashboardComplete = () =>
2439
2498
  whiteSpace: 'nowrap',
2440
2499
  }, children: errorMessage })), (0, jsx_runtime_1.jsx)("div", { style: { width: '100%' } }), baseAst && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SecondaryButton, { label: isCopying ? '✅ Copied' : 'Copy SQL', onClick: () => copyToClipboard(activeQuery) }), (0, jsx_runtime_1.jsx)(Button, { onClick: () => {
2441
2500
  setIsChartBuilderOpen(true);
2442
- }, label: 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { rows: applyFormatting({ rows, fields }, baseAst?.columns ?? []), columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: admin ? true : false, showDateFieldOptions: admin ? true : false, showAccessControlOptions: admin ? true : false, title: "Add to dashboard", isEditMode: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData })] }));
2501
+ }, label: 'Add to dashboard' })] }))] })] }), (0, jsx_runtime_1.jsx)("style", { children: `body{margin:0;}` }), (0, jsx_runtime_1.jsx)(ChartBuilder_1.ChartBuilderWithModal, { rows: applyFormatting({ rows, fields }, baseAst?.columns ?? []), columns: processColumnsForChartBuilder(Object.keys(rows[0] ?? {})), fields: fields, pivot: pivot, query: activeQuery, showTableFormatOptions: admin ? true : false, showDateFieldOptions: admin ? true : false, showAccessControlOptions: admin ? true : false, title: "Add to dashboard", isEditMode: true, isOpen: isChartBuilderOpen, setIsOpen: setIsChartBuilderOpen, onAddToDashboardComplete: onAddToDashboardComplete, destinationDashboard: destinationDashboard, organizationName: organizationName, pivotData: pivotData, Select: Select, TextInput: TextInput, Button: Button, SecondaryButton: SecondaryButton, Header: Header, Label: Label, Text: Text,
2502
+ // TODO: Modal={Modal}
2503
+ // TODO: Popover={Popover}
2504
+ DeleteButton: DeleteButton })] }));
2443
2505
  }
2444
2506
  exports.default = ReportBuilder;
@@ -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"}
@@ -15,7 +15,8 @@ const QuillTable_1 = __importDefault(require("./components/QuillTable"));
15
15
  const dataFetcher_1 = require("./utils/dataFetcher");
16
16
  const ChartBuilder_1 = require("./ChartBuilder");
17
17
  const UiComponents_1 = require("./components/UiComponents");
18
- const ui_1 = require("./components/ReportBuilder/ui");
18
+ const UiComponents_2 = require("./components/UiComponents");
19
+ const width_1 = require("./utils/width");
19
20
  function convertPostgresColumn(column) {
20
21
  let format;
21
22
  let fieldType;
@@ -131,7 +132,7 @@ const QuillButton = ({ onClick, label, theme, secondary, }) => ((0, jsx_runtime_
131
132
  fontFamily: theme?.fontFamily,
132
133
  height: 38,
133
134
  }, onClick: onClick, children: label }));
134
- function QueryEditor({ containerStyle = { height: '100vh' }, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, TextInputComponent = ui_1.QuillTextInput, TableComponent = QuillTable_1.default, newQueryEnabled = false, LoadingComponent, ModalComponent, defaultQuery, onChangeQuery, onChangeData, onChangeColumns, onChangeFields, isEditMode = false, chartBuilderEnabled = false, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, destinationDashboard, chartBuilderTitle, chartBuilderButtonLabel, onAddToDashboardComplete, addToDashboardButtonLabel = 'Add to dashboard', dashboardItem = undefined, organizationName = undefined, chartBuilderHorizontalView = false, }) {
135
+ function QueryEditor({ containerStyle = { height: '100vh' }, ButtonComponent = UiComponents_1.MemoizedButton, SecondaryButtonComponent = UiComponents_1.MemoizedSecondaryButton, TextInputComponent = UiComponents_2.QuillTextInput, TableComponent = QuillTable_1.default, newQueryEnabled = false, LoadingComponent, ModalComponent, defaultQuery, onChangeQuery, onChangeData, onChangeColumns, onChangeFields, isEditMode = false, chartBuilderEnabled = false, showTableFormatOptions = false, showDateFieldOptions = false, showAccessControlOptions = false, destinationDashboard, chartBuilderTitle, chartBuilderButtonLabel, onAddToDashboardComplete, addToDashboardButtonLabel = 'Add to dashboard', dashboardItem = undefined, organizationName = undefined, chartBuilderHorizontalView = false, }) {
135
136
  const [sqlPrompt, setSqlPrompt] = (0, react_1.useState)('');
136
137
  const [client] = (0, react_1.useContext)(Context_1.ClientContext);
137
138
  const [theme] = (0, react_1.useContext)(Context_1.ThemeContext);
@@ -146,6 +147,20 @@ function QueryEditor({ containerStyle = { height: '100vh' }, ButtonComponent = U
146
147
  const [schemaLoading, setSchemaLoading] = (0, react_1.useState)(false);
147
148
  const [isChartBuilderOpen, setIsChartBuilderOpen] = (0, react_1.useState)(false);
148
149
  const [displayTable, setDisplayTable] = (0, react_1.useState)(false);
150
+ const formRef = (0, react_1.useRef)(null);
151
+ const [searchBarWidth, setSearchBarWidth] = (0, react_1.useState)(200);
152
+ (0, react_1.useEffect)(() => {
153
+ // Since the TextInput component takes a required numeric width parameter,
154
+ // we dynamically calculate the width of this component here.
155
+ function handleResize() {
156
+ (0, width_1.updateFirstChildWidth)(formRef, setSearchBarWidth, { gap: 12 });
157
+ }
158
+ handleResize();
159
+ window.addEventListener('resize', handleResize);
160
+ return () => {
161
+ window.removeEventListener('resize', handleResize);
162
+ };
163
+ }, []);
149
164
  const getSchema = async (isSubscribed) => {
150
165
  setSchemaLoading(true);
151
166
  const { queryEndpoint, queryHeaders, publicKey } = client;
@@ -295,7 +310,7 @@ function QueryEditor({ containerStyle = { height: '100vh' }, ButtonComponent = U
295
310
  width: 'calc(100% - 290px)',
296
311
  height: '100%',
297
312
  overflowX: 'hidden',
298
- }, children: [(0, jsx_runtime_1.jsxs)("form", { onSubmit: (e) => {
313
+ }, children: [(0, jsx_runtime_1.jsxs)("form", { ref: formRef, onSubmit: (e) => {
299
314
  e.preventDefault();
300
315
  handleRunSqlPrompt();
301
316
  }, style: {
@@ -304,7 +319,7 @@ function QueryEditor({ containerStyle = { height: '100vh' }, ButtonComponent = U
304
319
  gap: 12,
305
320
  paddingTop: 16,
306
321
  paddingBottom: 16,
307
- }, children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: "ai-search", value: sqlPrompt, style: { width: '100%', fontSize: 14 }, onChange: (e) => setSqlPrompt(e.target.value), placeholder: "Ask a question..." }), (ButtonComponent && ((0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleRunSqlPrompt, label: "Ask AI" }))) || ((0, jsx_runtime_1.jsx)(QuillButton, { theme: theme, onClick: handleRunSqlPrompt, label: "Ask AI" }))] }), (0, jsx_runtime_1.jsx)("div", { style: { height: 'calc(50% - 40px)' }, children: (0, jsx_runtime_1.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 }) }), (0, jsx_runtime_1.jsxs)("div", { style: {
322
+ }, children: [(0, jsx_runtime_1.jsx)(TextInputComponent, { id: "ai-search", value: sqlPrompt, width: searchBarWidth, onChange: (e) => setSqlPrompt(e.target.value), placeholder: "Ask a question..." }), (ButtonComponent && ((0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: handleRunSqlPrompt, label: "Ask AI" }))) || ((0, jsx_runtime_1.jsx)(QuillButton, { theme: theme, onClick: handleRunSqlPrompt, label: "Ask AI" }))] }), (0, jsx_runtime_1.jsx)("div", { style: { height: 'calc(50% - 40px)' }, children: (0, jsx_runtime_1.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 }) }), (0, jsx_runtime_1.jsxs)("div", { style: {
308
323
  display: 'flex',
309
324
  flexDirection: 'column',
310
325
  height: 'calc(50% - 108px)',