@cobaltcore-dev/aurora 1.1.0 → 1.2.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 (183) hide show
  1. package/README.md +59 -9
  2. package/dist/client/App.d.ts +2 -2
  3. package/dist/client/AuroraApp.d.ts +33 -13
  4. package/dist/client/{AuthProvider-BS5OVv8n.mjs → AuthProvider-CVSAwW9f.mjs} +22 -8
  5. package/dist/client/AuthProvider-CVSAwW9f.mjs.map +1 -0
  6. package/dist/client/{ContentHeader-BHMUzd9H.mjs → ContentHeader-CPJbgYWn.mjs} +18 -18
  7. package/dist/client/{ContentHeader-BHMUzd9H.mjs.map → ContentHeader-CPJbgYWn.mjs.map} +1 -1
  8. package/dist/client/DeleteFlavorModal-V44QCJBd.mjs +773 -0
  9. package/dist/client/DeleteFlavorModal-V44QCJBd.mjs.map +1 -0
  10. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +26 -0
  11. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +1 -0
  12. package/dist/client/{FiltersInput-B8CNBg1L.mjs → FiltersInput-CKI6zWnm.mjs} +18 -18
  13. package/dist/client/{FiltersInput-B8CNBg1L.mjs.map → FiltersInput-CKI6zWnm.mjs.map} +1 -1
  14. package/dist/client/FloatingIpActionModals-CwEC5GR-.mjs +460 -0
  15. package/dist/client/FloatingIpActionModals-CwEC5GR-.mjs.map +1 -0
  16. package/dist/client/ImageToastNotifications-m6c3tVPb.mjs +1152 -0
  17. package/dist/client/ImageToastNotifications-m6c3tVPb.mjs.map +1 -0
  18. package/dist/client/SortInput-4g7nSTHW.mjs +34 -0
  19. package/dist/client/SortInput-4g7nSTHW.mjs.map +1 -0
  20. package/dist/client/{TwoColumnDescriptionList-DiDx3PnH.mjs → TwoColumnDescriptionList-NvgvErua.mjs} +2 -2
  21. package/dist/client/{TwoColumnDescriptionList-DiDx3PnH.mjs.map → TwoColumnDescriptionList-NvgvErua.mjs.map} +1 -1
  22. package/dist/client/_-CAsCx-Ay.mjs +6 -0
  23. package/dist/client/_-CAsCx-Ay.mjs.map +1 -0
  24. package/dist/client/_auth-SrDjHL6j.mjs +12 -0
  25. package/dist/client/_auth-SrDjHL6j.mjs.map +1 -0
  26. package/dist/client/_flavorId-9PcBBW52.mjs +231 -0
  27. package/dist/client/_flavorId-9PcBBW52.mjs.map +1 -0
  28. package/dist/client/{_flavorId-BN_qessZ.mjs → _flavorId-a9Gu66R1.mjs} +3 -9
  29. package/dist/client/_flavorId-a9Gu66R1.mjs.map +1 -0
  30. package/dist/client/_floatingIpId-AE9Fu8l6.mjs +210 -0
  31. package/dist/client/_floatingIpId-AE9Fu8l6.mjs.map +1 -0
  32. package/dist/client/{_floatingIpId-CwDGHkWm.mjs → _floatingIpId-AZ11Ksmu.mjs} +3 -9
  33. package/dist/client/_floatingIpId-AZ11Ksmu.mjs.map +1 -0
  34. package/dist/client/{_imageId-BtJ7GmYB.mjs → _imageId-BtAql2Kr.mjs} +104 -92
  35. package/dist/client/_imageId-BtAql2Kr.mjs.map +1 -0
  36. package/dist/client/_imageId-D76BxvFY.mjs +39 -0
  37. package/dist/client/_imageId-D76BxvFY.mjs.map +1 -0
  38. package/dist/client/{_projectId-Byt3GQDW.mjs → _projectId-7Nl1MQTJ.mjs} +5 -5
  39. package/dist/client/_projectId-7Nl1MQTJ.mjs.map +1 -0
  40. package/dist/client/_projectId-B3wmSala.mjs +281 -0
  41. package/dist/client/_projectId-B3wmSala.mjs.map +1 -0
  42. package/dist/client/_projectId-DPzv0CCp.mjs +77 -0
  43. package/dist/client/_projectId-DPzv0CCp.mjs.map +1 -0
  44. package/dist/client/_projectId-DfeVJy0G.mjs +30 -0
  45. package/dist/client/_projectId-DfeVJy0G.mjs.map +1 -0
  46. package/dist/client/_securityGroupId-C5huJNfO.mjs +1810 -0
  47. package/dist/client/_securityGroupId-C5huJNfO.mjs.map +1 -0
  48. package/dist/client/{_securityGroupId-BcbkRhsN.mjs → _securityGroupId-D85mSigA.mjs} +3 -9
  49. package/dist/client/_securityGroupId-D85mSigA.mjs.map +1 -0
  50. package/dist/client/_serviceType-DS8DxsrP.mjs +20 -0
  51. package/dist/client/_serviceType-DS8DxsrP.mjs.map +1 -0
  52. package/dist/client/_serviceType-M8d9rOT6.mjs +6 -0
  53. package/dist/client/_serviceType-M8d9rOT6.mjs.map +1 -0
  54. package/dist/client/_storageType-BRWWJtow.mjs +14 -0
  55. package/dist/client/_storageType-BRWWJtow.mjs.map +1 -0
  56. package/dist/client/_storageType-CzZ4u9x_.mjs +12 -0
  57. package/dist/client/_storageType-CzZ4u9x_.mjs.map +1 -0
  58. package/dist/client/_storageType-Dy9uCVXr.mjs +845 -0
  59. package/dist/client/_storageType-Dy9uCVXr.mjs.map +1 -0
  60. package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
  61. package/dist/client/{about-_73VmpTB.mjs → about-BmQTyLWc.mjs} +2 -2
  62. package/dist/client/{about-_73VmpTB.mjs.map → about-BmQTyLWc.mjs.map} +1 -1
  63. package/dist/client/{aurora-EbwGRLLf.mjs → aurora-CIml-f2f.mjs} +2 -2
  64. package/dist/client/{aurora-EbwGRLLf.mjs.map → aurora-CIml-f2f.mjs.map} +1 -1
  65. package/dist/client/{build-C_4vRMCq.mjs → build-WuxXRAqf.mjs} +121 -24
  66. package/dist/client/{build-C_4vRMCq.mjs.map → build-WuxXRAqf.mjs.map} +1 -1
  67. package/dist/client/components/Breadcrumbs.d.ts +1 -0
  68. package/dist/client/components/ListToolbar/SortInput.d.ts +3 -0
  69. package/dist/client/context/BreadcrumbExtensionContext.d.ts +9 -0
  70. package/dist/client/context/DynamicBreadcrumbContext.d.ts +9 -0
  71. package/dist/client/{flavors-CiHCYrtZ.mjs → flavors-B0rbqffG.mjs} +3 -5
  72. package/dist/client/flavors-B0rbqffG.mjs.map +1 -0
  73. package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
  74. package/dist/client/flavors-Rl20bxVU.mjs +628 -0
  75. package/dist/client/flavors-Rl20bxVU.mjs.map +1 -0
  76. package/dist/client/floatingips-Cz9k80cc.mjs +8 -0
  77. package/dist/client/floatingips-Cz9k80cc.mjs.map +1 -0
  78. package/dist/client/floatingips-xbO_mu4f.mjs +576 -0
  79. package/dist/client/floatingips-xbO_mu4f.mjs.map +1 -0
  80. package/dist/client/hooks/useBreadcrumbs.d.ts +16 -0
  81. package/dist/client/hooks/usePushBreadcrumbs.d.ts +10 -0
  82. package/dist/client/hooks/useSetBreadcrumb.d.ts +11 -0
  83. package/dist/client/{hooks-LutR2Yg3.mjs → hooks-D0yKIumu.mjs} +2 -2
  84. package/dist/client/{hooks-LutR2Yg3.mjs.map → hooks-D0yKIumu.mjs.map} +1 -1
  85. package/dist/client/images-BGQv9kKT.mjs +1983 -0
  86. package/dist/client/images-BGQv9kKT.mjs.map +1 -0
  87. package/dist/client/{images-CS4kZQyu.mjs → images-CPmMa4SQ.mjs} +3 -5
  88. package/dist/client/images-CPmMa4SQ.mjs.map +1 -0
  89. package/dist/client/images-NBf2bV43.mjs.map +1 -1
  90. package/dist/client/index.d.ts +7 -3
  91. package/dist/client/index.js +549 -535
  92. package/dist/client/index.js.map +1 -1
  93. package/dist/client/{objects-C3azvW8m.mjs → objects-BE_u5yRt.mjs} +7087 -4211
  94. package/dist/client/objects-BE_u5yRt.mjs.map +1 -0
  95. package/dist/client/objects-BN-59Th0.mjs +66 -0
  96. package/dist/client/objects-BN-59Th0.mjs.map +1 -0
  97. package/dist/client/objects-D9Luf9KB.mjs +66 -0
  98. package/dist/client/objects-D9Luf9KB.mjs.map +1 -0
  99. package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
  100. package/dist/client/routeInfo-DP3v74Wg.mjs +19 -0
  101. package/dist/client/routeInfo-DP3v74Wg.mjs.map +1 -0
  102. package/dist/client/router.d.ts +2 -2
  103. package/dist/client/{routes-CdDm-hhO.mjs → routes-CJj7SR_K.mjs} +2 -2
  104. package/dist/client/routes-CJj7SR_K.mjs.map +1 -0
  105. package/dist/client/routes-xofA3ksU.mjs +110 -0
  106. package/dist/client/routes-xofA3ksU.mjs.map +1 -0
  107. package/dist/client/securitygroups-BjhgLBHm.mjs +620 -0
  108. package/dist/client/securitygroups-BjhgLBHm.mjs.map +1 -0
  109. package/dist/client/securitygroups-CtKne8UQ.mjs +8 -0
  110. package/dist/client/securitygroups-CtKne8UQ.mjs.map +1 -0
  111. package/dist/client/{securitygroups-Byte-iSp.mjs → securitygroups-DEJQBcxm.mjs} +3 -5
  112. package/dist/client/securitygroups-DEJQBcxm.mjs.map +1 -0
  113. package/dist/client/trpcClient.d.ts +135 -3
  114. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +54 -0
  115. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +1 -0
  116. package/dist/client/useModalTracking-BcOKTYRN.mjs +33 -0
  117. package/dist/client/useModalTracking-BcOKTYRN.mjs.map +1 -0
  118. package/dist/client/{useSecurityGroupPermissions-C29mzb3b.mjs → useSecurityGroupPermissions-BOyLQLdC.mjs} +85 -19
  119. package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs.map +1 -0
  120. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +19 -0
  121. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +1 -0
  122. package/dist/client/utils/formatSwiftDate.d.ts +30 -0
  123. package/dist/server/index.d.ts +136 -4
  124. package/dist/server/index.js +845 -260
  125. package/package.json +37 -36
  126. package/dist/client/AuthProvider-BS5OVv8n.mjs.map +0 -1
  127. package/dist/client/DeleteFlavorModal-BP83t9zX.mjs +0 -721
  128. package/dist/client/DeleteFlavorModal-BP83t9zX.mjs.map +0 -1
  129. package/dist/client/FloatingIpActionModals-BraiJWBi.mjs +0 -417
  130. package/dist/client/FloatingIpActionModals-BraiJWBi.mjs.map +0 -1
  131. package/dist/client/ImageToastNotifications-BXMHJaIH.mjs +0 -1131
  132. package/dist/client/ImageToastNotifications-BXMHJaIH.mjs.map +0 -1
  133. package/dist/client/RouteError-hAF8_jbe.mjs +0 -25
  134. package/dist/client/RouteError-hAF8_jbe.mjs.map +0 -1
  135. package/dist/client/SortInput-Cqs2poV3.mjs +0 -34
  136. package/dist/client/SortInput-Cqs2poV3.mjs.map +0 -1
  137. package/dist/client/StatusError-C5KodQOq.mjs +0 -39
  138. package/dist/client/StatusError-C5KodQOq.mjs.map +0 -1
  139. package/dist/client/_auth-DJ9wHZaj.mjs +0 -11
  140. package/dist/client/_auth-DJ9wHZaj.mjs.map +0 -1
  141. package/dist/client/_flavorId-BN_qessZ.mjs.map +0 -1
  142. package/dist/client/_flavorId-CJjEB_Ao.mjs +0 -210
  143. package/dist/client/_flavorId-CJjEB_Ao.mjs.map +0 -1
  144. package/dist/client/_floatingIpId-CwDGHkWm.mjs.map +0 -1
  145. package/dist/client/_floatingIpId-foMIwbE4.mjs +0 -215
  146. package/dist/client/_floatingIpId-foMIwbE4.mjs.map +0 -1
  147. package/dist/client/_imageId-BtJ7GmYB.mjs.map +0 -1
  148. package/dist/client/_projectId-BmtCuzJu.mjs +0 -29
  149. package/dist/client/_projectId-BmtCuzJu.mjs.map +0 -1
  150. package/dist/client/_projectId-Byt3GQDW.mjs.map +0 -1
  151. package/dist/client/_projectId-NYk1IN_a.mjs +0 -291
  152. package/dist/client/_projectId-NYk1IN_a.mjs.map +0 -1
  153. package/dist/client/_projectId-QueiFczy.mjs +0 -46
  154. package/dist/client/_projectId-QueiFczy.mjs.map +0 -1
  155. package/dist/client/_securityGroupId-BcbkRhsN.mjs.map +0 -1
  156. package/dist/client/_securityGroupId-pPtJsCoe.mjs +0 -1797
  157. package/dist/client/_securityGroupId-pPtJsCoe.mjs.map +0 -1
  158. package/dist/client/_storageType-BmqrU06i.mjs +0 -2202
  159. package/dist/client/_storageType-BmqrU06i.mjs.map +0 -1
  160. package/dist/client/components/Error/StatusError.d.ts +0 -11
  161. package/dist/client/components/ProjectView/ProjectInfoBox.d.ts +0 -12
  162. package/dist/client/flavors-CiHCYrtZ.mjs.map +0 -1
  163. package/dist/client/flavors-DY-bDc8l.mjs +0 -650
  164. package/dist/client/flavors-DY-bDc8l.mjs.map +0 -1
  165. package/dist/client/floatingips-Ci4jHkaG.mjs +0 -591
  166. package/dist/client/floatingips-Ci4jHkaG.mjs.map +0 -1
  167. package/dist/client/images-91U7tr9Y2.mjs +0 -1976
  168. package/dist/client/images-91U7tr9Y2.mjs.map +0 -1
  169. package/dist/client/images-CS4kZQyu.mjs.map +0 -1
  170. package/dist/client/objects-C3azvW8m.mjs.map +0 -1
  171. package/dist/client/objects-CM265S6b.mjs +0 -56
  172. package/dist/client/objects-CM265S6b.mjs.map +0 -1
  173. package/dist/client/objects-EE9Cd1wI.mjs +0 -56
  174. package/dist/client/objects-EE9Cd1wI.mjs.map +0 -1
  175. package/dist/client/routeInfo-DXqB2HCf.mjs +0 -32
  176. package/dist/client/routeInfo-DXqB2HCf.mjs.map +0 -1
  177. package/dist/client/routes-CBd8CCuM.mjs +0 -115
  178. package/dist/client/routes-CBd8CCuM.mjs.map +0 -1
  179. package/dist/client/routes-CdDm-hhO.mjs.map +0 -1
  180. package/dist/client/securitygroups-Bd_uV4S9.mjs +0 -595
  181. package/dist/client/securitygroups-Bd_uV4S9.mjs.map +0 -1
  182. package/dist/client/securitygroups-Byte-iSp.mjs.map +0 -1
  183. package/dist/client/useSecurityGroupPermissions-C29mzb3b.mjs.map +0 -1
