@solidxai/core-ui 0.1.12-beta.7 → 0.1.12-beta.8
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/components/auth/AuthLayout.d.ts.map +1 -1
- package/dist/components/auth/AuthLayout.js +19 -17
- package/dist/components/auth/AuthLayout.js.map +1 -1
- package/dist/components/auth/AuthLayout.tsx +59 -34
- package/dist/components/common/BackendReconnectIndicator.d.ts +6 -0
- package/dist/components/common/BackendReconnectIndicator.d.ts.map +1 -0
- package/dist/components/common/BackendReconnectIndicator.js +25 -0
- package/dist/components/common/BackendReconnectIndicator.js.map +1 -0
- package/dist/components/common/BackendReconnectIndicator.tsx +45 -0
- package/dist/components/common/SettingsComponent.d.ts.map +1 -1
- package/dist/components/common/SettingsComponent.js +7 -3
- package/dist/components/common/SettingsComponent.js.map +1 -1
- package/dist/components/common/SettingsComponent.module.css +144 -12
- package/dist/components/common/SettingsComponent.tsx +22 -3
- package/dist/components/common/SolidAdmin.d.ts.map +1 -1
- package/dist/components/common/SolidAdmin.js +7 -2
- package/dist/components/common/SolidAdmin.js.map +1 -1
- package/dist/components/common/SolidAdmin.tsx +7 -2
- package/dist/components/common/SolidBreadcrumb.d.ts.map +1 -1
- package/dist/components/common/SolidBreadcrumb.js +1 -6
- package/dist/components/common/SolidBreadcrumb.js.map +1 -1
- package/dist/components/common/SolidBreadcrumb.tsx +1 -8
- package/dist/components/common/SolidMaterialSymbol.d.ts +10 -0
- package/dist/components/common/SolidMaterialSymbol.d.ts.map +1 -0
- package/dist/components/common/SolidMaterialSymbol.js +69 -0
- package/dist/components/common/SolidMaterialSymbol.js.map +1 -0
- package/dist/components/common/SolidMaterialSymbol.tsx +96 -0
- package/dist/components/common/SolidToastProvider.d.ts.map +1 -1
- package/dist/components/common/SolidToastProvider.js +14 -1
- package/dist/components/common/SolidToastProvider.js.map +1 -1
- package/dist/components/common/SolidToastProvider.tsx +19 -1
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +3 -1
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +3 -2
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +14 -18
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +43 -16
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +24 -2
- package/dist/components/core/form/SolidFormFooter.js +1 -1
- package/dist/components/core/form/SolidFormFooter.js.map +1 -1
- package/dist/components/core/form/SolidFormFooter.tsx +1 -1
- package/dist/components/core/form/SolidFormLayouts.js +1 -1
- package/dist/components/core/form/SolidFormLayouts.js.map +1 -1
- package/dist/components/core/form/SolidFormLayouts.tsx +2 -2
- package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaMultipleField.js +120 -56
- package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaMultipleField.tsx +63 -50
- package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.js +115 -37
- package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/form/fields/SolidMediaSingleField.tsx +36 -35
- package/dist/components/core/form/fields/SolidRichTextField.d.ts.map +1 -1
- package/dist/components/core/form/fields/SolidRichTextField.js +67 -4
- package/dist/components/core/form/fields/SolidRichTextField.js.map +1 -1
- package/dist/components/core/form/fields/SolidRichTextField.tsx +89 -7
- package/dist/components/core/form/fields/mediaFieldUtils.d.ts +3 -0
- package/dist/components/core/form/fields/mediaFieldUtils.d.ts.map +1 -0
- package/dist/components/core/form/fields/mediaFieldUtils.js +30 -0
- package/dist/components/core/form/fields/mediaFieldUtils.js.map +1 -0
- package/dist/components/core/form/fields/mediaFieldUtils.ts +45 -0
- package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.js +1 -1
- package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.js.map +1 -1
- package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.tsx +3 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +22 -23
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
- package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +13 -7
- package/dist/components/core/form/fields/widgets/SolidIconEditWidget.d.ts.map +1 -1
- package/dist/components/core/form/fields/widgets/SolidIconEditWidget.js +16 -11
- package/dist/components/core/form/fields/widgets/SolidIconEditWidget.js.map +1 -1
- package/dist/components/core/form/fields/widgets/SolidIconEditWidget.tsx +32 -18
- package/dist/components/core/form/fields/widgets/SolidIconViewWidget.d.ts.map +1 -1
- package/dist/components/core/form/fields/widgets/SolidIconViewWidget.js +3 -1
- package/dist/components/core/form/fields/widgets/SolidIconViewWidget.js.map +1 -1
- package/dist/components/core/form/fields/widgets/SolidIconViewWidget.tsx +11 -5
- package/dist/components/core/list/SolidDataTable.d.ts.map +1 -1
- package/dist/components/core/list/SolidDataTable.js +3 -2
- package/dist/components/core/list/SolidDataTable.js.map +1 -1
- package/dist/components/core/list/SolidDataTable.tsx +3 -2
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +11 -5
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +15 -8
- package/dist/components/core/list/SolidListViewColumn.d.ts.map +1 -1
- package/dist/components/core/list/SolidListViewColumn.js +1 -0
- package/dist/components/core/list/SolidListViewColumn.js.map +1 -1
- package/dist/components/core/list/SolidListViewColumn.tsx +1 -0
- package/dist/components/core/list/columns/SolidShortTextColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidShortTextColumn.js +7 -2
- package/dist/components/core/list/columns/SolidShortTextColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidShortTextColumn.tsx +7 -2
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.js +4 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.tsx +5 -2
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +2 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +2 -1
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.js +4 -1
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.js.map +1 -1
- package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.tsx +5 -2
- package/dist/components/core/locales/SolidLocale.d.ts.map +1 -1
- package/dist/components/core/locales/SolidLocale.js +1 -1
- package/dist/components/core/locales/SolidLocale.js.map +1 -1
- package/dist/components/core/locales/SolidLocale.tsx +1 -0
- package/dist/components/core/model/CreateModel.css +26 -0
- package/dist/components/core/model/FieldMetaData.d.ts.map +1 -1
- package/dist/components/core/model/FieldMetaData.js +21 -3
- package/dist/components/core/model/FieldMetaData.js.map +1 -1
- package/dist/components/core/model/FieldMetaData.tsx +45 -4
- package/dist/components/core/model/FieldMetaDataForm.css +82 -0
- package/dist/components/core/model/FieldMetaDataForm.d.ts +1 -0
- package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.js +246 -235
- package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.tsx +46 -34
- package/dist/components/core/model/FieldSelector.js +1 -1
- package/dist/components/core/model/FieldSelector.js.map +1 -1
- package/dist/components/core/model/FieldSelector.tsx +1 -1
- package/dist/components/core/model/ModelMetaData.js +1 -1
- package/dist/components/core/model/ModelMetaData.js.map +1 -1
- package/dist/components/core/model/ModelMetaData.tsx +1 -1
- package/dist/components/core/module/CreateModule.css +55 -2
- package/dist/components/core/module/CreateModule.d.ts.map +1 -1
- package/dist/components/core/module/CreateModule.js +2 -2
- package/dist/components/core/module/CreateModule.js.map +1 -1
- package/dist/components/core/module/CreateModule.tsx +3 -2
- package/dist/components/core/module/ModuleMetadataExplorer.css +27 -0
- package/dist/components/core/module/ModuleMetadataExplorer.d.ts.map +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.js +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.js.map +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.tsx +1 -0
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +6 -1
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +7 -1
- package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
- package/dist/components/layout/AdminHeaderActions.js +10 -9
- package/dist/components/layout/AdminHeaderActions.js.map +1 -1
- package/dist/components/layout/AdminHeaderActions.tsx +2 -0
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +2 -1
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/AppSidebar.tsx +12 -5
- package/dist/components/layout/SolidMenuItemIcon.d.ts +9 -0
- package/dist/components/layout/SolidMenuItemIcon.d.ts.map +1 -0
- package/dist/components/layout/SolidMenuItemIcon.js +20 -0
- package/dist/components/layout/SolidMenuItemIcon.js.map +1 -0
- package/dist/components/layout/SolidMenuItemIcon.tsx +45 -0
- package/dist/components/layout/navbar-two-menu.d.ts.map +1 -1
- package/dist/components/layout/navbar-two-menu.js +6 -7
- package/dist/components/layout/navbar-two-menu.js.map +1 -1
- package/dist/components/layout/navbar-two-menu.tsx +4 -12
- package/dist/components/shad-cn-ui/SolidCodeEditor.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidCodeEditor.js +30 -2
- package/dist/components/shad-cn-ui/SolidCodeEditor.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidCodeEditor.tsx +38 -1
- package/dist/helpers/backendHealthMonitor.d.ts +39 -0
- package/dist/helpers/backendHealthMonitor.d.ts.map +1 -0
- package/dist/helpers/backendHealthMonitor.js +255 -0
- package/dist/helpers/backendHealthMonitor.js.map +1 -0
- package/dist/helpers/backendHealthMonitor.ts +177 -0
- package/dist/helpers/helpers.d.ts +1 -0
- package/dist/helpers/helpers.d.ts.map +1 -1
- package/dist/helpers/helpers.js +9 -0
- package/dist/helpers/helpers.js.map +1 -1
- package/dist/helpers/helpers.ts +11 -1
- package/dist/helpers/menuItemIcons.d.ts +34 -0
- package/dist/helpers/menuItemIcons.d.ts.map +1 -0
- package/dist/helpers/menuItemIcons.js +144 -0
- package/dist/helpers/menuItemIcons.js.map +1 -0
- package/dist/helpers/menuItemIcons.ts +191 -0
- package/dist/helpers/relationDisplay.d.ts +3 -0
- package/dist/helpers/relationDisplay.d.ts.map +1 -0
- package/dist/helpers/relationDisplay.js +92 -0
- package/dist/helpers/relationDisplay.js.map +1 -0
- package/dist/helpers/relationDisplay.ts +101 -0
- package/dist/helpers/settingsPayload.d.ts +1 -0
- package/dist/helpers/settingsPayload.d.ts.map +1 -1
- package/dist/helpers/settingsPayload.js.map +1 -1
- package/dist/helpers/settingsPayload.ts +1 -0
- package/dist/helpers/solidIcons.d.ts +2 -0
- package/dist/helpers/solidIcons.d.ts.map +1 -1
- package/dist/helpers/solidIcons.js +8 -0
- package/dist/helpers/solidIcons.js.map +1 -1
- package/dist/helpers/solidIcons.tsx +10 -1
- package/dist/helpers/waitForBackendAvailability.d.ts +1 -0
- package/dist/helpers/waitForBackendAvailability.d.ts.map +1 -1
- package/dist/helpers/waitForBackendAvailability.js +35 -22
- package/dist/helpers/waitForBackendAvailability.js.map +1 -1
- package/dist/helpers/waitForBackendAvailability.ts +18 -12
- package/dist/http/solidHttp.d.ts.map +1 -1
- package/dist/http/solidHttp.js +10 -4
- package/dist/http/solidHttp.js.map +1 -1
- package/dist/http/solidHttp.ts +9 -4
- package/dist/redux/api/datasourceIntrospectionApi.d.ts +4 -0
- package/dist/redux/api/datasourceIntrospectionApi.d.ts.map +1 -1
- package/dist/redux/api/datasourceIntrospectionApi.js.map +1 -1
- package/dist/redux/api/datasourceIntrospectionApi.ts +4 -0
- package/dist/redux/api/fetchBaseQuery.d.ts.map +1 -1
- package/dist/redux/api/fetchBaseQuery.js +9 -3
- package/dist/redux/api/fetchBaseQuery.js.map +1 -1
- package/dist/redux/api/fetchBaseQuery.tsx +9 -3
- package/dist/redux/store/StoreProvider.d.ts.map +1 -1
- package/dist/redux/store/StoreProvider.js +4 -3
- package/dist/redux/store/StoreProvider.js.map +1 -1
- package/dist/redux/store/StoreProvider.tsx +4 -3
- package/dist/resources/globals.css +341 -49
- package/dist/resources/solid-custom.css +410 -12
- package/dist/resources/solid-responsive.css +27 -16
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/routes/AppEventListener.d.ts.map +1 -1
- package/dist/routes/AppEventListener.js +23 -0
- package/dist/routes/AppEventListener.js.map +1 -1
- package/dist/routes/AppEventListener.tsx +29 -0
- package/dist/routes/pages/admin/core/DashboardPage.module.css +12 -0
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.css +306 -3
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js +745 -393
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.tsx +1074 -420
- package/dist/routes/pages/admin/core/DatasourcesPage.css +15 -0
- package/dist/routes/pages/admin/core/DatasourcesPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DatasourcesPage.js +7 -188
- package/dist/routes/pages/admin/core/DatasourcesPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DatasourcesPage.tsx +3 -393
- package/package.json +1 -1
|
@@ -272,6 +272,21 @@
|
|
|
272
272
|
background: color-mix(in srgb, var(--card) 96%, white 4%);
|
|
273
273
|
}
|
|
274
274
|
|
|
275
|
+
.sdm-switch {
|
|
276
|
+
min-width: 44px;
|
|
277
|
+
appearance: none;
|
|
278
|
+
-webkit-appearance: none;
|
|
279
|
+
justify-content: flex-start;
|
|
280
|
+
box-sizing: border-box;
|
|
281
|
+
flex-shrink: 0;
|
|
282
|
+
vertical-align: middle;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.sdm-switch .solid-switch-thumb {
|
|
286
|
+
display: block;
|
|
287
|
+
flex: 0 0 18px;
|
|
288
|
+
}
|
|
289
|
+
|
|
275
290
|
.sdm-switch-field strong {
|
|
276
291
|
display: block;
|
|
277
292
|
font-size: 13px;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatasourcesPage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/DatasourcesPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DatasourcesPage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/DatasourcesPage.tsx"],"names":[],"mappings":"AAMA,OAAO,uBAAuB,CAAC;AAgC/B,wBAAgB,eAAe,4CA+G9B"}
|
|
@@ -1,101 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
-
t[p] = s[p];
|
|
7
|
-
}
|
|
8
|
-
return t;
|
|
9
|
-
};
|
|
10
|
-
return __assign.apply(this, arguments);
|
|
11
|
-
};
|
|
12
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
23
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
-
function step(op) {
|
|
26
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
29
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
-
switch (op[0]) {
|
|
31
|
-
case 0: case 1: t = op; break;
|
|
32
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
-
default:
|
|
36
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
-
if (t[2]) _.ops.pop();
|
|
41
|
-
_.trys.pop(); continue;
|
|
42
|
-
}
|
|
43
|
-
op = body.call(thisArg, _);
|
|
44
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
49
|
-
import { Database, Plus, RefreshCw } from "lucide-react";
|
|
50
|
-
import { useEffect, useState } from "react";
|
|
51
|
-
import { useDispatch } from "react-redux";
|
|
52
|
-
import { showToast } from "../../../../redux/features/toastSlice";
|
|
53
|
-
import { useCreateDatasourceMutation, useGetDatasourcesQuery, } from "../../../../redux/api/datasourceManagementApi";
|
|
54
|
-
import { SolidButton, SolidDialog, SolidDialogBody, SolidDialogDescription, SolidDialogFooter, SolidDialogHeader, SolidDialogSeparator, SolidDialogTitle, SolidInput, SolidPanel, SolidSelect, SolidSpinner, SolidSwitch, } from "../../../../components/shad-cn-ui";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Database, RefreshCw } from "lucide-react";
|
|
3
|
+
import { useGetDatasourcesQuery } from "../../../../redux/api/datasourceManagementApi";
|
|
4
|
+
import { SolidButton, SolidSpinner, } from "../../../../components/shad-cn-ui";
|
|
55
5
|
import "./DatasourcesPage.css";
|
|
56
6
|
var providerOptions = [
|
|
57
7
|
{ label: "PostgreSQL", value: "postgres" },
|
|
58
8
|
{ label: "MySQL", value: "mysql" },
|
|
59
9
|
{ label: "MS SQL Server", value: "mssql" },
|
|
60
10
|
];
|
|
61
|
-
var defaultFormState = {
|
|
62
|
-
name: "",
|
|
63
|
-
displayName: "",
|
|
64
|
-
type: "postgres",
|
|
65
|
-
host: "",
|
|
66
|
-
port: 5432,
|
|
67
|
-
database: "",
|
|
68
|
-
username: "",
|
|
69
|
-
password: "",
|
|
70
|
-
synchronize: false,
|
|
71
|
-
logging: false,
|
|
72
|
-
ssl: false,
|
|
73
|
-
sslRejectUnauthorized: true,
|
|
74
|
-
poolMax: 20,
|
|
75
|
-
connectionTimeoutMs: 60000,
|
|
76
|
-
idleTimeoutMs: 30000,
|
|
77
|
-
statementTimeoutMs: 60000,
|
|
78
|
-
idleInTxTimeoutMs: 60000,
|
|
79
|
-
retryAttempts: 0,
|
|
80
|
-
retryDelayMs: 0,
|
|
81
|
-
encrypt: false,
|
|
82
|
-
trustServerCertificate: true,
|
|
83
|
-
};
|
|
84
|
-
function slugifyDatasourceName(value) {
|
|
85
|
-
return value
|
|
86
|
-
.toLowerCase()
|
|
87
|
-
.trim()
|
|
88
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
89
|
-
.replace(/^-+|-+$/g, "")
|
|
90
|
-
.slice(0, 48);
|
|
91
|
-
}
|
|
92
|
-
function getDefaultPort(type) {
|
|
93
|
-
if (type === "mysql")
|
|
94
|
-
return 3306;
|
|
95
|
-
if (type === "mssql")
|
|
96
|
-
return 1433;
|
|
97
|
-
return 5432;
|
|
98
|
-
}
|
|
99
11
|
function providerLabel(type) {
|
|
100
12
|
var _a;
|
|
101
13
|
return ((_a = providerOptions.find(function (option) { return option.value === type; })) === null || _a === void 0 ? void 0 : _a.label) || type;
|
|
@@ -114,108 +26,15 @@ function providerGlyph(type) {
|
|
|
114
26
|
return "MY";
|
|
115
27
|
return "MS";
|
|
116
28
|
}
|
|
117
|
-
function readMutationError(error) {
|
|
118
|
-
var _a;
|
|
119
|
-
return (((_a = error === null || error === void 0 ? void 0 : error.data) === null || _a === void 0 ? void 0 : _a.message)
|
|
120
|
-
|| (error === null || error === void 0 ? void 0 : error.error)
|
|
121
|
-
|| (error === null || error === void 0 ? void 0 : error.message)
|
|
122
|
-
|| "Unable to save the datasource.");
|
|
123
|
-
}
|
|
124
|
-
function sanitizePayload(formState) {
|
|
125
|
-
var payload = __assign(__assign({}, formState), { name: slugifyDatasourceName(formState.name) });
|
|
126
|
-
if (payload.type === "mssql") {
|
|
127
|
-
delete payload.ssl;
|
|
128
|
-
delete payload.sslRejectUnauthorized;
|
|
129
|
-
delete payload.statementTimeoutMs;
|
|
130
|
-
delete payload.idleInTxTimeoutMs;
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
delete payload.encrypt;
|
|
134
|
-
delete payload.trustServerCertificate;
|
|
135
|
-
}
|
|
136
|
-
if (payload.type !== "postgres") {
|
|
137
|
-
delete payload.statementTimeoutMs;
|
|
138
|
-
delete payload.idleInTxTimeoutMs;
|
|
139
|
-
}
|
|
140
|
-
return payload;
|
|
141
|
-
}
|
|
142
29
|
function DatasourceProviderMark(_a) {
|
|
143
30
|
var type = _a.type;
|
|
144
31
|
return (_jsx("div", { className: "sdm-provider-mark ".concat(providerTone(type)), children: _jsx("span", { children: providerGlyph(type) }) }));
|
|
145
32
|
}
|
|
146
33
|
export function DatasourcesPage() {
|
|
147
|
-
var
|
|
148
|
-
|
|
149
|
-
var dispatch = useDispatch();
|
|
150
|
-
var _h = useGetDatasourcesQuery(), _j = _h.data, datasources = _j === void 0 ? [] : _j, isLoading = _h.isLoading, isFetching = _h.isFetching, error = _h.error, refetch = _h.refetch;
|
|
151
|
-
var _k = useCreateDatasourceMutation(), createDatasource = _k[0], isCreating = _k[1].isLoading;
|
|
152
|
-
var _l = useState(false), dialogOpen = _l[0], setDialogOpen = _l[1];
|
|
153
|
-
var _m = useState(false), nameTouched = _m[0], setNameTouched = _m[1];
|
|
154
|
-
var _o = useState(defaultFormState), formState = _o[0], setFormState = _o[1];
|
|
155
|
-
useEffect(function () {
|
|
156
|
-
if (!dialogOpen) {
|
|
157
|
-
setFormState(defaultFormState);
|
|
158
|
-
setNameTouched(false);
|
|
159
|
-
}
|
|
160
|
-
}, [dialogOpen]);
|
|
161
|
-
var handleFieldChange = function (key, value) {
|
|
162
|
-
setFormState(function (current) {
|
|
163
|
-
var _a;
|
|
164
|
-
return (__assign(__assign({}, current), (_a = {}, _a[key] = value, _a)));
|
|
165
|
-
});
|
|
166
|
-
};
|
|
167
|
-
var handleDisplayNameChange = function (value) {
|
|
168
|
-
setFormState(function (current) { return (__assign(__assign({}, current), { displayName: value, name: nameTouched ? current.name : slugifyDatasourceName(value) })); });
|
|
169
|
-
};
|
|
170
|
-
var handleTypeChange = function (value) {
|
|
171
|
-
handleFieldChange("type", value);
|
|
172
|
-
handleFieldChange("port", getDefaultPort(value));
|
|
173
|
-
};
|
|
174
|
-
var handleSubmit = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
175
|
-
var payload, mutationError_1;
|
|
176
|
-
return __generator(this, function (_a) {
|
|
177
|
-
switch (_a.label) {
|
|
178
|
-
case 0:
|
|
179
|
-
if (!formState.name || !formState.host || !formState.database || !formState.username || !formState.password) {
|
|
180
|
-
dispatch(showToast({
|
|
181
|
-
severity: "warn",
|
|
182
|
-
summary: "Missing details",
|
|
183
|
-
detail: "Fill in the datasource name, host, database, username, and password.",
|
|
184
|
-
}));
|
|
185
|
-
return [2 /*return*/];
|
|
186
|
-
}
|
|
187
|
-
_a.label = 1;
|
|
188
|
-
case 1:
|
|
189
|
-
_a.trys.push([1, 3, , 4]);
|
|
190
|
-
payload = sanitizePayload(formState);
|
|
191
|
-
return [4 /*yield*/, createDatasource(payload).unwrap()];
|
|
192
|
-
case 2:
|
|
193
|
-
_a.sent();
|
|
194
|
-
setDialogOpen(false);
|
|
195
|
-
dispatch(showToast({
|
|
196
|
-
severity: "success",
|
|
197
|
-
summary: "Datasource created",
|
|
198
|
-
detail: "".concat(payload.displayName || payload.name, " is now registered in SolidX."),
|
|
199
|
-
}));
|
|
200
|
-
return [3 /*break*/, 4];
|
|
201
|
-
case 3:
|
|
202
|
-
mutationError_1 = _a.sent();
|
|
203
|
-
dispatch(showToast({
|
|
204
|
-
severity: "error",
|
|
205
|
-
summary: "Datasource creation failed",
|
|
206
|
-
detail: readMutationError(mutationError_1),
|
|
207
|
-
}));
|
|
208
|
-
return [3 /*break*/, 4];
|
|
209
|
-
case 4: return [2 /*return*/];
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}); };
|
|
213
|
-
return (_jsxs("div", { className: "sdm-page", children: [_jsxs("div", { className: "sdm-header", children: [_jsxs("div", { className: "sdm-title-block", children: [_jsx("h1", { className: "sdm-title", children: "Datasource Management" }), _jsx("p", { className: "sdm-subtitle", children: "Review and manage the datasources configured for this SolidX application." })] }), _jsxs("div", { className: "sdm-header-actions", children: [isFetching && !isLoading ? (_jsxs("div", { className: "sdm-inline-status", children: [_jsx(SolidSpinner, { size: 16 }), _jsx("span", { children: "Refreshing" })] })) : null, _jsx(SolidButton, { className: "sdm-icon-button", leftIcon: _jsx(Plus, { size: 16 }), onClick: function () { return setDialogOpen(true); }, tooltip: "Add datasource", "aria-label": "Add datasource" }), _jsx(SolidButton, { className: "sdm-icon-button", leftIcon: _jsx(RefreshCw, { size: 16 }), onClick: function () { return void refetch(); }, tooltip: "Refresh", "aria-label": "Refresh" })] })] }), isLoading ? (_jsxs("div", { className: "sdm-loading", children: [_jsx(SolidSpinner, { size: 28 }), _jsx("p", { children: "Loading datasource configuration..." })] })) : error ? (_jsxs("div", { className: "sdm-error", children: [_jsx("span", { children: "Unable to load datasource configuration." }), _jsx(SolidButton, { size: "small", variant: "outline", onClick: function () { return void refetch(); }, children: "Retry" })] })) : datasources.length ? (_jsx("div", { className: "sdm-grid", children: datasources.map(function (datasource) {
|
|
34
|
+
var _a = useGetDatasourcesQuery(), _b = _a.data, datasources = _b === void 0 ? [] : _b, isLoading = _a.isLoading, isFetching = _a.isFetching, error = _a.error, refetch = _a.refetch;
|
|
35
|
+
return (_jsxs("div", { className: "sdm-page", children: [_jsxs("div", { className: "sdm-header", children: [_jsxs("div", { className: "sdm-title-block", children: [_jsx("h1", { className: "sdm-title", children: "Datasource Management" }), _jsx("p", { className: "sdm-subtitle", children: "Review and manage the datasources configured for this SolidX application." })] }), _jsxs("div", { className: "sdm-header-actions", children: [isFetching && !isLoading ? (_jsxs("div", { className: "sdm-inline-status", children: [_jsx(SolidSpinner, { size: 16 }), _jsx("span", { children: "Refreshing" })] })) : null, _jsx(SolidButton, { className: "sdm-icon-button", leftIcon: _jsx(RefreshCw, { size: 16 }), onClick: function () { return void refetch(); }, tooltip: "Refresh", "aria-label": "Refresh" })] })] }), isLoading ? (_jsxs("div", { className: "sdm-loading", children: [_jsx(SolidSpinner, { size: 28 }), _jsx("p", { children: "Loading datasource configuration..." })] })) : error ? (_jsxs("div", { className: "sdm-error", children: [_jsx("span", { children: "Unable to load datasource configuration." }), _jsx(SolidButton, { size: "small", variant: "outline", onClick: function () { return void refetch(); }, children: "Retry" })] })) : datasources.length ? (_jsx("div", { className: "sdm-grid", children: datasources.map(function (datasource) {
|
|
214
36
|
var _a, _b;
|
|
215
37
|
return (_jsxs("article", { className: "sdm-card", children: [_jsxs("div", { className: "sdm-card__top", children: [_jsxs("div", { className: "sdm-card__identity", children: [_jsx(DatasourceProviderMark, { type: datasource.type }), _jsxs("div", { children: [_jsx("h3", { children: datasource.displayName }), _jsx("p", { children: datasource.name })] })] }), _jsxs("div", { className: "sdm-card__badges", children: [_jsx("span", { className: "sdm-badge sdm-badge--provider", children: providerLabel(datasource.type) }), datasource.isDefault ? _jsx("span", { className: "sdm-badge sdm-badge--default", children: "Default" }) : null] })] }), _jsxs("div", { className: "sdm-card__facts", children: [_jsxs("div", { className: "sdm-card__row", children: [_jsx("span", { children: "Host" }), _jsx("strong", { children: datasource.host || "Not configured" })] }), _jsxs("div", { className: "sdm-card__row", children: [_jsx("span", { children: "Port" }), _jsx("strong", { children: (_a = datasource.port) !== null && _a !== void 0 ? _a : "Not configured" })] }), _jsxs("div", { className: "sdm-card__row", children: [_jsx("span", { children: "Database" }), _jsx("strong", { children: datasource.database || "Not configured" })] }), _jsxs("div", { className: "sdm-card__row", children: [_jsx("span", { children: "User" }), _jsx("strong", { children: datasource.username || "Not configured" })] }), _jsxs("div", { className: "sdm-card__row", children: [_jsx("span", { children: "Env prefix" }), _jsx("strong", { children: datasource.envPrefix })] }), _jsxs("div", { className: "sdm-card__row", children: [_jsx("span", { children: "Password" }), _jsx("strong", { children: datasource.passwordConfigured ? "Configured" : "Missing" })] })] }), _jsxs("div", { className: "sdm-card__footer", children: [_jsxs("div", { className: "sdm-meta-pill", children: ["sync: ", datasource.synchronize === null ? "n/a" : String(datasource.synchronize)] }), _jsxs("div", { className: "sdm-meta-pill", children: ["logging: ", datasource.logging === null ? "n/a" : String(datasource.logging)] }), ((_b = datasource.advanced) === null || _b === void 0 ? void 0 : _b.poolMax) ? _jsxs("div", { className: "sdm-meta-pill", children: ["pool: ", datasource.advanced.poolMax] }) : null] })] }, datasource.name));
|
|
216
|
-
}) })) : (_jsxs("div", { className: "sdm-empty", children: [_jsx(Database, { size: 22 }), _jsxs("div", { children: [_jsx("h3", { children: "No datasources configured" }), _jsx("p", { children: "
|
|
217
|
-
setNameTouched(true);
|
|
218
|
-
handleFieldChange("name", slugifyDatasourceName(event.target.value));
|
|
219
|
-
} })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Provider" }), _jsx(SolidSelect, { value: formState.type, options: providerOptions, onChange: function (event) { return handleTypeChange(event.value); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Port" }), _jsx(SolidInput, { type: "number", value: formState.port, onChange: function (event) { return handleFieldChange("port", Number(event.target.value) || getDefaultPort(formState.type)); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Host" }), _jsx(SolidInput, { value: formState.host, placeholder: "localhost", onChange: function (event) { return handleFieldChange("host", event.target.value); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Database" }), _jsx(SolidInput, { value: formState.database, placeholder: "solidx_app", onChange: function (event) { return handleFieldChange("database", event.target.value); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Username" }), _jsx(SolidInput, { value: formState.username, placeholder: "postgres", onChange: function (event) { return handleFieldChange("username", event.target.value); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Password" }), _jsx(SolidInput, { type: "password", value: formState.password, onChange: function (event) { return handleFieldChange("password", event.target.value); } })] })] }), _jsxs("div", { className: "sdm-switch-row", children: [_jsxs("label", { className: "sdm-switch-field", children: [_jsxs("div", { children: [_jsx("strong", { children: "Synchronize" }), _jsx("span", { children: "Write `*_DATABASE_SYNCHRONIZE` for this datasource." })] }), _jsx(SolidSwitch, { checked: !!formState.synchronize, onChange: function (checked) { return handleFieldChange("synchronize", checked); } })] }), _jsxs("label", { className: "sdm-switch-field", children: [_jsxs("div", { children: [_jsx("strong", { children: "Logging" }), _jsx("span", { children: "Enable TypeORM logging through the generated datasource module." })] }), _jsx(SolidSwitch, { checked: !!formState.logging, onChange: function (checked) { return handleFieldChange("logging", checked); } })] })] }), _jsx(SolidPanel, { header: "Advanced options", toggleable: true, className: "solid-column-panel sdm-advanced-panel", children: _jsxs("div", { className: "sdm-advanced-grid", children: [formState.type === "mssql" ? (_jsxs(_Fragment, { children: [_jsxs("label", { className: "sdm-switch-field sdm-switch-field--inline", children: [_jsxs("div", { children: [_jsx("strong", { children: "Encrypt" }), _jsx("span", { children: "MSSQL connection option." })] }), _jsx(SolidSwitch, { checked: !!formState.encrypt, onChange: function (checked) { return handleFieldChange("encrypt", checked); } })] }), _jsxs("label", { className: "sdm-switch-field sdm-switch-field--inline", children: [_jsxs("div", { children: [_jsx("strong", { children: "Trust certificate" }), _jsx("span", { children: "Allow self-signed development certificates." })] }), _jsx(SolidSwitch, { checked: !!formState.trustServerCertificate, onChange: function (checked) { return handleFieldChange("trustServerCertificate", checked); } })] })] })) : (_jsxs(_Fragment, { children: [_jsxs("label", { className: "sdm-switch-field sdm-switch-field--inline", children: [_jsxs("div", { children: [_jsx("strong", { children: "SSL" }), _jsx("span", { children: "Enable SSL for PostgreSQL or MySQL." })] }), _jsx(SolidSwitch, { checked: !!formState.ssl, onChange: function (checked) { return handleFieldChange("ssl", checked); } })] }), _jsxs("label", { className: "sdm-switch-field sdm-switch-field--inline", children: [_jsxs("div", { children: [_jsx("strong", { children: "Reject unauthorized" }), _jsx("span", { children: "Keep certificate validation strict when SSL is enabled." })] }), _jsx(SolidSwitch, { checked: !!formState.sslRejectUnauthorized, onChange: function (checked) { return handleFieldChange("sslRejectUnauthorized", checked); } })] })] })), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Pool max" }), _jsx(SolidInput, { type: "number", value: (_a = formState.poolMax) !== null && _a !== void 0 ? _a : "", onChange: function (event) { return handleFieldChange("poolMax", Number(event.target.value) || 0); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Connection timeout (ms)" }), _jsx(SolidInput, { type: "number", value: (_b = formState.connectionTimeoutMs) !== null && _b !== void 0 ? _b : "", onChange: function (event) { return handleFieldChange("connectionTimeoutMs", Number(event.target.value) || 0); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Idle timeout (ms)" }), _jsx(SolidInput, { type: "number", value: (_c = formState.idleTimeoutMs) !== null && _c !== void 0 ? _c : "", onChange: function (event) { return handleFieldChange("idleTimeoutMs", Number(event.target.value) || 0); } })] }), formState.type === "postgres" ? (_jsxs(_Fragment, { children: [_jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Statement timeout (ms)" }), _jsx(SolidInput, { type: "number", value: (_d = formState.statementTimeoutMs) !== null && _d !== void 0 ? _d : "", onChange: function (event) { return handleFieldChange("statementTimeoutMs", Number(event.target.value) || 0); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Idle in transaction timeout (ms)" }), _jsx(SolidInput, { type: "number", value: (_e = formState.idleInTxTimeoutMs) !== null && _e !== void 0 ? _e : "", onChange: function (event) { return handleFieldChange("idleInTxTimeoutMs", Number(event.target.value) || 0); } })] })] })) : null, _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Retry attempts" }), _jsx(SolidInput, { type: "number", value: (_f = formState.retryAttempts) !== null && _f !== void 0 ? _f : "", onChange: function (event) { return handleFieldChange("retryAttempts", Number(event.target.value) || 0); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Retry delay (ms)" }), _jsx(SolidInput, { type: "number", value: (_g = formState.retryDelayMs) !== null && _g !== void 0 ? _g : "", onChange: function (event) { return handleFieldChange("retryDelayMs", Number(event.target.value) || 0); } })] })] }) })] }), _jsxs(SolidDialogFooter, { children: [_jsx(SolidButton, { variant: "outline", onClick: function () { return setDialogOpen(false); }, children: "Cancel" }), _jsx(SolidButton, { onClick: function () { return void handleSubmit(); }, loading: isCreating, children: "Create datasource" })] })] })] }));
|
|
38
|
+
}) })) : (_jsxs("div", { className: "sdm-empty", children: [_jsx(Database, { size: 22 }), _jsxs("div", { children: [_jsx("h3", { children: "No datasources configured" }), _jsx("p", { children: "Datasource creation is temporarily unavailable from this screen." })] })] }))] }));
|
|
220
39
|
}
|
|
221
40
|
//# sourceMappingURL=DatasourcesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatasourcesPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/DatasourcesPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Database, Plus, RefreshCw } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { showToast } from \"../../../../redux/features/toastSlice\";\nimport {\n type CreateDatasourceManagementPayload,\n type DatasourceManagementRecord,\n useCreateDatasourceMutation,\n useGetDatasourcesQuery,\n} from \"../../../../redux/api/datasourceManagementApi\";\nimport {\n SolidButton,\n SolidDialog,\n SolidDialogBody,\n SolidDialogDescription,\n SolidDialogFooter,\n SolidDialogHeader,\n SolidDialogSeparator,\n SolidDialogTitle,\n SolidInput,\n SolidPanel,\n SolidSelect,\n SolidSpinner,\n SolidSwitch,\n} from \"../../../../components/shad-cn-ui\";\nimport \"./DatasourcesPage.css\";\n\nconst providerOptions = [\n { label: \"PostgreSQL\", value: \"postgres\" },\n { label: \"MySQL\", value: \"mysql\" },\n { label: \"MS SQL Server\", value: \"mssql\" },\n] as const;\n\nconst defaultFormState: CreateDatasourceManagementPayload = {\n name: \"\",\n displayName: \"\",\n type: \"postgres\",\n host: \"\",\n port: 5432,\n database: \"\",\n username: \"\",\n password: \"\",\n synchronize: false,\n logging: false,\n ssl: false,\n sslRejectUnauthorized: true,\n poolMax: 20,\n connectionTimeoutMs: 60000,\n idleTimeoutMs: 30000,\n statementTimeoutMs: 60000,\n idleInTxTimeoutMs: 60000,\n retryAttempts: 0,\n retryDelayMs: 0,\n encrypt: false,\n trustServerCertificate: true,\n};\n\nfunction slugifyDatasourceName(value: string) {\n return value\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48);\n}\n\nfunction getDefaultPort(type: CreateDatasourceManagementPayload[\"type\"]) {\n if (type === \"mysql\") return 3306;\n if (type === \"mssql\") return 1433;\n return 5432;\n}\n\nfunction providerLabel(type: string) {\n return providerOptions.find((option) => option.value === type)?.label || type;\n}\n\nfunction providerTone(type: string) {\n if (type === \"postgres\") return \"sdm-provider-mark--postgres\";\n if (type === \"mysql\") return \"sdm-provider-mark--mysql\";\n return \"sdm-provider-mark--mssql\";\n}\n\nfunction providerGlyph(type: string) {\n if (type === \"postgres\") return \"PG\";\n if (type === \"mysql\") return \"MY\";\n return \"MS\";\n}\n\nfunction readMutationError(error: any) {\n return (\n error?.data?.message\n || error?.error\n || error?.message\n || \"Unable to save the datasource.\"\n );\n}\n\nfunction sanitizePayload(formState: CreateDatasourceManagementPayload): CreateDatasourceManagementPayload {\n const payload: CreateDatasourceManagementPayload = {\n ...formState,\n name: slugifyDatasourceName(formState.name),\n };\n\n if (payload.type === \"mssql\") {\n delete payload.ssl;\n delete payload.sslRejectUnauthorized;\n delete payload.statementTimeoutMs;\n delete payload.idleInTxTimeoutMs;\n } else {\n delete payload.encrypt;\n delete payload.trustServerCertificate;\n }\n\n if (payload.type !== \"postgres\") {\n delete payload.statementTimeoutMs;\n delete payload.idleInTxTimeoutMs;\n }\n\n return payload;\n}\n\nfunction DatasourceProviderMark({ type }: { type: string }) {\n return (\n <div className={`sdm-provider-mark ${providerTone(type)}`}>\n <span>{providerGlyph(type)}</span>\n </div>\n );\n}\n\nexport function DatasourcesPage() {\n const dispatch = useDispatch();\n const {\n data: datasources = [],\n isLoading,\n isFetching,\n error,\n refetch,\n } = useGetDatasourcesQuery();\n const [createDatasource, { isLoading: isCreating }] = useCreateDatasourceMutation();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [nameTouched, setNameTouched] = useState(false);\n const [formState, setFormState] = useState<CreateDatasourceManagementPayload>(defaultFormState);\n\n useEffect(() => {\n if (!dialogOpen) {\n setFormState(defaultFormState);\n setNameTouched(false);\n }\n }, [dialogOpen]);\n\n const handleFieldChange = <K extends keyof CreateDatasourceManagementPayload>(\n key: K,\n value: CreateDatasourceManagementPayload[K],\n ) => {\n setFormState((current) => ({\n ...current,\n [key]: value,\n }));\n };\n\n const handleDisplayNameChange = (value: string) => {\n setFormState((current) => ({\n ...current,\n displayName: value,\n name: nameTouched ? current.name : slugifyDatasourceName(value),\n }));\n };\n\n const handleTypeChange = (value: CreateDatasourceManagementPayload[\"type\"]) => {\n handleFieldChange(\"type\", value);\n handleFieldChange(\"port\", getDefaultPort(value));\n };\n\n const handleSubmit = async () => {\n if (!formState.name || !formState.host || !formState.database || !formState.username || !formState.password) {\n dispatch(showToast({\n severity: \"warn\",\n summary: \"Missing details\",\n detail: \"Fill in the datasource name, host, database, username, and password.\",\n }));\n return;\n }\n\n try {\n const payload = sanitizePayload(formState);\n await createDatasource(payload).unwrap();\n setDialogOpen(false);\n dispatch(showToast({\n severity: \"success\",\n summary: \"Datasource created\",\n detail: `${payload.displayName || payload.name} is now registered in SolidX.`,\n }));\n } catch (mutationError: any) {\n dispatch(showToast({\n severity: \"error\",\n summary: \"Datasource creation failed\",\n detail: readMutationError(mutationError),\n }));\n }\n };\n\n return (\n <div className=\"sdm-page\">\n <div className=\"sdm-header\">\n <div className=\"sdm-title-block\">\n <h1 className=\"sdm-title\">Datasource Management</h1>\n <p className=\"sdm-subtitle\">Review and manage the datasources configured for this SolidX application.</p>\n </div>\n\n <div className=\"sdm-header-actions\">\n {isFetching && !isLoading ? (\n <div className=\"sdm-inline-status\">\n <SolidSpinner size={16} />\n <span>Refreshing</span>\n </div>\n ) : null}\n\n <SolidButton\n className=\"sdm-icon-button\"\n leftIcon={<Plus size={16} />}\n onClick={() => setDialogOpen(true)}\n tooltip=\"Add datasource\"\n aria-label=\"Add datasource\"\n />\n\n <SolidButton\n className=\"sdm-icon-button\"\n leftIcon={<RefreshCw size={16} />}\n onClick={() => void refetch()}\n tooltip=\"Refresh\"\n aria-label=\"Refresh\"\n />\n </div>\n </div>\n\n {isLoading ? (\n <div className=\"sdm-loading\">\n <SolidSpinner size={28} />\n <p>Loading datasource configuration...</p>\n </div>\n ) : error ? (\n <div className=\"sdm-error\">\n <span>Unable to load datasource configuration.</span>\n <SolidButton size=\"small\" variant=\"outline\" onClick={() => void refetch()}>\n Retry\n </SolidButton>\n </div>\n ) : datasources.length ? (\n <div className=\"sdm-grid\">\n {datasources.map((datasource) => (\n <article key={datasource.name} className=\"sdm-card\">\n <div className=\"sdm-card__top\">\n <div className=\"sdm-card__identity\">\n <DatasourceProviderMark type={datasource.type} />\n <div>\n <h3>{datasource.displayName}</h3>\n <p>{datasource.name}</p>\n </div>\n </div>\n <div className=\"sdm-card__badges\">\n <span className=\"sdm-badge sdm-badge--provider\">{providerLabel(datasource.type)}</span>\n {datasource.isDefault ? <span className=\"sdm-badge sdm-badge--default\">Default</span> : null}\n </div>\n </div>\n\n <div className=\"sdm-card__facts\">\n <div className=\"sdm-card__row\">\n <span>Host</span>\n <strong>{datasource.host || \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Port</span>\n <strong>{datasource.port ?? \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Database</span>\n <strong>{datasource.database || \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>User</span>\n <strong>{datasource.username || \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Env prefix</span>\n <strong>{datasource.envPrefix}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Password</span>\n <strong>{datasource.passwordConfigured ? \"Configured\" : \"Missing\"}</strong>\n </div>\n </div>\n\n <div className=\"sdm-card__footer\">\n <div className=\"sdm-meta-pill\">sync: {datasource.synchronize === null ? \"n/a\" : String(datasource.synchronize)}</div>\n <div className=\"sdm-meta-pill\">logging: {datasource.logging === null ? \"n/a\" : String(datasource.logging)}</div>\n {datasource.advanced?.poolMax ? <div className=\"sdm-meta-pill\">pool: {datasource.advanced.poolMax}</div> : null}\n </div>\n </article>\n ))}\n </div>\n ) : (\n <div className=\"sdm-empty\">\n <Database size={22} />\n <div>\n <h3>No datasources configured</h3>\n <p>Create one here and SolidX will wire the module and environment variables for you.</p>\n </div>\n <SolidButton size=\"small\" onClick={() => setDialogOpen(true)} leftIcon={<Plus size={14} />}>\n Add datasource\n </SolidButton>\n </div>\n )}\n\n <SolidDialog open={dialogOpen} onOpenChange={setDialogOpen} style={{ width: \"min(860px, calc(100vw - 32px))\" }}>\n <SolidDialogHeader>\n <div>\n <SolidDialogTitle>Add datasource</SolidDialogTitle>\n <SolidDialogDescription>\n Create a new datasource module, register it in `app.module.ts`, and persist its env variables to disk.\n </SolidDialogDescription>\n </div>\n </SolidDialogHeader>\n <SolidDialogSeparator />\n <SolidDialogBody>\n <div className=\"sdm-form-grid\">\n <label className=\"sdm-form-field\">\n <span>Display name</span>\n <SolidInput\n value={formState.displayName || \"\"}\n placeholder=\"Applications\"\n onChange={(event) => handleDisplayNameChange(event.target.value)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Datasource key</span>\n <SolidInput\n value={formState.name}\n placeholder=\"applications\"\n onChange={(event) => {\n setNameTouched(true);\n handleFieldChange(\"name\", slugifyDatasourceName(event.target.value));\n }}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Provider</span>\n <SolidSelect\n value={formState.type}\n options={providerOptions as any}\n onChange={(event) => handleTypeChange(event.value)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Port</span>\n <SolidInput\n type=\"number\"\n value={formState.port}\n onChange={(event) => handleFieldChange(\"port\", Number(event.target.value) || getDefaultPort(formState.type))}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Host</span>\n <SolidInput\n value={formState.host}\n placeholder=\"localhost\"\n onChange={(event) => handleFieldChange(\"host\", event.target.value)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Database</span>\n <SolidInput\n value={formState.database}\n placeholder=\"solidx_app\"\n onChange={(event) => handleFieldChange(\"database\", event.target.value)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Username</span>\n <SolidInput\n value={formState.username}\n placeholder=\"postgres\"\n onChange={(event) => handleFieldChange(\"username\", event.target.value)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Password</span>\n <SolidInput\n type=\"password\"\n value={formState.password}\n onChange={(event) => handleFieldChange(\"password\", event.target.value)}\n />\n </label>\n </div>\n\n <div className=\"sdm-switch-row\">\n <label className=\"sdm-switch-field\">\n <div>\n <strong>Synchronize</strong>\n <span>Write `*_DATABASE_SYNCHRONIZE` for this datasource.</span>\n </div>\n <SolidSwitch checked={!!formState.synchronize} onChange={(checked) => handleFieldChange(\"synchronize\", checked)} />\n </label>\n\n <label className=\"sdm-switch-field\">\n <div>\n <strong>Logging</strong>\n <span>Enable TypeORM logging through the generated datasource module.</span>\n </div>\n <SolidSwitch checked={!!formState.logging} onChange={(checked) => handleFieldChange(\"logging\", checked)} />\n </label>\n </div>\n\n <SolidPanel header=\"Advanced options\" toggleable className=\"solid-column-panel sdm-advanced-panel\">\n <div className=\"sdm-advanced-grid\">\n {formState.type === \"mssql\" ? (\n <>\n <label className=\"sdm-switch-field sdm-switch-field--inline\">\n <div>\n <strong>Encrypt</strong>\n <span>MSSQL connection option.</span>\n </div>\n <SolidSwitch checked={!!formState.encrypt} onChange={(checked) => handleFieldChange(\"encrypt\", checked)} />\n </label>\n\n <label className=\"sdm-switch-field sdm-switch-field--inline\">\n <div>\n <strong>Trust certificate</strong>\n <span>Allow self-signed development certificates.</span>\n </div>\n <SolidSwitch checked={!!formState.trustServerCertificate} onChange={(checked) => handleFieldChange(\"trustServerCertificate\", checked)} />\n </label>\n </>\n ) : (\n <>\n <label className=\"sdm-switch-field sdm-switch-field--inline\">\n <div>\n <strong>SSL</strong>\n <span>Enable SSL for PostgreSQL or MySQL.</span>\n </div>\n <SolidSwitch checked={!!formState.ssl} onChange={(checked) => handleFieldChange(\"ssl\", checked)} />\n </label>\n\n <label className=\"sdm-switch-field sdm-switch-field--inline\">\n <div>\n <strong>Reject unauthorized</strong>\n <span>Keep certificate validation strict when SSL is enabled.</span>\n </div>\n <SolidSwitch checked={!!formState.sslRejectUnauthorized} onChange={(checked) => handleFieldChange(\"sslRejectUnauthorized\", checked)} />\n </label>\n </>\n )}\n\n <label className=\"sdm-form-field\">\n <span>Pool max</span>\n <SolidInput\n type=\"number\"\n value={formState.poolMax ?? \"\"}\n onChange={(event) => handleFieldChange(\"poolMax\", Number(event.target.value) || 0)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Connection timeout (ms)</span>\n <SolidInput\n type=\"number\"\n value={formState.connectionTimeoutMs ?? \"\"}\n onChange={(event) => handleFieldChange(\"connectionTimeoutMs\", Number(event.target.value) || 0)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Idle timeout (ms)</span>\n <SolidInput\n type=\"number\"\n value={formState.idleTimeoutMs ?? \"\"}\n onChange={(event) => handleFieldChange(\"idleTimeoutMs\", Number(event.target.value) || 0)}\n />\n </label>\n\n {formState.type === \"postgres\" ? (\n <>\n <label className=\"sdm-form-field\">\n <span>Statement timeout (ms)</span>\n <SolidInput\n type=\"number\"\n value={formState.statementTimeoutMs ?? \"\"}\n onChange={(event) => handleFieldChange(\"statementTimeoutMs\", Number(event.target.value) || 0)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Idle in transaction timeout (ms)</span>\n <SolidInput\n type=\"number\"\n value={formState.idleInTxTimeoutMs ?? \"\"}\n onChange={(event) => handleFieldChange(\"idleInTxTimeoutMs\", Number(event.target.value) || 0)}\n />\n </label>\n </>\n ) : null}\n\n <label className=\"sdm-form-field\">\n <span>Retry attempts</span>\n <SolidInput\n type=\"number\"\n value={formState.retryAttempts ?? \"\"}\n onChange={(event) => handleFieldChange(\"retryAttempts\", Number(event.target.value) || 0)}\n />\n </label>\n\n <label className=\"sdm-form-field\">\n <span>Retry delay (ms)</span>\n <SolidInput\n type=\"number\"\n value={formState.retryDelayMs ?? \"\"}\n onChange={(event) => handleFieldChange(\"retryDelayMs\", Number(event.target.value) || 0)}\n />\n </label>\n </div>\n </SolidPanel>\n </SolidDialogBody>\n <SolidDialogFooter>\n <SolidButton variant=\"outline\" onClick={() => setDialogOpen(false)}>\n Cancel\n </SolidButton>\n <SolidButton onClick={() => void handleSubmit()} loading={isCreating}>\n Create datasource\n </SolidButton>\n </SolidDialogFooter>\n </SolidDialog>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DatasourcesPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/DatasourcesPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Database, RefreshCw } from \"lucide-react\";\nimport { useGetDatasourcesQuery } from \"../../../../redux/api/datasourceManagementApi\";\nimport {\n SolidButton,\n SolidSpinner,\n} from \"../../../../components/shad-cn-ui\";\nimport \"./DatasourcesPage.css\";\n\nconst providerOptions = [\n { label: \"PostgreSQL\", value: \"postgres\" },\n { label: \"MySQL\", value: \"mysql\" },\n { label: \"MS SQL Server\", value: \"mssql\" },\n] as const;\n\nfunction providerLabel(type: string) {\n return providerOptions.find((option) => option.value === type)?.label || type;\n}\n\nfunction providerTone(type: string) {\n if (type === \"postgres\") return \"sdm-provider-mark--postgres\";\n if (type === \"mysql\") return \"sdm-provider-mark--mysql\";\n return \"sdm-provider-mark--mssql\";\n}\n\nfunction providerGlyph(type: string) {\n if (type === \"postgres\") return \"PG\";\n if (type === \"mysql\") return \"MY\";\n return \"MS\";\n}\n\nfunction DatasourceProviderMark({ type }: { type: string }) {\n return (\n <div className={`sdm-provider-mark ${providerTone(type)}`}>\n <span>{providerGlyph(type)}</span>\n </div>\n );\n}\n\nexport function DatasourcesPage() {\n const {\n data: datasources = [],\n isLoading,\n isFetching,\n error,\n refetch,\n } = useGetDatasourcesQuery();\n\n return (\n <div className=\"sdm-page\">\n <div className=\"sdm-header\">\n <div className=\"sdm-title-block\">\n <h1 className=\"sdm-title\">Datasource Management</h1>\n <p className=\"sdm-subtitle\">Review and manage the datasources configured for this SolidX application.</p>\n </div>\n\n <div className=\"sdm-header-actions\">\n {isFetching && !isLoading ? (\n <div className=\"sdm-inline-status\">\n <SolidSpinner size={16} />\n <span>Refreshing</span>\n </div>\n ) : null}\n\n <SolidButton\n className=\"sdm-icon-button\"\n leftIcon={<RefreshCw size={16} />}\n onClick={() => void refetch()}\n tooltip=\"Refresh\"\n aria-label=\"Refresh\"\n />\n </div>\n </div>\n\n {isLoading ? (\n <div className=\"sdm-loading\">\n <SolidSpinner size={28} />\n <p>Loading datasource configuration...</p>\n </div>\n ) : error ? (\n <div className=\"sdm-error\">\n <span>Unable to load datasource configuration.</span>\n <SolidButton size=\"small\" variant=\"outline\" onClick={() => void refetch()}>\n Retry\n </SolidButton>\n </div>\n ) : datasources.length ? (\n <div className=\"sdm-grid\">\n {datasources.map((datasource) => (\n <article key={datasource.name} className=\"sdm-card\">\n <div className=\"sdm-card__top\">\n <div className=\"sdm-card__identity\">\n <DatasourceProviderMark type={datasource.type} />\n <div>\n <h3>{datasource.displayName}</h3>\n <p>{datasource.name}</p>\n </div>\n </div>\n <div className=\"sdm-card__badges\">\n <span className=\"sdm-badge sdm-badge--provider\">{providerLabel(datasource.type)}</span>\n {datasource.isDefault ? <span className=\"sdm-badge sdm-badge--default\">Default</span> : null}\n </div>\n </div>\n\n <div className=\"sdm-card__facts\">\n <div className=\"sdm-card__row\">\n <span>Host</span>\n <strong>{datasource.host || \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Port</span>\n <strong>{datasource.port ?? \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Database</span>\n <strong>{datasource.database || \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>User</span>\n <strong>{datasource.username || \"Not configured\"}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Env prefix</span>\n <strong>{datasource.envPrefix}</strong>\n </div>\n <div className=\"sdm-card__row\">\n <span>Password</span>\n <strong>{datasource.passwordConfigured ? \"Configured\" : \"Missing\"}</strong>\n </div>\n </div>\n\n <div className=\"sdm-card__footer\">\n <div className=\"sdm-meta-pill\">sync: {datasource.synchronize === null ? \"n/a\" : String(datasource.synchronize)}</div>\n <div className=\"sdm-meta-pill\">logging: {datasource.logging === null ? \"n/a\" : String(datasource.logging)}</div>\n {datasource.advanced?.poolMax ? <div className=\"sdm-meta-pill\">pool: {datasource.advanced.poolMax}</div> : null}\n </div>\n </article>\n ))}\n </div>\n ) : (\n <div className=\"sdm-empty\">\n <Database size={22} />\n <div>\n <h3>No datasources configured</h3>\n <p>Datasource creation is temporarily unavailable from this screen.</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|