@quillsql/admin 1.5.2 → 1.6.1

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 (219) hide show
  1. package/dist/cjs/Admin.d.ts +19 -72
  2. package/dist/cjs/Admin.d.ts.map +1 -1
  3. package/dist/cjs/Admin.js +215 -996
  4. package/dist/cjs/AdminProvider.d.ts +2 -12
  5. package/dist/cjs/AdminProvider.d.ts.map +1 -1
  6. package/dist/cjs/AdminProvider.js +27 -32
  7. package/dist/cjs/api/ConnectionClient.d.ts +19 -0
  8. package/dist/cjs/api/ConnectionClient.d.ts.map +1 -1
  9. package/dist/cjs/api/ConnectionClient.js +108 -13
  10. package/dist/cjs/components/DashboardSelectPopover.d.ts.map +1 -1
  11. package/dist/cjs/components/DashboardSelectPopover.js +20 -3
  12. package/dist/cjs/components/DropDownMenu.js +1 -1
  13. package/dist/cjs/components/DropDownMenuWithLabel.d.ts.map +1 -1
  14. package/dist/cjs/components/DropDownMenuWithLabel.js +18 -87
  15. package/dist/cjs/components/EmptyDashboardComponent/index.d.ts.map +1 -1
  16. package/dist/cjs/components/EmptyDashboardComponent/index.js +11 -9
  17. package/dist/cjs/components/OrgSelect.d.ts.map +1 -1
  18. package/dist/cjs/components/OrgSelect.js +10 -20
  19. package/dist/cjs/components/QuillSelect.d.ts +3 -0
  20. package/dist/cjs/components/QuillSelect.d.ts.map +1 -0
  21. package/dist/cjs/components/QuillSelect.js +137 -0
  22. package/dist/cjs/components/SegmentedControl.d.ts +9 -0
  23. package/dist/cjs/components/SegmentedControl.d.ts.map +1 -0
  24. package/dist/cjs/components/SegmentedControl.js +60 -0
  25. package/dist/cjs/components/SqlTextEditor.d.ts +9 -1
  26. package/dist/cjs/components/SqlTextEditor.d.ts.map +1 -1
  27. package/dist/cjs/components/SqlTextEditor.js +60 -12
  28. package/dist/cjs/components/UiComponents.d.ts +18 -30
  29. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  30. package/dist/cjs/components/UiComponents.js +48 -84
  31. package/dist/cjs/constants/dataTypes.d.ts +2 -0
  32. package/dist/cjs/constants/dataTypes.d.ts.map +1 -0
  33. package/dist/cjs/constants/dataTypes.js +21 -0
  34. package/dist/cjs/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
  35. package/dist/cjs/forms/client_onboard/ConnectDatabase.js +9 -17
  36. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts +2 -1
  37. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  38. package/dist/cjs/forms/client_onboard/ConnectSchema.js +143 -68
  39. package/dist/cjs/forms/client_onboard/CreateSqlViews.d.ts.map +1 -1
  40. package/dist/cjs/forms/client_onboard/CreateSqlViews.js +57 -15
  41. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts +11 -5
  42. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts.map +1 -1
  43. package/dist/cjs/forms/sql_views/CreateEditSqlView.js +107 -53
  44. package/dist/cjs/hooks/useOnClickOutside.d.ts +3 -0
  45. package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -0
  46. package/dist/cjs/hooks/useOnClickOutside.js +20 -0
  47. package/dist/cjs/modals/EditFiltersModal.d.ts +17 -0
  48. package/dist/cjs/modals/EditFiltersModal.d.ts.map +1 -0
  49. package/dist/cjs/modals/EditFiltersModal.js +355 -0
  50. package/dist/cjs/modals/NewDashboardModal.d.ts +1 -3
  51. package/dist/cjs/modals/NewDashboardModal.d.ts.map +1 -1
  52. package/dist/cjs/modals/NewDashboardModal.js +64 -47
  53. package/dist/cjs/modals/PromoteDashModal.d.ts.map +1 -1
  54. package/dist/cjs/modals/PromoteDashModal.js +11 -4
  55. package/dist/cjs/modals/PromoteViewModal.d.ts +2 -1
  56. package/dist/cjs/modals/PromoteViewModal.d.ts.map +1 -1
  57. package/dist/cjs/modals/PromoteViewModal.js +46 -36
  58. package/dist/cjs/modals/ReorderDashboardModal.d.ts.map +1 -1
  59. package/dist/cjs/modals/ReorderDashboardModal.js +42 -45
  60. package/dist/cjs/modals/index.d.ts +0 -1
  61. package/dist/cjs/modals/index.d.ts.map +1 -1
  62. package/dist/cjs/modals/index.js +1 -3
  63. package/dist/cjs/primitives/ButtonPrimitive.d.ts +3 -1
  64. package/dist/cjs/primitives/ButtonPrimitive.d.ts.map +1 -1
  65. package/dist/cjs/primitives/ButtonPrimitive.js +5 -3
  66. package/dist/cjs/primitives/TextInputPrimitive.d.ts +1 -0
  67. package/dist/cjs/primitives/TextInputPrimitive.d.ts.map +1 -1
  68. package/dist/cjs/primitives/TextInputPrimitive.js +35 -20
  69. package/dist/cjs/primitives/TogglePrimitive.js +5 -5
  70. package/dist/cjs/public_components/CreateEnvironment.d.ts +2 -1
  71. package/dist/cjs/public_components/CreateEnvironment.d.ts.map +1 -1
  72. package/dist/cjs/public_components/CreateEnvironment.js +5 -2
  73. package/dist/cjs/public_components/DashboardBuilder.d.ts.map +1 -1
  74. package/dist/cjs/public_components/DashboardBuilder.js +71 -125
  75. package/dist/cjs/public_components/DashboardManager.d.ts.map +1 -1
  76. package/dist/cjs/public_components/DashboardManager.js +109 -146
  77. package/dist/cjs/public_components/SQLViewManager.d.ts +1 -0
  78. package/dist/cjs/public_components/SQLViewManager.d.ts.map +1 -1
  79. package/dist/cjs/public_components/SQLViewManager.js +271 -46
  80. package/dist/cjs/utils/astProcessing.d.ts +2 -0
  81. package/dist/cjs/utils/astProcessing.d.ts.map +1 -0
  82. package/dist/cjs/utils/astProcessing.js +41 -0
  83. package/dist/cjs/utils/astProcessing.uspec.d.ts +2 -0
  84. package/dist/cjs/utils/astProcessing.uspec.d.ts.map +1 -0
  85. package/dist/cjs/utils/astProcessing.uspec.js +26 -0
  86. package/dist/cjs/utils/columnProcessing.d.ts +3 -0
  87. package/dist/cjs/utils/columnProcessing.d.ts.map +1 -0
  88. package/dist/cjs/utils/columnProcessing.js +42 -0
  89. package/dist/cjs/utils/dataEditor.d.ts +2 -2
  90. package/dist/cjs/utils/dataEditor.d.ts.map +1 -1
  91. package/dist/cjs/utils/dataEditor.js +4 -2
  92. package/dist/cjs/utils/databases.d.ts +0 -1
  93. package/dist/cjs/utils/databases.d.ts.map +1 -1
  94. package/dist/cjs/utils/databases.js +5 -6
  95. package/dist/cjs/utils/monacoAutocomplete.d.ts +21 -0
  96. package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
  97. package/dist/cjs/utils/monacoAutocomplete.js +250 -0
  98. package/dist/cjs/utils/schema.d.ts +11 -0
  99. package/dist/cjs/utils/schema.d.ts.map +1 -1
  100. package/dist/cjs/utils/schema.js +129 -0
  101. package/dist/cjs/utils/table.d.ts +1 -0
  102. package/dist/cjs/utils/table.d.ts.map +1 -1
  103. package/dist/cjs/utils/table.js +13 -0
  104. package/dist/cjs/utils/textProcessing.d.ts +2 -0
  105. package/dist/cjs/utils/textProcessing.d.ts.map +1 -0
  106. package/dist/cjs/utils/textProcessing.js +9 -0
  107. package/dist/esm/Admin.d.ts +19 -72
  108. package/dist/esm/Admin.d.ts.map +1 -1
  109. package/dist/esm/Admin.js +218 -989
  110. package/dist/esm/AdminProvider.d.ts +2 -12
  111. package/dist/esm/AdminProvider.d.ts.map +1 -1
  112. package/dist/esm/AdminProvider.js +27 -32
  113. package/dist/esm/api/ConnectionClient.d.ts +19 -0
  114. package/dist/esm/api/ConnectionClient.d.ts.map +1 -1
  115. package/dist/esm/api/ConnectionClient.js +106 -12
  116. package/dist/esm/components/DashboardSelectPopover.d.ts.map +1 -1
  117. package/dist/esm/components/DashboardSelectPopover.js +20 -3
  118. package/dist/esm/components/DropDownMenu.js +1 -1
  119. package/dist/esm/components/DropDownMenuWithLabel.d.ts.map +1 -1
  120. package/dist/esm/components/DropDownMenuWithLabel.js +18 -87
  121. package/dist/esm/components/EmptyDashboardComponent/index.d.ts.map +1 -1
  122. package/dist/esm/components/EmptyDashboardComponent/index.js +11 -9
  123. package/dist/esm/components/OrgSelect.d.ts.map +1 -1
  124. package/dist/esm/components/OrgSelect.js +6 -19
  125. package/dist/esm/components/QuillSelect.d.ts +3 -0
  126. package/dist/esm/components/QuillSelect.d.ts.map +1 -0
  127. package/dist/esm/components/QuillSelect.js +130 -0
  128. package/dist/esm/components/SegmentedControl.d.ts +9 -0
  129. package/dist/esm/components/SegmentedControl.d.ts.map +1 -0
  130. package/dist/esm/components/SegmentedControl.js +56 -0
  131. package/dist/esm/components/SqlTextEditor.d.ts +9 -1
  132. package/dist/esm/components/SqlTextEditor.d.ts.map +1 -1
  133. package/dist/esm/components/SqlTextEditor.js +59 -11
  134. package/dist/esm/components/UiComponents.d.ts +18 -30
  135. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  136. package/dist/esm/components/UiComponents.js +45 -83
  137. package/dist/esm/constants/dataTypes.d.ts +2 -0
  138. package/dist/esm/constants/dataTypes.d.ts.map +1 -0
  139. package/dist/esm/constants/dataTypes.js +18 -0
  140. package/dist/esm/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
  141. package/dist/esm/forms/client_onboard/ConnectDatabase.js +9 -17
  142. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts +2 -1
  143. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  144. package/dist/esm/forms/client_onboard/ConnectSchema.js +145 -70
  145. package/dist/esm/forms/client_onboard/CreateSqlViews.d.ts.map +1 -1
  146. package/dist/esm/forms/client_onboard/CreateSqlViews.js +58 -16
  147. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts +11 -5
  148. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts.map +1 -1
  149. package/dist/esm/forms/sql_views/CreateEditSqlView.js +108 -54
  150. package/dist/esm/hooks/useOnClickOutside.d.ts +3 -0
  151. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -0
  152. package/dist/esm/hooks/useOnClickOutside.js +18 -0
  153. package/dist/esm/modals/EditFiltersModal.d.ts +17 -0
  154. package/dist/esm/modals/EditFiltersModal.d.ts.map +1 -0
  155. package/dist/esm/modals/EditFiltersModal.js +348 -0
  156. package/dist/esm/modals/NewDashboardModal.d.ts +1 -3
  157. package/dist/esm/modals/NewDashboardModal.d.ts.map +1 -1
  158. package/dist/esm/modals/NewDashboardModal.js +64 -47
  159. package/dist/esm/modals/PromoteDashModal.d.ts.map +1 -1
  160. package/dist/esm/modals/PromoteDashModal.js +11 -4
  161. package/dist/esm/modals/PromoteViewModal.d.ts +2 -1
  162. package/dist/esm/modals/PromoteViewModal.d.ts.map +1 -1
  163. package/dist/esm/modals/PromoteViewModal.js +50 -40
  164. package/dist/esm/modals/ReorderDashboardModal.d.ts.map +1 -1
  165. package/dist/esm/modals/ReorderDashboardModal.js +43 -46
  166. package/dist/esm/modals/index.d.ts +0 -1
  167. package/dist/esm/modals/index.d.ts.map +1 -1
  168. package/dist/esm/modals/index.js +0 -1
  169. package/dist/esm/primitives/ButtonPrimitive.d.ts +3 -1
  170. package/dist/esm/primitives/ButtonPrimitive.d.ts.map +1 -1
  171. package/dist/esm/primitives/ButtonPrimitive.js +5 -3
  172. package/dist/esm/primitives/TextInputPrimitive.d.ts +1 -0
  173. package/dist/esm/primitives/TextInputPrimitive.d.ts.map +1 -1
  174. package/dist/esm/primitives/TextInputPrimitive.js +33 -21
  175. package/dist/esm/primitives/TogglePrimitive.js +5 -5
  176. package/dist/esm/public_components/CreateEnvironment.d.ts +2 -1
  177. package/dist/esm/public_components/CreateEnvironment.d.ts.map +1 -1
  178. package/dist/esm/public_components/CreateEnvironment.js +5 -2
  179. package/dist/esm/public_components/DashboardBuilder.d.ts.map +1 -1
  180. package/dist/esm/public_components/DashboardBuilder.js +72 -126
  181. package/dist/esm/public_components/DashboardManager.d.ts.map +1 -1
  182. package/dist/esm/public_components/DashboardManager.js +112 -149
  183. package/dist/esm/public_components/SQLViewManager.d.ts +1 -0
  184. package/dist/esm/public_components/SQLViewManager.d.ts.map +1 -1
  185. package/dist/esm/public_components/SQLViewManager.js +271 -48
  186. package/dist/esm/utils/astProcessing.d.ts +2 -0
  187. package/dist/esm/utils/astProcessing.d.ts.map +1 -0
  188. package/dist/esm/utils/astProcessing.js +37 -0
  189. package/dist/esm/utils/astProcessing.uspec.d.ts +2 -0
  190. package/dist/esm/utils/astProcessing.uspec.d.ts.map +1 -0
  191. package/dist/esm/utils/astProcessing.uspec.js +24 -0
  192. package/dist/esm/utils/columnProcessing.d.ts +3 -0
  193. package/dist/esm/utils/columnProcessing.d.ts.map +1 -0
  194. package/dist/esm/utils/columnProcessing.js +37 -0
  195. package/dist/esm/utils/dataEditor.d.ts +2 -2
  196. package/dist/esm/utils/dataEditor.d.ts.map +1 -1
  197. package/dist/esm/utils/dataEditor.js +4 -2
  198. package/dist/esm/utils/databases.d.ts +0 -1
  199. package/dist/esm/utils/databases.d.ts.map +1 -1
  200. package/dist/esm/utils/databases.js +5 -6
  201. package/dist/esm/utils/monacoAutocomplete.d.ts +21 -0
  202. package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
  203. package/dist/esm/utils/monacoAutocomplete.js +245 -0
  204. package/dist/esm/utils/schema.d.ts +11 -0
  205. package/dist/esm/utils/schema.d.ts.map +1 -1
  206. package/dist/esm/utils/schema.js +126 -1
  207. package/dist/esm/utils/table.d.ts +1 -0
  208. package/dist/esm/utils/table.d.ts.map +1 -1
  209. package/dist/esm/utils/table.js +11 -1
  210. package/dist/esm/utils/textProcessing.d.ts +2 -0
  211. package/dist/esm/utils/textProcessing.d.ts.map +1 -0
  212. package/dist/esm/utils/textProcessing.js +5 -0
  213. package/package.json +3 -2
  214. package/dist/cjs/modals/EditDashboardsModal.d.ts +0 -20
  215. package/dist/cjs/modals/EditDashboardsModal.d.ts.map +0 -1
  216. package/dist/cjs/modals/EditDashboardsModal.js +0 -94
  217. package/dist/esm/modals/EditDashboardsModal.d.ts +0 -20
  218. package/dist/esm/modals/EditDashboardsModal.d.ts.map +0 -1
  219. package/dist/esm/modals/EditDashboardsModal.js +0 -91
