@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
@@ -24,6 +24,7 @@ export default function SQLViewManager({ containerStyle, }) {
24
24
  const [deleteModalIsOpen, setDeleteModalIsOpen] = useState(false);
25
25
  const [isPromoteViewModalOpen, setIsPromoteViewModalOpen] = useState(false);
26
26
  const [allTableData, setAllTableData] = useState([]);
27
+ const [referencedTablesMap, setReferencedTablesMap] = useState({});
27
28
  const [schemaIsLoading, setSchemaIsLoading] = useState(false);
28
29
  const [initialSqlView, setInitialSqlView] = useState(undefined);
29
30
  const parentRef = useRef(null);
@@ -72,37 +73,107 @@ export default function SQLViewManager({ containerStyle, }) {
72
73
  setAllTableData(response);
73
74
  setSchemaIsLoading(false);
74
75
  };
76
+ const getReferencedTablesMap = async () => {
77
+ const response = await fetch(`${state.queryEndpoint}`, {
78
+ method: 'POST',
79
+ headers: {
80
+ ...state.queryHeaders,
81
+ 'Content-Type': 'application/json',
82
+ },
83
+ body: JSON.stringify({
84
+ metadata: {
85
+ clientId: state.client._id,
86
+ publicKey: state.client._id,
87
+ task: 'referenced-tables-map',
88
+ databaseType: state.client.databaseType,
89
+ },
90
+ }),
91
+ });
92
+ if (!response.ok) {
93
+ throw new Error('Failed to fetch tables data');
94
+ }
95
+ const data = await response.json();
96
+ setReferencedTablesMap(data.data.referencedTablesMap);
97
+ };
75
98
  useEffect(() => {
76
99
  let isSubscribed = true;
77
100
  if (isSubscribed && state.client) {
78
101
  getTables();
79
102
  getSchemaTableDetails();
103
+ getReferencedTablesMap();
80
104
  }
81
105
  return () => {
82
106
  isSubscribed = false;
83
107
  };
84
108
  }, [state.client]);
85
- const handleClickFirstDelete = () => {
86
- setTableToBeDeleted(editName);
87
- setDeleteModalIsOpen(true);
88
- };
89
- const handleModalSubmit = async (submitRequest, query, name, id) => {
109
+ const handleModalSubmit = async (submitRequest, query, name, id, columns) => {
90
110
  try {
111
+ const prevTableName = tables?.find((table) => table._id === id)?.name;
112
+ const isPlural = referencedTablesMap &&
113
+ referencedTablesMap[prevTableName] &&
114
+ referencedTablesMap[prevTableName].length > 1
115
+ ? 's'
116
+ : '';
91
117
  switch (submitRequest) {
92
118
  case 'add':
93
119
  if (!name) {
94
- alert('No Name found');
120
+ alert('No name found');
121
+ return;
122
+ }
123
+ if (tables?.map((table) => table.name).includes(name)) {
124
+ alert('Name already exists');
125
+ return;
126
+ }
127
+ if (!/^[a-z0-9_]+$/.test(name)) {
128
+ alert('Name must be lowercase with no spaces');
95
129
  return;
96
130
  }
97
131
  await addSqlView(name, query, state);
98
132
  break;
99
133
  case 'edit':
134
+ if (!id) {
135
+ return;
136
+ }
137
+ if (referencedTablesMap && referencedTablesMap[prevTableName]) {
138
+ // This condition is for only query edits
139
+ if (editQueryView) {
140
+ const errorColumns = [];
141
+ referencedTablesMap[prevTableName] = referencedTablesMap[prevTableName].forEach((table) => {
142
+ table.referencedColumns.forEach((column) => {
143
+ if (!columns?.find((col) => {
144
+ return col.field === column;
145
+ })) {
146
+ errorColumns.push(`'${column}' referenced by ${table.dashboardName} - ${table.reportName}`);
147
+ }
148
+ });
149
+ });
150
+ if (errorColumns.length > 0) {
151
+ alert(`Edit Error\n\n${errorColumns.join('\n')} \n\nPlease modify your query to include these columns.`);
152
+ return;
153
+ }
154
+ }
155
+ else {
156
+ const referencedTableInfo = referencedTablesMap[prevTableName].map((info) => {
157
+ return `${info.dashboardName} - ${info.reportName}`;
158
+ });
159
+ alert(`Edit Error\n\n${referencedTableInfo.join('\n')} \n\nPlease delete those charts before renaming this table.`);
160
+ return;
161
+ }
162
+ }
100
163
  if (!name) {
101
- alert('No id found');
164
+ alert('No name found');
102
165
  return;
103
166
  }
104
- if (!id) {
105
- alert('No id found');
167
+ if (!/^[a-z0-9_]+$/.test(name)) {
168
+ alert('Names can only include lowercase letters, numbers, and underscores');
169
+ return;
170
+ }
171
+ // check if the tableName is present excluding the table with the same id
172
+ if (tables
173
+ ?.filter((table) => table._id !== id)
174
+ .map((table) => table.name)
175
+ .includes(name)) {
176
+ alert('Name already exists');
106
177
  return;
107
178
  }
108
179
  await editSQLView(name, query, id, state);
@@ -112,6 +183,11 @@ export default function SQLViewManager({ containerStyle, }) {
112
183
  alert('No id found');
113
184
  return;
114
185
  }
186
+ // Determine if the table is referenced in other charts
187
+ if (referencedTablesMap && referencedTablesMap[prevTableName]) {
188
+ alert(`This table is referenced in the following dashboard${isPlural}/chart${isPlural}.\n\n${referencedTablesMap[prevTableName]?.join('\n')} \n\nPlease delete those charts before deleting this table.`);
189
+ return;
190
+ }
115
191
  await deleteSQLView(id, state);
116
192
  break;
117
193
  default:
@@ -129,18 +205,10 @@ export default function SQLViewManager({ containerStyle, }) {
129
205
  console.error(e);
130
206
  }
131
207
  };
132
- const handleEditAddView = async (request, query, name, id) => {
208
+ const handleEditAddView = async (request, query, name, id, columns) => {
133
209
  switch (request) {
134
210
  case 'edit':
135
- if (!name) {
136
- alert('No name found');
137
- return;
138
- }
139
- if (!id) {
140
- alert('No id found');
141
- return;
142
- }
143
- await handleModalSubmit('edit', query, name, id);
211
+ await handleModalSubmit('edit', query, name, id, columns);
144
212
  break;
145
213
  default:
146
214
  await handleModalSubmit('final-edit', query);
@@ -155,7 +223,7 @@ export default function SQLViewManager({ containerStyle, }) {
155
223
  flexDirection: 'column',
156
224
  paddingTop: '0px',
157
225
  position: 'relative',
158
- }, ref: parentRef, children: [_jsx("div", { style: {
226
+ }, ref: parentRef, children: [(state.databaseTypeMismatch.show || !editQueryView) && (_jsx("div", { style: {
159
227
  // width: 'calc(100vw - 30px)',
160
228
  display: 'flex',
161
229
  position: 'sticky',
@@ -176,7 +244,7 @@ export default function SQLViewManager({ containerStyle, }) {
176
244
  borderLeftWidth: 0,
177
245
  borderRightWidth: 0,
178
246
  borderStyle: 'solid',
179
- borderColor: state.theme.borderColor,
247
+ borderColor: state.theme?.borderColor,
180
248
  paddingBottom: 20,
181
249
  // boxShadow: "0px 1px 4px 0px rgba(0, 0, 0, 0.07)",
182
250
  // paddingRight: '50px',
@@ -204,7 +272,7 @@ export default function SQLViewManager({ containerStyle, }) {
204
272
  setEditViewId('');
205
273
  setInitialSqlView(undefined);
206
274
  setEditQueryView(true);
207
- }, label: "Add view +" }))] }) }), state.databaseTypeMismatch.show ? (_jsx(DatabaseMismatchCard, { environemntName: state.client.name, environemntDatabaseType: state.client.databaseType, backendDatabaseType: state.databaseTypeMismatch.backendDatabaseType })) : (_jsx(_Fragment, { children: !editQueryView ? (_jsx("div", { style: {
275
+ }, label: "Add view +" }))] }) })), state.databaseTypeMismatch.show ? (_jsx(DatabaseMismatchCard, { environemntName: state.client.name, environemntDatabaseType: state.client.databaseType, backendDatabaseType: state.databaseTypeMismatch.backendDatabaseType })) : (_jsx(_Fragment, { children: !editQueryView ? (_jsx("div", { style: {
208
276
  display: 'flex',
209
277
  flexWrap: 'wrap',
210
278
  paddingLeft: 25,
@@ -212,8 +280,8 @@ export default function SQLViewManager({ containerStyle, }) {
212
280
  paddingTop: 25,
213
281
  }, children: tables && tables?.length
214
282
  ? tables.map((table) => (_jsx(TableCell, { table: table, clickTableCell: clickTableCell }, table._id)))
215
- : null }, 'edit-view-query')) : (_jsx(CreateEditSqlView, { containerStyle: {}, initialSqlView: initialSqlView, closeEditView: () => setEditQueryView(false), addEditView: (request, name, query, id) => {
216
- handleEditAddView(request, name, query, id);
283
+ : null }, 'edit-view-query')) : (_jsx(CreateEditSqlView, { containerStyle: {}, initialSqlView: initialSqlView, closeEditView: () => setEditQueryView(false), addEditView: (request, name, query, id, columns) => {
284
+ handleEditAddView(request, name, query, id, columns);
217
285
  }, allTableData: allTableData, schemaIsLoading: schemaIsLoading })) }))] }), _jsx(EditAddViewModal, { viewName: editName, viewQuery: editViewQuery, viewId: editViewId, editModalIsOpen: editModalIsOpen, closeEditModal: closeEditModal, submit: handleModalSubmit, state: state, onEditViewClick: () => setEditQueryView(true) })] }));
218
286
  }
