@quillsql/admin 1.4.0 → 1.6.0

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 (149) hide show
  1. package/dist/cjs/Admin.d.ts +23 -73
  2. package/dist/cjs/Admin.d.ts.map +1 -1
  3. package/dist/cjs/Admin.js +221 -970
  4. package/dist/cjs/AdminProvider.d.ts +1 -12
  5. package/dist/cjs/AdminProvider.d.ts.map +1 -1
  6. package/dist/cjs/AdminProvider.js +24 -18
  7. package/dist/cjs/api/ConnectionClient.d.ts +11 -0
  8. package/dist/cjs/api/ConnectionClient.d.ts.map +1 -1
  9. package/dist/cjs/api/ConnectionClient.js +84 -10
  10. package/dist/cjs/components/DropDownMenu.js +1 -1
  11. package/dist/cjs/components/DropDownMenuWithLabel.d.ts.map +1 -1
  12. package/dist/cjs/components/DropDownMenuWithLabel.js +16 -54
  13. package/dist/cjs/components/OrgSelect.d.ts.map +1 -1
  14. package/dist/cjs/components/OrgSelect.js +10 -20
  15. package/dist/cjs/components/QuillSelect.d.ts +3 -0
  16. package/dist/cjs/components/QuillSelect.d.ts.map +1 -0
  17. package/dist/cjs/components/QuillSelect.js +137 -0
  18. package/dist/cjs/components/SegmentedControl.d.ts +7 -0
  19. package/dist/cjs/components/SegmentedControl.d.ts.map +1 -0
  20. package/dist/cjs/components/SegmentedControl.js +54 -0
  21. package/dist/cjs/components/UiComponents.d.ts +18 -29
  22. package/dist/cjs/components/UiComponents.d.ts.map +1 -1
  23. package/dist/cjs/components/UiComponents.js +40 -83
  24. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts +2 -1
  25. package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  26. package/dist/cjs/forms/client_onboard/ConnectSchema.js +143 -68
  27. package/dist/cjs/forms/client_onboard/CreateSqlViews.d.ts.map +1 -1
  28. package/dist/cjs/forms/client_onboard/CreateSqlViews.js +40 -11
  29. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts +7 -4
  30. package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts.map +1 -1
  31. package/dist/cjs/forms/sql_views/CreateEditSqlView.js +36 -20
  32. package/dist/cjs/hooks/useOnClickOutside.d.ts +3 -0
  33. package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -0
  34. package/dist/cjs/hooks/useOnClickOutside.js +20 -0
  35. package/dist/cjs/modals/EditFiltersModal.d.ts +17 -0
  36. package/dist/cjs/modals/EditFiltersModal.d.ts.map +1 -0
  37. package/dist/cjs/modals/EditFiltersModal.js +345 -0
  38. package/dist/cjs/modals/NewDashboardModal.d.ts +1 -3
  39. package/dist/cjs/modals/NewDashboardModal.d.ts.map +1 -1
  40. package/dist/cjs/modals/NewDashboardModal.js +63 -46
  41. package/dist/cjs/modals/PromoteDashModal.d.ts.map +1 -1
  42. package/dist/cjs/modals/PromoteDashModal.js +10 -3
  43. package/dist/cjs/modals/ReorderDashboardModal.d.ts.map +1 -1
  44. package/dist/cjs/modals/ReorderDashboardModal.js +202 -90
  45. package/dist/cjs/modals/index.d.ts +0 -1
  46. package/dist/cjs/modals/index.d.ts.map +1 -1
  47. package/dist/cjs/modals/index.js +1 -3
  48. package/dist/cjs/primitives/ButtonPrimitive.d.ts +3 -1
  49. package/dist/cjs/primitives/ButtonPrimitive.d.ts.map +1 -1
  50. package/dist/cjs/primitives/ButtonPrimitive.js +5 -3
  51. package/dist/cjs/primitives/ModalPrimitive.d.ts.map +1 -1
  52. package/dist/cjs/primitives/ModalPrimitive.js +1 -2
  53. package/dist/cjs/primitives/TogglePrimitive.js +5 -5
  54. package/dist/cjs/public_components/CreateEnvironment.d.ts.map +1 -1
  55. package/dist/cjs/public_components/CreateEnvironment.js +1 -1
  56. package/dist/cjs/public_components/DashboardBuilder.d.ts.map +1 -1
  57. package/dist/cjs/public_components/DashboardBuilder.js +127 -30
  58. package/dist/cjs/public_components/DashboardManager.d.ts.map +1 -1
  59. package/dist/cjs/public_components/DashboardManager.js +161 -193
  60. package/dist/cjs/public_components/SQLViewManager.d.ts.map +1 -1
  61. package/dist/cjs/public_components/SQLViewManager.js +92 -24
  62. package/dist/cjs/utils/constants.d.ts +4 -4
  63. package/dist/cjs/utils/constants.js +2 -2
  64. package/dist/cjs/utils/schema.d.ts +6 -0
  65. package/dist/cjs/utils/schema.d.ts.map +1 -1
  66. package/dist/cjs/utils/table.d.ts +1 -0
  67. package/dist/cjs/utils/table.d.ts.map +1 -1
  68. package/dist/cjs/utils/table.js +13 -0
  69. package/dist/cjs/utils/textProcessing.d.ts +2 -0
  70. package/dist/cjs/utils/textProcessing.d.ts.map +1 -0
  71. package/dist/cjs/utils/textProcessing.js +9 -0
  72. package/dist/esm/Admin.d.ts +23 -73
  73. package/dist/esm/Admin.d.ts.map +1 -1
  74. package/dist/esm/Admin.js +225 -964
  75. package/dist/esm/AdminProvider.d.ts +1 -12
  76. package/dist/esm/AdminProvider.d.ts.map +1 -1
  77. package/dist/esm/AdminProvider.js +25 -19
  78. package/dist/esm/api/ConnectionClient.d.ts +11 -0
  79. package/dist/esm/api/ConnectionClient.d.ts.map +1 -1
  80. package/dist/esm/api/ConnectionClient.js +82 -9
  81. package/dist/esm/components/DropDownMenu.js +1 -1
  82. package/dist/esm/components/DropDownMenuWithLabel.d.ts.map +1 -1
  83. package/dist/esm/components/DropDownMenuWithLabel.js +16 -54
  84. package/dist/esm/components/OrgSelect.d.ts.map +1 -1
  85. package/dist/esm/components/OrgSelect.js +6 -19
  86. package/dist/esm/components/QuillSelect.d.ts +3 -0
  87. package/dist/esm/components/QuillSelect.d.ts.map +1 -0
  88. package/dist/esm/components/QuillSelect.js +130 -0
  89. package/dist/esm/components/SegmentedControl.d.ts +7 -0
  90. package/dist/esm/components/SegmentedControl.d.ts.map +1 -0
  91. package/dist/esm/components/SegmentedControl.js +50 -0
  92. package/dist/esm/components/UiComponents.d.ts +18 -29
  93. package/dist/esm/components/UiComponents.d.ts.map +1 -1
  94. package/dist/esm/components/UiComponents.js +37 -82
  95. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts +2 -1
  96. package/dist/esm/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
  97. package/dist/esm/forms/client_onboard/ConnectSchema.js +145 -70
  98. package/dist/esm/forms/client_onboard/CreateSqlViews.d.ts.map +1 -1
  99. package/dist/esm/forms/client_onboard/CreateSqlViews.js +41 -12
  100. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts +7 -4
  101. package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts.map +1 -1
  102. package/dist/esm/forms/sql_views/CreateEditSqlView.js +38 -22
  103. package/dist/esm/hooks/useOnClickOutside.d.ts +3 -0
  104. package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -0
  105. package/dist/esm/hooks/useOnClickOutside.js +18 -0
  106. package/dist/esm/modals/EditFiltersModal.d.ts +17 -0
  107. package/dist/esm/modals/EditFiltersModal.d.ts.map +1 -0
  108. package/dist/esm/modals/EditFiltersModal.js +338 -0
  109. package/dist/esm/modals/NewDashboardModal.d.ts +1 -3
  110. package/dist/esm/modals/NewDashboardModal.d.ts.map +1 -1
  111. package/dist/esm/modals/NewDashboardModal.js +63 -46
  112. package/dist/esm/modals/PromoteDashModal.d.ts.map +1 -1
  113. package/dist/esm/modals/PromoteDashModal.js +10 -3
  114. package/dist/esm/modals/ReorderDashboardModal.d.ts.map +1 -1
  115. package/dist/esm/modals/ReorderDashboardModal.js +201 -89
  116. package/dist/esm/modals/index.d.ts +0 -1
  117. package/dist/esm/modals/index.d.ts.map +1 -1
  118. package/dist/esm/modals/index.js +0 -1
  119. package/dist/esm/primitives/ButtonPrimitive.d.ts +3 -1
  120. package/dist/esm/primitives/ButtonPrimitive.d.ts.map +1 -1
  121. package/dist/esm/primitives/ButtonPrimitive.js +5 -3
  122. package/dist/esm/primitives/ModalPrimitive.d.ts.map +1 -1
  123. package/dist/esm/primitives/ModalPrimitive.js +1 -2
  124. package/dist/esm/primitives/TogglePrimitive.js +5 -5
  125. package/dist/esm/public_components/CreateEnvironment.d.ts.map +1 -1
  126. package/dist/esm/public_components/CreateEnvironment.js +1 -1
  127. package/dist/esm/public_components/DashboardBuilder.d.ts.map +1 -1
  128. package/dist/esm/public_components/DashboardBuilder.js +128 -31
  129. package/dist/esm/public_components/DashboardManager.d.ts.map +1 -1
  130. package/dist/esm/public_components/DashboardManager.js +163 -195
  131. package/dist/esm/public_components/SQLViewManager.d.ts.map +1 -1
  132. package/dist/esm/public_components/SQLViewManager.js +92 -24
  133. package/dist/esm/utils/constants.d.ts +4 -4
  134. package/dist/esm/utils/constants.js +2 -2
  135. package/dist/esm/utils/schema.d.ts +6 -0
  136. package/dist/esm/utils/schema.d.ts.map +1 -1
  137. package/dist/esm/utils/table.d.ts +1 -0
  138. package/dist/esm/utils/table.d.ts.map +1 -1
  139. package/dist/esm/utils/table.js +11 -1
  140. package/dist/esm/utils/textProcessing.d.ts +2 -0
  141. package/dist/esm/utils/textProcessing.d.ts.map +1 -0
  142. package/dist/esm/utils/textProcessing.js +5 -0
  143. package/package.json +1 -1
  144. package/dist/cjs/modals/EditDashboardsModal.d.ts +0 -20
  145. package/dist/cjs/modals/EditDashboardsModal.d.ts.map +0 -1
  146. package/dist/cjs/modals/EditDashboardsModal.js +0 -94
  147. package/dist/esm/modals/EditDashboardsModal.d.ts +0 -20
  148. package/dist/esm/modals/EditDashboardsModal.d.ts.map +0 -1
  149. package/dist/esm/modals/EditDashboardsModal.js +0 -91