@@ -4,7 +4,10 @@ import { ButtonPrimitive, ModalPrimitive, TextInputPrimitive, } from '../../prim
4
4
  import { createSQLView, getQueryFromAiWithConnection, getSqlViewData, } from '../../api/ConnectionClient';
5
5
  import SqlViewTile from '../../components/SqlViewTile';
6
6
  import SqlTextEditor from '../../components/SqlTextEditor';
7
- import { Table } from '@quillsql/react';
7
+ import { SchemaListComponent, Table } from '@quillsql/react';
8
+ import { LoadingSpinner } from '../../components/UiComponents';
9
+ import { getDuplicateColumns } from '../../public_components/SQLViewManager';
10
+ import { processColumnReference } from '../../utils/columnProcessing';
8
11
  export default function CreateSQLViews({ containerStyle, header1Style, header2Style, columnsByTable, environmentDetails, allSchemaInfo, domainName, completeOnboarding, clientId, state, }) {
9
12
  const [selectedTable, setSelectedTable] = useState(undefined);
10
13
  const [queryInfo, setQueryInfo] = useState({
@@ -17,9 +20,11 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
17
20
  const [tableData, setTableData] = useState(undefined);
18
21
  const [client, setClient] = useState(undefined);
19
22
  const [sqlTables, setSqlTables] = useState([]);
20
- const [askAIButton, setAskAIButton] = useState('Ask AI');
21
- const [runQueryButtonLabel, setRunQueryButtonLabel] = useState('Run query');
23
+ const [askAIButtonLoading, setAskAIButtonLoading] = useState(false);
24
+ const [runQueryButtonLoading, setRunQueryButtonLoading] = useState(false);
22
25
  const [showFKModal, setShowFKModal] = useState(false);
26
+ const [tableSearchQuery, setTableSearchQuery] = useState('');
27
+ const [displayedTableData, setDisplayedTableData] = useState(columnsByTable);
23
28
  const addSqlView = async (override) => {
24
29
  const results = await createSQLView(environmentDetails, allSchemaInfo, columnsByTable, queryInfo, client, domainName, tableData, sqlTables.map((e) => {
25
30
  return e.name;
@@ -37,6 +42,17 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
37
42
  setSqlQueryInfo({ msg: results.message, status: true });
38
43
  }
39
44
  };
45
+ const handleClickSchemaItem = async (event) => {
46
+ const name = event.target.textContent;
47
+ if (!name) {
48
+ return;
49
+ }
50
+ const newQuery = `SELECT * FROM ${processColumnReference(name, environmentDetails?.type)};`;
51
+ if (!queryInfo.query || queryInfo.query.length === 0) {
52
+ setQueryInfo({ name: queryInfo.name, query: newQuery });
53
+ }
54
+ await navigator.clipboard.writeText(newQuery);
55
+ };
40
56
  useEffect(() => {
41
57
  window.scrollTo({
42
58
  behavior: 'smooth',
@@ -47,6 +63,7 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
47
63
  ...containerStyle,
48
64
  display: 'flex',
49
65
  flexDirection: 'column',
66
+ minWidth: 900,
50
67
  }, id: "create-sql-view", children: [_jsxs("div", { style: {
51
68
  padding: 20,
52
69
  paddingBottom: 12,
@@ -58,10 +75,28 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
58
75
  flexDirection: 'row',
59
76
  borderTop: 'solid 1px #e7e7e7',
60
77
  height: 'calc(100vh - 143px)',
61
- }, children: [_jsxs("div", { id: "form-editor-table", style: {
78
+ }, children: [_jsxs("div", { style: {
79
+ display: 'flex',
80
+ flexDirection: 'column',
81
+ }, children: [_jsx("div", { style: {
82
+ paddingLeft: '20px',
83
+ paddingRight: '30px',
84
+ height: 70,
85
+ minHeight: 70,
86
+ display: 'flex',
87
+ alignItems: 'center',
88
+ }, children: _jsx(TextInputPrimitive, { placeholder: "Search...",
89
+ // @ts-ignore
90
+ onChange: (e) => {
91
+ setTableSearchQuery(e.target.value);
92
+ setDisplayedTableData(columnsByTable.filter((table) => table.tableName
93
+ .toLowerCase()
94
+ .includes(e.target.value.toLowerCase().trim())));
95
+ }, value: tableSearchQuery, width: "180px" }) }), _jsx(SchemaListComponent, { schema: displayedTableData, theme: state.theme, width: '300px', loading: false, LoadingComponent: LoadingSpinner, onClick: handleClickSchemaItem })] }), _jsxs("div", { id: "form-editor-table", style: {
62
96
  display: 'flex',
63
97
  flexDirection: 'column',
64
- width: 'calc(100% - 300px)',
98
+ width: 'calc(100% - 600px)',
99
+ minWidth: 300,
65
100
  }, children: [_jsxs("div", { style: {
66
101
  display: 'flex',
67
102
  flexDirection: 'row',
@@ -73,16 +108,16 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
73
108
  height: 70,
74
109
  }, children: [_jsx(TextInputPrimitive, { onChange: (e) => {
75
110
  setAIPrompt(e.target.value);
76
- }, placeholder: 'Describe a query...', value: aiPrompt }), _jsx(ButtonPrimitive, { label: askAIButton, onClick: async () => {
77
- setAskAIButton('Loading...');
111
+ }, placeholder: 'Describe a query...', value: aiPrompt }), _jsx(ButtonPrimitive, { label: 'Ask AI', isLoading: askAIButtonLoading, onClick: async () => {
112
+ setAskAIButtonLoading(true);
78
113
  const results = await getQueryFromAiWithConnection(aiPrompt, clientId, allSchemaInfo?.selectedFields.schema
79
114
  ? [allSchemaInfo?.selectedFields.schema]
80
115
  : undefined);
81
116
  setQueryInfo({ name: queryInfo.name, query: results });
82
- setAskAIButton('Ask AI');
117
+ setAskAIButtonLoading(false);
83
118
  }, style: { width: '90px' } })] }), _jsx(SqlTextEditor, { value: queryInfo.query, setValue: (e) => {
84
119
  setQueryInfo({ name: queryInfo.name, query: e });
85
- }, containerStyle: { paddingLeft: 16, paddingRight: 16 } }), _jsxs("div", { style: {
120
+ }, setEditorMounted: () => { }, containerStyle: { paddingLeft: 16, paddingRight: 16 }, schema: displayedTableData, databaseType: environmentDetails?.type, previousProvider: null }), _jsxs("div", { style: {
86
121
  display: 'flex',
87
122
  flexDirection: 'row',
88
123
  justifyContent: 'space-between',
@@ -90,8 +125,8 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
90
125
  paddingLeft: 16,
91
126
  paddingRight: 16,
92
127
  height: 70,
93
- }, children: [_jsx(ButtonPrimitive, { label: runQueryButtonLabel, onClick: async () => {
94
- setRunQueryButtonLabel('Querying...');
128
+ }, children: [_jsx(ButtonPrimitive, { label: 'Run query', onClick: async () => {
129
+ setRunQueryButtonLoading(true);
95
130
  const getSqlResults = await getSqlViewData(clientId, queryInfo.query, environmentDetails.type, state.queryEndpoint);
96
131
  if (!getSqlResults.success) {
97
132
  setErrorInfo({ status: true, msg: getSqlResults.error });
@@ -100,7 +135,7 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
100
135
  setErrorInfo({ status: false, msg: '' });
101
136
  setTableData(getSqlResults);
102
137
  }
103
- setRunQueryButtonLabel('Run query');
138
+ setRunQueryButtonLoading(false);
104
139
  } }), errorInfo.status ? (_jsx("h2", { style: {
105
140
  ...header2Style,
106
141
  color: 'red',
@@ -113,7 +148,7 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
113
148
  }, children: [_jsx(Table, { rows: tableData.rows, columns: tableData.fields, containerStyle: {
114
149
  height: 'calc(100vh - 589px)',
115
150
  width: '100%',
116
- }, showDownloadCSVButton: true }), _jsxs("div", { style: {
151
+ }, hideCSVDownloadButton: true, isLoading: runQueryButtonLoading }), _jsxs("div", { style: {
117
152
  width: '100%',
118
153
  display: 'flex',
119
154
  justifyContent: 'space-between',
@@ -124,7 +159,14 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
124
159
  color: 'red',
125
160
  paddingTop: '12px',
126
161
  // textTransform: 'capitalize',
127
- }, children: sqlQueryError.msg })) : (_jsx("div", {})), _jsx(ButtonPrimitive, { label: "Add SQL View", onClick: () => addSqlView(false) })] })] }))] }), _jsxs("div", { style: {
162
+ }, children: sqlQueryError.msg })) : (_jsx("div", {})), _jsx(ButtonPrimitive, { label: "Add SQL View", onClick: () => {
163
+ const duplicateColumns2 = getDuplicateColumns(tableData?.fields);
164
+ if (duplicateColumns2.length > 0) {
165
+ alert(`Ambiguous column names found. Either use aliases or remove the column to make every column name unique: \n\n${duplicateColumns2.join('\n')}`);
166
+ return;
167
+ }
168
+ addSqlView(false);
169
+ } })] })] }))] }), _jsxs("div", { style: {
128
170
  // width: '30%',
129
171
  background: '#fafafa',
130
172
  borderLeft: 'solid 1px #e7e7e7',
@@ -176,7 +218,7 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
176
218
  paddingRight: 12,
177
219
  background: 'white',
178
220
  borderTop: 'solid 1px #e7e7e7',
179
- }, children: _jsx(ButtonPrimitive, { label: "Go to dashboard", onClick: () => {
221
+ }, children: _jsx(ButtonPrimitive, { label: "Looks good", onClick: () => {
180
222
  completeOnboarding(client);
181
223
  }, style: { width: 276 } }) })) : null] })] }), _jsx(ForeignKeyModal, { isOpen: showFKModal, setIsOpen: setShowFKModal, override: addSqlView, foreignKey: allSchemaInfo?.selectedFields.foreignKey, tableName: allSchemaInfo?.selectedFields.table })] }));
