@solidxai/core-ui 0.1.8 → 0.1.9-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/dist/components/auth/AuthLayout.d.ts.map +1 -1
  2. package/dist/components/auth/AuthLayout.js +16 -15
  3. package/dist/components/auth/AuthLayout.js.map +1 -1
  4. package/dist/components/auth/AuthLayout.tsx +3 -1
  5. package/dist/components/auth/ForgotPasswordThankYou.js +1 -1
  6. package/dist/components/auth/ForgotPasswordThankYou.js.map +1 -1
  7. package/dist/components/auth/ForgotPasswordThankYou.tsx +2 -2
  8. package/dist/components/auth/SolidForgotPassword.js +1 -1
  9. package/dist/components/auth/SolidForgotPassword.js.map +1 -1
  10. package/dist/components/auth/SolidForgotPassword.tsx +2 -2
  11. package/dist/components/auth/SolidInitialLoginOtp.js +8 -8
  12. package/dist/components/auth/SolidInitialLoginOtp.js.map +1 -1
  13. package/dist/components/auth/SolidInitialLoginOtp.tsx +1 -1
  14. package/dist/components/auth/SolidInitiateRegisterOtp.js +8 -8
  15. package/dist/components/auth/SolidInitiateRegisterOtp.js.map +1 -1
  16. package/dist/components/auth/SolidInitiateRegisterOtp.tsx +1 -1
  17. package/dist/components/auth/SolidLogin.js +7 -8
  18. package/dist/components/auth/SolidLogin.js.map +1 -1
  19. package/dist/components/auth/SolidLogin.tsx +1 -1
  20. package/dist/components/auth/SolidRegister.js +9 -9
  21. package/dist/components/auth/SolidRegister.js.map +1 -1
  22. package/dist/components/auth/SolidRegister.tsx +2 -2
  23. package/dist/components/common/AuthBanner.js.map +1 -1
  24. package/dist/components/common/SocialMediaLogin.js +1 -1
  25. package/dist/components/common/SocialMediaLogin.js.map +1 -1
  26. package/dist/components/common/SocialMediaLogin.tsx +4 -4
  27. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +149 -0
  28. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts.map +1 -1
  29. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js +21 -4
  30. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js.map +1 -1
  31. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx +128 -1
  32. package/dist/components/core/form/SolidFormActionHeader.d.ts.map +1 -1
  33. package/dist/components/core/form/SolidFormActionHeader.js +5 -2
  34. package/dist/components/core/form/SolidFormActionHeader.js.map +1 -1
  35. package/dist/components/core/form/SolidFormActionHeader.tsx +6 -3
  36. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  37. package/dist/components/core/form/SolidFormView.js +5 -1
  38. package/dist/components/core/form/SolidFormView.js.map +1 -1
  39. package/dist/components/core/form/SolidFormView.tsx +4 -1
  40. package/dist/components/core/form/fields/SolidJsonField.d.ts.map +1 -1
  41. package/dist/components/core/form/fields/SolidJsonField.js +4 -1
  42. package/dist/components/core/form/fields/SolidJsonField.js.map +1 -1
  43. package/dist/components/core/form/fields/SolidJsonField.tsx +4 -1
  44. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js +2 -2
  45. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.js.map +1 -1
  46. package/dist/components/core/form/fields/relations/SolidRelationManyToOneField.tsx +2 -2
  47. package/dist/components/core/kanban/SolidManyToOneFilterElement.d.ts.map +1 -1
  48. package/dist/components/core/kanban/SolidManyToOneFilterElement.js.map +1 -1
  49. package/dist/components/core/kanban/SolidManyToOneFilterElement.tsx +1 -2
  50. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.d.ts.map +1 -1
  51. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.js +2 -2
  52. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.js.map +1 -1
  53. package/dist/components/core/kanban/kanban-fields/SolidMediaMultipleKanbanField.tsx +21 -10
  54. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.d.ts.map +1 -1
  55. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js +2 -2
  56. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.js.map +1 -1
  57. package/dist/components/core/kanban/kanban-fields/SolidMediaSingleKanbanField.tsx +18 -10
  58. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.d.ts.map +1 -1
  59. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js +3 -6
  60. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.js.map +1 -1
  61. package/dist/components/core/kanban/kanban-fields/SolidShortTextKanbanField.tsx +30 -24
  62. package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.js.map +1 -1
  63. package/dist/components/core/kanban/kanban-fields/relations/SolidRelationManyToOneKanbanField.tsx +2 -2
  64. package/dist/components/core/list/SolidDataTablePagination.d.ts +15 -0
  65. package/dist/components/core/list/SolidDataTablePagination.d.ts.map +1 -0
  66. package/dist/components/core/list/SolidDataTablePagination.js +22 -0
  67. package/dist/components/core/list/SolidDataTablePagination.js.map +1 -0
  68. package/dist/components/core/list/SolidDataTablePagination.tsx +71 -0
  69. package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
  70. package/dist/components/core/list/SolidListViewConfigure.js +31 -2
  71. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  72. package/dist/components/core/list/SolidListViewConfigure.tsx +34 -2
  73. package/dist/components/core/list/SolidListViewRowButtonContextMenu.d.ts +1 -1
  74. package/dist/components/core/list/SolidListViewRowButtonContextMenu.d.ts.map +1 -1
  75. package/dist/components/core/list/SolidListViewRowButtonContextMenu.js +6 -7
  76. package/dist/components/core/list/SolidListViewRowButtonContextMenu.js.map +1 -1
  77. package/dist/components/core/list/SolidListViewRowButtonContextMenu.tsx +9 -10
  78. package/dist/components/core/tree/SolidTreeTable.d.ts +1 -1
  79. package/dist/components/core/tree/SolidTreeTable.d.ts.map +1 -1
  80. package/dist/components/core/tree/SolidTreeTable.js +78 -78
  81. package/dist/components/core/tree/SolidTreeTable.js.map +1 -1
  82. package/dist/components/core/tree/SolidTreeTable.tsx +1 -10
  83. package/dist/components/core/users/CreateUser.css +27 -2
  84. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  85. package/dist/components/core/users/CreateUser.js +14 -12
  86. package/dist/components/core/users/CreateUser.js.map +1 -1
  87. package/dist/components/core/users/CreateUser.tsx +18 -2
  88. package/dist/components/layout/user-profile-menu.d.ts.map +1 -1
  89. package/dist/components/layout/user-profile-menu.js +2 -1
  90. package/dist/components/layout/user-profile-menu.js.map +1 -1
  91. package/dist/components/layout/user-profile-menu.tsx +22 -27
  92. package/dist/components/shad-cn-ui/SolidButton.d.ts +14 -15
  93. package/dist/components/shad-cn-ui/SolidButton.d.ts.map +1 -1
  94. package/dist/components/shad-cn-ui/SolidButton.js +13 -3
  95. package/dist/components/shad-cn-ui/SolidButton.js.map +1 -1
  96. package/dist/components/shad-cn-ui/SolidButton.tsx +24 -4
  97. package/dist/components/solid-ui/SolidButton.d.ts +14 -0
  98. package/dist/components/solid-ui/SolidButton.d.ts.map +1 -0
  99. package/dist/components/solid-ui/SolidButton.js +36 -0
  100. package/dist/components/solid-ui/SolidButton.js.map +1 -0
  101. package/dist/components/solid-ui/SolidButton.tsx +54 -0
  102. package/dist/components/solid-ui/SolidTabs.d.ts +18 -0
  103. package/dist/components/solid-ui/SolidTabs.d.ts.map +1 -0
  104. package/dist/components/solid-ui/SolidTabs.js +22 -0
  105. package/dist/components/solid-ui/SolidTabs.js.map +1 -0
  106. package/dist/components/solid-ui/SolidTabs.tsx +73 -0
  107. package/dist/components/solid-ui/index.d.ts +3 -0
  108. package/dist/components/solid-ui/index.d.ts.map +1 -0
  109. package/dist/components/solid-ui/index.js +3 -0
  110. package/dist/components/solid-ui/index.js.map +1 -0
  111. package/dist/components/solid-ui/index.ts +2 -0
  112. package/dist/index.d.ts +3 -0
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +2 -0
  115. package/dist/index.js.map +1 -1
  116. package/dist/index.ts +3 -0
  117. package/dist/redux/api/solidEntityApi.d.ts.map +1 -1
  118. package/dist/redux/api/solidEntityApi.js +13 -0
  119. package/dist/redux/api/solidEntityApi.js.map +1 -1
  120. package/dist/redux/api/solidEntityApi.tsx +16 -0
  121. package/dist/redux/store/createSolidStore.d.ts +1 -1
  122. package/dist/redux/store/createSolidStore.d.ts.map +1 -1
  123. package/dist/redux/store/createSolidStore.js +20 -11
  124. package/dist/redux/store/createSolidStore.js.map +1 -1
  125. package/dist/redux/store/createSolidStore.ts +20 -11
  126. package/dist/redux/store/dynamicEntityApiMiddleware.d.ts +10 -0
  127. package/dist/redux/store/dynamicEntityApiMiddleware.d.ts.map +1 -0
  128. package/dist/redux/store/dynamicEntityApiMiddleware.js +44 -0
  129. package/dist/redux/store/dynamicEntityApiMiddleware.js.map +1 -0
  130. package/dist/redux/store/dynamicEntityApiMiddleware.ts +58 -0
  131. package/dist/redux/store/dynamicReducerManager.d.ts +10 -0
  132. package/dist/redux/store/dynamicReducerManager.d.ts.map +1 -0
  133. package/dist/redux/store/dynamicReducerManager.js +51 -0
  134. package/dist/redux/store/dynamicReducerManager.js.map +1 -0
  135. package/dist/redux/store/dynamicReducerManager.ts +51 -0
  136. package/dist/redux/store/solidEntityApiPool.d.ts +31 -0
  137. package/dist/redux/store/solidEntityApiPool.d.ts.map +1 -0
  138. package/dist/redux/store/solidEntityApiPool.js +123 -0
  139. package/dist/redux/store/solidEntityApiPool.js.map +1 -0
  140. package/dist/redux/store/solidEntityApiPool.ts +167 -0
  141. package/dist/resources/globals.css +7 -1
  142. package/dist/resources/shadcn-base.css +25 -9
  143. package/dist/routes/SolidRouteMetadataBoundary.d.ts +5 -0
  144. package/dist/routes/SolidRouteMetadataBoundary.d.ts.map +1 -0
  145. package/dist/routes/SolidRouteMetadataBoundary.js +72 -0
  146. package/dist/routes/SolidRouteMetadataBoundary.js.map +1 -0
  147. package/dist/routes/SolidRouteMetadataBoundary.tsx +77 -0
  148. package/dist/routes/pages/admin/core/DiagnosticsPage.d.ts +2 -0
  149. package/dist/routes/pages/admin/core/DiagnosticsPage.d.ts.map +1 -0
  150. package/dist/routes/pages/admin/core/DiagnosticsPage.js +48 -0
  151. package/dist/routes/pages/admin/core/DiagnosticsPage.js.map +1 -0
  152. package/dist/routes/pages/admin/core/DiagnosticsPage.tsx +167 -0
  153. package/dist/routes/pages/studio/StudioLandingPage.d.ts.map +1 -1
  154. package/dist/routes/pages/studio/StudioLandingPage.js +35 -7
  155. package/dist/routes/pages/studio/StudioLandingPage.js.map +1 -1
  156. package/dist/routes/pages/studio/StudioLandingPage.tsx +42 -6
  157. package/dist/routes/solidRoutes.d.ts.map +1 -1
  158. package/dist/routes/solidRoutes.js +47 -26
  159. package/dist/routes/solidRoutes.js.map +1 -1
  160. package/dist/routes/solidRoutes.tsx +47 -26
  161. package/dist/routes/types.d.ts +7 -0
  162. package/dist/routes/types.d.ts.map +1 -1
  163. package/dist/routes/types.js.map +1 -1
  164. package/dist/routes/types.ts +8 -0
  165. package/package.json +1 -1
  166. package/dist/components/auth/SolidOTPVerify.d.ts +0 -3
  167. package/dist/components/auth/SolidOTPVerify.d.ts.map +0 -1
  168. package/dist/components/auth/SolidOTPVerify.js +0 -67
  169. package/dist/components/auth/SolidOTPVerify.js.map +0 -1
  170. package/dist/components/auth/SolidOTPVerify.tsx +0 -133
  171. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts +0 -2
  172. package/dist/components/core/common/LoadDynamicJsxComponent.d.ts.map +0 -1
  173. package/dist/components/core/common/LoadDynamicJsxComponent.js +0 -50
  174. package/dist/components/core/common/LoadDynamicJsxComponent.js.map +0 -1
  175. package/dist/components/core/common/LoadDynamicJsxComponent.tsx +0 -70
  176. package/dist/nextAuth/authProviders.d.ts +0 -4
  177. package/dist/nextAuth/authProviders.d.ts.map +0 -1
  178. package/dist/nextAuth/authProviders.js +0 -198
  179. package/dist/nextAuth/authProviders.js.map +0 -1
  180. package/dist/nextAuth/authProviders.tsx +0 -232
  181. package/dist/nextAuth/handleLogout.d.ts +0 -2
  182. package/dist/nextAuth/handleLogout.d.ts.map +0 -1
  183. package/dist/nextAuth/handleLogout.js +0 -36
  184. package/dist/nextAuth/handleLogout.js.map +0 -1
  185. package/dist/nextAuth/handleLogout.tsx +0 -39
  186. package/dist/nextAuth/refreshAccessToken.d.ts +0 -2
  187. package/dist/nextAuth/refreshAccessToken.d.ts.map +0 -1
  188. package/dist/nextAuth/refreshAccessToken.js +0 -24
  189. package/dist/nextAuth/refreshAccessToken.js.map +0 -1
  190. package/dist/nextAuth/refreshAccessToken.tsx +0 -28
  191. package/dist/redux/features/settingsSlice.d.ts +0 -20
  192. package/dist/redux/features/settingsSlice.d.ts.map +0 -1
  193. package/dist/redux/features/settingsSlice.js +0 -39
  194. package/dist/redux/features/settingsSlice.js.map +0 -1
  195. package/dist/redux/features/settingsSlice.ts +0 -60
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolidRouteMetadataBoundary.d.ts","sourceRoot":"","sources":["../../src/routes/SolidRouteMetadataBoundary.tsx"],"names":[],"mappings":"AACA,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAuBtF,wBAAgB,0BAA0B,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,2CAoD/E"}
@@ -0,0 +1,72 @@
1
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
+ if (ar || !(i in from)) {
4
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
+ ar[i] = from[i];
6
+ }
7
+ }
8
+ return to.concat(ar || Array.prototype.slice.call(from));
9
+ };
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { useEffect, useRef } from "react";
12
+ import { matchRoutes, Outlet, useLocation } from "react-router-dom";
13
+ import { getSettingsMap } from "../helpers/settingsPayload";
14
+ import { useGetAuthSettingsQuery } from "../redux/api/solidSettingsApi";
15
+ function normalizePart(value) {
16
+ var trimmed = value === null || value === void 0 ? void 0 : value.trim();
17
+ return trimmed ? trimmed : undefined;
18
+ }
19
+ function uniqueParts(parts) {
20
+ var seen = new Set();
21
+ var result = [];
22
+ for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {
23
+ var part = parts_1[_i];
24
+ if (!part || seen.has(part))
25
+ continue;
26
+ seen.add(part);
27
+ result.push(part);
28
+ }
29
+ return result;
30
+ }
31
+ export function SolidRouteMetadataBoundary(_a) {
32
+ var _b, _c;
33
+ var routes = _a.routes;
34
+ var location = useLocation();
35
+ var authSettings = useGetAuthSettingsQuery(undefined).data;
36
+ var initialDescriptionRef = useRef(typeof document !== "undefined"
37
+ ? (_c = (_b = document.querySelector('meta[name="description"]')) === null || _b === void 0 ? void 0 : _b.getAttribute("content")) !== null && _c !== void 0 ? _c : ""
38
+ : "");
39
+ useEffect(function () {
40
+ var _a, _b, _c;
41
+ var matches = (_a = matchRoutes(routes, location)) !== null && _a !== void 0 ? _a : [];
42
+ var handles = matches
43
+ .map(function (match) { return match.route.handle; })
44
+ .filter(function (handle) { return Boolean(handle); });
45
+ var hasExplicitOptOut = handles.some(function (handle) { return handle.manageDocumentMeta === false; });
46
+ var hasAutoManagedMeta = handles.some(function (handle) {
47
+ return handle.manageDocumentMeta === true ||
48
+ Boolean(handle.title || handle.description || handle.titlePrefix || handle.titleSuffix);
49
+ });
50
+ if (hasExplicitOptOut || !hasAutoManagedMeta) {
51
+ return;
52
+ }
53
+ var settingsMap = getSettingsMap(authSettings);
54
+ var resolvedAppTitle = (_b = normalizePart(settingsMap.appTitle)) !== null && _b !== void 0 ? _b : "SolidX";
55
+ var resolvedTitle = __spreadArray([], handles, true).reverse()
56
+ .map(function (handle) { return normalizePart(handle.title); })
57
+ .find(Boolean);
58
+ var resolvedDescription = __spreadArray([], handles, true).reverse()
59
+ .map(function (handle) { return normalizePart(handle.description); })
60
+ .find(Boolean);
61
+ var titlePrefixes = handles.map(function (handle) { return normalizePart(handle.titlePrefix); });
62
+ var titleSuffixes = handles.map(function (handle) { return normalizePart(handle.titleSuffix); });
63
+ var nextTitleParts = uniqueParts(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], titlePrefixes, true), [resolvedTitle], false), titleSuffixes, true), [resolvedAppTitle], false));
64
+ document.title = nextTitleParts.join(" | ");
65
+ var metaDescription = document.querySelector('meta[name="description"]');
66
+ if (metaDescription) {
67
+ metaDescription.setAttribute("content", (_c = resolvedDescription !== null && resolvedDescription !== void 0 ? resolvedDescription : normalizePart(initialDescriptionRef.current)) !== null && _c !== void 0 ? _c : resolvedAppTitle);
68
+ }
69
+ }, [authSettings, location, routes]);
70
+ return _jsx(Outlet, {});
71
+ }
72
+ //# sourceMappingURL=SolidRouteMetadataBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolidRouteMetadataBoundary.js","sourceRoot":"","sources":["../../src/routes/SolidRouteMetadataBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { matchRoutes, Outlet, useLocation, type RouteObject } from \"react-router-dom\";\nimport { getSettingsMap } from \"../helpers/settingsPayload\";\nimport { useGetAuthSettingsQuery } from \"../redux/api/solidSettingsApi\";\nimport type { SolidPageMeta } from \"./types\";\n\nfunction normalizePart(value?: string): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction uniqueParts(parts: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const part of parts) {\n if (!part || seen.has(part)) continue;\n seen.add(part);\n result.push(part);\n }\n\n return result;\n}\n\nexport function SolidRouteMetadataBoundary({ routes }: { routes: RouteObject[] }) {\n const location = useLocation();\n const { data: authSettings } = useGetAuthSettingsQuery(undefined);\n const initialDescriptionRef = useRef(\n typeof document !== \"undefined\"\n ? document.querySelector('meta[name=\"description\"]')?.getAttribute(\"content\") ?? \"\"\n : \"\",\n );\n\n useEffect(() => {\n const matches = matchRoutes(routes, location) ?? [];\n const handles = matches\n .map((match) => match.route.handle as SolidPageMeta | undefined)\n .filter((handle): handle is SolidPageMeta => Boolean(handle));\n\n const hasExplicitOptOut = handles.some((handle) => handle.manageDocumentMeta === false);\n const hasAutoManagedMeta = handles.some(\n (handle) =>\n handle.manageDocumentMeta === true ||\n Boolean(handle.title || handle.description || handle.titlePrefix || handle.titleSuffix),\n );\n\n if (hasExplicitOptOut || !hasAutoManagedMeta) {\n return;\n }\n\n const settingsMap = getSettingsMap(authSettings);\n const resolvedAppTitle = normalizePart(settingsMap.appTitle) ?? \"SolidX\";\n const resolvedTitle = [...handles]\n .reverse()\n .map((handle) => normalizePart(handle.title))\n .find(Boolean);\n const resolvedDescription = [...handles]\n .reverse()\n .map((handle) => normalizePart(handle.description))\n .find(Boolean);\n const titlePrefixes = handles.map((handle) => normalizePart(handle.titlePrefix));\n const titleSuffixes = handles.map((handle) => normalizePart(handle.titleSuffix));\n\n const nextTitleParts = uniqueParts([...titlePrefixes, resolvedTitle, ...titleSuffixes, resolvedAppTitle]);\n document.title = nextTitleParts.join(\" | \");\n\n const metaDescription = document.querySelector('meta[name=\"description\"]');\n if (metaDescription) {\n metaDescription.setAttribute(\n \"content\",\n resolvedDescription ?? normalizePart(initialDescriptionRef.current) ?? resolvedAppTitle,\n );\n }\n }, [authSettings, location, routes]);\n\n return <Outlet />;\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { matchRoutes, Outlet, useLocation, type RouteObject } from "react-router-dom";
3
+ import { getSettingsMap } from "../helpers/settingsPayload";
4
+ import { useGetAuthSettingsQuery } from "../redux/api/solidSettingsApi";
5
+ import type { SolidPageMeta } from "./types";
6
+
7
+ function normalizePart(value?: string): string | undefined {
8
+ const trimmed = value?.trim();
9
+ return trimmed ? trimmed : undefined;
10
+ }
11
+
12
+ function uniqueParts(parts: Array<string | undefined>): string[] {
13
+ const seen = new Set<string>();
14
+ const result: string[] = [];
15
+
16
+ for (const part of parts) {
17
+ if (!part || seen.has(part)) continue;
18
+ seen.add(part);
19
+ result.push(part);
20
+ }
21
+
22
+ return result;
23
+ }
24
+
25
+ export function SolidRouteMetadataBoundary({ routes }: { routes: RouteObject[] }) {
26
+ const location = useLocation();
27
+ const { data: authSettings } = useGetAuthSettingsQuery(undefined);
28
+ const initialDescriptionRef = useRef(
29
+ typeof document !== "undefined"
30
+ ? document.querySelector('meta[name="description"]')?.getAttribute("content") ?? ""
31
+ : "",
32
+ );
33
+
34
+ useEffect(() => {
35
+ const matches = matchRoutes(routes, location) ?? [];
36
+ const handles = matches
37
+ .map((match) => match.route.handle as SolidPageMeta | undefined)
38
+ .filter((handle): handle is SolidPageMeta => Boolean(handle));
39
+
40
+ const hasExplicitOptOut = handles.some((handle) => handle.manageDocumentMeta === false);
41
+ const hasAutoManagedMeta = handles.some(
42
+ (handle) =>
43
+ handle.manageDocumentMeta === true ||
44
+ Boolean(handle.title || handle.description || handle.titlePrefix || handle.titleSuffix),
45
+ );
46
+
47
+ if (hasExplicitOptOut || !hasAutoManagedMeta) {
48
+ return;
49
+ }
50
+
51
+ const settingsMap = getSettingsMap(authSettings);
52
+ const resolvedAppTitle = normalizePart(settingsMap.appTitle) ?? "SolidX";
53
+ const resolvedTitle = [...handles]
54
+ .reverse()
55
+ .map((handle) => normalizePart(handle.title))
56
+ .find(Boolean);
57
+ const resolvedDescription = [...handles]
58
+ .reverse()
59
+ .map((handle) => normalizePart(handle.description))
60
+ .find(Boolean);
61
+ const titlePrefixes = handles.map((handle) => normalizePart(handle.titlePrefix));
62
+ const titleSuffixes = handles.map((handle) => normalizePart(handle.titleSuffix));
63
+
64
+ const nextTitleParts = uniqueParts([...titlePrefixes, resolvedTitle, ...titleSuffixes, resolvedAppTitle]);
65
+ document.title = nextTitleParts.join(" | ");
66
+
67
+ const metaDescription = document.querySelector('meta[name="description"]');
68
+ if (metaDescription) {
69
+ metaDescription.setAttribute(
70
+ "content",
71
+ resolvedDescription ?? normalizePart(initialDescriptionRef.current) ?? resolvedAppTitle,
72
+ );
73
+ }
74
+ }, [authSettings, location, routes]);
75
+
76
+ return <Outlet />;
77
+ }
@@ -0,0 +1,2 @@
1
+ export declare function DiagnosticsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=DiagnosticsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsPage.d.ts","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/DiagnosticsPage.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,eAAe,4CAgJ9B"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
3
+ import { env } from "../../../../adapters/env";
4
+ import { loadSession } from "../../../../adapters/auth/storage";
5
+ import { hasAnyRole } from "../../../../helpers/rolesHelper";
6
+ import { useSession } from "../../../../hooks/useSession";
7
+ import { getSolidEntityApiPoolSnapshot, SOLID_ENTITY_API_POOL_LIMIT } from "../../../../redux/store/solidEntityApiPool";
8
+ import { SolidButton } from "../../../../components/shad-cn-ui/SolidButton";
9
+ var ALLOWED_ENVIRONMENTS = new Set([
10
+ "dev",
11
+ "development",
12
+ "staging",
13
+ "stage",
14
+ "uat",
15
+ "test",
16
+ "local",
17
+ ]);
18
+ function toDisplayTime(counter) {
19
+ return "#".concat(counter);
20
+ }
21
+ export function DiagnosticsPage() {
22
+ var _a, _b, _c, _d;
23
+ var _e = useSession(), session = _e.data, status = _e.status;
24
+ var _f = useState(0), refreshTick = _f[0], setRefreshTick = _f[1];
25
+ var envName = (env("VITE_SOLIDX_ENV") || "unknown").toLowerCase();
26
+ var diagnosticsEnabled = ALLOWED_ENVIRONMENTS.has(envName);
27
+ var isAdmin = hasAnyRole((_a = session === null || session === void 0 ? void 0 : session.user) === null || _a === void 0 ? void 0 : _a.roles, ["Admin"]);
28
+ var poolSnapshot = useMemo(function () {
29
+ refreshTick;
30
+ return getSolidEntityApiPoolSnapshot();
31
+ }, [refreshTick]);
32
+ var activeCount = poolSnapshot.filter(function (entry) { return entry.active; }).length;
33
+ var cachedCount = poolSnapshot.length;
34
+ var loginRedirect = env("NEXT_PUBLIC_LOGIN_REDIRECT_URL") || "/admin";
35
+ var backendApi = env("NEXT_PUBLIC_BACKEND_API_URL") || env("API_URL", "");
36
+ var localSession = loadSession();
37
+ if (status === "loading") {
38
+ return (_jsx("div", { className: "solid-studio-home", children: _jsx("div", { className: "solid-studio-home-inner solid-studio-home-inner--wider", children: _jsx("div", { className: "solid-studio-card", children: _jsx("div", { className: "solid-studio-card-content", children: "Loading diagnostics..." }) }) }) }));
39
+ }
40
+ if (!isAdmin) {
41
+ return (_jsx("div", { className: "solid-studio-home", children: _jsx("div", { className: "solid-studio-home-inner solid-studio-home-inner--wider", children: _jsx("div", { className: "solid-studio-card", children: _jsxs("div", { className: "solid-studio-card-header", children: [_jsx("h3", { className: "solid-studio-card-title", children: "Diagnostics Access Restricted" }), _jsx("p", { className: "solid-studio-card-description", children: "You do not have permission to view this diagnostics page." })] }) }) }) }));
42
+ }
43
+ if (!diagnosticsEnabled) {
44
+ return (_jsx("div", { className: "solid-studio-home", children: _jsx("div", { className: "solid-studio-home-inner solid-studio-home-inner--wider", children: _jsx("div", { className: "solid-studio-card", children: _jsxs("div", { className: "solid-studio-card-header", children: [_jsx("h3", { className: "solid-studio-card-title", children: "Diagnostics Disabled" }), _jsxs("p", { className: "solid-studio-card-description", children: ["Diagnostics are enabled only in dev/staging-style environments. Current environment: ", _jsx("code", { children: envName }), "."] })] }) }) }) }));
45
+ }
46
+ return (_jsx("div", { className: "solid-studio-home solid-studio-home--top", children: _jsxs("div", { className: "solid-studio-home-inner solid-studio-home-inner--wider", children: [_jsxs("div", { className: "solid-studio-home-toolbar", style: { marginBottom: "14px" }, children: [_jsx("div", { className: "solid-studio-home-toolbar-left", children: _jsxs("div", { className: "solid-studio-home-heading", children: [_jsx("div", { className: "solid-studio-home-badge", children: "Diagnostics" }), _jsx("h1", { children: "SolidX Runtime Diagnostics" }), _jsx("p", { children: "Read-only runtime snapshot for support and debugging." })] }) }), _jsx("div", { className: "solid-studio-home-toolbar-right", children: _jsx(SolidButton, { size: "sm", variant: "outline", onClick: function () { return setRefreshTick(function (v) { return v + 1; }); }, children: "Refresh" }) })] }), _jsxs("div", { className: "solid-studio-card", style: { marginBottom: "14px" }, children: [_jsx("div", { className: "solid-studio-card-header", children: _jsx("h3", { className: "solid-studio-card-title", children: "Runtime" }) }), _jsx("div", { className: "solid-studio-card-content", children: _jsxs("div", { style: { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: "10px" }, children: [_jsxs("div", { children: [_jsx("strong", { children: "Environment:" }), " ", envName] }), _jsxs("div", { children: [_jsx("strong", { children: "Pool Limit:" }), " ", SOLID_ENTITY_API_POOL_LIMIT] }), _jsxs("div", { children: [_jsx("strong", { children: "Active Entity APIs:" }), " ", activeCount] }), _jsxs("div", { children: [_jsx("strong", { children: "Cached Entity APIs:" }), " ", cachedCount] }), _jsxs("div", { children: [_jsx("strong", { children: "Login Redirect:" }), " ", loginRedirect] }), _jsxs("div", { children: [_jsx("strong", { children: "Backend API:" }), " ", backendApi || "(not set)"] }), _jsxs("div", { children: [_jsx("strong", { children: "User:" }), " ", ((_b = localSession === null || localSession === void 0 ? void 0 : localSession.user) === null || _b === void 0 ? void 0 : _b.email) || ((_c = localSession === null || localSession === void 0 ? void 0 : localSession.user) === null || _c === void 0 ? void 0 : _c.name) || "(unknown)"] }), _jsxs("div", { children: [_jsx("strong", { children: "Roles:" }), " ", (((_d = localSession === null || localSession === void 0 ? void 0 : localSession.user) === null || _d === void 0 ? void 0 : _d.roles) || []).map(function (r) { return r.name || r; }).join(", ") || "(none)"] })] }) })] }), _jsxs("div", { className: "solid-studio-card", children: [_jsxs("div", { className: "solid-studio-card-header", children: [_jsx("h3", { className: "solid-studio-card-title", children: "Entity API Pool" }), _jsx("p", { className: "solid-studio-card-description", children: "Each entry represents a lazily created entity API. Active entries have reducer+middleware currently registered." })] }), _jsx("div", { className: "solid-studio-card-content", style: { overflowX: "auto" }, children: _jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: "13px" }, children: [_jsx("thead", { children: _jsxs("tr", { style: { borderBottom: "1px solid rgba(148, 163, 184, 0.35)" }, children: [_jsx("th", { style: { textAlign: "left", padding: "8px" }, children: "Entity" }), _jsx("th", { style: { textAlign: "left", padding: "8px" }, children: "Reducer Path" }), _jsx("th", { style: { textAlign: "left", padding: "8px" }, children: "Registered" }), _jsx("th", { style: { textAlign: "left", padding: "8px" }, children: "Last Accessed" }), _jsx("th", { style: { textAlign: "left", padding: "8px" }, children: "Active" })] }) }), _jsx("tbody", { children: poolSnapshot.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: 5, style: { padding: "12px", opacity: 0.7 }, children: "No entity APIs have been created in this session yet." }) })) : (poolSnapshot.map(function (entry) { return (_jsxs("tr", { style: { borderBottom: "1px solid rgba(148, 163, 184, 0.2)" }, children: [_jsx("td", { style: { padding: "8px" }, children: entry.entityName }), _jsx("td", { style: { padding: "8px", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace" }, children: entry.reducerPath }), _jsx("td", { style: { padding: "8px" }, children: toDisplayTime(entry.registeredAt) }), _jsx("td", { style: { padding: "8px" }, children: toDisplayTime(entry.lastAccessedAt) }), _jsx("td", { style: { padding: "8px" }, children: entry.active ? "yes" : "no" })] }, entry.reducerPath)); })) })] }) })] })] }) }));
47
+ }
48
+ //# sourceMappingURL=DiagnosticsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsPage.js","sourceRoot":"","sources":["../../../../../src/routes/pages/admin/core/DiagnosticsPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState } from \"react\";\nimport { env } from \"../../../../adapters/env\";\nimport { loadSession } from \"../../../../adapters/auth/storage\";\nimport { hasAnyRole } from \"../../../../helpers/rolesHelper\";\nimport { useSession } from \"../../../../hooks/useSession\";\nimport { getSolidEntityApiPoolSnapshot, SOLID_ENTITY_API_POOL_LIMIT } from \"../../../../redux/store/solidEntityApiPool\";\nimport { SolidButton } from \"../../../../components/shad-cn-ui/SolidButton\";\n\nconst ALLOWED_ENVIRONMENTS = new Set([\n \"dev\",\n \"development\",\n \"staging\",\n \"stage\",\n \"uat\",\n \"test\",\n \"local\",\n]);\n\nfunction toDisplayTime(counter: number) {\n return `#${counter}`;\n}\n\nexport function DiagnosticsPage() {\n const { data: session, status } = useSession();\n const [refreshTick, setRefreshTick] = useState(0);\n\n const envName = (env(\"VITE_SOLIDX_ENV\") || \"unknown\").toLowerCase();\n const diagnosticsEnabled = ALLOWED_ENVIRONMENTS.has(envName);\n const isAdmin = hasAnyRole(session?.user?.roles, [\"Admin\"]);\n\n const poolSnapshot = useMemo(() => {\n refreshTick;\n return getSolidEntityApiPoolSnapshot();\n }, [refreshTick]);\n\n const activeCount = poolSnapshot.filter((entry) => entry.active).length;\n const cachedCount = poolSnapshot.length;\n const loginRedirect = env(\"NEXT_PUBLIC_LOGIN_REDIRECT_URL\") || \"/admin\";\n const backendApi = env(\"NEXT_PUBLIC_BACKEND_API_URL\") || env(\"API_URL\", \"\");\n const localSession = loadSession();\n\n if (status === \"loading\") {\n return (\n <div className=\"solid-studio-home\">\n <div className=\"solid-studio-home-inner solid-studio-home-inner--wider\">\n <div className=\"solid-studio-card\">\n <div className=\"solid-studio-card-content\">Loading diagnostics...</div>\n </div>\n </div>\n </div>\n );\n }\n\n if (!isAdmin) {\n return (\n <div className=\"solid-studio-home\">\n <div className=\"solid-studio-home-inner solid-studio-home-inner--wider\">\n <div className=\"solid-studio-card\">\n <div className=\"solid-studio-card-header\">\n <h3 className=\"solid-studio-card-title\">Diagnostics Access Restricted</h3>\n <p className=\"solid-studio-card-description\">\n You do not have permission to view this diagnostics page.\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (!diagnosticsEnabled) {\n return (\n <div className=\"solid-studio-home\">\n <div className=\"solid-studio-home-inner solid-studio-home-inner--wider\">\n <div className=\"solid-studio-card\">\n <div className=\"solid-studio-card-header\">\n <h3 className=\"solid-studio-card-title\">Diagnostics Disabled</h3>\n <p className=\"solid-studio-card-description\">\n Diagnostics are enabled only in dev/staging-style environments. Current environment: <code>{envName}</code>.\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"solid-studio-home solid-studio-home--top\">\n <div className=\"solid-studio-home-inner solid-studio-home-inner--wider\">\n <div className=\"solid-studio-home-toolbar\" style={{ marginBottom: \"14px\" }}>\n <div className=\"solid-studio-home-toolbar-left\">\n <div className=\"solid-studio-home-heading\">\n <div className=\"solid-studio-home-badge\">Diagnostics</div>\n <h1>SolidX Runtime Diagnostics</h1>\n <p>Read-only runtime snapshot for support and debugging.</p>\n </div>\n </div>\n <div className=\"solid-studio-home-toolbar-right\">\n <SolidButton size=\"sm\" variant=\"outline\" onClick={() => setRefreshTick((v) => v + 1)}>\n Refresh\n </SolidButton>\n </div>\n </div>\n\n <div className=\"solid-studio-card\" style={{ marginBottom: \"14px\" }}>\n <div className=\"solid-studio-card-header\">\n <h3 className=\"solid-studio-card-title\">Runtime</h3>\n </div>\n <div className=\"solid-studio-card-content\">\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fit, minmax(220px, 1fr))\", gap: \"10px\" }}>\n <div><strong>Environment:</strong> {envName}</div>\n <div><strong>Pool Limit:</strong> {SOLID_ENTITY_API_POOL_LIMIT}</div>\n <div><strong>Active Entity APIs:</strong> {activeCount}</div>\n <div><strong>Cached Entity APIs:</strong> {cachedCount}</div>\n <div><strong>Login Redirect:</strong> {loginRedirect}</div>\n <div><strong>Backend API:</strong> {backendApi || \"(not set)\"}</div>\n <div><strong>User:</strong> {localSession?.user?.email || localSession?.user?.name || \"(unknown)\"}</div>\n <div><strong>Roles:</strong> {(localSession?.user?.roles || []).map((r: any) => r.name || r).join(\", \") || \"(none)\"}</div>\n </div>\n </div>\n </div>\n\n <div className=\"solid-studio-card\">\n <div className=\"solid-studio-card-header\">\n <h3 className=\"solid-studio-card-title\">Entity API Pool</h3>\n <p className=\"solid-studio-card-description\">\n Each entry represents a lazily created entity API. Active entries have reducer+middleware currently registered.\n </p>\n </div>\n <div className=\"solid-studio-card-content\" style={{ overflowX: \"auto\" }}>\n <table style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: \"13px\" }}>\n <thead>\n <tr style={{ borderBottom: \"1px solid rgba(148, 163, 184, 0.35)\" }}>\n <th style={{ textAlign: \"left\", padding: \"8px\" }}>Entity</th>\n <th style={{ textAlign: \"left\", padding: \"8px\" }}>Reducer Path</th>\n <th style={{ textAlign: \"left\", padding: \"8px\" }}>Registered</th>\n <th style={{ textAlign: \"left\", padding: \"8px\" }}>Last Accessed</th>\n <th style={{ textAlign: \"left\", padding: \"8px\" }}>Active</th>\n </tr>\n </thead>\n <tbody>\n {poolSnapshot.length === 0 ? (\n <tr>\n <td colSpan={5} style={{ padding: \"12px\", opacity: 0.7 }}>\n No entity APIs have been created in this session yet.\n </td>\n </tr>\n ) : (\n poolSnapshot.map((entry) => (\n <tr key={entry.reducerPath} style={{ borderBottom: \"1px solid rgba(148, 163, 184, 0.2)\" }}>\n <td style={{ padding: \"8px\" }}>{entry.entityName}</td>\n <td style={{ padding: \"8px\", fontFamily: \"ui-monospace, SFMono-Regular, Menlo, monospace\" }}>{entry.reducerPath}</td>\n <td style={{ padding: \"8px\" }}>{toDisplayTime(entry.registeredAt)}</td>\n <td style={{ padding: \"8px\" }}>{toDisplayTime(entry.lastAccessedAt)}</td>\n <td style={{ padding: \"8px\" }}>{entry.active ? \"yes\" : \"no\"}</td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,167 @@
1
+ import { useMemo, useState } from "react";
2
+ import { env } from "../../../../adapters/env";
3
+ import { loadSession } from "../../../../adapters/auth/storage";
4
+ import { hasAnyRole } from "../../../../helpers/rolesHelper";
5
+ import { useSession } from "../../../../hooks/useSession";
6
+ import { getSolidEntityApiPoolSnapshot, SOLID_ENTITY_API_POOL_LIMIT } from "../../../../redux/store/solidEntityApiPool";
7
+ import { SolidButton } from "../../../../components/shad-cn-ui/SolidButton";
8
+
9
+ const ALLOWED_ENVIRONMENTS = new Set([
10
+ "dev",
11
+ "development",
12
+ "staging",
13
+ "stage",
14
+ "uat",
15
+ "test",
16
+ "local",
17
+ ]);
18
+
19
+ function toDisplayTime(counter: number) {
20
+ return `#${counter}`;
21
+ }
22
+
23
+ export function DiagnosticsPage() {
24
+ const { data: session, status } = useSession();
25
+ const [refreshTick, setRefreshTick] = useState(0);
26
+
27
+ const envName = (env("VITE_SOLIDX_ENV") || "unknown").toLowerCase();
28
+ const diagnosticsEnabled = ALLOWED_ENVIRONMENTS.has(envName);
29
+ const isAdmin = hasAnyRole(session?.user?.roles, ["Admin"]);
30
+
31
+ const poolSnapshot = useMemo(() => {
32
+ refreshTick;
33
+ return getSolidEntityApiPoolSnapshot();
34
+ }, [refreshTick]);
35
+
36
+ const activeCount = poolSnapshot.filter((entry) => entry.active).length;
37
+ const cachedCount = poolSnapshot.length;
38
+ const loginRedirect = env("NEXT_PUBLIC_LOGIN_REDIRECT_URL") || "/admin";
39
+ const backendApi = env("NEXT_PUBLIC_BACKEND_API_URL") || env("API_URL", "");
40
+ const localSession = loadSession();
41
+
42
+ if (status === "loading") {
43
+ return (
44
+ <div className="solid-studio-home">
45
+ <div className="solid-studio-home-inner solid-studio-home-inner--wider">
46
+ <div className="solid-studio-card">
47
+ <div className="solid-studio-card-content">Loading diagnostics...</div>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ );
52
+ }
53
+
54
+ if (!isAdmin) {
55
+ return (
56
+ <div className="solid-studio-home">
57
+ <div className="solid-studio-home-inner solid-studio-home-inner--wider">
58
+ <div className="solid-studio-card">
59
+ <div className="solid-studio-card-header">
60
+ <h3 className="solid-studio-card-title">Diagnostics Access Restricted</h3>
61
+ <p className="solid-studio-card-description">
62
+ You do not have permission to view this diagnostics page.
63
+ </p>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ );
69
+ }
70
+
71
+ if (!diagnosticsEnabled) {
72
+ return (
73
+ <div className="solid-studio-home">
74
+ <div className="solid-studio-home-inner solid-studio-home-inner--wider">
75
+ <div className="solid-studio-card">
76
+ <div className="solid-studio-card-header">
77
+ <h3 className="solid-studio-card-title">Diagnostics Disabled</h3>
78
+ <p className="solid-studio-card-description">
79
+ Diagnostics are enabled only in dev/staging-style environments. Current environment: <code>{envName}</code>.
80
+ </p>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ );
86
+ }
87
+
88
+ return (
89
+ <div className="solid-studio-home solid-studio-home--top">
90
+ <div className="solid-studio-home-inner solid-studio-home-inner--wider">
91
+ <div className="solid-studio-home-toolbar" style={{ marginBottom: "14px" }}>
92
+ <div className="solid-studio-home-toolbar-left">
93
+ <div className="solid-studio-home-heading">
94
+ <div className="solid-studio-home-badge">Diagnostics</div>
95
+ <h1>SolidX Runtime Diagnostics</h1>
96
+ <p>Read-only runtime snapshot for support and debugging.</p>
97
+ </div>
98
+ </div>
99
+ <div className="solid-studio-home-toolbar-right">
100
+ <SolidButton size="sm" variant="outline" onClick={() => setRefreshTick((v) => v + 1)}>
101
+ Refresh
102
+ </SolidButton>
103
+ </div>
104
+ </div>
105
+
106
+ <div className="solid-studio-card" style={{ marginBottom: "14px" }}>
107
+ <div className="solid-studio-card-header">
108
+ <h3 className="solid-studio-card-title">Runtime</h3>
109
+ </div>
110
+ <div className="solid-studio-card-content">
111
+ <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))", gap: "10px" }}>
112
+ <div><strong>Environment:</strong> {envName}</div>
113
+ <div><strong>Pool Limit:</strong> {SOLID_ENTITY_API_POOL_LIMIT}</div>
114
+ <div><strong>Active Entity APIs:</strong> {activeCount}</div>
115
+ <div><strong>Cached Entity APIs:</strong> {cachedCount}</div>
116
+ <div><strong>Login Redirect:</strong> {loginRedirect}</div>
117
+ <div><strong>Backend API:</strong> {backendApi || "(not set)"}</div>
118
+ <div><strong>User:</strong> {localSession?.user?.email || localSession?.user?.name || "(unknown)"}</div>
119
+ <div><strong>Roles:</strong> {(localSession?.user?.roles || []).map((r: any) => r.name || r).join(", ") || "(none)"}</div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+
124
+ <div className="solid-studio-card">
125
+ <div className="solid-studio-card-header">
126
+ <h3 className="solid-studio-card-title">Entity API Pool</h3>
127
+ <p className="solid-studio-card-description">
128
+ Each entry represents a lazily created entity API. Active entries have reducer+middleware currently registered.
129
+ </p>
130
+ </div>
131
+ <div className="solid-studio-card-content" style={{ overflowX: "auto" }}>
132
+ <table style={{ width: "100%", borderCollapse: "collapse", fontSize: "13px" }}>
133
+ <thead>
134
+ <tr style={{ borderBottom: "1px solid rgba(148, 163, 184, 0.35)" }}>
135
+ <th style={{ textAlign: "left", padding: "8px" }}>Entity</th>
136
+ <th style={{ textAlign: "left", padding: "8px" }}>Reducer Path</th>
137
+ <th style={{ textAlign: "left", padding: "8px" }}>Registered</th>
138
+ <th style={{ textAlign: "left", padding: "8px" }}>Last Accessed</th>
139
+ <th style={{ textAlign: "left", padding: "8px" }}>Active</th>
140
+ </tr>
141
+ </thead>
142
+ <tbody>
143
+ {poolSnapshot.length === 0 ? (
144
+ <tr>
145
+ <td colSpan={5} style={{ padding: "12px", opacity: 0.7 }}>
146
+ No entity APIs have been created in this session yet.
147
+ </td>
148
+ </tr>
149
+ ) : (
150
+ poolSnapshot.map((entry) => (
151
+ <tr key={entry.reducerPath} style={{ borderBottom: "1px solid rgba(148, 163, 184, 0.2)" }}>
152
+ <td style={{ padding: "8px" }}>{entry.entityName}</td>
153
+ <td style={{ padding: "8px", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace" }}>{entry.reducerPath}</td>
154
+ <td style={{ padding: "8px" }}>{toDisplayTime(entry.registeredAt)}</td>
155
+ <td style={{ padding: "8px" }}>{toDisplayTime(entry.lastAccessedAt)}</td>
156
+ <td style={{ padding: "8px" }}>{entry.active ? "yes" : "no"}</td>
157
+ </tr>
158
+ ))
159
+ )}
160
+ </tbody>
161
+ </table>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ );
167
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"StudioLandingPage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/studio/StudioLandingPage.tsx"],"names":[],"mappings":"AAgQA,wBAAgB,iBAAiB,4CA+DhC"}
1
+ {"version":3,"file":"StudioLandingPage.d.ts","sourceRoot":"","sources":["../../../../src/routes/pages/studio/StudioLandingPage.tsx"],"names":[],"mappings":"AA+PA,wBAAgB,iBAAiB,4CAoGhC"}
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
+ import { useDispatch } from "react-redux";
3
4
  import { useNavigate } from "react-router-dom";
4
5
  import { useSolidLayoutRegistry } from "../../SolidLayoutRegistry";
5
6
  import { ChatIcon } from "../../../components/layout/SolidAiStudioLayout";
6
7
  import { env } from "../../../adapters/env";
8
+ import { showToast } from "../../../redux/features/toastSlice";
7
9
  // ── Icons ──────────────────────────────────────────────────────────────────────
8
10
  var ArrowIcon = function () { return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M2.5 7h9M8 3.5l3.5 3.5L8 10.5", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round", strokeLinejoin: "round" }) })); };
9
11
  var LayoutPlaceholderIcon = function () { return (_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "none", "aria-hidden": "true", children: [_jsx("rect", { x: "1", y: "1", width: "16", height: "16", rx: "2.5", stroke: "currentColor", strokeWidth: "1.3" }), _jsx("path", { d: "M1 6h16", stroke: "currentColor", strokeWidth: "1.1" }), _jsx("path", { d: "M6 6v11", stroke: "currentColor", strokeWidth: "1.1" })] })); };
@@ -55,12 +57,9 @@ function CardFooter(_a) {
55
57
  return _jsx("div", { className: "solid-studio-card-footer ".concat(className), children: children });
56
58
  }
57
59
  // ── Empty state ───────────────────────────────────────────────────────────────
58
- function EmptyState() {
59
- return (_jsx("div", { className: "solid-studio-landing-empty-container", children: _jsxs(Card, { className: "solid-studio-landing-empty-card", children: [_jsxs(CardHeader, { className: "solid-studio-landing-empty-header", children: [_jsx("div", { className: "solid-studio-home-badge", style: { marginBottom: '12px' }, children: "Frontend Studio" }), _jsx(CardTitle, { children: "Frontend layout will appear here" }), _jsx(CardDescription, { children: "Register your app layouts to explore and customize them in the Studio." })] }), _jsxs(CardContent, { className: "solid-studio-landing-empty-body", children: [_jsxs("div", { className: "solid-studio-landing-empty-primary-action", children: [_jsxs("p", { children: ["To get started, use the ", _jsx("strong", { children: "SolidX AI Agent" }), " to add a new custom layout."] }), _jsxs("button", { type: "button", className: "solid-studio-empty-cta-button", onClick: function () {
60
- var aiUrl = env("VITE_SOLIDX_AI_URL");
61
- if (aiUrl)
62
- window.open(aiUrl, "_blank");
63
- }, children: [_jsx(ChatIcon, {}), _jsx("span", { children: "Open AI Chat" })] })] }), _jsx("div", { className: "solid-studio-landing-empty-divider" }), _jsxs("div", { className: "solid-studio-landing-empty-details", children: [_jsxs("p", { className: "solid-studio-landing-empty-instruction", children: ["Any route with a ", _jsx("code", { children: "path" }), " and ", _jsx("code", { children: "children" }), " passed to", " ", _jsx("code", { children: "getSolidRoutes()" }), " will automatically appear as a card."] }), _jsx("div", { className: "solid-studio-landing-snippet", children: _jsx("pre", { children: _jsx("code", { children: "// AppRoutes.tsx\nconst extraRoutes = [\n {\n path: \"/my-layout\",\n element: <MyLayout />,\n children: [{ index: true, element: <MyPage /> }],\n },\n];\n\ngetSolidRoutes({ extraRoutes });" }) }) }), _jsxs("p", { className: "solid-studio-landing-hint", children: [_jsx("strong", { children: "Pro Tip:" }), " Add ", _jsxs("code", { children: ["handle: ", "{ title, description }"] }), " to a route to customize its appearance."] })] })] })] }) }));
60
+ function EmptyState(_a) {
61
+ var onOpenChat = _a.onOpenChat;
62
+ return (_jsx("div", { className: "solid-studio-landing-empty-container", children: _jsxs(Card, { className: "solid-studio-landing-empty-card", children: [_jsxs(CardHeader, { className: "solid-studio-landing-empty-header", children: [_jsx("div", { className: "solid-studio-home-badge", style: { marginBottom: '12px' }, children: "Frontend Studio" }), _jsx(CardTitle, { children: "Frontend layout will appear here" }), _jsx(CardDescription, { children: "Register your app layouts to explore and customize them in the Studio." })] }), _jsxs(CardContent, { className: "solid-studio-landing-empty-body", children: [_jsxs("div", { className: "solid-studio-landing-empty-primary-action", children: [_jsxs("p", { children: ["To get started, use the ", _jsx("strong", { children: "SolidX AI Agent" }), " to add a new custom layout."] }), _jsxs("button", { type: "button", className: "solid-studio-empty-cta-button", onClick: onOpenChat, children: [_jsx(ChatIcon, {}), _jsx("span", { children: "Open AI Chat" })] })] }), _jsx("div", { className: "solid-studio-landing-empty-divider" }), _jsxs("div", { className: "solid-studio-landing-empty-details", children: [_jsxs("p", { className: "solid-studio-landing-empty-instruction", children: ["Any route with a ", _jsx("code", { children: "path" }), " and ", _jsx("code", { children: "children" }), " passed to", " ", _jsx("code", { children: "getSolidRoutes()" }), " will automatically appear as a card."] }), _jsx("div", { className: "solid-studio-landing-snippet", children: _jsx("pre", { children: _jsx("code", { children: "// AppRoutes.tsx\nconst extraRoutes = [\n {\n path: \"/my-layout\",\n element: <MyLayout />,\n children: [{ index: true, element: <MyPage /> }],\n },\n];\n\ngetSolidRoutes({ extraRoutes });" }) }) }), _jsxs("p", { className: "solid-studio-landing-hint", children: [_jsx("strong", { children: "Pro Tip:" }), " Add ", _jsxs("code", { children: ["handle: ", "{ title, description }"] }), " to a route to customize its appearance."] })] })] })] }) }));
64
63
  }
65
64
  // ── Card ──────────────────────────────────────────────────────────────────────
66
65
  function LayoutCard(_a) {
@@ -71,8 +70,37 @@ function LayoutCard(_a) {
71
70
  }
72
71
  // ── Page ──────────────────────────────────────────────────────────────────────
73
72
  export function StudioLandingPage() {
73
+ var dispatch = useDispatch();
74
74
  var layouts = useSolidLayoutRegistry();
75
75
  var _a = useState(false), listView = _a[0], setListView = _a[1];
76
- return (_jsx("div", { className: "solid-studio-home ".concat(layouts.length > 0 ? "solid-studio-home--top" : ""), children: _jsxs("div", { className: "solid-studio-home-inner ".concat(layouts.length > 0 ? "solid-studio-home-inner--fluid" : ""), children: [_jsx("div", { className: "solid-studio-home-toolbar", children: layouts.length > 0 && (_jsxs("div", { className: "solid-studio-home-toolbar-right", children: [_jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(!listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(false); }, "aria-label": "Grid view", title: "Grid view", children: _jsx(GridViewIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(true); }, "aria-label": "List view", title: "List view", children: _jsx(ListViewIcon, {}) })] })) }), layouts.length === 0 ? (_jsx(EmptyState, {})) : listView ? (_jsx("div", { className: "solid-studio-home-cards--list", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: true }, entry.path)); }) })) : (_jsx("div", { className: "solid-studio-home-cards solid-studio-home-cards--fluid", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: false }, entry.path)); }) }))] }) }));
76
+ var handleOpenAiChat = function () {
77
+ var aiUrl = env("VITE_SOLIDX_AI_URL");
78
+ if (!aiUrl) {
79
+ dispatch(showToast({
80
+ severity: "error",
81
+ summary: "AI Chat unavailable",
82
+ detail: "VITE_SOLIDX_AI_URL is not configured.",
83
+ }));
84
+ return;
85
+ }
86
+ try {
87
+ var chatWindow = window.open(aiUrl, "_blank", "noopener,noreferrer");
88
+ if (!chatWindow) {
89
+ dispatch(showToast({
90
+ severity: "error",
91
+ summary: "AI Chat unavailable",
92
+ detail: "Unable to open chat window. Please allow pop-ups and try again.",
93
+ }));
94
+ }
95
+ }
96
+ catch (_a) {
97
+ dispatch(showToast({
98
+ severity: "error",
99
+ summary: "AI Chat unavailable",
100
+ detail: "Failed to open chat. Please check the configured URL.",
101
+ }));
102
+ }
103
+ };
104
+ return (_jsx("div", { className: "solid-studio-home ".concat(layouts.length > 0 ? "solid-studio-home--top" : ""), children: _jsxs("div", { className: "solid-studio-home-inner ".concat(layouts.length > 0 ? "solid-studio-home-inner--fluid" : ""), children: [_jsx("div", { className: "solid-studio-home-toolbar", children: layouts.length > 0 && (_jsxs("div", { className: "solid-studio-home-toolbar-right", children: [_jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(!listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(false); }, "aria-label": "Grid view", title: "Grid view", children: _jsx(GridViewIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-home-view-btn".concat(listView ? " solid-studio-home-view-btn--active" : ""), onClick: function () { return setListView(true); }, "aria-label": "List view", title: "List view", children: _jsx(ListViewIcon, {}) })] })) }), layouts.length === 0 ? (_jsx(EmptyState, { onOpenChat: handleOpenAiChat })) : listView ? (_jsx("div", { className: "solid-studio-home-cards--list", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: true }, entry.path)); }) })) : (_jsx("div", { className: "solid-studio-home-cards solid-studio-home-cards--fluid", children: layouts.map(function (entry, i) { return (_jsx(LayoutCard, { entry: entry, index: i, listView: false }, entry.path)); }) }))] }) }));
77
105
  }
78
106
  //# sourceMappingURL=StudioLandingPage.js.map