@@ -1,12 +1,38 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
- import { ButtonPrimitive } from '../../primitives';
3
+ import { ButtonPrimitive, TextInputPrimitive } from '../../primitives';
4
4
  import DropdownMenuWithLabel from '../../components/DropDownMenuWithLabel';
5
- import { getFKInfo, getOrgInfo, getSchemaTableInfo, getTableInfo, getTablesBySchema, } from '../../api/ConnectionClient';
6
- export default function ConnectSchema({ containerStyle, header1Style, header2Style, allSchemaInfo, environmentDetails, propogateSchemaDetails, initialError, clientId, parentRef, }) {
5
+ import { getFKInfo, getOrgInfo, getSchemaTableInfo, getSqlViewData, getTableInfo, getTablesBySchema, processCustomerOrgViewQuery, } from '../../api/ConnectionClient';
6
+ export default function ConnectSchema({ containerStyle, header1Style, header2Style, allSchemaInfo, environmentDetails, propogateSchemaDetails, initialError, clientId, parentRef, state, }) {
7
7
  const [schemaDetails, setSchemaDetails] = useState(allSchemaInfo);
8
8
  const [schemaError, setSchemaError] = useState(initialError);
9
9
  const [formError, setFormError] = useState({ show: false, message: '' });
10
+ const [runQueryButtonLabel, setRunQueryButtonLabel] = useState('Run query');
11
+ const [errorInfo, setErrorInfo] = useState({ status: false, msg: '' });
12
+ const [customerViewQuery, setCustomerViewQuery] = useState('');
13
+ const handleQuerySuccess = async (getSqlResults) => {
14
+ const processedResults = await processCustomerOrgViewQuery(customerViewQuery, allSchemaInfo?.selectedFields.schema || '', clientId);
15
+ if (processedResults.success === false) {
16
+ setErrorInfo({
17
+ status: true,
18
+ msg: processedResults.message || 'Failed to process the query.',
19
+ });
20
+ return;
21
+ }
22
+ setSchemaDetails({
23
+ ...schemaDetails,
24
+ // @ts-ignore
25
+ selectedFields: {
26
+ ...schemaDetails?.selectedFields,
27
+ table: processedResults.table,
28
+ organizationIdField: 'id',
29
+ customerNameField: 'name',
30
+ customerView: customerViewQuery,
31
+ },
32
+ customQueryFKs: processedResults.fkInfo,
33
+ customQueryOrganizations: getSqlResults.rows,
34
+ });
35
+ };
10
36
  return (_jsxs("div", { style: { ...containerStyle }, id: "connect-database-form", children: [_jsx("h1", { style: header1Style, children: "Select Organization Table" }), _jsx("h2", { style: header2Style, children: "Select which table you use for organizations (your customers). Quill uses this table to partition data by organization." }), _jsxs("div", { style: {
11
37
  marginTop: 16,
12
38
  width: '100%',
@@ -60,92 +86,141 @@ export default function ConnectSchema({ containerStyle, header1Style, header2Sty
60
86
  else {
61
87
  setSchemaError(suspectedSchema);
62
88
  }
63
- } }))] }), schemaDetails?.tables && (_jsxs("div", { children: [_jsx("div", { style: { gap: 16 }, id: "database-details-form", children: _jsxs("div", {
64
- // style={{
65
- // display: 'flex',
66
- // flexWrap: 'wrap',
67
- // width: '100%',
68
- // gap: '16px',
69
- // }}
70
- style: {
71
- display: 'grid',
72
- gridTemplateColumns: 'repeat(3, 1fr)',
73
- gap: '20px',
74
- justifyContent: 'space-between',
75
- marginTop: '8px',
76
- }, children: [_jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.tables || [], setSelected: async (e) => {
77
- const columns = await getTableInfo(clientId, schemaDetails?.selectedFields?.schema, e);
78
- setSchemaDetails({
79
- ...schemaDetails,
80
- columns: columns.columns,
81
- foreignKeys: [],
82
- organizations: [],
83
- selectedFields: {
84
- schema: schemaDetails?.selectedFields?.schema,
85
- table: e,
86
- },
87
- });
88
- }, selected: schemaDetails?.selectedFields?.table, label: 'Organization table' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.columns || [], setSelected: async (e) => {
89
- const fkStrings = await getFKInfo(clientId, schemaDetails?.selectedFields?.schema, schemaDetails?.selectedFields?.table, e);
90
- if (schemaDetails?.selectedFields.customerNameField) {
91
- const organizations = await getOrgInfo(clientId, schemaDetails?.selectedFields?.schema, schemaDetails?.selectedFields?.table, e, schemaDetails?.selectedFields.customerNameField);
89
+ } }))] }), schemaDetails?.tables && (_jsxs("div", { children: [_jsxs("div", { style: { gap: 16 }, id: "database-details-form", children: [_jsxs("div", {
90
+ // style={{
91
+ // display: 'flex',
92
+ // flexWrap: 'wrap',
93
+ // width: '100%',
94
+ // gap: '16px',
95
+ // }}
96
+ style: {
97
+ display: 'grid',
98
+ gridTemplateColumns: 'repeat(3, 1fr)',
99
+ gap: '20px',
100
+ justifyContent: 'space-between',
101
+ marginTop: '8px',
102
+ }, children: [_jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.tables || [], setSelected: async (e) => {
103
+ const columns = await getTableInfo(clientId, schemaDetails?.selectedFields?.schema, e);
92
104
  setSchemaDetails({
93
105
  ...schemaDetails,
94
- organizations: organizations,
106
+ columns: columns.columns,
107
+ foreignKeys: [],
108
+ organizations: [],
109
+ selectedFields: {
110
+ schema: schemaDetails?.selectedFields?.schema,
111
+ table: e,
112
+ },
113
+ });
114
+ }, selected: schemaDetails?.selectedFields?.table, label: 'Organization table' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.columns || [], setSelected: async (e) => {
115
+ const fkStrings = await getFKInfo(clientId, schemaDetails?.selectedFields?.schema, schemaDetails?.selectedFields?.table, e);
116
+ if (schemaDetails?.selectedFields.customerNameField) {
117
+ const organizations = await getOrgInfo(clientId, schemaDetails?.selectedFields?.schema, schemaDetails?.selectedFields?.table, e, schemaDetails?.selectedFields.customerNameField);
118
+ setSchemaDetails({
119
+ ...schemaDetails,
120
+ organizations: organizations,
121
+ selectedFields: {
122
+ ...schemaDetails?.selectedFields,
123
+ organizationIdField: e,
124
+ },
125
+ });
126
+ }
127
+ setSchemaDetails({
128
+ ...schemaDetails,
129
+ foreignKeys: fkStrings,
95
130
  selectedFields: {
96
131
  ...schemaDetails?.selectedFields,
97
132
  organizationIdField: e,
98
133
  },
99
134
  });
100
- }
101
- setSchemaDetails({
102
- ...schemaDetails,
103
- foreignKeys: fkStrings,
104
- selectedFields: {
105
- ...schemaDetails?.selectedFields,
106
- organizationIdField: e,
107
- },
108
- });
109
- }, selected: schemaDetails?.selectedFields?.organizationIdField, label: 'Organization ID field' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.columns || [], setSelected: async (e) => {
110
- if (schemaDetails?.selectedFields.organizationIdField) {
111
- const organizations = await getOrgInfo(clientId, schemaDetails?.selectedFields?.schema, schemaDetails?.selectedFields?.table, schemaDetails?.selectedFields.organizationIdField, e);
135
+ }, selected: schemaDetails?.selectedFields?.organizationIdField, label: 'Organization ID field' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.columns || [], setSelected: async (e) => {
136
+ if (schemaDetails?.selectedFields.organizationIdField) {
137
+ const organizations = await getOrgInfo(clientId, schemaDetails?.selectedFields?.schema, schemaDetails?.selectedFields?.table, schemaDetails?.selectedFields.organizationIdField, e);
138
+ setSchemaDetails({
139
+ ...schemaDetails,
140
+ organizations: organizations,
141
+ selectedFields: {
142
+ ...schemaDetails?.selectedFields,
143
+ customerNameField: e,
144
+ },
145
+ });
146
+ }
147
+ else {
148
+ setSchemaDetails({
149
+ ...schemaDetails,
150
+ selectedFields: {
151
+ ...schemaDetails?.selectedFields,
152
+ customerNameField: e,
153
+ },
154
+ });
155
+ }
156
+ }, selected: schemaDetails?.selectedFields?.customerNameField, label: 'Organization name field' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.organizations?.map((orgObj) => orgObj.name) ||
157
+ [], setSelected: async (e) => {
158
+ const orgObj = schemaDetails?.organizations?.find((orgObj) => orgObj.name === e);
112
159
  setSchemaDetails({
113
160
  ...schemaDetails,
114
- organizations: organizations,
115
161
  selectedFields: {
116
162
  ...schemaDetails?.selectedFields,
117
- customerNameField: e,
163
+ defaultOrg: orgObj,
118
164
  },
119
165
  });
120
- }
121
- else {
166
+ }, selected: schemaDetails?.selectedFields?.defaultOrg?.name, label: 'Default organization' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.foreignKeys || [], setSelected: async (e) => {
122
167
  setSchemaDetails({
123
168
  ...schemaDetails,
124
169
  selectedFields: {
125
170
  ...schemaDetails?.selectedFields,
126
- customerNameField: e,
171
+ foreignKey: e,
127
172
  },
128
173
  });
129
- }
130
- }, selected: schemaDetails?.selectedFields?.customerNameField, label: 'Organization name field' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.organizations?.map((orgObj) => orgObj.name) ||
131
- [], setSelected: async (e) => {
132
- const orgObj = schemaDetails?.organizations?.find((orgObj) => orgObj.name === e);
133
- setSchemaDetails({
134
- ...schemaDetails,
135
- selectedFields: {
136
- ...schemaDetails?.selectedFields,
137
- defaultOrg: orgObj,
138
- },
139
- });
140
- }, selected: schemaDetails?.selectedFields?.defaultOrg?.name, label: 'Default organization' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.foreignKeys || [], setSelected: async (e) => {
141
- setSchemaDetails({
142
- ...schemaDetails,
143
- selectedFields: {
144
- ...schemaDetails?.selectedFields,
145
- foreignKey: e,
146
- },
147
- });
148
- }, selected: schemaDetails?.selectedFields?.foreignKey, label: 'Foreign key' })] }) }), _jsxs("div", { style: {
174
+ }, selected: schemaDetails?.selectedFields?.foreignKey, label: 'Foreign key' })] }), _jsxs("div", { style: {
175
+ ...header1Style,
176
+ textAlign: 'center',
177
+ fontSize: 14,
178
+ color: '#565656',
179
+ display: 'flex',
180
+ flexDirection: 'row',
181
+ alignItems: 'center',
182
+ paddingTop: 24,
183
+ paddingBottom: 0,
184
+ }, children: [_jsx("div", { style: { width: '100%', height: 1, background: '#e7e7e7' } }), _jsx("div", { style: { padding: 12 }, children: "or" }), _jsx("div", { style: { width: '100%', height: 1, background: '#e7e7e7' } })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: [_jsxs("div", { children: [_jsx("h2", { style: { ...header2Style, fontWeight: 600, color: "#6e6e6e" }, children: "Customer Organization View" }), _jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: '16px' }, children: [_jsx(TextInputPrimitive, { onChange: (e) => {
185
+ setCustomerViewQuery(e.target.value);
186
+ }, value: customerViewQuery }), _jsx(ButtonPrimitive, { label: runQueryButtonLabel, onClick: async () => {
187
+ setRunQueryButtonLabel('Querying...');
188
+ const getSqlResults = await getSqlViewData(clientId, customerViewQuery, environmentDetails.type, state.queryEndpoint);
189
+ if (!getSqlResults.success) {
190
+ setErrorInfo({
191
+ status: true,
192
+ msg: getSqlResults.error,
193
+ });
194
+ }
195
+ else {
196
+ setErrorInfo({ status: false, msg: '' });
197
+ handleQuerySuccess(getSqlResults);
198
+ }
199
+ setRunQueryButtonLabel('Run query');
200
+ },
201
+ // dont let the font wrap
202
+ style: { whiteSpace: 'nowrap' } })] })] }), _jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: '16px' }, children: [_jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.customQueryOrganizations?.map((orgObj) => orgObj.name) || [], setSelected: async (e) => {
203
+ const orgObj = schemaDetails?.customQueryOrganizations?.find((orgObj) => orgObj.name === e);
204
+ setSchemaDetails({
205
+ ...schemaDetails,
206
+ selectedFields: {
207
+ ...schemaDetails?.selectedFields,
208
+ defaultOrg: orgObj,
209
+ },
210
+ });
211
+ }, selected: schemaDetails?.selectedFields?.defaultOrg?.name, label: 'Default organization' }), _jsx(DropdownMenuWithLabel, { parentRef: parentRef, items: schemaDetails?.customQueryFKs || [], setSelected: async (e) => {
212
+ setSchemaDetails({
213
+ ...schemaDetails,
214
+ selectedFields: {
215
+ ...schemaDetails?.selectedFields,
216
+ foreignKey: e,
217
+ },
218
+ });
219
+ }, selected: schemaDetails?.selectedFields?.foreignKey, label: 'Foreign key' })] }), errorInfo.status ? (_jsx("h2", { style: {
220
+ ...header2Style,
221
+ color: 'red',
222
+ paddingTop: '12px',
223
+ }, children: errorInfo.msg })) : (_jsx("div", {}))] })] }), _jsxs("div", { style: {
149
224
  width: '100%',
150
225
  display: 'flex',
151
226
  justifyContent: 'space-between',
@@ -1 +1 @@
1
- {"version":3,"file":"CreateSqlViews.d.ts","sourceRoot":"","sources":["../../../../src/forms/client_onboard/CreateSqlViews.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAuB,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAa3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAwB,MAAM,uBAAuB,CAAC;AAK7E,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,KAAK,GACN,EAAE;IACD,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kBAAkB,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;CACZ,2CAiWA;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,GACV,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,2CAiDA"}
1
+ {"version":3,"file":"CreateSqlViews.d.ts","sourceRoot":"","sources":["../../../../src/forms/client_onboard/CreateSqlViews.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAuB,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAY3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAwB,MAAM,uBAAuB,CAAC;AAS7E,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,KAAK,GACN,EAAE;IACD,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,kBAAkB,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;CACZ,2CA0ZA;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,GACV,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,2CAiDA"}
@@ -4,7 +4,8 @@ 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 { QuillTable } from '@quillsql/react';
7
+ import { SchemaListComponent, Table } from '@quillsql/react';
8
+ import { LoadingSpinner, } from '../../components/UiComponents';
8
9
  export default function CreateSQLViews({ containerStyle, header1Style, header2Style, columnsByTable, environmentDetails, allSchemaInfo, domainName, completeOnboarding, clientId, state, }) {
9
10
  const [selectedTable, setSelectedTable] = useState(undefined);
10
11
  const [queryInfo, setQueryInfo] = useState({
@@ -17,9 +18,11 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
17
18
  const [tableData, setTableData] = useState(undefined);
18
19
  const [client, setClient] = useState(undefined);
19
20
  const [sqlTables, setSqlTables] = useState([]);
20
- const [askAIButton, setAskAIButton] = useState('Ask AI');
21
- const [runQueryButtonLabel, setRunQueryButtonLabel] = useState('Run query');
21
+ const [askAIButtonLoading, setAskAIButtonLoading] = useState(false);
22
+ const [runQueryButtonLoading, setRunQueryButtonLoading] = useState(false);
22
23
  const [showFKModal, setShowFKModal] = useState(false);
24
+ const [tableSearchQuery, setTableSearchQuery] = useState('');
25
+ const [displayedTableData, setDisplayedTableData] = useState(columnsByTable);
23
26
  const addSqlView = async (override) => {
24
27
  const results = await createSQLView(environmentDetails, allSchemaInfo, columnsByTable, queryInfo, client, domainName, tableData, sqlTables.map((e) => {
25
28
  return e.name;
@@ -37,6 +40,15 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
37
40
  setSqlQueryInfo({ msg: results.message, status: true });
38
41
  }
39
42
  };
43
+ const handleClickSchemaItem = async (event) => {
44
+ const name = event.target.textContent;
45
+ if (queryInfo.query && queryInfo.query.length > 0) {
46
+ await navigator.clipboard.writeText(name || '');
47
+ }
48
+ else {
49
+ setQueryInfo({ name: queryInfo.name, query: `SELECT * FROM ${name}` });
50
+ }
51
+ };
40
52
  useEffect(() => {
41
53
  window.scrollTo({
42
54
  behavior: 'smooth',
@@ -58,7 +70,24 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
58
70
  flexDirection: 'row',
59
71
  borderTop: 'solid 1px #e7e7e7',
60
72
  height: 'calc(100vh - 143px)',
61
- }, children: [_jsxs("div", { id: "form-editor-table", style: {
73
+ }, children: [_jsxs("div", { style: {
74
+ display: 'flex',
75
+ flexDirection: 'column',
76
+ }, children: [_jsx("div", { style: {
77
+ paddingLeft: '20px',
78
+ paddingRight: '30px',
79
+ height: 70,
80
+ minHeight: 70,
81
+ display: 'flex',
82
+ alignItems: 'center',
83
+ }, children: _jsx(TextInputPrimitive, { placeholder: "Search...",
84
+ // @ts-ignore
85
+ onChange: (e) => {
86
+ setTableSearchQuery(e.target.value);
87
+ setDisplayedTableData(columnsByTable.filter((table) => table.tableName
88
+ .toLowerCase()
89
+ .includes(e.target.value.toLowerCase().trim())));
90
+ }, value: tableSearchQuery, width: "100%" }) }), _jsx(SchemaListComponent, { schema: displayedTableData, theme: state.theme, width: '300px', loading: false, LoadingComponent: LoadingSpinner, onClick: handleClickSchemaItem })] }), _jsxs("div", { id: "form-editor-table", style: {
62
91
  display: 'flex',
63
92
  flexDirection: 'column',
64
93
  width: 'calc(100% - 300px)',
@@ -73,13 +102,13 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
73
102
  height: 70,
74
103
  }, children: [_jsx(TextInputPrimitive, { onChange: (e) => {
75
104
  setAIPrompt(e.target.value);
76
- }, placeholder: 'Describe a query...', value: aiPrompt }), _jsx(ButtonPrimitive, { label: askAIButton, onClick: async () => {
77
- setAskAIButton('Loading...');
105
+ }, placeholder: 'Describe a query...', value: aiPrompt }), _jsx(ButtonPrimitive, { label: 'Ask AI', isLoading: askAIButtonLoading, onClick: async () => {
106
+ setAskAIButtonLoading(true);
78
107
  const results = await getQueryFromAiWithConnection(aiPrompt, clientId, allSchemaInfo?.selectedFields.schema
79
108
  ? [allSchemaInfo?.selectedFields.schema]
80
109
  : undefined);
81
110
  setQueryInfo({ name: queryInfo.name, query: results });
82
- setAskAIButton('Ask AI');
111
+ setAskAIButtonLoading(false);
83
112
  }, style: { width: '90px' } })] }), _jsx(SqlTextEditor, { value: queryInfo.query, setValue: (e) => {
84
113
  setQueryInfo({ name: queryInfo.name, query: e });
85
114
  }, containerStyle: { paddingLeft: 16, paddingRight: 16 } }), _jsxs("div", { style: {
@@ -90,8 +119,8 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
90
119
  paddingLeft: 16,
91
120
  paddingRight: 16,
92
121
  height: 70,
93
- }, children: [_jsx(ButtonPrimitive, { label: runQueryButtonLabel, onClick: async () => {
94
- setRunQueryButtonLabel('Querying...');
122
+ }, children: [_jsx(ButtonPrimitive, { label: 'Run query', onClick: async () => {
123
+ setRunQueryButtonLoading(true);
95
124
  const getSqlResults = await getSqlViewData(clientId, queryInfo.query, environmentDetails.type, state.queryEndpoint);
96
125
  if (!getSqlResults.success) {
97
126
  setErrorInfo({ status: true, msg: getSqlResults.error });
@@ -100,7 +129,7 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
100
129
  setErrorInfo({ status: false, msg: '' });
101
130
  setTableData(getSqlResults);
102
131
  }
103
- setRunQueryButtonLabel('Run query');
132
+ setRunQueryButtonLoading(false);
104
133
  } }), errorInfo.status ? (_jsx("h2", { style: {
105
134
  ...header2Style,
106
135
  color: 'red',
@@ -110,10 +139,10 @@ export default function CreateSQLViews({ containerStyle, header1Style, header2St
110
139
  paddingLeft: 16,
111
140
  paddingRight: 16,
112
141
  height: 'calc(100vh - 515px)',
113
- }, children: [_jsx(QuillTable, { rows: tableData.rows, columns: tableData.fields, containerStyle: {
142
+ }, children: [_jsx(Table, { rows: tableData.rows, columns: tableData.fields, containerStyle: {
114
143
  height: 'calc(100vh - 589px)',
115
144
  width: '100%',
116
- }, showDownloadCSVButton: true }), _jsxs("div", { style: {
145
+ }, hideCSVDownloadButton: true }), _jsxs("div", { style: {
117
146
  width: '100%',
118
147
  display: 'flex',
119
148
  justifyContent: 'space-between',
@@ -1,5 +1,6 @@
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 { TextInputComponentProps } from '../../components/UiComponents';
3
4
  import { ColumnsByTable } from '../../utils/table';
4
5
  interface CreateEditSqlViewProps {
5
6
  containerStyle: React.CSSProperties;
@@ -12,9 +13,11 @@ interface CreateEditSqlViewProps {
12
13
  SecondaryButtonComponent?: (props: ButtonComponentProps) => JSX.Element;
13
14
  TextInput?: (props: TextInputComponentProps) => JSX.Element;
14
15
  LoadingComponent?: () => JSX.Element;
15
- Header?: (props: HeaderProps) => JSX.Element;
16
+ Header?: (props: {
17
+ children: ReactNode;
18
+ }) => JSX.Element;
16
19
  closeEditView: () => void;
17
- addEditView: (request: string, query: string, name?: string, id?: string) => void;
20
+ addEditView: (request: string, query: string, name?: string, id?: string, columns?: any[]) => void;
18
21
  allTableData: ColumnsByTable[];
19
22
  schemaIsLoading: boolean;
20
23
  }
@@ -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,EAEZ,MAAM,iBAAiB,CAAC;AAwBzB,OAAO,EAAU,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAK3D,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,CAuStC"}
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;AAEzB,OAAO,EAEL,SAAS,EAKV,MAAM,OAAO,CAAC;AASf,OAAO,EAML,uBAAuB,EACxB,MAAM,+BAA+B,CAAC;AAEvC,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;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,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,CAgUtC"}
@@ -1,20 +1,19 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { QuillTable } from '@quillsql/react';
3
- import { useEffect, useState } from 'react';
2
+ import { Table, SchemaListComponent, } from '@quillsql/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
- import { SchemaListComponent } from '@quillsql/react';
9
8
  import { ForeignKeyModal } from '../client_onboard/CreateSqlViews';
10
9
  import DynamicBanner from '../../components/DynamicBanner';
11
10
  export default function CreateEditSqlView({ containerStyle, initialSqlView, closeEditView, addEditView, SecondaryButtonComponent, LoadingComponent = () => _jsx(LoadingSpinner, {}), Button = MemoizedButton, TextInput = MemoizedTextInput, Header = MemoizedHeader, allTableData, schemaIsLoading, }) {
12
11
  const [name, setName] = useState(initialSqlView?.name || '');
13
12
  const [editViewQuery, setEditViewQuery] = useState(initialSqlView?.query || '');
14
13
  const [ranViewQuery, setRanViewQuery] = useState(initialSqlView?.query || '');
15
- const [askAIButton, setAskAIButton] = useState('Ask AI');
14
+ const [askAIButtonLoading, setAskAIButtonLoading] = useState(false);
15
+ const [runQueryButtonLoading, setRunQueryButtonLoading] = useState(false);
16
16
  const [aiPrompt, setAIPrompt] = useState('');
17
- const [runQueryButtonLabel, setRunQueryButtonLabel] = useState('Run query');
18
17
  const [viewAddable, setViewAddable] = useState(false);
19
18
  const [showFKModal, setShowFKModal] = useState(false);
20
19
  const [overrideFKCheck, setOverrideFKCheck] = useState(false);
@@ -31,7 +30,7 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
31
30
  setShowFKModal(true);
32
31
  return;
33
32
  }
34
- addEditView(initialSqlView ? 'edit' : 'add', ranViewQuery, name, initialSqlView ? initialSqlView.id : undefined);
33
+ addEditView(initialSqlView ? 'edit' : 'add', ranViewQuery, name, initialSqlView ? initialSqlView.id : undefined, tableData?.fields || []);
35
34
  };
36
35
  useEffect(() => {
37
36
  setDisplayedTableData(allTableData);
@@ -39,19 +38,28 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
39
38
  const handleRunSqlPrompt = async () => {
40
39
  setErrorInfo({ show: false, message: '' });
41
40
  setViewAddable(false);
42
- setAskAIButton('Loading...');
41
+ setAskAIButtonLoading(true);
43
42
  const results = await getQueryFromAiWithConnection(aiPrompt, state.client._id, state.client.schemaNames);
44
43
  setOverrideFKCheck(false);
45
44
  setEditViewQuery(results);
46
- setAskAIButton('Ask AI');
45
+ setAskAIButtonLoading(false);
46
+ };
47
+ const handleClickSchemaItem = async (event) => {
48
+ const name = event.target.textContent;
49
+ if (editViewQuery && editViewQuery.length > 0) {
50
+ await navigator.clipboard.writeText(name || '');
51
+ }
52
+ else {
53
+ setEditViewQuery(`SELECT * FROM ${name}`);
54
+ }
47
55
  };
48
56
  const handleRunQuery = async () => {
49
57
  const query = editViewQuery;
50
58
  // If this query has a limit at the end alert the user
51
- if (query.toLowerCase().includes(' limit ')) {
59
+ if (/limit\s+\d+\s*;?\s*$/i.test(query)) {
52
60
  setErrorInfo({
53
61
  show: true,
54
- message: 'Error: Please remove the limit on you query.',
62
+ message: 'Error: Please remove the limit at the end of your query.',
55
63
  });
56
64
  return;
57
65
  }
@@ -59,11 +67,11 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
59
67
  setErrorInfo({ show: false, message: '' });
60
68
  setTableData(undefined);
61
69
  setIsLoading(true);
62
- setRunQueryButtonLabel('Querying...');
70
+ setRunQueryButtonLoading(true);
63
71
  setOverrideFKCheck(false);
64
72
  if (editViewQuery.length === 0) {
65
73
  setErrorInfo({ show: true, message: 'Error: Please enter a query.' });
66
- setRunQueryButtonLabel('Run query');
74
+ setRunQueryButtonLoading(false);
67
75
  return;
68
76
  }
69
77
  const resp = await getSqlViewData(state.client._id, query, state.client.databaseType, state.queryEndpoint);
@@ -71,12 +79,21 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
71
79
  setErrorInfo({ show: true, message: resp.error });
72
80
  setTableData(undefined);
73
81
  setViewAddable(false);
74
- setRunQueryButtonLabel('Run query');
82
+ setRunQueryButtonLoading(false);
75
83
  setIsLoading(false);
76
84
  return;
77
85
  }
78
- setRunQueryButtonLabel('Run query');
86
+ setRunQueryButtonLoading(false);
79
87
  setErrorInfo({ show: false, message: '' });
88
+ // stringify all rows that are either jsonb or json
89
+ resp.rows = resp.rows.map((row) => {
90
+ for (const key in row) {
91
+ if (typeof row[key] === 'object') {
92
+ row[key] = JSON.stringify(row[key]);
93
+ }
94
+ }
95
+ return row;
96
+ });
80
97
  setTableData(resp);
81
98
  setViewAddable(true);
82
99
  setRanViewQuery(query);
@@ -112,11 +129,11 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
112
129
  paddingLeft: '20px',
113
130
  paddingRight: '30px',
114
131
  }, children: _jsx(TextInput, { placeholder: "Search...", onChange: (e) => {
115
- setTableSearchQuery(e);
132
+ setTableSearchQuery(e.target.value);
116
133
  setDisplayedTableData(allTableData.filter((table) => table.tableName
117
134
  .toLowerCase()
118
- .includes(e.toLowerCase().trim())));
119
- }, value: tableSearchQuery, id: 'edit-name', width: "100%" }) }), _jsx(SchemaListComponent, { schema: displayedTableData, theme: state.theme, LoadingComponent: LoadingComponent, loading: schemaIsLoading, width: '400px' })] }), _jsxs("div", { style: {
135
+ .includes(e.target.value.toLowerCase().trim())));
136
+ }, 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: {
120
137
  display: 'flex',
121
138
  gap: 20,
122
139
  flexDirection: 'column',
@@ -132,11 +149,10 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
132
149
  gap: 20,
133
150
  width: '100%',
134
151
  }, children: [_jsx(TextInput, { onChange: (e) => {
135
- setAIPrompt(e);
136
- }, 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) => {
137
- setErrorInfo({ show: false, message: '' });
152
+ setAIPrompt(e.target.value);
153
+ }, 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) => {
138
154
  setEditViewQuery(e);
139
- } }), _jsx("div", { style: { width: '200px' }, children: _jsx(Button, { label: runQueryButtonLabel, onClick: handleRunQuery }) }), errorInfo.show ? (_jsx("div", { style: {
155
+ } }), _jsx("div", { style: { width: '200px' }, children: _jsx(Button, { label: 'Run query', isLoading: runQueryButtonLoading, onClick: handleRunQuery }) }), errorInfo.show ? (_jsx("div", { style: {
140
156
  fontSize: 15,
141
157
  fontWeight: '400',
142
158
  }, children: _jsx("div", { style: {
@@ -151,5 +167,5 @@ export default function CreateEditSqlView({ containerStyle, initialSqlView, clos
151
167
  display: 'flex',
152
168
  justifyContent: 'center',
153
169
  alignItems: 'center',
154
- }, children: _jsx(LoadingComponent, {}) })), tableData && (_jsx(QuillTable, { 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 })] }) }));
170
+ }, 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 })] }) }));
155
171
  }
@@ -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":"AAeA,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,2CA8mBA"}