182
224
  }
@@ -188,7 +230,7 @@ export function ForeignKeyModal({ isOpen, setIsOpen, override, foreignKey, table
188
230
  fontWeight: 600,
189
231
  color: '#212121',
190
232
  paddingBottom: 14,
191
- }, children: `Organization Foreign Key "${foreignKey}" Not Found` }), _jsxs("div", { style: { marginBottom: '12px' }, children: [`Your organization table `, _jsx("strong", { children: `"${tableName}"` }), ` foreign key `, _jsx("strong", { children: `"${foreignKey}"` }), " is not present in the current query. If this query will never have organization specific data on it (this is rare), override this message.`"] }), _jsx("br", {}), _jsxs("div", { style: {
233
+ }, children: `Organization Foreign Key "${foreignKey?.replaceAll('"', '')}" Not Found` }), _jsxs("div", { style: { marginBottom: '12px' }, children: [`Your organization table `, _jsx("strong", { children: `"${tableName?.replaceAll('"', '')}"` }), ` foreign key `, _jsx("strong", { children: `"${foreignKey?.replaceAll('"', '')}"` }), " is not present in the current query. If this query will never have organization specific data on it (this is rare), override this message.`"] }), _jsx("br", {}), _jsxs("div", { style: {
192
234
  display: 'flex',
193
235
  flexDirection: 'row',
194
236
  gap: '12px',
@@ -1,5 +1,7 @@
1
- /// <reference types="react" />
2
- import { ButtonComponentProps, TextInputComponentProps, HeaderProps } from '@quillsql/react';
1
+ import { ButtonComponentProps } from '@quillsql/react';
2
+ import { ReactNode } from 'react';
3
+ import { IDisposable } from 'monaco-editor';
4
+ import { TextInputComponentProps } from '../../components/UiComponents';
3
5
  import { ColumnsByTable } from '../../utils/table';
4
6
  interface CreateEditSqlViewProps {
5
7
  containerStyle: React.CSSProperties;
@@ -12,12 +14,16 @@ interface CreateEditSqlViewProps {
12
14
  SecondaryButtonComponent?: (props: ButtonComponentProps) => JSX.Element;
13
15
  TextInput?: (props: TextInputComponentProps) => JSX.Element;
14
16
  LoadingComponent?: () => JSX.Element;
15
- Header?: (props: HeaderProps) => JSX.Element;
17
+ Header?: (props: {
18
+ children: ReactNode;
19
+ }) => JSX.Element;
16
20
  closeEditView: () => void;
17
- addEditView: (request: string, query: string, name?: string, id?: string) => void;
21
+ addEditView: (request: string, query: string, name?: string, id?: string, columns?: any[]) => void;
22
+ setProvider: (provider: IDisposable | null) => void;
23
+ provider: IDisposable | null;
18
24
  allTableData: ColumnsByTable[];
19
25
  schemaIsLoading: boolean;
20
26
  }
21
- export default function CreateEditSqlView({ containerStyle, initialSqlView, closeEditView, addEditView, SecondaryButtonComponent, LoadingComponent, Button, TextInput, Header, allTableData, schemaIsLoading, }: CreateEditSqlViewProps): JSX.Element;
27
+ export default function CreateEditSqlView({ containerStyle, initialSqlView, closeEditView, addEditView, setProvider, provider, SecondaryButtonComponent, LoadingComponent, Button, TextInput, Header, allTableData, schemaIsLoading, }: CreateEditSqlViewProps): JSX.Element;
22
28
  export {};
23
29
  //# sourceMappingURL=CreateEditSqlView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateEditSqlView.d.ts","sourceRoot":"","sources":["../../../../src/forms/sql_views/CreateEditSqlView.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,oBAAoB,EAEpB,uBAAuB,EACvB,WAAW,EAGZ,MAAM,iBAAiB,CAAC;AAwBzB,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAI3D,UAAU,sBAAsB;IAC9B,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;IACpC,cAAc,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IACtD,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAExE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC5D,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,GAAG,CAAC,OAAO,CAAC;IAC7C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,EAAE,CACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,MAAM,KACR,IAAI,CAAC;IACV,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACX,wBAAwB,EACxB,gBAA2C,EAC3C,MAAuB,EACvB,SAA6B,EAC7B,MAAuB,EACvB,YAAY,EACZ,eAAe,GAChB,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAiTtC"}
1
+ {"version":3,"file":"CreateEditSqlView.d.ts","sourceRoot":"","sources":["../../../../src/forms/sql_views/CreateEditSqlView.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAKrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,SAAS,EAKV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,OAAO,EAML,uBAAuB,EACxB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQ3D,UAAU,sBAAsB;IAC9B,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;IACpC,cAAc,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IACtD,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,GAAG,CAAC,OAAO,CAAC;IAExE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,GAAG,CAAC,OAAO,CAAC;IAC5D,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,KAAK,GAAG,CAAC,OAAO,CAAC;IACzD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,EAAE,CACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,GAAG,EAAE,KACZ,IAAI,CAAC;IACV,WAAW,EAAE,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACpD,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,wBAAwB,EACxB,gBAA2C,EAC3C,MAAuB,EACvB,SAA6B,EAC7B,MAAuB,EACvB,YAAY,EACZ,eAAe,GAChB,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAmYtC"}
@@ -1,24 +1,29 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Table, SchemaListComponent, } from '@quillsql/react';
3
- import { useEffect, useState } from 'react';
3
+ import { useEffect, useState, } from 'react';
4
4
  import { useAdmin } from '../../AdminProvider';
5
5
  import { getQueryFromAiWithConnection, getSqlViewData, } from '../../api/ConnectionClient';
6
6
  import SqlTextEditor from '../../components/SqlTextEditor';
7
7
  import { LoadingSpinner, MemoizedButton, MemoizedHeader, MemoizedTextInput, } from '../../components/UiComponents';
8
8
  import { ForeignKeyModal } from '../client_onboard/CreateSqlViews';
9
9
  import DynamicBanner from '../../components/DynamicBanner';
10
- export default function CreateEditSqlView({ containerStyle, initialSqlView, closeEditView, addEditView, SecondaryButtonComponent, LoadingComponent = () => _jsx(LoadingSpinner, {}), Button = MemoizedButton, TextInput = MemoizedTextInput, Header = MemoizedHeader, allTableData, schemaIsLoading, }) {
10
+ import { getDuplicateColumns } from '../../public_components/SQLViewManager';
11
+ import { processColumnReference } from '../../utils/columnProcessing';
12
+ import { processJoinASTWithDuplicateColumns } from '../../utils/astProcessing';
13
+ import { QUILL_SERVER } from '../../utils/constants';
14
+ export default function CreateEditSqlView({ containerStyle, initialSqlView, closeEditView, addEditView, setProvider, provider, SecondaryButtonComponent, LoadingComponent = () => _jsx(LoadingSpinner, {}), Button = MemoizedButton, TextInput = MemoizedTextInput, Header = MemoizedHeader, allTableData, schemaIsLoading, }) {
11
15
  const [name, setName] = useState(initialSqlView?.name || '');
12
16
  const [editViewQuery, setEditViewQuery] = useState(initialSqlView?.query || '');
13
17
  const [ranViewQuery, setRanViewQuery] = useState(initialSqlView?.query || '');
14
- const [askAIButton, setAskAIButton] = useState('Ask AI');
18
+ const [askAIButtonLoading, setAskAIButtonLoading] = useState(false);
19
+ const [runQueryButtonLoading, setRunQueryButtonLoading] = useState(false);
15
20
  const [aiPrompt, setAIPrompt] = useState('');
16
- const [runQueryButtonLabel, setRunQueryButtonLabel] = useState('Run query');
17
21
  const [viewAddable, setViewAddable] = useState(false);
18
22
  const [showFKModal, setShowFKModal] = useState(false);
19
23
  const [overrideFKCheck, setOverrideFKCheck] = useState(false);
20
24
  const [isLoading, setIsLoading] = useState(false);
21
25
  const [tableSearchQuery, setTableSearchQuery] = useState('');
26
+ const [editorMounted, setEditorMounted] = useState(false);
22
27
  const [displayedTableData, setDisplayedTableData] = useState(allTableData);
23
28
  const [errorInfo, setErrorInfo] = useState({ show: false, message: '' });
24
29
  const [tableData, setTableData] = useState(undefined);
@@ -30,7 +35,7 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
30
35
  setShowFKModal(true);
31
36
  return;
32
37
  }
33
- addEditView(initialSqlView ? 'edit' : 'add', ranViewQuery, name, initialSqlView ? initialSqlView.id : undefined);
38
+ addEditView(initialSqlView ? 'edit' : 'add', ranViewQuery, name, initialSqlView ? initialSqlView.id : undefined, tableData?.fields || []);
34
39
  };
35
40
  useEffect(() => {
36
41
  setDisplayedTableData(allTableData);
@@ -38,19 +43,30 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
38
43
  const handleRunSqlPrompt = async () => {
39
44
  setErrorInfo({ show: false, message: '' });
40
45
  setViewAddable(false);
41
- setAskAIButton('Loading...');
46
+ setAskAIButtonLoading(true);
42
47
  const results = await getQueryFromAiWithConnection(aiPrompt, state.client._id, state.client.schemaNames);
43
48
  setOverrideFKCheck(false);
44
49
  setEditViewQuery(results);
45
- setAskAIButton('Ask AI');
50
+ setAskAIButtonLoading(false);
46
51
  };
47
- const handleRunQuery = async () => {
48
- const query = editViewQuery;
52
+ const handleClickSchemaItem = async (event) => {
53
+ const name = event.target.textContent;
54
+ if (!name) {
55
+ return;
56
+ }
57
+ const newQuery = `SELECT * FROM ${processColumnReference(name, state.client.databaseType)};`;
58
+ if (!editViewQuery || editViewQuery.length === 0) {
59
+ setEditViewQuery(newQuery);
60
+ }
61
+ await navigator.clipboard.writeText(newQuery);
62
+ };
63
+ const handleRunQuery = async (overrideQuery) => {
64
+ const query = overrideQuery ? overrideQuery : editViewQuery;
49
65
  // If this query has a limit at the end alert the user
50
- if (query.toLowerCase().includes(' limit ')) {
66
+ if (/limit\s+\d+\s*;?\s*$/i.test(query)) {
51
67
  setErrorInfo({
52
68
  show: true,
53
- message: 'Error: Please remove the limit on you query.',
69
+ message: 'Error: Please remove the limit at the end of your query.',
54
70
  });
55
71
  return;
56
72
  }
@@ -58,11 +74,11 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
58
74
  setErrorInfo({ show: false, message: '' });
59
75
  setTableData(undefined);
60
76
  setIsLoading(true);
61
- setRunQueryButtonLabel('Querying...');
77
+ setRunQueryButtonLoading(true);
62
78
  setOverrideFKCheck(false);
63
- if (editViewQuery.length === 0) {
79
+ if (query.length === 0) {
64
80
  setErrorInfo({ show: true, message: 'Error: Please enter a query.' });
65
- setRunQueryButtonLabel('Run query');
81
+ setRunQueryButtonLoading(false);
66
82
  return;
67
83
  }
68
84
  const resp = await getSqlViewData(state.client._id, query, state.client.databaseType, state.queryEndpoint);
@@ -70,22 +86,48 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
70
86
  setErrorInfo({ show: true, message: resp.error });
71
87
  setTableData(undefined);
72
88
  setViewAddable(false);
73
- setRunQueryButtonLabel('Run query');
89
+ setRunQueryButtonLoading(false);
74
90
  setIsLoading(false);
75
91
  return;
76
92
  }
77
- setRunQueryButtonLabel('Run query');
93
+ setRunQueryButtonLoading(false);
78
94
  setErrorInfo({ show: false, message: '' });
79
95
  // stringify all rows that are either jsonb or json
80
96
  resp.rows = resp.rows.map((row) => {
81
97
  for (const key in row) {
82
- if (typeof row[key] === 'object') {
98
+ if (row[key] !== null && typeof row[key] === 'object') {
83
99
  row[key] = JSON.stringify(row[key]);
84
100
  }
85
101
  }
86
102
  return row;
87
103
  });
88
- setTableData(resp);
104
+ const duplicateColumns = getDuplicateColumns(resp.fields);
105
+ if (duplicateColumns.length > 0) {
106
+ let parsedAST = resp.ast;
107
+ if (Array.isArray(resp.ast)) {
108
+ parsedAST = [0];
109
+ }
110
+ const tableNames = parsedAST.from.map((table) => {
111
+ const db = table.db ? `${table.db}.` : '';
112
+ return `${db}${table.table}`;
113
+ });
114
+ const newAst = processJoinASTWithDuplicateColumns(duplicateColumns, tableNames, allTableData, parsedAST);
115
+ const response = await fetch(`${QUILL_SERVER}/sqlify`, {
116
+ method: 'POST',
117
+ headers: {
118
+ 'Content-Type': 'application/json',
119
+ },
120
+ body: JSON.stringify({
121
+ ast: { ...newAst },
122
+ publicKey: state.client._id,
123
+ }),
124
+ });
125
+ const jsonResponse = await response.json();
126
+ setEditViewQuery(jsonResponse.query);
127
+ await handleRunQuery(jsonResponse.query);
128
+ return;
129
+ }
130
+ setTableData({ fields: resp.fields, rows: resp.rows });
89
131
  setViewAddable(true);
90
132
  setRanViewQuery(query);
91
133
  setIsLoading(false);
@@ -93,7 +135,7 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
93
135
  return (_jsx("div", { style: {
94
136
  ...containerStyle,
95
137
  gap: 6,
96
- height: 'calc(100vh - 188px)',
138
+ height: 'calc(100vh - 130px)',
97
139
  }, children: _jsxs("div", { style: { display: 'flex', height: '100%', flexDirection: 'column' }, children: [_jsx(DynamicBanner, { header: initialSqlView
98
140
  ? `Edit "${initialSqlView.name}" view`
99
141
  : 'Create SQL View', message: initialSqlView
@@ -119,50 +161,62 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
119
161
  }, children: [_jsx("div", { style: {
120
162
  paddingLeft: '20px',
121
163
  paddingRight: '30px',
122
- }, children: _jsx(TextInput, { placeholder: "Search...",
123
- // @ts-ignore
124
- onChange: (e) => {
125
- setTableSearchQuery(e);
164
+ }, children: _jsx(TextInput, { placeholder: "Search...", onChange: (e) => {
165
+ setTableSearchQuery(e.target.value);
126
166
  setDisplayedTableData(allTableData.filter((table) => table.tableName
127
167
  .toLowerCase()
128
- .includes(e.toLowerCase().trim())));
129
- }, value: tableSearchQuery, id: 'edit-name', width: "100%" }) }), _jsx(SchemaListComponent, { schema: displayedTableData, theme: state.theme, LoadingComponent: LoadingComponent, loading: schemaIsLoading, width: '400px' })] }), _jsxs("div", { style: {
168
+ .includes(e.target.value.toLowerCase().trim())));
169
+ }, value: tableSearchQuery, id: 'edit-name', width: '100%' }) }), _jsx(SchemaListComponent, { schema: displayedTableData, theme: state.theme, LoadingComponent: LoadingComponent, loading: schemaIsLoading, width: '400px', onClick: handleClickSchemaItem })] }), _jsxs("div", { style: {
130
170
  display: 'flex',
131
171
  gap: 20,
132
172
  flexDirection: 'column',
133
173
  width: 'calc(100% - 250px)',
134
- height: '100%',
174
+ maxHeight: '100%',
135
175
  overflowX: 'hidden',
136
176
  paddingRight: '24px',
137
177
  }, children: [_jsxs("div", { style: {
138
- display: 'flex',
139
- flexDirection: 'row',
140
- alignItems: 'flex-start',
141
- justifyContent: 'space-between',
178
+ overflow: 'auto',
142
179
  gap: 20,
143
- width: '100%',
144
- }, children: [_jsx(TextInput
145
- // @ts-ignore
146
- , {
147
- // @ts-ignore
148
- onChange: (e) => {
149
- setAIPrompt(e);
150
- }, placeholder: 'Describe a query...', value: aiPrompt, id: 'ai-prompt', width: '95%' }), _jsx(Button, { label: askAIButton, onClick: handleRunSqlPrompt, width: "100px" })] }), _jsx(SqlTextEditor, { value: editViewQuery, setValue: (e) => {
151
- setEditViewQuery(e);
152
- } }), _jsx("div", { style: { width: '200px' }, children: _jsx(Button, { label: runQueryButtonLabel, onClick: handleRunQuery }) }), errorInfo.show ? (_jsx("div", { style: {
153
- fontSize: 15,
154
- fontWeight: '400',
155
- }, children: _jsx("div", { style: {
156
- padding: 30,
157
- background: 'rgba(0,0,0,0.02)',
158
- display: 'inline-block',
159
- flex: 0,
160
- borderRadius: 6,
161
- }, children: errorInfo.message }) })) : null, isLoading && (_jsx("div", { style: {
162
- height: 'calc(100vh - 589px)',
163
- width: '100%',
164
180
  display: 'flex',
165
- justifyContent: 'center',
166
- alignItems: 'center',
167
- }, children: _jsx(LoadingComponent, {}) })), tableData && (_jsx(Table, { rows: tableData.rows, columns: tableData.fields, containerStyle: { height: '360px' } })), viewAddable && (_jsx("div", { style: { width: '200px' }, children: _jsx(Button, { label: `${initialSqlView ? 'Save changes' : 'Create view'}`, onClick: () => addEditSqlView(false) }) }))] })] }), _jsx(ForeignKeyModal, { isOpen: showFKModal, setIsOpen: setShowFKModal, override: addEditSqlView, foreignKey: state.client.customerFieldName, tableName: state.client.customerTableName })] }) }));
181
+ flexDirection: 'column',
182
+ }, children: [_jsxs("div", { style: {
183
+ display: 'flex',
184
+ flexDirection: 'row',
185
+ alignItems: 'flex-start',
186
+ justifyContent: 'space-between',
187
+ gap: 20,
188
+ width: '100%',
189
+ }, children: [_jsx(TextInput, { onChange: (e) => {
190
+ setAIPrompt(e.target.value);
191
+ }, placeholder: 'Describe a query...', value: aiPrompt, id: 'ai-prompt', width: '100%' }), _jsx(Button, { label: 'Ask AI', isLoading: askAIButtonLoading, onClick: handleRunSqlPrompt })] }), _jsx(SqlTextEditor, { value: editViewQuery, setValue: (e) => {
192
+ setEditViewQuery(e);
193
+ }, setEditorMounted: (didMount) => {
194
+ setEditorMounted(didMount);
195
+ }, setPreviousProvier: (provider) => {
196
+ setProvider(provider);
197
+ }, previousProvider: provider, schema: displayedTableData, databaseType: state.client.databaseType }), editorMounted && (_jsx("div", { style: { width: '200px' }, children: _jsx(Button, { label: 'Run query', onClick: () => {
198
+ handleRunQuery();
199
+ } }) })), errorInfo.show ? (_jsx("div", { style: {
200
+ fontSize: 15,
201
+ fontWeight: '400',
202
+ }, children: _jsx("div", { style: {
203
+ padding: 30,
204
+ background: 'rgba(0,0,0,0.02)',
205
+ display: 'inline-block',
206
+ flex: 0,
207
+ borderRadius: 6,
208
+ }, children: errorInfo.message }) })) : null, isLoading && (_jsx("div", { style: {
209
+ height: 'calc(100vh - 589px)',
210
+ width: '100%',
211
+ display: 'flex',
212
+ justifyContent: 'center',
213
+ alignItems: 'center',
214
+ }, children: _jsx(LoadingComponent, {}) })), tableData && (_jsx(Table, { rows: tableData.rows, columns: tableData.fields, containerStyle: { height: '360px', minHeight: 250 } }))] }), viewAddable && (_jsx("div", { style: { width: '200px' }, children: _jsx(Button, { label: `${initialSqlView ? 'Save changes' : 'Create view'}`, onClick: () => {
215
+ const duplicateColumns2 = getDuplicateColumns(tableData?.fields);
216
+ if (duplicateColumns2.length > 0) {
217
+ alert(`Ambiguous column names found. Either use aliases or remove the column to make every column name unique: \n\n${duplicateColumns2.join('\n')}`);
218
+ return;
219
+ }
220
+ addEditSqlView(false);
221
+ } }) }))] })] }), _jsx(ForeignKeyModal, { isOpen: showFKModal, setIsOpen: setShowFKModal, override: addEditSqlView, foreignKey: state.client.customerFieldName, tableName: state.client.customerTableName })] }) }));
168
222
  }