219
287
  function EditAddViewModal({ viewName, viewQuery, viewId, editModalIsOpen, closeEditModal, submit, state, onEditViewClick = () => { }, }) {
@@ -8,11 +8,11 @@ export declare const InitialDateRangeOptions: readonly [{
8
8
  readonly value: "LAST_30_DAYS";
9
9
  readonly label: "Last 30 days";
10
10
  }, {
11
- readonly value: "CURRENT_MONTH";
12
- readonly label: "Current Month";
11
+ readonly value: "THIS_MONTH";
12
+ readonly label: "This Month";
13
13
  }, {
14
- readonly value: "CURRENT_WEEK";
15
- readonly label: "Current Week";
14
+ readonly value: "THIS_WEEK";
15
+ readonly label: "This Week";
16
16
  }, {
17
17
  readonly value: "ALL_TIME";
18
18
  readonly label: "All time";
@@ -4,8 +4,8 @@
4
4
  export const InitialDateRangeOptions = [
5
5
  { value: 'LAST_90_DAYS', label: 'Last 90 days' },
6
6
  { value: 'LAST_30_DAYS', label: 'Last 30 days' },
7
- { value: 'CURRENT_MONTH', label: 'Current Month' },
8
- { value: 'CURRENT_WEEK', label: 'Current Week' },
7
+ { value: 'THIS_MONTH', label: 'This Month' },
8
+ { value: 'THIS_WEEK', label: 'This Week' },
9
9
  { value: 'ALL_TIME', label: 'All time' },
10
10
  ];
11
11
  export const defaultDateRange = InitialDateRangeOptions[0];
@@ -7,6 +7,11 @@ export interface SchemaDetails {
7
7
  name: string;
8
8
  }[];
9
9
  foreignKeys?: string[];
10
+ customQueryFKs?: string[];
11
+ customQueryOrganizations?: {
12
+ id: any;
13
+ name: string;
14
+ }[];
10
15
  selectedFields: {
11
16
  schema: string;
12
17
  table?: string;
@@ -17,6 +22,7 @@ export interface SchemaDetails {
17
22
  name: string;
18
23
  };
19
24
  foreignKey?: string;
25
+ customerView?: string;
20
26
  };
21
27
  }
22
28
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/utils/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,UAAU,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/utils/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wBAAwB,CAAC,EAAE;QAAE,EAAE,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,UAAU,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH"}
@@ -15,4 +15,5 @@ export interface Column {
15
15
  displayName: string;
16
16
  fieldType: string;
17
17
  }
18
+ export declare const hasColumnAlias: (columns: Column[], referencedColumns: string[]) => boolean;
18
19
  //# sourceMappingURL=table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/utils/table.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/utils/table.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,cAAc,YAChB,MAAM,EAAE,qBACE,MAAM,EAAE,KAC1B,OAUF,CAAC"}
@@ -1 +1,11 @@
1
- export {};
1
+ export const hasColumnAlias = (columns, referencedColumns) => {
2
+ if (!referencedColumns) {
3
+ return true;
4
+ }
5
+ for (const column of columns) {
6
+ if (!referencedColumns.includes(column.field)) {
7
+ return true;
8
+ }
9
+ }
10
+ return false;
11
+ };
@@ -0,0 +1,2 @@
1
+ export declare function wrapInQuotes(str?: string, willWrap?: boolean): string;
2
+ //# sourceMappingURL=textProcessing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/textProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,MAAM,CAGnE"}
@@ -0,0 +1,5 @@
1
+ export function wrapInQuotes(str, willWrap = false) {
2
+ if (!willWrap)
3
+ return str || '';
4
+ return `"${str}"`;
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillsql/admin",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "Admin tools for Quill",
5
5
  "exports": {
6
6
  ".": {
@@ -1,20 +0,0 @@
1
- /// <reference types="react" />
2
- interface EditDashboardsModalProps {
3
- ModalComponent: React.ComponentType<any>;
4
- TextInputComponent: React.ComponentType<any>;
5
- isOpen: boolean;
6
- setIsOpen: (isOpen: boolean) => void;
7
- clientId: string;
8
- ButtonComponent: React.ComponentType<any>;
9
- SecondaryButtonComponent: React.ComponentType<any>;
10
- openEditFilterModal: (dashboardName: string) => void;
11
- openEditOrderModal: (dashboardName: string) => void;
12
- openAddDashboardModal: () => void;
13
- HeaderComponent: React.ComponentType<any>;
14
- setDashboardData: (dashboardData: any) => void;
15
- dashboards: any[];
16
- getDashNames: () => void;
17
- }
18
- export default function EditDashboardsModal({ ModalComponent, TextInputComponent, isOpen, setIsOpen, clientId, ButtonComponent, SecondaryButtonComponent, openEditFilterModal, openEditOrderModal, openAddDashboardModal, HeaderComponent, setDashboardData, dashboards, getDashNames, }: EditDashboardsModalProps): import("react/jsx-runtime").JSX.Element;
19
- export {};
20
- //# sourceMappingURL=EditDashboardsModal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EditDashboardsModal.d.ts","sourceRoot":"","sources":["../../../src/modals/EditDashboardsModal.tsx"],"names":[],"mappings":";AAGA,UAAU,wBAAwB;IAChC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,wBAAwB,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACnD,mBAAmB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,kBAAkB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,gBAAgB,EAAE,CAAC,aAAa,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/C,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,cAAc,EACd,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAY,GACb,EAAE,wBAAwB,2CAyJ1B"}
@@ -1,94 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const jsx_runtime_1 = require("react/jsx-runtime");
4
- const Admin_1 = require("../Admin");
5
- const constants_1 = require("../utils/constants");
6
- function EditDashboardsModal({ ModalComponent, TextInputComponent, isOpen, setIsOpen, clientId, ButtonComponent, SecondaryButtonComponent, openEditFilterModal, openEditOrderModal, openAddDashboardModal, HeaderComponent, setDashboardData, dashboards, getDashNames, }) {
7
- // const [dashboards, setDashboards] = useState([]);
8
- // useEffect(() => {
9
- // async function getDashboards(clientId) {
10
- // const url = `${QUILL_SERVER}/dashnames/${clientId}/`;
11
- // const response2 = await fetch(url, {
12
- // method: "GET",
13
- // headers: {
14
- // Authorization: "Bearer ", // Ensure you append your token after 'Bearer ' if needed
15
- // },
16
- // });
17
- // // If you need to retrieve the JSON data from the response:
18
- // const data = await response2.json();
19
- // setDashboards(data);
20
- // }
21
- // if (clientId) {
22
- // getDashboards(clientId);
23
- // }
24
- // }, [clientId]);
25
- async function handleDeleteDashboard(dashboardName) {
26
- const url = `${constants_1.QUILL_SERVER}/dashdelete/${clientId}/`;
27
- const body = {
28
- name: dashboardName,
29
- };
30
- const headers = {
31
- 'Content-Type': 'application/json',
32
- Authorization: `Bearer `,
33
- };
34
- try {
35
- const response = await fetch(url, {
36
- method: 'POST',
37
- headers: headers,
38
- body: JSON.stringify(body),
39
- });
40
- if (!response.ok) {
41
- throw new Error(`HTTP error! Status: ${response.status}`);
42
- }
43
- const responseData = await response.json();
44
- if (responseData) {
45
- getDashNames();
46
- return;
47
- }
48
- }
49
- catch (e) {
50
- console.log('error', e);
51
- }
52
- }
53
- return ((0, jsx_runtime_1.jsx)(ModalComponent, { isOpen: isOpen, close: () => setIsOpen(false), children: (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
54
- display: 'flex',
55
- flexDirection: 'column',
56
- }, children: [(0, jsx_runtime_1.jsx)("h1", { style: {
57
- fontWeight: '600',
58
- fontSize: 24,
59
- paddingBottom: 8,
60
- color: Admin_1.theme.primaryTextColor,
61
- }, children: "Dashboards" }), dashboards &&
62
- dashboards.map((dashboardName, index) => {
63
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
64
- display: 'flex',
65
- flexDirection: 'row',
66
- paddingTop: 5,
67
- width: 400,
68
- paddingBottom: 5,
69
- alignItems: 'center',
70
- justifyContent: 'space-between',
71
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
72
- display: 'flex',
73
- flexDirection: 'column',
74
- }, children: (0, jsx_runtime_1.jsx)("div", { style: {
75
- marginRight: 12,
76
- fontWeight: '600',
77
- fontSize: 16,
78
- color: Admin_1.theme.primaryTextColor,
79
- }, children: dashboardName.name }) }), (0, jsx_runtime_1.jsx)("div", { style: {
80
- display: 'flex',
81
- flexDirection: 'column',
82
- }, children: (0, jsx_runtime_1.jsxs)("div", { style: {
83
- display: 'flex',
84
- flexDirection: 'row',
85
- alignItems: 'flex-end',
86
- }, children: [(0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => openEditFilterModal(dashboardName.name), label: "Edit" }), (0, jsx_runtime_1.jsx)("div", { style: { width: 8 } }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => openEditOrderModal(dashboardName.name), label: "Reorder" }), (0, jsx_runtime_1.jsx)("div", { style: { width: 8 } }), (0, jsx_runtime_1.jsx)(SecondaryButtonComponent, { onClick: () => handleDeleteDashboard(dashboardName.name), label: "Delete" })] }) })] }, dashboardName + index));
87
- })] }), (0, jsx_runtime_1.jsx)("div", { style: {
88
- display: 'flex',
89
- flexDirection: 'column',
90
- justifyContent: 'center',
91
- marginTop: 20,
92
- }, children: (0, jsx_runtime_1.jsx)(ButtonComponent, { onClick: openAddDashboardModal, label: "Create new dashboard" }) })] }) }));
93
- }
94
- exports.default = EditDashboardsModal;
@@ -1,20 +0,0 @@
1
- /// <reference types="react" />
2
- interface EditDashboardsModalProps {
3
- ModalComponent: React.ComponentType<any>;
4
- TextInputComponent: React.ComponentType<any>;
5
- isOpen: boolean;
6
- setIsOpen: (isOpen: boolean) => void;
7
- clientId: string;
8
- ButtonComponent: React.ComponentType<any>;
9
- SecondaryButtonComponent: React.ComponentType<any>;
10
- openEditFilterModal: (dashboardName: string) => void;
11
- openEditOrderModal: (dashboardName: string) => void;
12
- openAddDashboardModal: () => void;
13
- HeaderComponent: React.ComponentType<any>;
14
- setDashboardData: (dashboardData: any) => void;
15
- dashboards: any[];
16
- getDashNames: () => void;
17
- }
18
- export default function EditDashboardsModal({ ModalComponent, TextInputComponent, isOpen, setIsOpen, clientId, ButtonComponent, SecondaryButtonComponent, openEditFilterModal, openEditOrderModal, openAddDashboardModal, HeaderComponent, setDashboardData, dashboards, getDashNames, }: EditDashboardsModalProps): import("react/jsx-runtime").JSX.Element;
19
- export {};
20
- //# sourceMappingURL=EditDashboardsModal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EditDashboardsModal.d.ts","sourceRoot":"","sources":["../../../src/modals/EditDashboardsModal.tsx"],"names":[],"mappings":";AAGA,UAAU,wBAAwB;IAChC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,wBAAwB,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACnD,mBAAmB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,kBAAkB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,gBAAgB,EAAE,CAAC,aAAa,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/C,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,cAAc,EACd,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAY,GACb,EAAE,wBAAwB,2CAyJ1B"}
@@ -1,91 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { theme } from '../Admin';
3
- import { QUILL_SERVER } from '../utils/constants';
4
- export default function EditDashboardsModal({ ModalComponent, TextInputComponent, isOpen, setIsOpen, clientId, ButtonComponent, SecondaryButtonComponent, openEditFilterModal, openEditOrderModal, openAddDashboardModal, HeaderComponent, setDashboardData, dashboards, getDashNames, }) {
5
- // const [dashboards, setDashboards] = useState([]);
6
- // useEffect(() => {
7
- // async function getDashboards(clientId) {
8
- // const url = `${QUILL_SERVER}/dashnames/${clientId}/`;
9
- // const response2 = await fetch(url, {
10
- // method: "GET",
11
- // headers: {
12
- // Authorization: "Bearer ", // Ensure you append your token after 'Bearer ' if needed
13
- // },
14
- // });
15
- // // If you need to retrieve the JSON data from the response:
16
- // const data = await response2.json();
17
- // setDashboards(data);
18
- // }
19
- // if (clientId) {
20
- // getDashboards(clientId);
21
- // }
22
- // }, [clientId]);
23
- async function handleDeleteDashboard(dashboardName) {
24
- const url = `${QUILL_SERVER}/dashdelete/${clientId}/`;
25
- const body = {
26
- name: dashboardName,
27
- };
28
- const headers = {
29
- 'Content-Type': 'application/json',
30
- Authorization: `Bearer `,
31
- };
32
- try {
33
- const response = await fetch(url, {
34
- method: 'POST',
35
- headers: headers,
36
- body: JSON.stringify(body),
37
- });
38
- if (!response.ok) {
39
- throw new Error(`HTTP error! Status: ${response.status}`);
40
- }
41
- const responseData = await response.json();
42
- if (responseData) {
43
- getDashNames();
44
- return;
45
- }
46
- }
47
- catch (e) {
48
- console.log('error', e);
49
- }
50
- }
51
- return (_jsx(ModalComponent, { isOpen: isOpen, close: () => setIsOpen(false), children: _jsxs("div", { children: [_jsxs("div", { style: {
52
- display: 'flex',
53
- flexDirection: 'column',
54
- }, children: [_jsx("h1", { style: {
55
- fontWeight: '600',
56
- fontSize: 24,
57
- paddingBottom: 8,
58
- color: theme.primaryTextColor,
59
- }, children: "Dashboards" }), dashboards &&
60
- dashboards.map((dashboardName, index) => {
61
- return (_jsxs("div", { style: {
62
- display: 'flex',
63
- flexDirection: 'row',
64
- paddingTop: 5,
65
- width: 400,
66
- paddingBottom: 5,
67
- alignItems: 'center',
68
- justifyContent: 'space-between',
69
- }, children: [_jsx("div", { style: {
70
- display: 'flex',
71
- flexDirection: 'column',
72
- }, children: _jsx("div", { style: {
73
- marginRight: 12,
74
- fontWeight: '600',
75
- fontSize: 16,
76
- color: theme.primaryTextColor,
77
- }, children: dashboardName.name }) }), _jsx("div", { style: {
78
- display: 'flex',
79
- flexDirection: 'column',
80
- }, children: _jsxs("div", { style: {
81
- display: 'flex',
82
- flexDirection: 'row',
83
- alignItems: 'flex-end',
84
- }, children: [_jsx(SecondaryButtonComponent, { onClick: () => openEditFilterModal(dashboardName.name), label: "Edit" }), _jsx("div", { style: { width: 8 } }), _jsx(SecondaryButtonComponent, { onClick: () => openEditOrderModal(dashboardName.name), label: "Reorder" }), _jsx("div", { style: { width: 8 } }), _jsx(SecondaryButtonComponent, { onClick: () => handleDeleteDashboard(dashboardName.name), label: "Delete" })] }) })] }, dashboardName + index));
85
- })] }), _jsx("div", { style: {
86
- display: 'flex',
87
- flexDirection: 'column',
88
- justifyContent: 'center',
89
- marginTop: 20,
90
- }, children: _jsx(ButtonComponent, { onClick: openAddDashboardModal, label: "Create new dashboard" }) })] }) }));
91
- }