@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.
- package/dist/cjs/Admin.d.ts +19 -72
- package/dist/cjs/Admin.d.ts.map +1 -1
- package/dist/cjs/Admin.js +215 -996
- package/dist/cjs/AdminProvider.d.ts +2 -12
- package/dist/cjs/AdminProvider.d.ts.map +1 -1
- package/dist/cjs/AdminProvider.js +27 -32
- package/dist/cjs/api/ConnectionClient.d.ts +19 -0
- package/dist/cjs/api/ConnectionClient.d.ts.map +1 -1
- package/dist/cjs/api/ConnectionClient.js +108 -13
- package/dist/cjs/components/DashboardSelectPopover.d.ts.map +1 -1
- package/dist/cjs/components/DashboardSelectPopover.js +20 -3
- package/dist/cjs/components/DropDownMenu.js +1 -1
- package/dist/cjs/components/DropDownMenuWithLabel.d.ts.map +1 -1
- package/dist/cjs/components/DropDownMenuWithLabel.js +18 -87
- package/dist/cjs/components/EmptyDashboardComponent/index.d.ts.map +1 -1
- package/dist/cjs/components/EmptyDashboardComponent/index.js +11 -9
- package/dist/cjs/components/OrgSelect.d.ts.map +1 -1
- package/dist/cjs/components/OrgSelect.js +10 -20
- package/dist/cjs/components/QuillSelect.d.ts +3 -0
- package/dist/cjs/components/QuillSelect.d.ts.map +1 -0
- package/dist/cjs/components/QuillSelect.js +137 -0
- package/dist/cjs/components/SegmentedControl.d.ts +9 -0
- package/dist/cjs/components/SegmentedControl.d.ts.map +1 -0
- package/dist/cjs/components/SegmentedControl.js +60 -0
- package/dist/cjs/components/SqlTextEditor.d.ts +9 -1
- package/dist/cjs/components/SqlTextEditor.d.ts.map +1 -1
- package/dist/cjs/components/SqlTextEditor.js +60 -12
- package/dist/cjs/components/UiComponents.d.ts +18 -30
- package/dist/cjs/components/UiComponents.d.ts.map +1 -1
- package/dist/cjs/components/UiComponents.js +48 -84
- package/dist/cjs/constants/dataTypes.d.ts +2 -0
- package/dist/cjs/constants/dataTypes.d.ts.map +1 -0
- package/dist/cjs/constants/dataTypes.js +21 -0
- package/dist/cjs/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
- package/dist/cjs/forms/client_onboard/ConnectDatabase.js +9 -17
- package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts +2 -1
- package/dist/cjs/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
- package/dist/cjs/forms/client_onboard/ConnectSchema.js +143 -68
- package/dist/cjs/forms/client_onboard/CreateSqlViews.d.ts.map +1 -1
- package/dist/cjs/forms/client_onboard/CreateSqlViews.js +57 -15
- package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts +11 -5
- package/dist/cjs/forms/sql_views/CreateEditSqlView.d.ts.map +1 -1
- package/dist/cjs/forms/sql_views/CreateEditSqlView.js +107 -53
- package/dist/cjs/hooks/useOnClickOutside.d.ts +3 -0
- package/dist/cjs/hooks/useOnClickOutside.d.ts.map +1 -0
- package/dist/cjs/hooks/useOnClickOutside.js +20 -0
- package/dist/cjs/modals/EditFiltersModal.d.ts +17 -0
- package/dist/cjs/modals/EditFiltersModal.d.ts.map +1 -0
- package/dist/cjs/modals/EditFiltersModal.js +355 -0
- package/dist/cjs/modals/NewDashboardModal.d.ts +1 -3
- package/dist/cjs/modals/NewDashboardModal.d.ts.map +1 -1
- package/dist/cjs/modals/NewDashboardModal.js +64 -47
- package/dist/cjs/modals/PromoteDashModal.d.ts.map +1 -1
- package/dist/cjs/modals/PromoteDashModal.js +11 -4
- package/dist/cjs/modals/PromoteViewModal.d.ts +2 -1
- package/dist/cjs/modals/PromoteViewModal.d.ts.map +1 -1
- package/dist/cjs/modals/PromoteViewModal.js +46 -36
- package/dist/cjs/modals/ReorderDashboardModal.d.ts.map +1 -1
- package/dist/cjs/modals/ReorderDashboardModal.js +42 -45
- package/dist/cjs/modals/index.d.ts +0 -1
- package/dist/cjs/modals/index.d.ts.map +1 -1
- package/dist/cjs/modals/index.js +1 -3
- package/dist/cjs/primitives/ButtonPrimitive.d.ts +3 -1
- package/dist/cjs/primitives/ButtonPrimitive.d.ts.map +1 -1
- package/dist/cjs/primitives/ButtonPrimitive.js +5 -3
- package/dist/cjs/primitives/TextInputPrimitive.d.ts +1 -0
- package/dist/cjs/primitives/TextInputPrimitive.d.ts.map +1 -1
- package/dist/cjs/primitives/TextInputPrimitive.js +35 -20
- package/dist/cjs/primitives/TogglePrimitive.js +5 -5
- package/dist/cjs/public_components/CreateEnvironment.d.ts +2 -1
- package/dist/cjs/public_components/CreateEnvironment.d.ts.map +1 -1
- package/dist/cjs/public_components/CreateEnvironment.js +5 -2
- package/dist/cjs/public_components/DashboardBuilder.d.ts.map +1 -1
- package/dist/cjs/public_components/DashboardBuilder.js +71 -125
- package/dist/cjs/public_components/DashboardManager.d.ts.map +1 -1
- package/dist/cjs/public_components/DashboardManager.js +109 -146
- package/dist/cjs/public_components/SQLViewManager.d.ts +1 -0
- package/dist/cjs/public_components/SQLViewManager.d.ts.map +1 -1
- package/dist/cjs/public_components/SQLViewManager.js +271 -46
- package/dist/cjs/utils/astProcessing.d.ts +2 -0
- package/dist/cjs/utils/astProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/astProcessing.js +41 -0
- package/dist/cjs/utils/astProcessing.uspec.d.ts +2 -0
- package/dist/cjs/utils/astProcessing.uspec.d.ts.map +1 -0
- package/dist/cjs/utils/astProcessing.uspec.js +26 -0
- package/dist/cjs/utils/columnProcessing.d.ts +3 -0
- package/dist/cjs/utils/columnProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/columnProcessing.js +42 -0
- package/dist/cjs/utils/dataEditor.d.ts +2 -2
- package/dist/cjs/utils/dataEditor.d.ts.map +1 -1
- package/dist/cjs/utils/dataEditor.js +4 -2
- package/dist/cjs/utils/databases.d.ts +0 -1
- package/dist/cjs/utils/databases.d.ts.map +1 -1
- package/dist/cjs/utils/databases.js +5 -6
- package/dist/cjs/utils/monacoAutocomplete.d.ts +21 -0
- package/dist/cjs/utils/monacoAutocomplete.d.ts.map +1 -0
- package/dist/cjs/utils/monacoAutocomplete.js +250 -0
- package/dist/cjs/utils/schema.d.ts +11 -0
- package/dist/cjs/utils/schema.d.ts.map +1 -1
- package/dist/cjs/utils/schema.js +129 -0
- package/dist/cjs/utils/table.d.ts +1 -0
- package/dist/cjs/utils/table.d.ts.map +1 -1
- package/dist/cjs/utils/table.js +13 -0
- package/dist/cjs/utils/textProcessing.d.ts +2 -0
- package/dist/cjs/utils/textProcessing.d.ts.map +1 -0
- package/dist/cjs/utils/textProcessing.js +9 -0
- package/dist/esm/Admin.d.ts +19 -72
- package/dist/esm/Admin.d.ts.map +1 -1
- package/dist/esm/Admin.js +218 -989
- package/dist/esm/AdminProvider.d.ts +2 -12
- package/dist/esm/AdminProvider.d.ts.map +1 -1
- package/dist/esm/AdminProvider.js +27 -32
- package/dist/esm/api/ConnectionClient.d.ts +19 -0
- package/dist/esm/api/ConnectionClient.d.ts.map +1 -1
- package/dist/esm/api/ConnectionClient.js +106 -12
- package/dist/esm/components/DashboardSelectPopover.d.ts.map +1 -1
- package/dist/esm/components/DashboardSelectPopover.js +20 -3
- package/dist/esm/components/DropDownMenu.js +1 -1
- package/dist/esm/components/DropDownMenuWithLabel.d.ts.map +1 -1
- package/dist/esm/components/DropDownMenuWithLabel.js +18 -87
- package/dist/esm/components/EmptyDashboardComponent/index.d.ts.map +1 -1
- package/dist/esm/components/EmptyDashboardComponent/index.js +11 -9
- package/dist/esm/components/OrgSelect.d.ts.map +1 -1
- package/dist/esm/components/OrgSelect.js +6 -19
- package/dist/esm/components/QuillSelect.d.ts +3 -0
- package/dist/esm/components/QuillSelect.d.ts.map +1 -0
- package/dist/esm/components/QuillSelect.js +130 -0
- package/dist/esm/components/SegmentedControl.d.ts +9 -0
- package/dist/esm/components/SegmentedControl.d.ts.map +1 -0
- package/dist/esm/components/SegmentedControl.js +56 -0
- package/dist/esm/components/SqlTextEditor.d.ts +9 -1
- package/dist/esm/components/SqlTextEditor.d.ts.map +1 -1
- package/dist/esm/components/SqlTextEditor.js +59 -11
- package/dist/esm/components/UiComponents.d.ts +18 -30
- package/dist/esm/components/UiComponents.d.ts.map +1 -1
- package/dist/esm/components/UiComponents.js +45 -83
- package/dist/esm/constants/dataTypes.d.ts +2 -0
- package/dist/esm/constants/dataTypes.d.ts.map +1 -0
- package/dist/esm/constants/dataTypes.js +18 -0
- package/dist/esm/forms/client_onboard/ConnectDatabase.d.ts.map +1 -1
- package/dist/esm/forms/client_onboard/ConnectDatabase.js +9 -17
- package/dist/esm/forms/client_onboard/ConnectSchema.d.ts +2 -1
- package/dist/esm/forms/client_onboard/ConnectSchema.d.ts.map +1 -1
- package/dist/esm/forms/client_onboard/ConnectSchema.js +145 -70
- package/dist/esm/forms/client_onboard/CreateSqlViews.d.ts.map +1 -1
- package/dist/esm/forms/client_onboard/CreateSqlViews.js +58 -16
- package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts +11 -5
- package/dist/esm/forms/sql_views/CreateEditSqlView.d.ts.map +1 -1
- package/dist/esm/forms/sql_views/CreateEditSqlView.js +108 -54
- package/dist/esm/hooks/useOnClickOutside.d.ts +3 -0
- package/dist/esm/hooks/useOnClickOutside.d.ts.map +1 -0
- package/dist/esm/hooks/useOnClickOutside.js +18 -0
- package/dist/esm/modals/EditFiltersModal.d.ts +17 -0
- package/dist/esm/modals/EditFiltersModal.d.ts.map +1 -0
- package/dist/esm/modals/EditFiltersModal.js +348 -0
- package/dist/esm/modals/NewDashboardModal.d.ts +1 -3
- package/dist/esm/modals/NewDashboardModal.d.ts.map +1 -1
- package/dist/esm/modals/NewDashboardModal.js +64 -47
- package/dist/esm/modals/PromoteDashModal.d.ts.map +1 -1
- package/dist/esm/modals/PromoteDashModal.js +11 -4
- package/dist/esm/modals/PromoteViewModal.d.ts +2 -1
- package/dist/esm/modals/PromoteViewModal.d.ts.map +1 -1
- package/dist/esm/modals/PromoteViewModal.js +50 -40
- package/dist/esm/modals/ReorderDashboardModal.d.ts.map +1 -1
- package/dist/esm/modals/ReorderDashboardModal.js +43 -46
- package/dist/esm/modals/index.d.ts +0 -1
- package/dist/esm/modals/index.d.ts.map +1 -1
- package/dist/esm/modals/index.js +0 -1
- package/dist/esm/primitives/ButtonPrimitive.d.ts +3 -1
- package/dist/esm/primitives/ButtonPrimitive.d.ts.map +1 -1
- package/dist/esm/primitives/ButtonPrimitive.js +5 -3
- package/dist/esm/primitives/TextInputPrimitive.d.ts +1 -0
- package/dist/esm/primitives/TextInputPrimitive.d.ts.map +1 -1
- package/dist/esm/primitives/TextInputPrimitive.js +33 -21
- package/dist/esm/primitives/TogglePrimitive.js +5 -5
- package/dist/esm/public_components/CreateEnvironment.d.ts +2 -1
- package/dist/esm/public_components/CreateEnvironment.d.ts.map +1 -1
- package/dist/esm/public_components/CreateEnvironment.js +5 -2
- package/dist/esm/public_components/DashboardBuilder.d.ts.map +1 -1
- package/dist/esm/public_components/DashboardBuilder.js +72 -126
- package/dist/esm/public_components/DashboardManager.d.ts.map +1 -1
- package/dist/esm/public_components/DashboardManager.js +112 -149
- package/dist/esm/public_components/SQLViewManager.d.ts +1 -0
- package/dist/esm/public_components/SQLViewManager.d.ts.map +1 -1
- package/dist/esm/public_components/SQLViewManager.js +271 -48
- package/dist/esm/utils/astProcessing.d.ts +2 -0
- package/dist/esm/utils/astProcessing.d.ts.map +1 -0
- package/dist/esm/utils/astProcessing.js +37 -0
- package/dist/esm/utils/astProcessing.uspec.d.ts +2 -0
- package/dist/esm/utils/astProcessing.uspec.d.ts.map +1 -0
- package/dist/esm/utils/astProcessing.uspec.js +24 -0
- package/dist/esm/utils/columnProcessing.d.ts +3 -0
- package/dist/esm/utils/columnProcessing.d.ts.map +1 -0
- package/dist/esm/utils/columnProcessing.js +37 -0
- package/dist/esm/utils/dataEditor.d.ts +2 -2
- package/dist/esm/utils/dataEditor.d.ts.map +1 -1
- package/dist/esm/utils/dataEditor.js +4 -2
- package/dist/esm/utils/databases.d.ts +0 -1
- package/dist/esm/utils/databases.d.ts.map +1 -1
- package/dist/esm/utils/databases.js +5 -6
- package/dist/esm/utils/monacoAutocomplete.d.ts +21 -0
- package/dist/esm/utils/monacoAutocomplete.d.ts.map +1 -0
- package/dist/esm/utils/monacoAutocomplete.js +245 -0
- package/dist/esm/utils/schema.d.ts +11 -0
- package/dist/esm/utils/schema.d.ts.map +1 -1
- package/dist/esm/utils/schema.js +126 -1
- package/dist/esm/utils/table.d.ts +1 -0
- package/dist/esm/utils/table.d.ts.map +1 -1
- package/dist/esm/utils/table.js +11 -1
- package/dist/esm/utils/textProcessing.d.ts +2 -0
- package/dist/esm/utils/textProcessing.d.ts.map +1 -0
- package/dist/esm/utils/textProcessing.js +5 -0
- package/package.json +3 -2
- package/dist/cjs/modals/EditDashboardsModal.d.ts +0 -20
- package/dist/cjs/modals/EditDashboardsModal.d.ts.map +0 -1
- package/dist/cjs/modals/EditDashboardsModal.js +0 -94
- package/dist/esm/modals/EditDashboardsModal.d.ts +0 -20
- package/dist/esm/modals/EditDashboardsModal.d.ts.map +0 -1
- package/dist/esm/modals/EditDashboardsModal.js +0 -91
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getDuplicateColumns = void 0;
|
|
6
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
8
|
const react_1 = require("react");
|
|
8
9
|
const primitives_1 = require("../primitives");
|
|
@@ -14,6 +15,28 @@ const dataEditor_1 = require("../utils/dataEditor");
|
|
|
14
15
|
const ConnectionClient_1 = require("../api/ConnectionClient");
|
|
15
16
|
const UiComponents_1 = require("../components/UiComponents");
|
|
16
17
|
const DatabaseMismatchCard_1 = __importDefault(require("../components/DatabaseMismatchCard"));
|
|
18
|
+
const TogglePrimitive_1 = __importDefault(require("../primitives/TogglePrimitive"));
|
|
19
|
+
const SegmentedControl_1 = require("../components/SegmentedControl");
|
|
20
|
+
const SqlTextEditor_1 = __importDefault(require("../components/SqlTextEditor"));
|
|
21
|
+
const react_2 = require("@quillsql/react");
|
|
22
|
+
const schema_1 = require("../utils/schema");
|
|
23
|
+
const modals_1 = require("../modals");
|
|
24
|
+
const getDuplicateColumns = (columns) => {
|
|
25
|
+
if (!columns) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const columnCount = columns?.reduce((acc, curr) => {
|
|
29
|
+
if (acc[curr.field]) {
|
|
30
|
+
acc[curr.field] += 1;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
acc[curr.field] = 1;
|
|
34
|
+
}
|
|
35
|
+
return acc;
|
|
36
|
+
}, {});
|
|
37
|
+
return Object.keys(columnCount).filter((column) => columnCount[column] > 1);
|
|
38
|
+
};
|
|
39
|
+
exports.getDuplicateColumns = getDuplicateColumns;
|
|
17
40
|
function SQLViewManager({ containerStyle, }) {
|
|
18
41
|
const [tables, setTables] = (0, react_1.useState)(undefined);
|
|
19
42
|
const [modalIsOpen, setIsOpen] = (0, react_1.useState)(false);
|
|
@@ -29,14 +52,19 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
29
52
|
const [deleteModalIsOpen, setDeleteModalIsOpen] = (0, react_1.useState)(false);
|
|
30
53
|
const [isPromoteViewModalOpen, setIsPromoteViewModalOpen] = (0, react_1.useState)(false);
|
|
31
54
|
const [allTableData, setAllTableData] = (0, react_1.useState)([]);
|
|
55
|
+
const [referencedTablesMap, setReferencedTablesMap] = (0, react_1.useState)({});
|
|
32
56
|
const [schemaIsLoading, setSchemaIsLoading] = (0, react_1.useState)(false);
|
|
57
|
+
const [customFieldInfo, setCustomFieldInfo] = (0, react_1.useState)(undefined);
|
|
58
|
+
const [provider, setProvider] = (0, react_1.useState)(null);
|
|
33
59
|
const [initialSqlView, setInitialSqlView] = (0, react_1.useState)(undefined);
|
|
60
|
+
const [submittingView, setSubmittingView] = (0, react_1.useState)(false);
|
|
34
61
|
const parentRef = (0, react_1.useRef)(null);
|
|
35
62
|
const { state, dispatch } = (0, AdminProvider_1.useAdmin)();
|
|
36
63
|
const closeEditModal = () => {
|
|
37
64
|
setEditModalIsOpen(false);
|
|
38
65
|
setEditName('');
|
|
39
66
|
setEditViewQuery('');
|
|
67
|
+
setCustomFieldInfo(undefined);
|
|
40
68
|
};
|
|
41
69
|
const clickTableCell = (table) => {
|
|
42
70
|
setEditName(table.name);
|
|
@@ -47,9 +75,26 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
47
75
|
name: table.name,
|
|
48
76
|
query: table.viewQuery,
|
|
49
77
|
});
|
|
78
|
+
setCustomFieldInfo(table.customFieldInfo);
|
|
50
79
|
setEditModalIsOpen(true);
|
|
51
80
|
};
|
|
52
81
|
const getTables = async () => {
|
|
82
|
+
const schemaData = await (0, schema_1.getSchemaInfo)({
|
|
83
|
+
queryEndpoint: state.queryEndpoint,
|
|
84
|
+
queryHeaders: state.queryHeaders,
|
|
85
|
+
publicKey: state.client._id,
|
|
86
|
+
customerId: state.client.customerId,
|
|
87
|
+
gatherSchemaData: false,
|
|
88
|
+
}, 'svm');
|
|
89
|
+
setTables(schemaData);
|
|
90
|
+
};
|
|
91
|
+
const getSchemaTableDetails = async () => {
|
|
92
|
+
setSchemaIsLoading(true);
|
|
93
|
+
const response = await (0, ConnectionClient_1.getTableColumnsBySchema)(state.client._id, state.client.schemaNames, state.client.databaseType, state.queryEndpoint);
|
|
94
|
+
setAllTableData(response);
|
|
95
|
+
setSchemaIsLoading(false);
|
|
96
|
+
};
|
|
97
|
+
const getReferencedTablesMap = async () => {
|
|
53
98
|
const response = await fetch(`${state.queryEndpoint}`, {
|
|
54
99
|
method: 'POST',
|
|
55
100
|
headers: {
|
|
@@ -60,7 +105,7 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
60
105
|
metadata: {
|
|
61
106
|
clientId: state.client._id,
|
|
62
107
|
publicKey: state.client._id,
|
|
63
|
-
task: '
|
|
108
|
+
task: 'referenced-tables-map',
|
|
64
109
|
databaseType: state.client.databaseType,
|
|
65
110
|
},
|
|
66
111
|
}),
|
|
@@ -69,74 +114,119 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
69
114
|
throw new Error('Failed to fetch tables data');
|
|
70
115
|
}
|
|
71
116
|
const data = await response.json();
|
|
72
|
-
|
|
73
|
-
};
|
|
74
|
-
const getSchemaTableDetails = async () => {
|
|
75
|
-
setSchemaIsLoading(true);
|
|
76
|
-
const response = await (0, ConnectionClient_1.getTableColumnsBySchema)(state.client._id, state.client.schemaNames, state.client.databaseType, state.queryEndpoint);
|
|
77
|
-
setAllTableData(response);
|
|
78
|
-
setSchemaIsLoading(false);
|
|
117
|
+
setReferencedTablesMap(data.data.referencedTablesMap);
|
|
79
118
|
};
|
|
80
119
|
(0, react_1.useEffect)(() => {
|
|
81
120
|
let isSubscribed = true;
|
|
82
121
|
if (isSubscribed && state.client) {
|
|
83
122
|
getTables();
|
|
84
123
|
getSchemaTableDetails();
|
|
124
|
+
getReferencedTablesMap();
|
|
85
125
|
}
|
|
86
126
|
return () => {
|
|
87
127
|
isSubscribed = false;
|
|
88
128
|
};
|
|
89
129
|
}, [state.client]);
|
|
90
|
-
const
|
|
91
|
-
setTableToBeDeleted(editName);
|
|
92
|
-
setDeleteModalIsOpen(true);
|
|
93
|
-
};
|
|
94
|
-
const handleModalSubmit = async (submitRequest, query, name, id) => {
|
|
130
|
+
const handleModalSubmit = async (submitRequest, query, name, id, columns, customFieldInfo) => {
|
|
95
131
|
try {
|
|
132
|
+
const prevTableName = tables?.find((table) => table._id === id)?.name;
|
|
133
|
+
const isPlural = referencedTablesMap &&
|
|
134
|
+
referencedTablesMap[prevTableName] &&
|
|
135
|
+
referencedTablesMap[prevTableName].length > 1
|
|
136
|
+
? 's'
|
|
137
|
+
: '';
|
|
138
|
+
let trimmedName = name?.trim() || undefined;
|
|
139
|
+
let submitResponse;
|
|
96
140
|
switch (submitRequest) {
|
|
97
141
|
case 'add':
|
|
98
|
-
if (!
|
|
99
|
-
alert('No
|
|
142
|
+
if (!trimmedName) {
|
|
143
|
+
alert('No name found');
|
|
100
144
|
return;
|
|
101
145
|
}
|
|
102
|
-
if (tables?.map((table) => table.name).includes(
|
|
146
|
+
if (tables?.map((table) => table.name).includes(trimmedName)) {
|
|
103
147
|
alert('Name already exists');
|
|
104
148
|
return;
|
|
105
149
|
}
|
|
106
|
-
if
|
|
107
|
-
|
|
150
|
+
// determine if there are duplicate names if there are then alert the user
|
|
151
|
+
let duplicateColumns = (0, exports.getDuplicateColumns)(columns);
|
|
152
|
+
if (duplicateColumns.length > 0) {
|
|
153
|
+
alert(`Ambiguous column names found. Either use aliases or remove the column to make every column name unique: \n\n${duplicateColumns.join('\n')}`);
|
|
108
154
|
return;
|
|
109
155
|
}
|
|
110
|
-
|
|
156
|
+
if (!/^[a-z0-9_]+$/.test(trimmedName)) {
|
|
157
|
+
alert('Names can only include lowercase letters, numbers, and underscores');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
submitResponse = await (0, dataEditor_1.addSqlView)(trimmedName, query, customFieldInfo, state);
|
|
111
161
|
break;
|
|
112
162
|
case 'edit':
|
|
113
163
|
if (!id) {
|
|
114
164
|
return;
|
|
115
165
|
}
|
|
116
|
-
if (
|
|
117
|
-
|
|
166
|
+
if (referencedTablesMap && referencedTablesMap[prevTableName]) {
|
|
167
|
+
// This condition is for only query edits
|
|
168
|
+
if (editQueryView) {
|
|
169
|
+
const errorColumns = [];
|
|
170
|
+
referencedTablesMap[prevTableName] = referencedTablesMap[prevTableName].forEach((table) => {
|
|
171
|
+
table.referencedColumns.forEach((column) => {
|
|
172
|
+
if (!columns?.find((col) => {
|
|
173
|
+
return col.field === column;
|
|
174
|
+
})) {
|
|
175
|
+
errorColumns.push(`'${column}' referenced by ${table.dashboardName} - ${table.reportName}`);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
if (errorColumns.length > 0) {
|
|
180
|
+
alert(`Edit Error\n\n${errorColumns.join('\n')} \n\nPlease modify your query to include these columns.`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const referencedTableInfo = referencedTablesMap[prevTableName].map((info) => {
|
|
186
|
+
return `${info.dashboardName} - ${info.reportName}`;
|
|
187
|
+
});
|
|
188
|
+
alert(`Edit Error\n\n${referencedTableInfo.join('\n')} \n\nPlease delete those charts before renaming this table.`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (!trimmedName) {
|
|
193
|
+
alert('No name found');
|
|
118
194
|
return;
|
|
119
195
|
}
|
|
120
|
-
if (!/^[a-z0-9_]+$/.test(
|
|
196
|
+
if (!/^[a-z0-9_]+$/.test(trimmedName)) {
|
|
121
197
|
alert('Names can only include lowercase letters, numbers, and underscores');
|
|
122
198
|
return;
|
|
123
199
|
}
|
|
200
|
+
// determine if there are duplicate names if there are then alert the user
|
|
201
|
+
const duplicateColumns2 = (0, exports.getDuplicateColumns)(columns);
|
|
202
|
+
if (duplicateColumns2.length > 0) {
|
|
203
|
+
alert(`Ambiguous column names found. Either use aliases or remove the column to make every column name unique: \n\n${duplicateColumns2.join('\n')}`);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
124
206
|
// check if the tableName is present excluding the table with the same id
|
|
125
207
|
if (tables
|
|
126
208
|
?.filter((table) => table._id !== id)
|
|
127
209
|
.map((table) => table.name)
|
|
128
|
-
.includes(
|
|
210
|
+
.includes(trimmedName)) {
|
|
129
211
|
alert('Name already exists');
|
|
130
212
|
return;
|
|
131
213
|
}
|
|
132
|
-
await (0, dataEditor_1.editSQLView)(
|
|
214
|
+
submitResponse = await (0, dataEditor_1.editSQLView)(trimmedName, query, id, customFieldInfo, state);
|
|
133
215
|
break;
|
|
134
216
|
case 'delete':
|
|
135
217
|
if (!id) {
|
|
136
218
|
alert('No id found');
|
|
137
219
|
return;
|
|
138
220
|
}
|
|
139
|
-
|
|
221
|
+
// Determine if the table is referenced in other charts
|
|
222
|
+
if (referencedTablesMap && referencedTablesMap[prevTableName]) {
|
|
223
|
+
const referencedTableInfo = referencedTablesMap[prevTableName].map((info) => {
|
|
224
|
+
return `${info.dashboardName} - ${info.reportName}`;
|
|
225
|
+
});
|
|
226
|
+
alert(`This table is referenced in the following dashboard${isPlural}/chart${isPlural}.\n\n${referencedTableInfo.join('\n')} \n\nPlease delete those charts before deleting this table.`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
submitResponse = await (0, dataEditor_1.deleteSQLView)(id, state);
|
|
140
230
|
break;
|
|
141
231
|
default:
|
|
142
232
|
setEditName('');
|
|
@@ -145,6 +235,10 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
145
235
|
setEditModalIsOpen(true);
|
|
146
236
|
return;
|
|
147
237
|
}
|
|
238
|
+
if (submitResponse.status !== 'success') {
|
|
239
|
+
alert(`There was an error processing your ${submitRequest} request.`);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
148
242
|
await getTables();
|
|
149
243
|
closeEditModal();
|
|
150
244
|
setEditQueryView(false);
|
|
@@ -153,21 +247,13 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
153
247
|
console.error(e);
|
|
154
248
|
}
|
|
155
249
|
};
|
|
156
|
-
const handleEditAddView = async (request, query, name, id) => {
|
|
250
|
+
const handleEditAddView = async (request, query, name, id, columns) => {
|
|
157
251
|
switch (request) {
|
|
158
252
|
case 'edit':
|
|
159
|
-
|
|
160
|
-
alert('No name found');
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (!id) {
|
|
164
|
-
alert('No id found');
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
await handleModalSubmit('edit', query, name, id);
|
|
253
|
+
await handleModalSubmit('edit', query, name, id, columns);
|
|
168
254
|
break;
|
|
169
255
|
default:
|
|
170
|
-
await handleModalSubmit('final-edit', query);
|
|
256
|
+
await handleModalSubmit('final-edit', query, undefined, undefined, columns);
|
|
171
257
|
break;
|
|
172
258
|
}
|
|
173
259
|
};
|
|
@@ -200,7 +286,7 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
200
286
|
borderLeftWidth: 0,
|
|
201
287
|
borderRightWidth: 0,
|
|
202
288
|
borderStyle: 'solid',
|
|
203
|
-
borderColor: state.theme
|
|
289
|
+
borderColor: state.theme?.borderColor,
|
|
204
290
|
paddingBottom: 20,
|
|
205
291
|
// boxShadow: "0px 1px 4px 0px rgba(0, 0, 0, 0.07)",
|
|
206
292
|
// paddingRight: '50px',
|
|
@@ -236,15 +322,32 @@ function SQLViewManager({ containerStyle, }) {
|
|
|
236
322
|
paddingTop: 25,
|
|
237
323
|
}, children: tables && tables?.length
|
|
238
324
|
? tables.map((table) => ((0, jsx_runtime_1.jsx)(Admin_1.TableCell, { table: table, clickTableCell: clickTableCell }, table._id)))
|
|
239
|
-
: null }, 'edit-view-query')) : ((0, jsx_runtime_1.jsx)(CreateEditSqlView_1.default, { containerStyle: {}, initialSqlView: initialSqlView, closeEditView: () => setEditQueryView(false), addEditView: (request, name, query, id) => {
|
|
240
|
-
handleEditAddView(request, name, query, id);
|
|
241
|
-
}, allTableData: allTableData, schemaIsLoading: schemaIsLoading })) }))] }), (0, jsx_runtime_1.jsx)(EditAddViewModal, { viewName: editName, viewQuery: editViewQuery, viewId: editViewId, editModalIsOpen: editModalIsOpen, closeEditModal: closeEditModal, submit:
|
|
325
|
+
: null }, 'edit-view-query')) : ((0, jsx_runtime_1.jsx)(CreateEditSqlView_1.default, { containerStyle: {}, initialSqlView: initialSqlView, closeEditView: () => setEditQueryView(false), addEditView: (request, name, query, id, columns) => {
|
|
326
|
+
handleEditAddView(request, name, query, id, columns);
|
|
327
|
+
}, setProvider: (provider) => { setProvider(provider); }, provider: provider, allTableData: allTableData, schemaIsLoading: schemaIsLoading })) }))] }), (0, jsx_runtime_1.jsx)(modals_1.PromoteViewModal, { clientId: state.client._id, client: state.client, clients: state.clients, isOpen: isPromoteViewModalOpen, setIsOpen: setIsPromoteViewModalOpen, ModalComponent: UiComponents_1.MemoizedModal, views: tables || [], parentRef: parentRef }), (0, jsx_runtime_1.jsx)(EditAddViewModal, { viewName: editName, viewQuery: editViewQuery, viewId: editViewId, editModalIsOpen: editModalIsOpen, customFieldInfo: customFieldInfo, closeEditModal: closeEditModal, submit: async (submitRequest, query, name, id, columns, customFieldInfo) => {
|
|
328
|
+
if (submitRequest !== 'delete') {
|
|
329
|
+
setSubmittingView(true);
|
|
330
|
+
}
|
|
331
|
+
await handleModalSubmit(submitRequest, query, name, id, columns, customFieldInfo);
|
|
332
|
+
setSubmittingView(false);
|
|
333
|
+
}, state: state, onEditViewClick: () => setEditQueryView(true), isLoading: submittingView })] }));
|
|
242
334
|
}
|
|
243
335
|
exports.default = SQLViewManager;
|
|
244
|
-
function EditAddViewModal({ viewName, viewQuery, viewId, editModalIsOpen, closeEditModal, submit, state, onEditViewClick = () => { }, }) {
|
|
336
|
+
function EditAddViewModal({ viewName, viewQuery, viewId, editModalIsOpen, customFieldInfo, closeEditModal, submit, state, onEditViewClick = () => { }, isLoading, }) {
|
|
245
337
|
const [name, setName] = (0, react_1.useState)(viewName);
|
|
246
338
|
const [query, setQuery] = (0, react_1.useState)(viewQuery);
|
|
247
339
|
const [id, setId] = (0, react_1.useState)(viewId);
|
|
340
|
+
const [useCustomField, setUseCustomField] = (0, react_1.useState)(customFieldInfo ? true : false);
|
|
341
|
+
const [customFieldType, setCustomFieldType] = (0, react_1.useState)(customFieldInfo ? customFieldInfo.type : 'eav');
|
|
342
|
+
const [customFieldQuery, setCustomFieldQuery] = (0, react_1.useState)(customFieldInfo ? customFieldInfo.query : '');
|
|
343
|
+
const [runQueryButtonLoading, setRunQueryButtonLoading] = (0, react_1.useState)(false);
|
|
344
|
+
const [tableData, setTableData] = (0, react_1.useState)(undefined);
|
|
345
|
+
const [errorInfo, setErrorInfo] = (0, react_1.useState)({ show: false, message: '' });
|
|
346
|
+
(0, react_1.useEffect)(() => {
|
|
347
|
+
setCustomFieldQuery(customFieldInfo?.query || '');
|
|
348
|
+
setCustomFieldType(customFieldInfo?.type || 'eav');
|
|
349
|
+
setUseCustomField(customFieldInfo ? true : false);
|
|
350
|
+
}, [customFieldInfo]);
|
|
248
351
|
(0, react_1.useEffect)(() => {
|
|
249
352
|
setName(viewName);
|
|
250
353
|
}, [viewName]);
|
|
@@ -254,7 +357,15 @@ function EditAddViewModal({ viewName, viewQuery, viewId, editModalIsOpen, closeE
|
|
|
254
357
|
(0, react_1.useEffect)(() => {
|
|
255
358
|
setId(viewId);
|
|
256
359
|
}, [viewId]);
|
|
257
|
-
return ((0, jsx_runtime_1.jsx)(primitives_1.ModalPrimitive, { isOpen: editModalIsOpen, close:
|
|
360
|
+
return ((0, jsx_runtime_1.jsx)(primitives_1.ModalPrimitive, { isOpen: editModalIsOpen, close: () => {
|
|
361
|
+
setUseCustomField(false);
|
|
362
|
+
setCustomFieldType('eav');
|
|
363
|
+
setCustomFieldQuery('');
|
|
364
|
+
setTableData(undefined);
|
|
365
|
+
setErrorInfo({ show: false, message: '' });
|
|
366
|
+
setName('');
|
|
367
|
+
closeEditModal();
|
|
368
|
+
}, children: (0, jsx_runtime_1.jsxs)("div", { style: { height: '100%', overflow: 'scroll', width: '100%' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
|
|
258
369
|
display: 'flex',
|
|
259
370
|
flexDirection: 'row',
|
|
260
371
|
alignItems: 'center',
|
|
@@ -287,7 +398,6 @@ function EditAddViewModal({ viewName, viewQuery, viewId, editModalIsOpen, closeE
|
|
|
287
398
|
fontWeight: 'medium',
|
|
288
399
|
height: '120px',
|
|
289
400
|
boxShadow: '0 1px 2px 0 rgba(0,0,0,.05)',
|
|
290
|
-
width: '500px',
|
|
291
401
|
background: 'linear-gradient(white 50%, transparent)',
|
|
292
402
|
color: state.theme?.primaryTextColor,
|
|
293
403
|
borderWidth: '1px',
|
|
@@ -321,7 +431,81 @@ function EditAddViewModal({ viewName, viewQuery, viewId, editModalIsOpen, closeE
|
|
|
321
431
|
} }), viewName && ((0, jsx_runtime_1.jsx)("div", { style: { position: 'absolute', bottom: '10px', right: '10px' }, children: (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedSecondaryButton, { label: 'Edit Query ↗', onClick: () => {
|
|
322
432
|
closeEditModal();
|
|
323
433
|
onEditViewClick();
|
|
324
|
-
} }) }))] }), (0, jsx_runtime_1.
|
|
434
|
+
} }) }))] }), (0, jsx_runtime_1.jsx)("br", {}), ['65d65b57cdd8ae70a5648d9c', '665610862cf7a3000be66453'].includes(state.client._id) &&
|
|
435
|
+
state.client.databaseType === 'PostgreSQL' && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("h3", { style: {
|
|
436
|
+
fontWeight: '600',
|
|
437
|
+
fontSize: '14px',
|
|
438
|
+
marginBottom: '6px',
|
|
439
|
+
color: '#212121',
|
|
440
|
+
}, children: "Custom fields" }), (0, jsx_runtime_1.jsx)(TogglePrimitive_1.default, { value: useCustomField, onClick: () => {
|
|
441
|
+
setUseCustomField((useCustomField) => !useCustomField);
|
|
442
|
+
} }), (0, jsx_runtime_1.jsx)("br", {}), useCustomField && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("h3", { style: {
|
|
443
|
+
fontWeight: '600',
|
|
444
|
+
fontSize: '14px',
|
|
445
|
+
marginBottom: '6px',
|
|
446
|
+
marginTop: '20px',
|
|
447
|
+
color: '#212121',
|
|
448
|
+
}, children: "Custom field type" }), (0, jsx_runtime_1.jsx)(SegmentedControl_1.SegmentedControl, { theme: state.theme, value: customFieldType, onChange: (e) => {
|
|
449
|
+
setCustomFieldType(e);
|
|
450
|
+
}, left: 'EAV', right: 'JSON' }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("h3", { style: {
|
|
451
|
+
fontWeight: '600',
|
|
452
|
+
fontSize: '14px',
|
|
453
|
+
marginBottom: '6px',
|
|
454
|
+
color: '#212121',
|
|
455
|
+
}, children: "Custom field query" }), (0, jsx_runtime_1.jsx)("h3", { style: {
|
|
456
|
+
fontWeight: '400',
|
|
457
|
+
fontSize: '14px',
|
|
458
|
+
marginBottom: '20px',
|
|
459
|
+
color: '#212121',
|
|
460
|
+
}, children: customFieldType === 'eav'
|
|
461
|
+
? `A table of custom fields. It must have these columns: ref_table, ref_id, field, value, type, ${state.client.customerFieldName.replaceAll('"', '')}.`
|
|
462
|
+
: `A table of custom fields. It must have these columns: ref_table, ref_column, field, ${state.client.customerFieldName.replaceAll('"', '')}.` }), (0, jsx_runtime_1.jsx)(SqlTextEditor_1.default, { value: customFieldQuery, setValue: (e) => {
|
|
463
|
+
setCustomFieldQuery(e);
|
|
464
|
+
}, setEditorMounted: () => { }, containerStyle: {
|
|
465
|
+
width: 800,
|
|
466
|
+
}, previousProvider: null, height: '150px', schema: [] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(UiComponents_1.MemoizedButton, { label: 'Run query', onClick: async () => {
|
|
467
|
+
if (/limit\s+\d+\s*;?\s*$/i.test(customFieldQuery)) {
|
|
468
|
+
setErrorInfo({
|
|
469
|
+
show: true,
|
|
470
|
+
message: 'Error: Please remove the limit at the end of your query.',
|
|
471
|
+
});
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
setErrorInfo({ show: false, message: '' });
|
|
475
|
+
setRunQueryButtonLoading(true);
|
|
476
|
+
const getSqlResults = await (0, ConnectionClient_1.getSqlViewData)(state.client._id, customFieldQuery, state.client.databaseType, state.queryEndpoint);
|
|
477
|
+
if (!getSqlResults.success) {
|
|
478
|
+
setErrorInfo({
|
|
479
|
+
show: true,
|
|
480
|
+
message: getSqlResults.error,
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
setErrorInfo({ show: false, message: '' });
|
|
485
|
+
setTableData(getSqlResults);
|
|
486
|
+
}
|
|
487
|
+
setRunQueryButtonLoading(false);
|
|
488
|
+
} }), (0, jsx_runtime_1.jsx)("br", {}), runQueryButtonLoading && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
489
|
+
height: '250px',
|
|
490
|
+
width: '100%',
|
|
491
|
+
display: 'flex',
|
|
492
|
+
justifyContent: 'center',
|
|
493
|
+
alignItems: 'center',
|
|
494
|
+
}, children: (0, jsx_runtime_1.jsx)(UiComponents_1.LoadingSpinner, {}) })), !errorInfo.show && tableData && !runQueryButtonLoading && ((0, jsx_runtime_1.jsx)(react_2.Table, { rows: tableData.rows, columns: tableData.fields, containerStyle: {
|
|
495
|
+
height: '250px',
|
|
496
|
+
maxWidth: '800px',
|
|
497
|
+
paddingTop: '20px',
|
|
498
|
+
}, hideCSVDownloadButton: true })), errorInfo.show && ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
499
|
+
fontSize: 15,
|
|
500
|
+
fontWeight: '400',
|
|
501
|
+
paddingTop: '20px',
|
|
502
|
+
}, children: (0, jsx_runtime_1.jsx)("div", { style: {
|
|
503
|
+
padding: 30,
|
|
504
|
+
background: 'rgba(0,0,0,0.02)',
|
|
505
|
+
display: 'inline-block',
|
|
506
|
+
flex: 0,
|
|
507
|
+
borderRadius: 6,
|
|
508
|
+
}, children: errorInfo.message }) }))] }))] })), (0, jsx_runtime_1.jsxs)("div", { style: {
|
|
325
509
|
display: 'flex',
|
|
326
510
|
flexDirection: 'row',
|
|
327
511
|
alignItems: 'center',
|
|
@@ -333,6 +517,47 @@ function EditAddViewModal({ viewName, viewQuery, viewId, editModalIsOpen, closeE
|
|
|
333
517
|
alert('Please enter a name');
|
|
334
518
|
return;
|
|
335
519
|
}
|
|
336
|
-
|
|
337
|
-
|
|
520
|
+
if (useCustomField) {
|
|
521
|
+
const fields = tableData?.fields.map((field) => field.field);
|
|
522
|
+
const missingFields = [];
|
|
523
|
+
if (!fields) {
|
|
524
|
+
alert('Custom field query is missing required columns');
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
if (customFieldType === 'eav') {
|
|
528
|
+
// make sure the tableData has the required columns
|
|
529
|
+
[
|
|
530
|
+
'ref_table',
|
|
531
|
+
'ref_id',
|
|
532
|
+
'field',
|
|
533
|
+
'value',
|
|
534
|
+
'type',
|
|
535
|
+
state.client.customerFieldName.replaceAll('"', ''),
|
|
536
|
+
].forEach((requiredField) => {
|
|
537
|
+
if (!fields.includes(requiredField)) {
|
|
538
|
+
missingFields.push(requiredField);
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
[
|
|
544
|
+
'ref_table',
|
|
545
|
+
'field',
|
|
546
|
+
'ref_column',
|
|
547
|
+
state.client.customerFieldName.replaceAll('"', ''),
|
|
548
|
+
].forEach((requiredField) => {
|
|
549
|
+
if (!fields.includes(requiredField)) {
|
|
550
|
+
missingFields.push(requiredField);
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
if (missingFields.length > 0) {
|
|
555
|
+
alert(`Custom field query is missing required columns: ${missingFields.join(', ')}`);
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
submit(viewName ? 'edit' : 'add', query, name, id, undefined, useCustomField
|
|
560
|
+
? { type: customFieldType, query: customFieldQuery }
|
|
561
|
+
: undefined);
|
|
562
|
+
}, label: viewName ? 'Save changes' : 'Create view', isLoading: isLoading })] })] }) }));
|
|
338
563
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/astProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,kCAAkC,CAChD,qBAAqB,EAAE,MAAM,EAAE,EAC/B,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,EAAE,GAAG,EACX,GAAG,EAAE,GAAG,OAsCT"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processJoinASTWithDuplicateColumns = void 0;
|
|
4
|
+
function processJoinASTWithDuplicateColumns(duplicateColumnsNames, tableNames, schema, ast) {
|
|
5
|
+
const columns = [];
|
|
6
|
+
schema.forEach((table) => {
|
|
7
|
+
if (tableNames.includes(table.tableName)) {
|
|
8
|
+
table.columns.forEach((column) => {
|
|
9
|
+
let tableName = table.tableName;
|
|
10
|
+
if (table.tableName.includes('.')) {
|
|
11
|
+
tableName = table.tableName.split('.')[1] || table.tableName;
|
|
12
|
+
}
|
|
13
|
+
if (duplicateColumnsNames.includes(column.columnName)) {
|
|
14
|
+
columns.push({
|
|
15
|
+
type: 'expr',
|
|
16
|
+
as: `${tableName}_${column.columnName}`,
|
|
17
|
+
expr: {
|
|
18
|
+
type: 'column_ref',
|
|
19
|
+
table: tableName,
|
|
20
|
+
column: column.columnName,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
columns.push({
|
|
26
|
+
type: 'expr',
|
|
27
|
+
as: null,
|
|
28
|
+
expr: {
|
|
29
|
+
type: 'column_ref',
|
|
30
|
+
table: tableName,
|
|
31
|
+
column: column.columnName,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
ast.columns = columns;
|
|
39
|
+
return ast;
|
|
40
|
+
}
|
|
41
|
+
exports.processJoinASTWithDuplicateColumns = processJoinASTWithDuplicateColumns;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astProcessing.uspec.d.ts","sourceRoot":"","sources":["../../../src/utils/astProcessing.uspec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const astProcessing_1 = require("./astProcessing");
|
|
4
|
+
describe('astProcessing', () => {
|
|
5
|
+
describe('processJoinASTWithDuplicateColumns', () => {
|
|
6
|
+
it('should return a new ast object with unambiguous columns', () => {
|
|
7
|
+
const dummyAst = { where: 'dummy where' };
|
|
8
|
+
const tableNames = ['table1', 'table2'];
|
|
9
|
+
const duplicateColumns = ['amount'];
|
|
10
|
+
const schema = [
|
|
11
|
+
{
|
|
12
|
+
tableName: 'table1',
|
|
13
|
+
columns: [{ columnName: 'amount' }, { columnName: 'name' }],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
tableName: 'table2',
|
|
17
|
+
columns: [{ columnName: 'amount' }, { columnName: 'other_name' }],
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
const resultAst = (0, astProcessing_1.processJoinASTWithDuplicateColumns)(duplicateColumns, tableNames, schema, dummyAst);
|
|
21
|
+
expect(resultAst.columns.length).toEqual(4);
|
|
22
|
+
expect(resultAst.columns[0].as).toEqual('table1_amount');
|
|
23
|
+
expect(resultAst.columns[1].as).toEqual(null);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columnProcessing.d.ts","sourceRoot":"","sources":["../../../src/utils/columnProcessing.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBlE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAa1E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processColumnReference = exports.convertFieldTypeToJSType = void 0;
|
|
4
|
+
function convertFieldTypeToJSType(fieldType) {
|
|
5
|
+
switch (fieldType) {
|
|
6
|
+
case 'bool':
|
|
7
|
+
return 'bool';
|
|
8
|
+
case 'int8':
|
|
9
|
+
case 'int2':
|
|
10
|
+
case 'int4':
|
|
11
|
+
case 'float4':
|
|
12
|
+
case 'float8':
|
|
13
|
+
case 'numeric':
|
|
14
|
+
return 'number';
|
|
15
|
+
case 'date':
|
|
16
|
+
case 'time':
|
|
17
|
+
case 'timestamptz':
|
|
18
|
+
case 'timestamp':
|
|
19
|
+
return 'date';
|
|
20
|
+
case 'interval':
|
|
21
|
+
case 'varchar':
|
|
22
|
+
case 'text':
|
|
23
|
+
default:
|
|
24
|
+
return 'string';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.convertFieldTypeToJSType = convertFieldTypeToJSType;
|
|
28
|
+
function processColumnReference(column, databaseType) {
|
|
29
|
+
if (['postgresql', 'snowflake'].includes(databaseType.toLowerCase())) {
|
|
30
|
+
const columnParts = column.split('.');
|
|
31
|
+
if (columnParts.length > 1) {
|
|
32
|
+
return `"${columnParts[0]}"."${columnParts[1]}"`;
|
|
33
|
+
}
|
|
34
|
+
return `"${column}"`;
|
|
35
|
+
}
|
|
36
|
+
const columnParts = column.split('.');
|
|
37
|
+
if (columnParts.length > 1) {
|
|
38
|
+
return `\`${columnParts[0]}\`.\`${columnParts[1]}\``;
|
|
39
|
+
}
|
|
40
|
+
return `\`${column}\``;
|
|
41
|
+
}
|
|
42
|
+
exports.processColumnReference = processColumnReference;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const editSQLView: (editName: string, editViewQuery: string, editViewId: string, state: any) => Promise<any>;
|
|
2
|
-
export declare const addSqlView: (name: string, editViewQuery: string, state: any) => Promise<any>;
|
|
1
|
+
export declare const editSQLView: (editName: string, editViewQuery: string, editViewId: string, customFieldInfo: any, state: any) => Promise<any>;
|
|
2
|
+
export declare const addSqlView: (name: string, editViewQuery: string, customFieldInfo: any, state: any) => Promise<any>;
|
|
3
3
|
export declare const deleteSQLView: (id: string, state: any) => Promise<any>;
|
|
4
4
|
//# sourceMappingURL=dataEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataEditor.d.ts","sourceRoot":"","sources":["../../../src/utils/dataEditor.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,aACZ,MAAM,iBACD,MAAM,cACT,MAAM,
|
|
1
|
+
{"version":3,"file":"dataEditor.d.ts","sourceRoot":"","sources":["../../../src/utils/dataEditor.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,aACZ,MAAM,iBACD,MAAM,cACT,MAAM,mBACD,GAAG,SACb,GAAG,iBAuDX,CAAC;AAEF,eAAO,MAAM,UAAU,SACf,MAAM,iBACG,MAAM,mBACJ,GAAG,SACb,GAAG,iBAgDX,CAAC;AAEF,eAAO,MAAM,aAAa,OAAc,MAAM,SAAS,GAAG,iBAmCzD,CAAC"}
|