@@ -0,0 +1,3 @@
1
+ declare const useOnClickOutside: (ref: React.RefObject<HTMLDivElement>, handler: (event: any) => void) => void;
2
+ export default useOnClickOutside;
3
+ //# sourceMappingURL=useOnClickOutside.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnClickOutside.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOnClickOutside.tsx"],"names":[],"mappings":"AAEA,QAAA,MAAM,iBAAiB,QAChB,MAAM,SAAS,CAAC,cAAc,CAAC,mBACjB,GAAG,KAAG,IAAI,SAgB9B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { useEffect } from "react";
2
+ const useOnClickOutside = (ref, handler) => {
3
+ useEffect(() => {
4
+ const listener = (event) => {
5
+ if (!ref.current || ref.current.contains(event.target)) {
6
+ return;
7
+ }
8
+ handler(event);
9
+ };
10
+ document.addEventListener("mousedown", listener);
11
+ document.addEventListener("touchstart", listener);
12
+ return () => {
13
+ document.removeEventListener("mousedown", listener);
14
+ document.removeEventListener("touchstart", listener);
15
+ };
16
+ }, [ref, handler]);
17
+ };
18
+ export default useOnClickOutside;
@@ -0,0 +1,17 @@
1
+ export declare function EditFiltersModal({ isOpen, dashboardData, selectedDashboard, client, setIsOpen, onSave, ModalComponent, TextInputComponent, ButtonComponent, HeaderComponent, SelectComponent, dashNames, SecondaryButtonComponent, openEditOrderModal, }: {
2
+ isOpen: boolean;
3
+ dashboardData: any;
4
+ selectedDashboard: any;
5
+ client: any;
6
+ setIsOpen: any;
7
+ onSave: any;
8
+ openEditOrderModal: any;
9
+ ModalComponent: any;
10
+ TextInputComponent: any;
11
+ ButtonComponent: any;
12
+ HeaderComponent: any;
13
+ SelectComponent: any;
14
+ dashNames: any;
15
+ SecondaryButtonComponent: any;
16
+ }): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=EditFiltersModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditFiltersModal.d.ts","sourceRoot":"","sources":["../../../src/modals/EditFiltersModal.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,SAAS,EACT,wBAAwB,EACxB,kBAAkB,GACnB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,GAAG,CAAC;IACnB,iBAAiB,EAAE,GAAG,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,EAAE,GAAG,CAAC;IACf,MAAM,EAAE,GAAG,CAAC;IACZ,kBAAkB,EAAE,GAAG,CAAC;IACxB,cAAc,EAAE,GAAG,CAAC;IACpB,kBAAkB,EAAE,GAAG,CAAC;IACxB,eAAe,EAAE,GAAG,CAAC;IACrB,eAAe,EAAE,GAAG,CAAC;IACrB,eAAe,EAAE,GAAG,CAAC;IACrB,SAAS,EAAE,GAAG,CAAC;IACf,wBAAwB,EAAE,GAAG,CAAC;CAC/B,2CA2nBA"}