@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.
Files changed (233) hide show
  1. package/dist/components/auth/AuthLayout.d.ts.map +1 -1
  2. package/dist/components/auth/AuthLayout.js +19 -17
  3. package/dist/components/auth/AuthLayout.js.map +1 -1
  4. package/dist/components/auth/AuthLayout.tsx +59 -34
  5. package/dist/components/common/BackendReconnectIndicator.d.ts +6 -0
  6. package/dist/components/common/BackendReconnectIndicator.d.ts.map +1 -0
  7. package/dist/components/common/BackendReconnectIndicator.js +25 -0
  8. package/dist/components/common/BackendReconnectIndicator.js.map +1 -0
  9. package/dist/components/common/BackendReconnectIndicator.tsx +45 -0
  10. package/dist/components/common/SettingsComponent.d.ts.map +1 -1
  11. package/dist/components/common/SettingsComponent.js +7 -3
  12. package/dist/components/common/SettingsComponent.js.map +1 -1
  13. package/dist/components/common/SettingsComponent.module.css +144 -12
  14. package/dist/components/common/SettingsComponent.tsx +22 -3
  15. package/dist/components/common/SolidAdmin.d.ts.map +1 -1
  16. package/dist/components/common/SolidAdmin.js +7 -2
  17. package/dist/components/common/SolidAdmin.js.map +1 -1
  18. package/dist/components/common/SolidAdmin.tsx +7 -2
  19. package/dist/components/common/SolidBreadcrumb.d.ts.map +1 -1
  20. package/dist/components/common/SolidBreadcrumb.js +1 -6
  21. package/dist/components/common/SolidBreadcrumb.js.map +1 -1
  22. package/dist/components/common/SolidBreadcrumb.tsx +1 -8
  23. package/dist/components/common/SolidMaterialSymbol.d.ts +10 -0
  24. package/dist/components/common/SolidMaterialSymbol.d.ts.map +1 -0
  25. package/dist/components/common/SolidMaterialSymbol.js +69 -0
  26. package/dist/components/common/SolidMaterialSymbol.js.map +1 -0
  27. package/dist/components/common/SolidMaterialSymbol.tsx +96 -0
  28. package/dist/components/common/SolidToastProvider.d.ts.map +1 -1
  29. package/dist/components/common/SolidToastProvider.js +14 -1
  30. package/dist/components/common/SolidToastProvider.js.map +1 -1
  31. package/dist/components/common/SolidToastProvider.tsx +19 -1
  32. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +3 -1
  33. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  34. package/dist/components/core/common/SolidGlobalSearchElement.js +3 -2
  35. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  36. package/dist/components/core/common/SolidGlobalSearchElement.tsx +14 -18
  37. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.d.ts.map +1 -1
  38. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +43 -16
  39. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
  40. package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +24 -2
  41. package/dist/components/core/form/SolidFormFooter.js +1 -1
  42. package/dist/components/core/form/SolidFormFooter.js.map +1 -1
  43. package/dist/components/core/form/SolidFormFooter.tsx +1 -1
  44. package/dist/components/core/form/SolidFormLayouts.js +1 -1
  45. package/dist/components/core/form/SolidFormLayouts.js.map +1 -1
  46. package/dist/components/core/form/SolidFormLayouts.tsx +2 -2
  47. package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
  48. package/dist/components/core/form/fields/SolidMediaMultipleField.js +120 -56
  49. package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
  50. package/dist/components/core/form/fields/SolidMediaMultipleField.tsx +63 -50
  51. package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
  52. package/dist/components/core/form/fields/SolidMediaSingleField.js +115 -37
  53. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  54. package/dist/components/core/form/fields/SolidMediaSingleField.tsx +36 -35
  55. package/dist/components/core/form/fields/SolidRichTextField.d.ts.map +1 -1
  56. package/dist/components/core/form/fields/SolidRichTextField.js +67 -4
  57. package/dist/components/core/form/fields/SolidRichTextField.js.map +1 -1
  58. package/dist/components/core/form/fields/SolidRichTextField.tsx +89 -7
  59. package/dist/components/core/form/fields/mediaFieldUtils.d.ts +3 -0
  60. package/dist/components/core/form/fields/mediaFieldUtils.d.ts.map +1 -0
  61. package/dist/components/core/form/fields/mediaFieldUtils.js +30 -0
  62. package/dist/components/core/form/fields/mediaFieldUtils.js.map +1 -0
  63. package/dist/components/core/form/fields/mediaFieldUtils.ts +45 -0
  64. package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.d.ts.map +1 -1
  65. package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.js +1 -1
  66. package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.js.map +1 -1
  67. package/dist/components/core/form/fields/relations/RolesGroupedByModuleWidget.tsx +3 -1
  68. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.d.ts.map +1 -1
  69. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +22 -23
  70. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
  71. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +13 -7
  72. package/dist/components/core/form/fields/widgets/SolidIconEditWidget.d.ts.map +1 -1
  73. package/dist/components/core/form/fields/widgets/SolidIconEditWidget.js +16 -11
  74. package/dist/components/core/form/fields/widgets/SolidIconEditWidget.js.map +1 -1
  75. package/dist/components/core/form/fields/widgets/SolidIconEditWidget.tsx +32 -18
  76. package/dist/components/core/form/fields/widgets/SolidIconViewWidget.d.ts.map +1 -1
  77. package/dist/components/core/form/fields/widgets/SolidIconViewWidget.js +3 -1
  78. package/dist/components/core/form/fields/widgets/SolidIconViewWidget.js.map +1 -1
  79. package/dist/components/core/form/fields/widgets/SolidIconViewWidget.tsx +11 -5
  80. package/dist/components/core/list/SolidDataTable.d.ts.map +1 -1
  81. package/dist/components/core/list/SolidDataTable.js +3 -2
  82. package/dist/components/core/list/SolidDataTable.js.map +1 -1
  83. package/dist/components/core/list/SolidDataTable.tsx +3 -2
  84. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  85. package/dist/components/core/list/SolidListView.js +11 -5
  86. package/dist/components/core/list/SolidListView.js.map +1 -1
  87. package/dist/components/core/list/SolidListView.tsx +15 -8
  88. package/dist/components/core/list/SolidListViewColumn.d.ts.map +1 -1
  89. package/dist/components/core/list/SolidListViewColumn.js +1 -0
  90. package/dist/components/core/list/SolidListViewColumn.js.map +1 -1
  91. package/dist/components/core/list/SolidListViewColumn.tsx +1 -0
  92. package/dist/components/core/list/columns/SolidShortTextColumn.d.ts.map +1 -1
  93. package/dist/components/core/list/columns/SolidShortTextColumn.js +7 -2
  94. package/dist/components/core/list/columns/SolidShortTextColumn.js.map +1 -1
  95. package/dist/components/core/list/columns/SolidShortTextColumn.tsx +7 -2
  96. package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.d.ts.map +1 -1
  97. package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.js +4 -1
  98. package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.js.map +1 -1
  99. package/dist/components/core/list/columns/relations/SolidRelationManyToManyColumn.tsx +5 -2
  100. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts.map +1 -1
  101. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +2 -1
  102. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
  103. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +2 -1
  104. package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.d.ts.map +1 -1
  105. package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.js +4 -1
  106. package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.js.map +1 -1
  107. package/dist/components/core/list/columns/relations/SolidRelationOneToManyColumn.tsx +5 -2
  108. package/dist/components/core/locales/SolidLocale.d.ts.map +1 -1
  109. package/dist/components/core/locales/SolidLocale.js +1 -1
  110. package/dist/components/core/locales/SolidLocale.js.map +1 -1
  111. package/dist/components/core/locales/SolidLocale.tsx +1 -0
  112. package/dist/components/core/model/CreateModel.css +26 -0
  113. package/dist/components/core/model/FieldMetaData.d.ts.map +1 -1
  114. package/dist/components/core/model/FieldMetaData.js +21 -3
  115. package/dist/components/core/model/FieldMetaData.js.map +1 -1
  116. package/dist/components/core/model/FieldMetaData.tsx +45 -4
  117. package/dist/components/core/model/FieldMetaDataForm.css +82 -0
  118. package/dist/components/core/model/FieldMetaDataForm.d.ts +1 -0
  119. package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
  120. package/dist/components/core/model/FieldMetaDataForm.js +246 -235
  121. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  122. package/dist/components/core/model/FieldMetaDataForm.tsx +46 -34
  123. package/dist/components/core/model/FieldSelector.js +1 -1
  124. package/dist/components/core/model/FieldSelector.js.map +1 -1
  125. package/dist/components/core/model/FieldSelector.tsx +1 -1
  126. package/dist/components/core/model/ModelMetaData.js +1 -1
  127. package/dist/components/core/model/ModelMetaData.js.map +1 -1
  128. package/dist/components/core/model/ModelMetaData.tsx +1 -1
  129. package/dist/components/core/module/CreateModule.css +55 -2
  130. package/dist/components/core/module/CreateModule.d.ts.map +1 -1
  131. package/dist/components/core/module/CreateModule.js +2 -2
  132. package/dist/components/core/module/CreateModule.js.map +1 -1
  133. package/dist/components/core/module/CreateModule.tsx +3 -2
  134. package/dist/components/core/module/ModuleMetadataExplorer.css +27 -0
  135. package/dist/components/core/module/ModuleMetadataExplorer.d.ts.map +1 -1
  136. package/dist/components/core/module/ModuleMetadataExplorer.js +1 -1
  137. package/dist/components/core/module/ModuleMetadataExplorer.js.map +1 -1
  138. package/dist/components/core/module/ModuleMetadataExplorer.tsx +1 -0
  139. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
  140. package/dist/components/core/tree/SolidTreeView.js +6 -1
  141. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  142. package/dist/components/core/tree/SolidTreeView.tsx +7 -1
  143. package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
  144. package/dist/components/layout/AdminHeaderActions.js +10 -9
  145. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  146. package/dist/components/layout/AdminHeaderActions.tsx +2 -0
  147. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  148. package/dist/components/layout/AppSidebar.js +2 -1
  149. package/dist/components/layout/AppSidebar.js.map +1 -1
  150. package/dist/components/layout/AppSidebar.tsx +12 -5
  151. package/dist/components/layout/SolidMenuItemIcon.d.ts +9 -0
  152. package/dist/components/layout/SolidMenuItemIcon.d.ts.map +1 -0
  153. package/dist/components/layout/SolidMenuItemIcon.js +20 -0
  154. package/dist/components/layout/SolidMenuItemIcon.js.map +1 -0
  155. package/dist/components/layout/SolidMenuItemIcon.tsx +45 -0
  156. package/dist/components/layout/navbar-two-menu.d.ts.map +1 -1
  157. package/dist/components/layout/navbar-two-menu.js +6 -7
  158. package/dist/components/layout/navbar-two-menu.js.map +1 -1
  159. package/dist/components/layout/navbar-two-menu.tsx +4 -12
  160. package/dist/components/shad-cn-ui/SolidCodeEditor.d.ts.map +1 -1
  161. package/dist/components/shad-cn-ui/SolidCodeEditor.js +30 -2
  162. package/dist/components/shad-cn-ui/SolidCodeEditor.js.map +1 -1
  163. package/dist/components/shad-cn-ui/SolidCodeEditor.tsx +38 -1
  164. package/dist/helpers/backendHealthMonitor.d.ts +39 -0
  165. package/dist/helpers/backendHealthMonitor.d.ts.map +1 -0
  166. package/dist/helpers/backendHealthMonitor.js +255 -0
  167. package/dist/helpers/backendHealthMonitor.js.map +1 -0
  168. package/dist/helpers/backendHealthMonitor.ts +177 -0
  169. package/dist/helpers/helpers.d.ts +1 -0
  170. package/dist/helpers/helpers.d.ts.map +1 -1
  171. package/dist/helpers/helpers.js +9 -0
  172. package/dist/helpers/helpers.js.map +1 -1
  173. package/dist/helpers/helpers.ts +11 -1
  174. package/dist/helpers/menuItemIcons.d.ts +34 -0
  175. package/dist/helpers/menuItemIcons.d.ts.map +1 -0
  176. package/dist/helpers/menuItemIcons.js +144 -0
  177. package/dist/helpers/menuItemIcons.js.map +1 -0
  178. package/dist/helpers/menuItemIcons.ts +191 -0
  179. package/dist/helpers/relationDisplay.d.ts +3 -0
  180. package/dist/helpers/relationDisplay.d.ts.map +1 -0
  181. package/dist/helpers/relationDisplay.js +92 -0
  182. package/dist/helpers/relationDisplay.js.map +1 -0
  183. package/dist/helpers/relationDisplay.ts +101 -0
  184. package/dist/helpers/settingsPayload.d.ts +1 -0
  185. package/dist/helpers/settingsPayload.d.ts.map +1 -1
  186. package/dist/helpers/settingsPayload.js.map +1 -1
  187. package/dist/helpers/settingsPayload.ts +1 -0
  188. package/dist/helpers/solidIcons.d.ts +2 -0
  189. package/dist/helpers/solidIcons.d.ts.map +1 -1
  190. package/dist/helpers/solidIcons.js +8 -0
  191. package/dist/helpers/solidIcons.js.map +1 -1
  192. package/dist/helpers/solidIcons.tsx +10 -1
  193. package/dist/helpers/waitForBackendAvailability.d.ts +1 -0
  194. package/dist/helpers/waitForBackendAvailability.d.ts.map +1 -1
  195. package/dist/helpers/waitForBackendAvailability.js +35 -22
  196. package/dist/helpers/waitForBackendAvailability.js.map +1 -1
  197. package/dist/helpers/waitForBackendAvailability.ts +18 -12
  198. package/dist/http/solidHttp.d.ts.map +1 -1
  199. package/dist/http/solidHttp.js +10 -4
  200. package/dist/http/solidHttp.js.map +1 -1
  201. package/dist/http/solidHttp.ts +9 -4
  202. package/dist/redux/api/datasourceIntrospectionApi.d.ts +4 -0
  203. package/dist/redux/api/datasourceIntrospectionApi.d.ts.map +1 -1
  204. package/dist/redux/api/datasourceIntrospectionApi.js.map +1 -1
  205. package/dist/redux/api/datasourceIntrospectionApi.ts +4 -0
  206. package/dist/redux/api/fetchBaseQuery.d.ts.map +1 -1
  207. package/dist/redux/api/fetchBaseQuery.js +9 -3
  208. package/dist/redux/api/fetchBaseQuery.js.map +1 -1
  209. package/dist/redux/api/fetchBaseQuery.tsx +9 -3
  210. package/dist/redux/store/StoreProvider.d.ts.map +1 -1
  211. package/dist/redux/store/StoreProvider.js +4 -3
  212. package/dist/redux/store/StoreProvider.js.map +1 -1
  213. package/dist/redux/store/StoreProvider.tsx +4 -3
  214. package/dist/resources/globals.css +341 -49
  215. package/dist/resources/solid-custom.css +410 -12
  216. package/dist/resources/solid-responsive.css +27 -16
  217. package/dist/resources/solid-tailwind-generated.css +1 -1
  218. package/dist/routes/AppEventListener.d.ts.map +1 -1
  219. package/dist/routes/AppEventListener.js +23 -0
  220. package/dist/routes/AppEventListener.js.map +1 -1
  221. package/dist/routes/AppEventListener.tsx +29 -0
  222. package/dist/routes/pages/admin/core/DashboardPage.module.css +12 -0
  223. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.css +306 -3
  224. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.d.ts.map +1 -1
  225. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js +745 -393
  226. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js.map +1 -1
  227. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.tsx +1074 -420
  228. package/dist/routes/pages/admin/core/DatasourcesPage.css +15 -0
  229. package/dist/routes/pages/admin/core/DatasourcesPage.d.ts.map +1 -1
  230. package/dist/routes/pages/admin/core/DatasourcesPage.js +7 -188
  231. package/dist/routes/pages/admin/core/DatasourcesPage.js.map +1 -1
  232. package/dist/routes/pages/admin/core/DatasourcesPage.tsx +3 -393
  233. 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":"AAyBA,OAAO,uBAAuB,CAAC;AAwG/B,wBAAgB,eAAe,4CA0Z9B"}
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
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
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 _this = this;
148
- var _a, _b, _c, _d, _e, _f, _g;
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: "Create one here and SolidX will wire the module and environment variables for you." })] }), _jsx(SolidButton, { size: "small", onClick: function () { return setDialogOpen(true); }, leftIcon: _jsx(Plus, { size: 14 }), children: "Add datasource" })] })), _jsxs(SolidDialog, { open: dialogOpen, onOpenChange: setDialogOpen, style: { width: "min(860px, calc(100vw - 32px))" }, children: [_jsx(SolidDialogHeader, { children: _jsxs("div", { children: [_jsx(SolidDialogTitle, { children: "Add datasource" }), _jsx(SolidDialogDescription, { children: "Create a new datasource module, register it in `app.module.ts`, and persist its env variables to disk." })] }) }), _jsx(SolidDialogSeparator, {}), _jsxs(SolidDialogBody, { children: [_jsxs("div", { className: "sdm-form-grid", children: [_jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Display name" }), _jsx(SolidInput, { value: formState.displayName || "", placeholder: "Applications", onChange: function (event) { return handleDisplayNameChange(event.target.value); } })] }), _jsxs("label", { className: "sdm-form-field", children: [_jsx("span", { children: "Datasource key" }), _jsx(SolidInput, { value: formState.name, placeholder: "applications", onChange: function (event) {
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"]}