@@ -1,56 +0,0 @@
1
- import { a as e, i as t, n, o as r, t as i } from "./objects-C3azvW8m.mjs";
2
- import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
3
- import { useParams as c } from "@tanstack/react-router";
4
- import { Trans as l } from "@lingui/react";
5
- import { ErrorBoundary as u } from "react-error-boundary";
6
- //#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=component
7
- function d() {
8
- let { projectId: d, provider: f, containerName: p } = c({
9
- from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
10
- select: (e) => ({
11
- projectId: e.projectId,
12
- provider: e.provider,
13
- containerName: e.containerName
14
- })
15
- }), { prefix: m, sortBy: h, sortDirection: g, search: _, view: v } = i.useSearch();
16
- return /*#__PURE__*/ s(a, { children: [f === "ceph" && /*#__PURE__*/ o(n, { bucketName: p }), /*#__PURE__*/ o("div", { children: d ? /*#__PURE__*/ o(u, {
17
- resetKeys: [
18
- d,
19
- f,
20
- p,
21
- m,
22
- h,
23
- g,
24
- _,
25
- v
26
- ],
27
- fallback: /*#__PURE__*/ o("div", {
28
- className: "p-4 text-center",
29
- children: /*#__PURE__*/ o(l, { id: "diFNkW" })
30
- }),
31
- children: (() => {
32
- switch (f) {
33
- case "swift": return /*#__PURE__*/ o(r, {
34
- provider: f,
35
- containerName: p
36
- });
37
- case "ceph": return o(v === "cors-rules" ? t : e, { bucketName: p });
38
- default: return /*#__PURE__*/ o("div", {
39
- className: "p-4",
40
- children: /*#__PURE__*/ o(l, {
41
- id: "ubUrot",
42
- values: { containerName: p }
43
- })
44
- });
45
- }
46
- })()
47
- }) : /*#__PURE__*/ o("div", {
48
- className: "p-4 text-center",
49
- children: /*#__PURE__*/ o(l, { id: "Z2fZGD" })
50
- }) })] });
51
- }
52
- var f = () => /*#__PURE__*/ o(d, {});
53
- //#endregion
54
- export { d as ObjectsDashboard, f as component };
55
-
56
- //# sourceMappingURL=objects-CM265S6b.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"objects-CM265S6b.mjs","names":["useParams","ErrorBoundary","Trans","SwiftObjects","CephObjects","CephCorsRules","BucketHeader","Route","ObjectsDashboard","projectId","provider","containerName","from","select","params","prefix","sortBy","sortDirection","search","view","useSearch","showContentHeader","SplitComponent","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, useParams } from \"@tanstack/react-router\"\nimport { checkServiceAvailability } from \"../../../../-components/utils/serviceAvailability\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { CephCorsRules } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\n\n// Search params schema\n// - prefix: base64-encoded current folder path, safe to carry \"/\" chars in the URL\n// - sortBy: active sort column key — persisted so deep links and back navigation restore sort state\n// Accepts both Swift keys (last_modified, bytes) and Ceph keys (lastModified, size) for compatibility\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\n// - view: tab selection for Ceph bucket details page (overview shows objects, cors-rules shows CORS config)\n// - corsSortBy: active sort column for CORS rules tab (ID, AllowedOrigins, etc.) — separate from objects sortBy\n// - corsSortDirection: \"asc\" | \"desc\" for CORS rules — separate from objects sortDirection\n// - corsSearch: search term for filtering CORS rules by Rule ID — separate from objects search\nconst objectsSearchSchema = z.object({\n prefix: z.string().optional(),\n sortBy: z.enum([\"name\", \"last_modified\", \"bytes\", \"lastModified\", \"size\"]).optional().default(\"name\"),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n search: z.string().optional(),\n tab: z.enum([\"all\", \"deleted\"]).optional().default(\"all\"),\n view: z.enum([\"overview\", \"cors-rules\"]).optional().default(\"overview\"),\n corsSortBy: z\n .enum([\"ID\", \"AllowedOrigins\", \"AllowedMethods\", \"AllowedHeaders\", \"ExposeHeaders\", \"MaxAgeSeconds\"])\n .optional()\n .default(\"ID\"),\n corsSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n corsSearch: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\n \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\"\n)({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n analytics: {\n name: \"storage.objectstore.detail\",\n },\n isDetail: true,\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\", to: \"/projects/$projectId/storage/$provider/$storageType\" },\n } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: () => {\n return (\n <p>\n <Trans>Storage container not found</Trans>\n </p>\n )\n },\n loader: async ({ context }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n\n return {\n client: trpcClient,\n availableServices,\n }\n },\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n checkServiceAvailability(availableServices!, params)\n },\n})\n\nexport function ObjectsDashboard() {\n const { projectId, provider, containerName } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\",\n select: (params) => ({\n projectId: params.projectId,\n provider: params.provider,\n containerName: params.containerName,\n }),\n })\n\n const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n // For Ceph buckets, we show ContentHeader with badges and actions\n // For Swift containers, the component handles its own header\n const showContentHeader = provider === \"ceph\"\n\n return (\n <>\n {showContentHeader && <BucketHeader bucketName={containerName} />}\n <div>\n {projectId ? (\n <ErrorBoundary\n resetKeys={[projectId, provider, containerName, prefix, sortBy, sortDirection, search, view]}\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Error loading component</Trans>\n </div>\n }\n >\n {(() => {\n switch (provider) {\n case \"swift\":\n return <SwiftObjects provider={provider} containerName={containerName} />\n case \"ceph\":\n if (view === \"cors-rules\") {\n return <CephCorsRules bucketName={containerName} />\n }\n return <CephObjects bucketName={containerName} />\n default:\n return (\n <div className=\"p-4\">\n <Trans>Objects: {containerName}</Trans>\n </div>\n )\n }\n })()}\n </ErrorBoundary>\n ) : (\n <div className=\"p-4 text-center\">\n <Trans>No project selected</Trans>\n </div>\n )}\n </div>\n </>\n )\n}\n"],"mappings":";;;;;;AA8EA,SAAgBQ,IAAAA;CACd,IAAM,EAAEC,cAAWC,aAAUC,qBAAkBX,EAAU;EACvDY,MAAM;EACNC,SAASC,OAAY;GACnBL,WAAWK,EAAOL;GAClBC,UAAUI,EAAOJ;GACjBC,eAAeG,EAAOH;EACxB;CACF,CAAA,GAEM,EAAEI,WAAQC,WAAQC,kBAAeC,WAAQC,YAASZ,EAAMa,UAAS;CAMvE,OACE,gBAAA,GAAA,EAAA,UAAA,CAHwBV,MAAa,UAIb,gBAAC,GAAA,EAAa,YAAYC,EAAAA,CAAAA,GAChD,gBAAC,OAAA,EACEF,UAAAA,IACC,gBAAC,GAAA;EACC,WAAW;GAACA;GAAWC;GAAUC;GAAeI;GAAQC;GAAQC;GAAeC;GAAQC;EAAK;EAC5F,UACE,gBAAC,OAAA;GAAI,WAAU;GACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;EAIH,iBAAC;GACA,QAAQT,GAAR;IACE,KAAK,SACH,OAAO,gBAAC,GAAA;KAAuBA;KAAyBC;;IAC1D,KAAK,QAIH,OAFS,EADLQ,MAAS,eACH,IAEF,GAFE,EAAc,YAAYR,EAAAA,CAAAA;IAGtC,SACE,OACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA;;MAAiBA,QAAAA,EAAAA,iBAAAA;;;GAGzB;EACF,EAAA,CAAA;CAGF,CAAA,IAAA,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;AAMZ;AAAC,IAAAW,UAhFU,gBAAC,GAAA,CAAA,CAAA"}
@@ -1,56 +0,0 @@
1
- import { a as e, i as t, n, o as r, t as i } from "./objects-C3azvW8m.mjs";
2
- import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
3
- import { useParams as c } from "@tanstack/react-router";
4
- import { Trans as l } from "@lingui/react";
5
- import { ErrorBoundary as u } from "react-error-boundary";
6
- //#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=notFoundComponent
7
- function d() {
8
- let { projectId: d, provider: f, containerName: p } = c({
9
- from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
10
- select: (e) => ({
11
- projectId: e.projectId,
12
- provider: e.provider,
13
- containerName: e.containerName
14
- })
15
- }), { prefix: m, sortBy: h, sortDirection: g, search: _, view: v } = i.useSearch();
16
- return /*#__PURE__*/ s(a, { children: [f === "ceph" && /*#__PURE__*/ o(n, { bucketName: p }), /*#__PURE__*/ o("div", { children: d ? /*#__PURE__*/ o(u, {
17
- resetKeys: [
18
- d,
19
- f,
20
- p,
21
- m,
22
- h,
23
- g,
24
- _,
25
- v
26
- ],
27
- fallback: /*#__PURE__*/ o("div", {
28
- className: "p-4 text-center",
29
- children: /*#__PURE__*/ o(l, { id: "diFNkW" })
30
- }),
31
- children: (() => {
32
- switch (f) {
33
- case "swift": return /*#__PURE__*/ o(r, {
34
- provider: f,
35
- containerName: p
36
- });
37
- case "ceph": return o(v === "cors-rules" ? t : e, { bucketName: p });
38
- default: return /*#__PURE__*/ o("div", {
39
- className: "p-4",
40
- children: /*#__PURE__*/ o(l, {
41
- id: "ubUrot",
42
- values: { containerName: p }
43
- })
44
- });
45
- }
46
- })()
47
- }) : /*#__PURE__*/ o("div", {
48
- className: "p-4 text-center",
49
- children: /*#__PURE__*/ o(l, { id: "Z2fZGD" })
50
- }) })] });
51
- }
52
- var f = () => /*#__PURE__*/ o("p", { children: /*#__PURE__*/ o(l, { id: "FRtmJJ" }) });
53
- //#endregion
54
- export { d as ObjectsDashboard, f as notFoundComponent };
55
-
56
- //# sourceMappingURL=objects-EE9Cd1wI.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"objects-EE9Cd1wI.mjs","names":["useParams","ErrorBoundary","Trans","SwiftObjects","CephObjects","CephCorsRules","BucketHeader","Route","ObjectsDashboard","projectId","provider","containerName","from","select","params","prefix","sortBy","sortDirection","search","view","useSearch","showContentHeader","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { createFileRoute, useParams } from \"@tanstack/react-router\"\nimport { checkServiceAvailability } from \"../../../../-components/utils/serviceAvailability\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { CephCorsRules } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\n\n// Search params schema\n// - prefix: base64-encoded current folder path, safe to carry \"/\" chars in the URL\n// - sortBy: active sort column key — persisted so deep links and back navigation restore sort state\n// Accepts both Swift keys (last_modified, bytes) and Ceph keys (lastModified, size) for compatibility\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\n// - view: tab selection for Ceph bucket details page (overview shows objects, cors-rules shows CORS config)\n// - corsSortBy: active sort column for CORS rules tab (ID, AllowedOrigins, etc.) — separate from objects sortBy\n// - corsSortDirection: \"asc\" | \"desc\" for CORS rules — separate from objects sortDirection\n// - corsSearch: search term for filtering CORS rules by Rule ID — separate from objects search\nconst objectsSearchSchema = z.object({\n prefix: z.string().optional(),\n sortBy: z.enum([\"name\", \"last_modified\", \"bytes\", \"lastModified\", \"size\"]).optional().default(\"name\"),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n search: z.string().optional(),\n tab: z.enum([\"all\", \"deleted\"]).optional().default(\"all\"),\n view: z.enum([\"overview\", \"cors-rules\"]).optional().default(\"overview\"),\n corsSortBy: z\n .enum([\"ID\", \"AllowedOrigins\", \"AllowedMethods\", \"AllowedHeaders\", \"ExposeHeaders\", \"MaxAgeSeconds\"])\n .optional()\n .default(\"ID\"),\n corsSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n corsSearch: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\n \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\"\n)({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n analytics: {\n name: \"storage.objectstore.detail\",\n },\n isDetail: true,\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\", to: \"/projects/$projectId/storage/$provider/$storageType\" },\n } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: () => {\n return (\n <p>\n <Trans>Storage container not found</Trans>\n </p>\n )\n },\n loader: async ({ context }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n\n return {\n client: trpcClient,\n availableServices,\n }\n },\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n checkServiceAvailability(availableServices!, params)\n },\n})\n\nexport function ObjectsDashboard() {\n const { projectId, provider, containerName } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\",\n select: (params) => ({\n projectId: params.projectId,\n provider: params.provider,\n containerName: params.containerName,\n }),\n })\n\n const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n // For Ceph buckets, we show ContentHeader with badges and actions\n // For Swift containers, the component handles its own header\n const showContentHeader = provider === \"ceph\"\n\n return (\n <>\n {showContentHeader && <BucketHeader bucketName={containerName} />}\n <div>\n {projectId ? (\n <ErrorBoundary\n resetKeys={[projectId, provider, containerName, prefix, sortBy, sortDirection, search, view]}\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Error loading component</Trans>\n </div>\n }\n >\n {(() => {\n switch (provider) {\n case \"swift\":\n return <SwiftObjects provider={provider} containerName={containerName} />\n case \"ceph\":\n if (view === \"cors-rules\") {\n return <CephCorsRules bucketName={containerName} />\n }\n return <CephObjects bucketName={containerName} />\n default:\n return (\n <div className=\"p-4\">\n <Trans>Objects: {containerName}</Trans>\n </div>\n )\n }\n })()}\n </ErrorBoundary>\n ) : (\n <div className=\"p-4 text-center\">\n <Trans>No project selected</Trans>\n </div>\n )}\n </div>\n </>\n )\n}\n"],"mappings":";;;;;;AA8EA,SAAgBQ,IAAAA;CACd,IAAM,EAAEC,cAAWC,aAAUC,qBAAkBX,EAAU;EACvDY,MAAM;EACNC,SAASC,OAAY;GACnBL,WAAWK,EAAOL;GAClBC,UAAUI,EAAOJ;GACjBC,eAAeG,EAAOH;EACxB;CACF,CAAA,GAEM,EAAEI,WAAQC,WAAQC,kBAAeC,WAAQC,YAASZ,EAAMa,UAAS;CAMvE,OACE,gBAAA,GAAA,EAAA,UAAA,CAHwBV,MAAa,UAIb,gBAAC,GAAA,EAAa,YAAYC,EAAAA,CAAAA,GAChD,gBAAC,OAAA,EACEF,UAAAA,IACC,gBAAC,GAAA;EACC,WAAW;GAACA;GAAWC;GAAUC;GAAeI;GAAQC;GAAQC;GAAeC;GAAQC;EAAK;EAC5F,UACE,gBAAC,OAAA;GAAI,WAAU;GACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;EAIH,iBAAC;GACA,QAAQT,GAAR;IACE,KAAK,SACH,OAAO,gBAAC,GAAA;KAAuBA;KAAyBC;;IAC1D,KAAK,QAIH,OAFS,EADLQ,MAAS,eACH,IAEF,GAFE,EAAc,YAAYR,EAAAA,CAAAA;IAGtC,SACE,OACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA;;MAAiBA,QAAAA,EAAAA,iBAAAA;;;GAGzB;EACF,EAAA,CAAA;CAGF,CAAA,IAAA,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;AAMZ;AAAC,IAAAW,UA5EK,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA"}
@@ -1,32 +0,0 @@
1
- import { z as e } from "zod";
2
- var t = e.object({
3
- labelKey: e.enum([
4
- "Compute",
5
- "Network",
6
- "Storage",
7
- "Services",
8
- "Images",
9
- "Flavors",
10
- "Security Groups",
11
- "Floating IPs"
12
- ]).optional(),
13
- label: e.string().optional(),
14
- to: e.string().optional(),
15
- useParamAsLabel: e.string().optional(),
16
- useParentTitleAsLabel: e.boolean().optional()
17
- }), n = e.object({ name: e.string() }), r = e.object({
18
- section: e.string().optional(),
19
- service: e.string().optional(),
20
- isDetail: e.boolean().optional(),
21
- crumb: t.optional(),
22
- sectionCrumb: t.optional(),
23
- intermediateCrumb: t.optional(),
24
- analytics: n.optional()
25
- });
26
- function i(e) {
27
- return r.safeParse(e).success;
28
- }
29
- //#endregion
30
- export { i as t };
31
-
32
- //# sourceMappingURL=routeInfo-DXqB2HCf.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routeInfo-DXqB2HCf.mjs","names":["z","CRUMB_LABEL_KEYS","CrumbSchema","object","labelKey","enum","optional","label","string","to","useParamAsLabel","useParentTitleAsLabel","boolean","AnalyticsSchema","name","RouteInfoSchema","section","service","isDetail","crumb","sectionCrumb","intermediateCrumb","analytics","isRouteInfo","data","safeParse","success"],"sources":["../../src/client/routes/routeInfo.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport const CRUMB_LABEL_KEYS = [\n \"Compute\",\n \"Network\",\n \"Storage\",\n \"Services\",\n \"Images\",\n \"Flavors\",\n \"Security Groups\",\n \"Floating IPs\",\n] as const\n\nexport type CrumbLabelKey = (typeof CRUMB_LABEL_KEYS)[number]\n\nconst CrumbSchema = z.object({\n labelKey: z.enum(CRUMB_LABEL_KEYS).optional(),\n label: z.string().optional(),\n to: z.string().optional(),\n useParamAsLabel: z.string().optional(),\n useParentTitleAsLabel: z.boolean().optional(),\n})\n\nconst AnalyticsSchema = z.object({\n name: z.string(),\n})\n\nconst RouteInfoSchema = z.object({\n section: z.string().optional(),\n service: z.string().optional(),\n isDetail: z.boolean().optional(),\n crumb: CrumbSchema.optional(),\n sectionCrumb: CrumbSchema.optional(),\n intermediateCrumb: CrumbSchema.optional(),\n analytics: AnalyticsSchema.optional(),\n})\n\nexport type Crumb = z.infer<typeof CrumbSchema>\nexport type Analytics = z.infer<typeof AnalyticsSchema>\nexport type RouteInfo = z.infer<typeof RouteInfoSchema>\n\nexport function isRouteInfo(data: unknown): data is RouteInfo {\n return RouteInfoSchema.safeParse(data).success\n}\n"],"mappings":";AAeA,IAAME,IAAcF,EAAEG,OAAO;CAC3BC,UAAUJ,EAAEK,KAAKJ;EAbjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAMiBA,CAAAA,CAAAA,CAAkBK,SAAQ;CAC3CC,OAAOP,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC1BG,IAAIT,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CACvBI,iBAAiBV,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CACpCK,uBAAuBX,EAAEY,QAAO,CAAA,CAAGN,SAAQ;AAC7C,CAAA,GAEMO,IAAkBb,EAAEG,OAAO,EAC/BW,MAAMd,EAAEQ,OAAM,EAChB,CAAA,GAEMO,IAAkBf,EAAEG,OAAO;CAC/Ba,SAAShB,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC5BW,SAASjB,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC5BY,UAAUlB,EAAEY,QAAO,CAAA,CAAGN,SAAQ;CAC9Ba,OAAOjB,EAAYI,SAAQ;CAC3Bc,cAAclB,EAAYI,SAAQ;CAClCe,mBAAmBnB,EAAYI,SAAQ;CACvCgB,WAAWT,EAAgBP,SAAQ;AACrC,CAAA;AAMA,SAAgBiB,EAAYC,GAAa;CACvC,OAAOT,EAAgBU,UAAUD,CAAAA,CAAAA,CAAME;AACzC"}
@@ -1,115 +0,0 @@
1
- import { F as e, W as t, X as n, a as r, h as i, m as a, nt as o } from "./build-C_4vRMCq.mjs";
2
- import { n as s } from "./AuthProvider-BS5OVv8n.mjs";
3
- import { t as c } from "./Slot-CWb612-_.mjs";
4
- import { t as l } from "./routes-CdDm-hhO.mjs";
5
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
- import { useEffect as f } from "react";
7
- import { useNavigate as p } from "@tanstack/react-router";
8
- import { Trans as m } from "@lingui/react";
9
- //#region src/client/components/Auth/LoginForm.tsx
10
- function h() {
11
- let { isLoading: t, error: n, login: c } = s();
12
- return /*#__PURE__*/ u("div", {
13
- className: "mt-8 flex justify-center",
14
- children: /*#__PURE__*/ d("div", {
15
- className: "border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg",
16
- children: [
17
- /*#__PURE__*/ u(o, {
18
- className: "text-center",
19
- children: /*#__PURE__*/ u(m, { id: "MDQl/K" })
20
- }),
21
- /*#__PURE__*/ u("p", {
22
- className: "mb-6 text-center",
23
- children: /*#__PURE__*/ u(m, { id: "N5vGcw" })
24
- }),
25
- /*#__PURE__*/ d("form", {
26
- className: "space-y-5",
27
- onSubmit: (e) => {
28
- e.preventDefault();
29
- let t = new FormData(e.currentTarget);
30
- c({
31
- domain: String(t.get("domain") ?? ""),
32
- user: String(t.get("user") ?? ""),
33
- password: String(t.get("password") ?? "")
34
- });
35
- },
36
- children: [
37
- n && /*#__PURE__*/ u(e, {
38
- text: n,
39
- variant: "error"
40
- }),
41
- /*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
42
- id: "domain",
43
- name: "domain",
44
- label: "Domain",
45
- autoComplete: "domain",
46
- required: !0
47
- }) }),
48
- /*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
49
- id: "user",
50
- name: "user",
51
- label: "User",
52
- autoComplete: "user",
53
- required: !0
54
- }) }),
55
- /*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
56
- id: "password",
57
- name: "password",
58
- type: "password",
59
- label: "Password",
60
- autoComplete: "password",
61
- required: !0
62
- }) }),
63
- /*#__PURE__*/ u(r, {
64
- type: "submit",
65
- variant: "primary",
66
- className: "mt-2 w-full",
67
- disabled: t,
68
- children: t ? /*#__PURE__*/ u(m, { id: "Z3FXyt" }) : /*#__PURE__*/ u(m, { id: "n1ekoW" })
69
- })
70
- ]
71
- })
72
- ]
73
- })
74
- });
75
- }
76
- //#endregion
77
- //#region src/client/routes/index.tsx?tsr-split=component
78
- function g(e) {
79
- return typeof e == "string" && e.startsWith("/") && !e.startsWith("//");
80
- }
81
- function _() {
82
- let { isLoading: e, isAuthenticated: r } = s(), { slots: i } = l.useRouteContext(), { redirect: a } = l.useSearch(), o = p();
83
- return f(() => {
84
- if (r && !e) {
85
- let e = g(a) ? a : "/projects";
86
- o({
87
- to: e,
88
- replace: !0
89
- });
90
- }
91
- }, [
92
- r,
93
- e,
94
- o,
95
- a
96
- ]), e ? /*#__PURE__*/ d(n, {
97
- className: "fixed inset-0",
98
- distribution: "center",
99
- alignment: "center",
100
- children: [/*#__PURE__*/ u("div", { className: "absolute inset-0 backdrop-blur-sm" }), /*#__PURE__*/ u(t, {
101
- variant: "primary",
102
- size: "large"
103
- })]
104
- }) : i?.login && !r ? /*#__PURE__*/ u("div", {
105
- className: "mt-8 flex justify-center",
106
- children: /*#__PURE__*/ u(c, {
107
- component: i.login,
108
- useShadowDOM: !1
109
- })
110
- }) : r ? null : /*#__PURE__*/ u(h, {});
111
- }
112
- //#endregion
113
- export { _ as component };
114
-
115
- //# sourceMappingURL=routes-CBd8CCuM.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes-CBd8CCuM.mjs","names":["ContentHeading","Message","Button","FormRow","TextInput","useAuth","LoginForm","isLoading","error","loginError","login","div","className","p","form","onSubmit","e","preventDefault","formData","FormData","currentTarget","domain","String","get","user","password","text","variant","id","name","label","autoComplete","required","type","disabled","useNavigate","Stack","Spinner","useEffect","LoginForm","Slot","useAuth","isSafeRedirect","path","startsWith","Route","LandingPage","isLoading","isAuthenticated","slots","useRouteContext","redirect","searchRedirect","useSearch","navigate","target","to","replace","login","component"],"sources":["../../src/client/components/Auth/LoginForm.tsx","../../src/client/routes/index.tsx?tsr-split=component"],"sourcesContent":["import { ContentHeading, Message, Button, FormRow, TextInput } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useAuth } from \"../../store/AuthProvider\"\n\nexport function LoginForm() {\n const { isLoading, error: loginError, login } = useAuth()\n\n return (\n <div className=\"mt-8 flex justify-center\">\n <div className=\"border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg\">\n <ContentHeading className=\"text-center\">\n <Trans>Sign In to Your Account</Trans>\n </ContentHeading>\n <p className=\"mb-6 text-center\">\n <Trans>Enter your credentials to access your account</Trans>\n </p>\n\n <form\n className=\"space-y-5\"\n onSubmit={(e) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n login({\n domain: String(formData.get(\"domain\") ?? \"\"),\n user: String(formData.get(\"user\") ?? \"\"),\n password: String(formData.get(\"password\") ?? \"\"),\n })\n }}\n >\n {loginError && <Message text={loginError} variant=\"error\" />}\n <FormRow>\n <TextInput id=\"domain\" name=\"domain\" label=\"Domain\" autoComplete=\"domain\" required />\n </FormRow>\n <FormRow>\n <TextInput id=\"user\" name=\"user\" label=\"User\" autoComplete=\"user\" required />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"password\"\n name=\"password\"\n type=\"password\"\n label=\"Password\"\n autoComplete=\"password\"\n required\n />\n </FormRow>\n\n <Button type=\"submit\" variant=\"primary\" className=\"mt-2 w-full\" disabled={isLoading}>\n {isLoading ? <Trans>Loading...</Trans> : <Trans>Sign In</Trans>}\n </Button>\n </form>\n </div>\n </div>\n )\n}\n","import { createFileRoute, useNavigate } from \"@tanstack/react-router\"\nimport { Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { z } from \"zod\"\nimport { useEffect } from \"react\"\nimport { LoginForm } from \"../components/Auth/LoginForm\"\nimport { Slot } from \"../components/Slot\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nfunction isSafeRedirect(path: unknown): path is string {\n return typeof path === \"string\" && path.startsWith(\"/\") && !path.startsWith(\"//\")\n}\n\nexport const Route = createFileRoute(\"/\")({\n validateSearch: z.object({\n redirect: z.string().optional().catch(\"\"),\n }),\n component: LandingPage,\n})\n\nfunction LandingPage() {\n const { isLoading, isAuthenticated } = useAuth()\n const { slots } = Route.useRouteContext()\n const { redirect: searchRedirect } = Route.useSearch()\n const navigate = useNavigate()\n\n // Redirect when authenticated\n useEffect(() => {\n if (isAuthenticated && !isLoading) {\n const target = isSafeRedirect(searchRedirect) ? searchRedirect : \"/projects\"\n navigate({ to: target, replace: true })\n }\n }, [isAuthenticated, isLoading, navigate, searchRedirect])\n\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\">\n <div className=\"absolute inset-0 backdrop-blur-sm\" />\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n )\n }\n\n if (slots?.login && !isAuthenticated) {\n return (\n <div className=\"mt-8 flex justify-center\">\n <Slot component={slots.login} useShadowDOM={false} />\n </div>\n )\n }\n\n if (!isAuthenticated) {\n return <LoginForm />\n }\n\n // Redirecting...\n return null\n}\n"],"mappings":";;;;;;;;;AAIA,SAAgBM,IAAAA;CACd,IAAM,EAAEC,cAAWC,OAAOC,GAAYC,aAAUL,EAAAA;CAEhD,OACE,gBAACM,OAAAA;EAAIC,WAAU;EACb,UAAA,gBAACD,OAAAA;GAAIC,WAAU;;IACb,gBAACZ,GAAAA;KAAeY,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAACC,KAAAA;KAAED,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAGF,gBAACE,QAAAA;KACCF,WAAU;KACVG,WAAWC,MAAAA;MACTA,EAAEC,eAAc;MAChB,IAAMC,IAAW,IAAIC,SAASH,EAAEI,aAAa;MAC7CV,EAAM;OACJW,QAAQC,OAAOJ,EAASK,IAAI,QAAA,KAAa,EAAA;OACzCC,MAAMF,OAAOJ,EAASK,IAAI,MAAA,KAAW,EAAA;OACrCE,UAAUH,OAAOJ,EAASK,IAAI,UAAA,KAAe,EAAA;MAC/C,CAAA;KACF;;MAECd,KAAc,gBAACR,GAAAA;OAAQyB,MAAMjB;OAAYkB,SAAQ;;MAClD,gBAACxB,GAAAA,EACC,UAAA,gBAACC,GAAAA;OAAUwB,IAAG;OAASC,MAAK;OAASC,OAAM;OAASC,cAAa;OAASC,UAAQ;;MAEpF,gBAAC7B,GAAAA,EACC,UAAA,gBAACC,GAAAA;OAAUwB,IAAG;OAAOC,MAAK;OAAOC,OAAM;OAAOC,cAAa;OAAOC,UAAQ;;MAE5E,gBAAC7B,GAAAA,EACC,UAAA,gBAACC,GAAAA;OACCwB,IAAG;OACHC,MAAK;OACLI,MAAK;OACLH,OAAM;OACNC,cAAa;OACbC,UAAQ;;MAIZ,gBAAC9B,GAAAA;OAAO+B,MAAK;OAASN,SAAQ;OAAUf,WAAU;OAAcsB,UAAU3B;OACvEA,UAAAA,IAAY,gBAAA,GAAA,EAAA,IAAA,SAA4B,CAAA,IAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;;;;AAMrD;;;AC9CA,SAASmC,EAAeC,GAAa;CACnC,OAAO,OAAOA,KAAS,YAAYA,EAAKC,WAAW,GAAA,KAAQ,CAACD,EAAKC,WAAW,IAAA;AAC9E;AASA,SAASE,IAAAA;CACP,IAAM,EAAEC,cAAWC,uBAAoBP,EAAAA,GACjC,EAAEQ,aAAUJ,EAAMK,gBAAe,GACjC,EAAEC,UAAUC,MAAmBP,EAAMQ,UAAS,GAC9CC,IAAWnB,EAAAA;CAgCjB,OA7BAG,QAAU;EACR,IAAIU,KAAmB,CAACD,GAAW;GACjC,IAAMQ,IAASb,EAAeU,CAAAA,IAAkBA,IAAiB;GACjEE,EAAS;IAAEE,IAAID;IAAQE,SAAS;GAAK,CAAA;EACvC;CACF,GAAG;EAACT;EAAiBD;EAAWO;EAAUF;CAAe,CAAA,GAErDL,IAEA,gBAAC,GAAA;EAAM,WAAU;EAAgB,cAAa;EAAS,WAAU;EAC/D,UAAA,CAAA,gBAAC,OAAA,EAAI,WAAU,oCAAA,CAAA,GACf,gBAAC,GAAA;GAAQ,SAAQ;GAAU,MAAK;;MAKlCE,GAAOS,SAAS,CAACV,IAEjB,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,gBAAC,GAAA;GAAK,WAAWC,EAAMS;GAAO,cAAc;;MAK7CV,IAKE,OAJE,gBAAC,GAAA,CAAA,CAAA;AAKZ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes-CdDm-hhO.mjs","names":["createFileRoute","z","Route","validateSearch","object","redirect","string","optional","catch","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/index.tsx"],"sourcesContent":["import { createFileRoute, useNavigate } from \"@tanstack/react-router\"\nimport { Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { z } from \"zod\"\nimport { useEffect } from \"react\"\nimport { LoginForm } from \"../components/Auth/LoginForm\"\nimport { Slot } from \"../components/Slot\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nfunction isSafeRedirect(path: unknown): path is string {\n return typeof path === \"string\" && path.startsWith(\"/\") && !path.startsWith(\"//\")\n}\n\nexport const Route = createFileRoute(\"/\")({\n validateSearch: z.object({\n redirect: z.string().optional().catch(\"\"),\n }),\n component: LandingPage,\n})\n\nfunction LandingPage() {\n const { isLoading, isAuthenticated } = useAuth()\n const { slots } = Route.useRouteContext()\n const { redirect: searchRedirect } = Route.useSearch()\n const navigate = useNavigate()\n\n // Redirect when authenticated\n useEffect(() => {\n if (isAuthenticated && !isLoading) {\n const target = isSafeRedirect(searchRedirect) ? searchRedirect : \"/projects\"\n navigate({ to: target, replace: true })\n }\n }, [isAuthenticated, isLoading, navigate, searchRedirect])\n\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\">\n <div className=\"absolute inset-0 backdrop-blur-sm\" />\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n )\n }\n\n if (slots?.login && !isAuthenticated) {\n return (\n <div className=\"mt-8 flex justify-center\">\n <Slot component={slots.login} useShadowDOM={false} />\n </div>\n )\n }\n\n if (!isAuthenticated) {\n return <LoginForm />\n }\n\n // Redirecting...\n return null\n}\n"],"mappings":";;AAYA,IAAaE,IAAQF,EAAgB,GAAA,CAAA,CAAK;CACxCG,gBAAgBF,EAAEG,OAAO,EACvBC,UAAUJ,EAAEK,OAAM,CAAA,CAAGC,SAAQ,CAAA,CAAGC,MAAM,EAAA,EACxC,CAAA;CACAC,WAASC,yCAAA,WAAA;AACX,CAAA"}