@cobaltcore-dev/aurora 2.1.1 → 2.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 (173) hide show
  1. package/README.md +31 -25
  2. package/dist/client/AuroraApp.d.ts +9 -2
  3. package/dist/client/context/AppConfigContext.d.ts +44 -0
  4. package/dist/client/index.d.ts +2 -0
  5. package/dist/client/index.js +41221 -845
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/trpcClient.d.ts +314 -0
  8. package/dist/client/utils/appConfigGating.d.ts +21 -0
  9. package/dist/server/index.d.ts +694 -3
  10. package/dist/server/index.js +1748 -722
  11. package/package.json +3 -3
  12. package/dist/client/AuthProvider-CVSAwW9f.mjs +0 -83
  13. package/dist/client/AuthProvider-CVSAwW9f.mjs.map +0 -1
  14. package/dist/client/ContentHeader-fKKZVu-o.mjs +0 -116
  15. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +0 -1
  16. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs +0 -724
  17. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs.map +0 -1
  18. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +0 -26
  19. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +0 -1
  20. package/dist/client/FiltersInput-Becwxo_J.mjs +0 -85
  21. package/dist/client/FiltersInput-Becwxo_J.mjs.map +0 -1
  22. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs +0 -466
  23. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs.map +0 -1
  24. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +0 -26
  25. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +0 -1
  26. package/dist/client/Slot-CWb612-_.mjs +0 -28
  27. package/dist/client/Slot-CWb612-_.mjs.map +0 -1
  28. package/dist/client/SortInput-4g7nSTHW.mjs +0 -34
  29. package/dist/client/SortInput-4g7nSTHW.mjs.map +0 -1
  30. package/dist/client/StorageNotFound-B-zVinVD.mjs +0 -30
  31. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +0 -1
  32. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs +0 -28
  33. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +0 -1
  34. package/dist/client/_-CAsCx-Ay.mjs +0 -6
  35. package/dist/client/_-CAsCx-Ay.mjs.map +0 -1
  36. package/dist/client/_auth-SrDjHL6j.mjs +0 -12
  37. package/dist/client/_auth-SrDjHL6j.mjs.map +0 -1
  38. package/dist/client/_flavorId-BPvssEzn.mjs +0 -277
  39. package/dist/client/_flavorId-BPvssEzn.mjs.map +0 -1
  40. package/dist/client/_flavorId-CFUBcU-l.mjs +0 -27
  41. package/dist/client/_flavorId-CFUBcU-l.mjs.map +0 -1
  42. package/dist/client/_flavorId-CZcIp0Ih.mjs +0 -22
  43. package/dist/client/_flavorId-CZcIp0Ih.mjs.map +0 -1
  44. package/dist/client/_floatingIpId-B8r64AL9.mjs +0 -196
  45. package/dist/client/_floatingIpId-B8r64AL9.mjs.map +0 -1
  46. package/dist/client/_floatingIpId-lEobpOER.mjs +0 -26
  47. package/dist/client/_floatingIpId-lEobpOER.mjs.map +0 -1
  48. package/dist/client/_imageId-BAezmV0Y.mjs +0 -526
  49. package/dist/client/_imageId-BAezmV0Y.mjs.map +0 -1
  50. package/dist/client/_imageId-D-jqz3e3.mjs +0 -40
  51. package/dist/client/_imageId-D-jqz3e3.mjs.map +0 -1
  52. package/dist/client/_imageId-gMdrdnVt.mjs +0 -22
  53. package/dist/client/_imageId-gMdrdnVt.mjs.map +0 -1
  54. package/dist/client/_projectId-BYccdAtX.mjs +0 -77
  55. package/dist/client/_projectId-BYccdAtX.mjs.map +0 -1
  56. package/dist/client/_projectId-CBjZC1tv.mjs +0 -283
  57. package/dist/client/_projectId-CBjZC1tv.mjs.map +0 -1
  58. package/dist/client/_projectId-CLEa1zgw.mjs +0 -30
  59. package/dist/client/_projectId-CLEa1zgw.mjs.map +0 -1
  60. package/dist/client/_projectId-D3VOH5lN.mjs +0 -94
  61. package/dist/client/_projectId-D3VOH5lN.mjs.map +0 -1
  62. package/dist/client/_securityGroupId-BwgZnoiR.mjs +0 -29
  63. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +0 -1
  64. package/dist/client/_securityGroupId-Cz2NUHdB.mjs +0 -1819
  65. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +0 -1
  66. package/dist/client/_serviceType-DS8DxsrP.mjs +0 -20
  67. package/dist/client/_serviceType-DS8DxsrP.mjs.map +0 -1
  68. package/dist/client/_serviceType-M8d9rOT6.mjs +0 -6
  69. package/dist/client/_serviceType-M8d9rOT6.mjs.map +0 -1
  70. package/dist/client/_storageType-BNpP1A2N.mjs +0 -13
  71. package/dist/client/_storageType-BNpP1A2N.mjs.map +0 -1
  72. package/dist/client/_storageType-BxSGKhAI.mjs +0 -15
  73. package/dist/client/_storageType-BxSGKhAI.mjs.map +0 -1
  74. package/dist/client/_storageType-DZYCmiLt.mjs +0 -30
  75. package/dist/client/_storageType-DZYCmiLt.mjs.map +0 -1
  76. package/dist/client/_storageType-UqAMP-8d.mjs +0 -859
  77. package/dist/client/_storageType-UqAMP-8d.mjs.map +0 -1
  78. package/dist/client/_storageType-u51_7OwJ.mjs +0 -7
  79. package/dist/client/_storageType-u51_7OwJ.mjs.map +0 -1
  80. package/dist/client/about-BmQTyLWc.mjs +0 -92
  81. package/dist/client/about-BmQTyLWc.mjs.map +0 -1
  82. package/dist/client/assets/__mocks__/svgMock.d.ts +0 -3
  83. package/dist/client/aurora-CIml-f2f.mjs +0 -19
  84. package/dist/client/aurora-CIml-f2f.mjs.map +0 -1
  85. package/dist/client/build-WuxXRAqf.mjs +0 -14530
  86. package/dist/client/build-WuxXRAqf.mjs.map +0 -1
  87. package/dist/client/cn-DM4Cy3jv.mjs +0 -10
  88. package/dist/client/cn-DM4Cy3jv.mjs.map +0 -1
  89. package/dist/client/flavors-CJVSNz6R.mjs +0 -15
  90. package/dist/client/flavors-CJVSNz6R.mjs.map +0 -1
  91. package/dist/client/flavors-CflJDIEH.mjs +0 -667
  92. package/dist/client/flavors-CflJDIEH.mjs.map +0 -1
  93. package/dist/client/flavors-DWMZ6TuJ.mjs +0 -8
  94. package/dist/client/flavors-DWMZ6TuJ.mjs.map +0 -1
  95. package/dist/client/floatingips-Cz9k80cc.mjs +0 -8
  96. package/dist/client/floatingips-Cz9k80cc.mjs.map +0 -1
  97. package/dist/client/floatingips-DXnRlLvV.mjs +0 -551
  98. package/dist/client/floatingips-DXnRlLvV.mjs.map +0 -1
  99. package/dist/client/floatingips-HRbuLxiN.mjs +0 -22
  100. package/dist/client/floatingips-HRbuLxiN.mjs.map +0 -1
  101. package/dist/client/floatingips-nN1kQmsu.mjs +0 -14
  102. package/dist/client/floatingips-nN1kQmsu.mjs.map +0 -1
  103. package/dist/client/formatBytes-CZv_XyCY.mjs +0 -38
  104. package/dist/client/formatBytes-CZv_XyCY.mjs.map +0 -1
  105. package/dist/client/helpers-1PpYf-fC.mjs +0 -6
  106. package/dist/client/helpers-1PpYf-fC.mjs.map +0 -1
  107. package/dist/client/hooks-D0yKIumu.mjs +0 -22
  108. package/dist/client/hooks-D0yKIumu.mjs.map +0 -1
  109. package/dist/client/imageHelpers-DBhL2ebL.mjs +0 -1272
  110. package/dist/client/imageHelpers-DBhL2ebL.mjs.map +0 -1
  111. package/dist/client/images-BsylWUiH.mjs +0 -2011
  112. package/dist/client/images-BsylWUiH.mjs.map +0 -1
  113. package/dist/client/images-NBf2bV43.mjs +0 -8
  114. package/dist/client/images-NBf2bV43.mjs.map +0 -1
  115. package/dist/client/images-zQq1nSVv.mjs +0 -15
  116. package/dist/client/images-zQq1nSVv.mjs.map +0 -1
  117. package/dist/client/md-kvaGCNAK.mjs +0 -336
  118. package/dist/client/md-kvaGCNAK.mjs.map +0 -1
  119. package/dist/client/network-DuZm76BZ.mjs +0 -8
  120. package/dist/client/network-DuZm76BZ.mjs.map +0 -1
  121. package/dist/client/objects-BudUAfWY.mjs +0 -12909
  122. package/dist/client/objects-BudUAfWY.mjs.map +0 -1
  123. package/dist/client/objects-Dc7sKUr8.mjs +0 -67
  124. package/dist/client/objects-Dc7sKUr8.mjs.map +0 -1
  125. package/dist/client/objects-Dw7oeTq2.mjs +0 -80
  126. package/dist/client/objects-Dw7oeTq2.mjs.map +0 -1
  127. package/dist/client/objects-_g7nGIn5.mjs +0 -25
  128. package/dist/client/objects-_g7nGIn5.mjs.map +0 -1
  129. package/dist/client/objects-eBxvY6_n.mjs +0 -78
  130. package/dist/client/objects-eBxvY6_n.mjs.map +0 -1
  131. package/dist/client/projects-yiK0HGSA.mjs +0 -7
  132. package/dist/client/projects-yiK0HGSA.mjs.map +0 -1
  133. package/dist/client/routeInfo-DP3v74Wg.mjs +0 -19
  134. package/dist/client/routeInfo-DP3v74Wg.mjs.map +0 -1
  135. package/dist/client/routes-CJj7SR_K.mjs +0 -10
  136. package/dist/client/routes-CJj7SR_K.mjs.map +0 -1
  137. package/dist/client/routes-xofA3ksU.mjs +0 -110
  138. package/dist/client/routes-xofA3ksU.mjs.map +0 -1
  139. package/dist/client/securitygroups-CSmsBzUb.mjs +0 -581
  140. package/dist/client/securitygroups-CSmsBzUb.mjs.map +0 -1
  141. package/dist/client/securitygroups-CtKne8UQ.mjs +0 -8
  142. package/dist/client/securitygroups-CtKne8UQ.mjs.map +0 -1
  143. package/dist/client/securitygroups-T7kaNFEp.mjs +0 -15
  144. package/dist/client/securitygroups-T7kaNFEp.mjs.map +0 -1
  145. package/dist/client/securitygroups-WLB1_IM6.mjs +0 -22
  146. package/dist/client/securitygroups-WLB1_IM6.mjs.map +0 -1
  147. package/dist/client/securitygroups-o0IXZM6S.mjs +0 -14
  148. package/dist/client/securitygroups-o0IXZM6S.mjs.map +0 -1
  149. package/dist/client/serviceCatalog-B3lKWC9V.mjs +0 -6
  150. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +0 -1
  151. package/dist/client/services-D1PbooD1.mjs +0 -6
  152. package/dist/client/services-D1PbooD1.mjs.map +0 -1
  153. package/dist/client/services-DEMVtFyn.mjs +0 -9
  154. package/dist/client/services-DEMVtFyn.mjs.map +0 -1
  155. package/dist/client/storageProviders-CJ5rOh13.mjs +0 -15
  156. package/dist/client/storageProviders-CJ5rOh13.mjs.map +0 -1
  157. package/dist/client/trpcClient-D7gpR7YG.mjs +0 -71
  158. package/dist/client/trpcClient-D7gpR7YG.mjs.map +0 -1
  159. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +0 -54
  160. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +0 -1
  161. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +0 -83
  162. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +0 -1
  163. package/dist/client/useModal-DCs1OJh7.mjs +0 -12
  164. package/dist/client/useModal-DCs1OJh7.mjs.map +0 -1
  165. package/dist/client/useModalTracking-BYd37pXm.mjs +0 -37
  166. package/dist/client/useModalTracking-BYd37pXm.mjs.map +0 -1
  167. package/dist/client/useProjectId-DBc5lpoU.mjs +0 -11
  168. package/dist/client/useProjectId-DBc5lpoU.mjs.map +0 -1
  169. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +0 -294
  170. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +0 -1
  171. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +0 -19
  172. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +0 -1
  173. package/dist/client/utils/trpcErrors.d.ts +0 -13
@@ -1,67 +0,0 @@
1
- import { t as e } from "./storageProviders-CJ5rOh13.mjs";
2
- import { C as t, S as n, b as r, n as i, t as a, v as o, x as s } from "./objects-BudUAfWY.mjs";
3
- import { t as c } from "./useSetBreadcrumb-tn7lBaQV.mjs";
4
- import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
5
- import { useParams as f } from "@tanstack/react-router";
6
- import { Trans as p } from "@lingui/react";
7
- import { ErrorBoundary as m } from "react-error-boundary";
8
- //#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=component
9
- function h() {
10
- let { projectId: h, provider: g, containerName: _ } = f({
11
- from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
12
- select: (e) => ({
13
- projectId: e.projectId,
14
- provider: e.provider,
15
- containerName: e.containerName
16
- })
17
- });
18
- c(a.id, _);
19
- let { prefix: v, sortBy: y, sortDirection: b, search: x, view: S } = a.useSearch();
20
- return /*#__PURE__*/ d(l, { children: [
21
- g === e.CEPH && /*#__PURE__*/ u(o, { bucketName: _ }),
22
- g === e.SWIFT && /*#__PURE__*/ u(i, { containerName: _ }),
23
- /*#__PURE__*/ u("div", {
24
- className: g === e.SWIFT ? "pt-4" : void 0,
25
- children: h ? /*#__PURE__*/ u(m, {
26
- resetKeys: [
27
- h,
28
- g,
29
- _,
30
- v,
31
- y,
32
- b,
33
- x,
34
- S
35
- ],
36
- fallback: /*#__PURE__*/ u("div", {
37
- className: "p-4 text-center",
38
- children: /*#__PURE__*/ u(p, { id: "diFNkW" })
39
- }),
40
- children: (() => {
41
- switch (g) {
42
- case e.SWIFT: return /*#__PURE__*/ u(t, {
43
- provider: g,
44
- containerName: _
45
- });
46
- case e.CEPH: return u(S === "lifecycle-rules" ? r : S === "cors-rules" ? s : n, { bucketName: _ });
47
- default: return /*#__PURE__*/ u("div", {
48
- className: "p-4",
49
- children: /*#__PURE__*/ u(p, {
50
- id: "ubUrot",
51
- values: { containerName: _ }
52
- })
53
- });
54
- }
55
- })()
56
- }) : /*#__PURE__*/ u("div", {
57
- className: "p-4 text-center",
58
- children: /*#__PURE__*/ u(p, { id: "Z2fZGD" })
59
- })
60
- })
61
- ] });
62
- }
63
- var g = () => /*#__PURE__*/ u(h, {});
64
- //#endregion
65
- export { h as ObjectsDashboard, g as component };
66
-
67
- //# sourceMappingURL=objects-Dc7sKUr8.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"objects-Dc7sKUr8.mjs","names":["useParams","ErrorBoundary","Trans","SwiftObjects","CephObjects","CephCorsRules","CephLifecycleRules","BucketHeader","ContainerHeader","useSetBreadcrumb","STORAGE_PROVIDER","Route","ObjectsDashboard","projectId","provider","containerName","from","select","params","id","prefix","sortBy","sortDirection","search","view","useSearch","CEPH","SWIFT","undefined","SplitComponent","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=component"],"sourcesContent":["import {\n createFileRoute,\n useNavigate,\n useParams,\n type ErrorComponentProps,\n type NotFoundRouteComponent,\n} from \"@tanstack/react-router\"\nimport type { ReactNode } from \"react\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { isTRPCClientError } from \"@trpc/client\"\nimport { guardStorageRoute, type StorageNotFoundReason } from \"../../../../-components/utils/serviceAvailability\"\nimport { CONTAINER_NOT_FOUND, requireContainerExists } from \"../../../../-components/utils/containerExistence\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { CephCorsRules, CephLifecycleRules } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\nimport { ContainerHeader } from \"../../../../-components/Swift/Containers/ContainerHeader\"\nimport { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\nimport { StorageNotFound } from \"../../../../-components/StorageNotFound\"\nimport { STORAGE_PROVIDER } from \"@/client/utils/storageProviders\"\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, lifecycle-rules shows lifecycle 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\n// - lifecycleSortBy: active sort column for lifecycle rules tab (ID, Status, Expiration) — separate from objects sortBy\n// - lifecycleSortDirection: \"asc\" | \"desc\" for lifecycle rules — separate from objects sortDirection\n// - lifecycleSearch: search term for filtering lifecycle 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\", \"lifecycle-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 lifecycleSortBy: z.enum([\"ID\", \"Status\", \"Expiration\"]).optional().default(\"ID\"),\n lifecycleSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n lifecycleSearch: z.string().optional(),\n})\n\n/**\n * \"Back to Buckets\"/\"Back to Containers\" — the exit both boundaries below want. The list\n * is the one page that is certainly still there, so it beats `RouteIdLevelDefaultError`'s\n * default \"Go to Project Home\", which leaves storage altogether.\n *\n * Returns undefined when the params aren't readable, so the caller falls back to that\n * default rather than rendering a button that can't build a target.\n */\nfunction useBackToContainerList(): ReactNode {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId, provider, storageType } = useParams({ strict: false })\n\n if (!projectId || !provider || !storageType) return undefined\n\n return (\n <Button\n variant=\"primary\"\n onClick={() =>\n navigate({\n to: \"/projects/$projectId/storage/$provider/$storageType\",\n params: { projectId, provider, storageType },\n })\n }\n >\n {provider === STORAGE_PROVIDER.CEPH ? t`Back to Buckets` : t`Back to Containers`}\n </Button>\n )\n}\n\n/**\n * The route's single notFound boundary serves two unrelated 404s, so it dispatches on the\n * reason the throw carried:\n *\n * - the address is wrong (bad provider, non-canonical storage-type) → `StorageNotFound`,\n * whose action leads out of storage entirely, because no storage page here is valid;\n * - the address is fine but the container isn't there → `RouteIdLevelDefaultError`, whose\n * action leads back to the list, which is a page the user can actually use.\n *\n * (The router spreads the whole notFound error object into these props, so the reason\n * arrives nested under `data` — see StorageNotFound for the three files that establish it.)\n */\nfunction ObjectsNotFound({ data }: { data?: { reason?: StorageNotFoundReason | typeof CONTAINER_NOT_FOUND } }) {\n const { t } = useLingui()\n const { provider } = useParams({ strict: false })\n const backToList = useBackToContainerList()\n\n const reason = data?.reason\n\n if (reason !== CONTAINER_NOT_FOUND) {\n return <StorageNotFound data={reason ? { reason } : undefined} />\n }\n\n const isCeph = provider === STORAGE_PROVIDER.CEPH\n\n return (\n <RouteIdLevelDefaultError\n errorTitle={isCeph ? t`Bucket Not Found` : t`Container Not Found`}\n errorDescription={\n isCeph\n ? t`This bucket does not exist or is not accessible in this project.`\n : t`This container does not exist or is not accessible in this project.`\n }\n action={backToList}\n />\n )\n}\n\n/**\n * Route-level error boundary — for a request that failed, as opposed to a resource that\n * isn't there. Deliberately a boundary of its own: #1304 points one component at both, and\n * since that component hardcodes `code={404}` a 500 arrives labelled \"Resource Not Found\".\n * The split is in what the two say, not in which component they use — `code` is what lets\n * this one state the real status instead of inheriting that default.\n *\n * Catching here rather than letting it reach the root keeps everything the parent routes\n * render — shell, nav, the breadcrumb trail up to this page — on screen, and lets the\n * boundary reset when the user navigates.\n */\nfunction ObjectsError({ error }: ErrorComponentProps) {\n const { t } = useLingui()\n const backToList = useBackToContainerList()\n const trpcError = isTRPCClientError(error) ? error : undefined\n\n return (\n <RouteIdLevelDefaultError\n code={trpcError?.data?.httpStatus ?? null}\n errorTitle={t`Unable to Load Content`}\n errorDescription={trpcError?.message ?? t`An unexpected error occurred.`}\n action={backToList}\n />\n )\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 } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: ObjectsNotFound as NotFoundRouteComponent,\n errorComponent: ObjectsError,\n loader: async ({ context, params }) => {\n const { trpcClient } = context\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n const availableServices = (await trpcClient.auth.getAvailableServices.query()) ?? []\n const provider = guardStorageRoute(availableServices, params)\n return requireContainerExists(trpcClient, { ...params, provider })\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 useSetBreadcrumb(Route.id, containerName)\n\n const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n return (\n <>\n {provider === STORAGE_PROVIDER.CEPH && <BucketHeader bucketName={containerName} />}\n {provider === STORAGE_PROVIDER.SWIFT && <ContainerHeader containerName={containerName} />}\n {/* Ceph gets extra breathing room below its header from BucketHeader's own\n tabs block; Swift has no such block, so pad the content wrapper directly\n to avoid the overflow menu sitting too close to the toolbar below it. */}\n <div className={provider === STORAGE_PROVIDER.SWIFT ? \"pt-4\" : undefined}>\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 STORAGE_PROVIDER.SWIFT:\n return <SwiftObjects provider={provider} containerName={containerName} />\n case STORAGE_PROVIDER.CEPH:\n if (view === \"lifecycle-rules\") {\n return <CephLifecycleRules bucketName={containerName} />\n }\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":";;;;;;;;AAoLA,SAAgBY,IAAAA;CACd,IAAM,EAAEC,cAAWC,aAAUC,qBAAkBf,EAAU;EACvDgB,MAAM;EACNC,SAASC,OAAY;GACnBL,WAAWK,EAAOL;GAClBC,UAAUI,EAAOJ;GACjBC,eAAeG,EAAOH;EACxB;CACF,CAAA;CAEAN,EAAiBE,EAAMQ,IAAIJ,CAAAA;CAE3B,IAAM,EAAEK,WAAQC,WAAQC,kBAAeC,WAAQC,YAASb,EAAMc,UAAS;CAEvE,OACE,gBAAA,GAAA,EAAA,UAAA;EACGX,MAAaJ,EAAiBgB,QAAQ,gBAAC,GAAA,EAAa,YAAYX,EAAAA,CAAAA;EAChED,MAAaJ,EAAiBiB,SAAS,gBAAC,GAAA,EAA+BZ,iBAAAA,CAAAA;EAIxE,gBAAC,OAAA;GAAI,WAAWD,MAAaJ,EAAiBiB,QAAQ,SAASC,KAAAA;GAC5Df,UAAAA,IACC,gBAAC,GAAA;IACC,WAAW;KAACA;KAAWC;KAAUC;KAAeK;KAAQC;KAAQC;KAAeC;KAAQC;IAAK;IAC5F,UACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAIH,iBAAC;KACA,QAAQV,GAAR;MACE,KAAKJ,EAAiBiB,OACpB,OAAO,gBAAC,GAAA;OAAuBb;OAAyBC;;MAC1D,KAAKL,EAAiBgB,MAOpB,OALS,EADLF,MAAS,oBACH,IAENA,MAAS,eACH,IAEF,GALE,EAAmB,YAAYT,EAAAA,CAAAA;MAM3C,SACE,OACE,gBAAC,OAAA;OAAI,WAAU;OACb,UAAA,gBAAA,GAAA;;QAAiBA,QAAAA,EAAAA,iBAAAA;;;KAGzB;IACF,EAAA,CAAA;GAGF,CAAA,IAAA,gBAAC,OAAA;IAAI,WAAU;IACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;AAMZ;AAAC,IAAAc,UA3EU,gBAAC,GAAA,CAAA,CAAA"}
@@ -1,80 +0,0 @@
1
- import { t as e } from "./storageProviders-CJ5rOh13.mjs";
2
- import { C as t, S as n, b as r, n as i, t as a, v as o, x as s } from "./objects-BudUAfWY.mjs";
3
- import { t as c } from "./RouteIdLevelDefaultError-DPF_x2tG.mjs";
4
- import { t as l } from "./useSetBreadcrumb-tn7lBaQV.mjs";
5
- import { t as u } from "./objects-_g7nGIn5.mjs";
6
- import { t as d } from "./StorageNotFound-B-zVinVD.mjs";
7
- import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
8
- import { useParams as h } from "@tanstack/react-router";
9
- import { Trans as g, useLingui as _ } from "@lingui/react";
10
- import { ErrorBoundary as v } from "react-error-boundary";
11
- //#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=notFoundComponent
12
- function y({ data: t }) {
13
- let { i18n: n, _: r } = _(), { provider: i } = h({ strict: !1 }), a = u(), o = t?.reason;
14
- if (o !== "container-not-found") return /*#__PURE__*/ p(d, { data: o ? { reason: o } : void 0 });
15
- let s = i === e.CEPH;
16
- return /*#__PURE__*/ p(c, {
17
- errorTitle: s ? n._({ id: "uu0Tl6" }) : n._({ id: "HPV820" }),
18
- errorDescription: s ? n._({ id: "oFW0cA" }) : n._({ id: "geLBjg" }),
19
- action: a
20
- });
21
- }
22
- function b() {
23
- let { projectId: c, provider: u, containerName: d } = h({
24
- from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
25
- select: (e) => ({
26
- projectId: e.projectId,
27
- provider: e.provider,
28
- containerName: e.containerName
29
- })
30
- });
31
- l(a.id, d);
32
- let { prefix: _, sortBy: y, sortDirection: b, search: x, view: S } = a.useSearch();
33
- return /*#__PURE__*/ m(f, { children: [
34
- u === e.CEPH && /*#__PURE__*/ p(o, { bucketName: d }),
35
- u === e.SWIFT && /*#__PURE__*/ p(i, { containerName: d }),
36
- /*#__PURE__*/ p("div", {
37
- className: u === e.SWIFT ? "pt-4" : void 0,
38
- children: c ? /*#__PURE__*/ p(v, {
39
- resetKeys: [
40
- c,
41
- u,
42
- d,
43
- _,
44
- y,
45
- b,
46
- x,
47
- S
48
- ],
49
- fallback: /*#__PURE__*/ p("div", {
50
- className: "p-4 text-center",
51
- children: /*#__PURE__*/ p(g, { id: "diFNkW" })
52
- }),
53
- children: (() => {
54
- switch (u) {
55
- case e.SWIFT: return /*#__PURE__*/ p(t, {
56
- provider: u,
57
- containerName: d
58
- });
59
- case e.CEPH: return p(S === "lifecycle-rules" ? r : S === "cors-rules" ? s : n, { bucketName: d });
60
- default: return /*#__PURE__*/ p("div", {
61
- className: "p-4",
62
- children: /*#__PURE__*/ p(g, {
63
- id: "ubUrot",
64
- values: { containerName: d }
65
- })
66
- });
67
- }
68
- })()
69
- }) : /*#__PURE__*/ p("div", {
70
- className: "p-4 text-center",
71
- children: /*#__PURE__*/ p(g, { id: "Z2fZGD" })
72
- })
73
- })
74
- ] });
75
- }
76
- var x = y;
77
- //#endregion
78
- export { b as ObjectsDashboard, x as notFoundComponent };
79
-
80
- //# sourceMappingURL=objects-Dw7oeTq2.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"objects-Dw7oeTq2.mjs","names":["useParams","CONTAINER_NOT_FOUND","RouteIdLevelDefaultError","ErrorBoundary","Trans","useLingui","SwiftObjects","CephObjects","CephCorsRules","CephLifecycleRules","BucketHeader","ContainerHeader","useSetBreadcrumb","StorageNotFound","STORAGE_PROVIDER","ObjectsNotFound","data","reason","StorageNotFoundReason","t","provider","strict","backToList","useBackToContainerList","undefined","isCeph","CEPH","Route","ObjectsDashboard","projectId","containerName","from","select","params","id","prefix","sortBy","sortDirection","search","view","useSearch","SWIFT","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import {\n createFileRoute,\n useNavigate,\n useParams,\n type ErrorComponentProps,\n type NotFoundRouteComponent,\n} from \"@tanstack/react-router\"\nimport type { ReactNode } from \"react\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { isTRPCClientError } from \"@trpc/client\"\nimport { guardStorageRoute, type StorageNotFoundReason } from \"../../../../-components/utils/serviceAvailability\"\nimport { CONTAINER_NOT_FOUND, requireContainerExists } from \"../../../../-components/utils/containerExistence\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { CephCorsRules, CephLifecycleRules } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\nimport { ContainerHeader } from \"../../../../-components/Swift/Containers/ContainerHeader\"\nimport { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\nimport { StorageNotFound } from \"../../../../-components/StorageNotFound\"\nimport { STORAGE_PROVIDER } from \"@/client/utils/storageProviders\"\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, lifecycle-rules shows lifecycle 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\n// - lifecycleSortBy: active sort column for lifecycle rules tab (ID, Status, Expiration) — separate from objects sortBy\n// - lifecycleSortDirection: \"asc\" | \"desc\" for lifecycle rules — separate from objects sortDirection\n// - lifecycleSearch: search term for filtering lifecycle 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\", \"lifecycle-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 lifecycleSortBy: z.enum([\"ID\", \"Status\", \"Expiration\"]).optional().default(\"ID\"),\n lifecycleSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n lifecycleSearch: z.string().optional(),\n})\n\n/**\n * \"Back to Buckets\"/\"Back to Containers\" — the exit both boundaries below want. The list\n * is the one page that is certainly still there, so it beats `RouteIdLevelDefaultError`'s\n * default \"Go to Project Home\", which leaves storage altogether.\n *\n * Returns undefined when the params aren't readable, so the caller falls back to that\n * default rather than rendering a button that can't build a target.\n */\nfunction useBackToContainerList(): ReactNode {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId, provider, storageType } = useParams({ strict: false })\n\n if (!projectId || !provider || !storageType) return undefined\n\n return (\n <Button\n variant=\"primary\"\n onClick={() =>\n navigate({\n to: \"/projects/$projectId/storage/$provider/$storageType\",\n params: { projectId, provider, storageType },\n })\n }\n >\n {provider === STORAGE_PROVIDER.CEPH ? t`Back to Buckets` : t`Back to Containers`}\n </Button>\n )\n}\n\n/**\n * The route's single notFound boundary serves two unrelated 404s, so it dispatches on the\n * reason the throw carried:\n *\n * - the address is wrong (bad provider, non-canonical storage-type) → `StorageNotFound`,\n * whose action leads out of storage entirely, because no storage page here is valid;\n * - the address is fine but the container isn't there → `RouteIdLevelDefaultError`, whose\n * action leads back to the list, which is a page the user can actually use.\n *\n * (The router spreads the whole notFound error object into these props, so the reason\n * arrives nested under `data` — see StorageNotFound for the three files that establish it.)\n */\nfunction ObjectsNotFound({ data }: { data?: { reason?: StorageNotFoundReason | typeof CONTAINER_NOT_FOUND } }) {\n const { t } = useLingui()\n const { provider } = useParams({ strict: false })\n const backToList = useBackToContainerList()\n\n const reason = data?.reason\n\n if (reason !== CONTAINER_NOT_FOUND) {\n return <StorageNotFound data={reason ? { reason } : undefined} />\n }\n\n const isCeph = provider === STORAGE_PROVIDER.CEPH\n\n return (\n <RouteIdLevelDefaultError\n errorTitle={isCeph ? t`Bucket Not Found` : t`Container Not Found`}\n errorDescription={\n isCeph\n ? t`This bucket does not exist or is not accessible in this project.`\n : t`This container does not exist or is not accessible in this project.`\n }\n action={backToList}\n />\n )\n}\n\n/**\n * Route-level error boundary — for a request that failed, as opposed to a resource that\n * isn't there. Deliberately a boundary of its own: #1304 points one component at both, and\n * since that component hardcodes `code={404}` a 500 arrives labelled \"Resource Not Found\".\n * The split is in what the two say, not in which component they use — `code` is what lets\n * this one state the real status instead of inheriting that default.\n *\n * Catching here rather than letting it reach the root keeps everything the parent routes\n * render — shell, nav, the breadcrumb trail up to this page — on screen, and lets the\n * boundary reset when the user navigates.\n */\nfunction ObjectsError({ error }: ErrorComponentProps) {\n const { t } = useLingui()\n const backToList = useBackToContainerList()\n const trpcError = isTRPCClientError(error) ? error : undefined\n\n return (\n <RouteIdLevelDefaultError\n code={trpcError?.data?.httpStatus ?? null}\n errorTitle={t`Unable to Load Content`}\n errorDescription={trpcError?.message ?? t`An unexpected error occurred.`}\n action={backToList}\n />\n )\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 } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: ObjectsNotFound as NotFoundRouteComponent,\n errorComponent: ObjectsError,\n loader: async ({ context, params }) => {\n const { trpcClient } = context\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n const availableServices = (await trpcClient.auth.getAvailableServices.query()) ?? []\n const provider = guardStorageRoute(availableServices, params)\n return requireContainerExists(trpcClient, { ...params, provider })\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 useSetBreadcrumb(Route.id, containerName)\n\n const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n return (\n <>\n {provider === STORAGE_PROVIDER.CEPH && <BucketHeader bucketName={containerName} />}\n {provider === STORAGE_PROVIDER.SWIFT && <ContainerHeader containerName={containerName} />}\n {/* Ceph gets extra breathing room below its header from BucketHeader's own\n tabs block; Swift has no such block, so pad the content wrapper directly\n to avoid the overflow menu sitting too close to the toolbar below it. */}\n <div className={provider === STORAGE_PROVIDER.SWIFT ? \"pt-4\" : undefined}>\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 STORAGE_PROVIDER.SWIFT:\n return <SwiftObjects provider={provider} containerName={containerName} />\n case STORAGE_PROVIDER.CEPH:\n if (view === \"lifecycle-rules\") {\n return <CephLifecycleRules bucketName={containerName} />\n }\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":";;;;;;;;;;;AAkGA,SAASe,EAAgB,EAAEC,WAAkF;CAC3G,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQX,EAAAA,GACR,EAAEe,gBAAapB,EAAU,EAAEqB,QAAQ,GAAM,CAAA,GACzCC,IAAaC,EAAAA,GAEbN,IAASD,GAAMC;CAErB,IAAIA,MAAAA,uBACF,OAAO,gBAAC,GAAA,EAAgB,MAAMA,IAAS,EAAEA,UAAO,IAAIO,KAAAA,EAAAA,CAAAA;CAGtD,IAAMC,IAASL,MAAaN,EAAiBY;CAE7C,OACE,gBAAC,GAAA;EACC,YAAYD,IAASN,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,IAAqBA,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;EAC5C,kBACEM,IACIN,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,IACDA,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;EAEP,QAAQG;;AAGd;AA0DA,SAAgBM,IAAAA;CACd,IAAM,EAAEC,cAAWT,aAAUU,qBAAkB9B,EAAU;EACvD+B,MAAM;EACNC,SAASC,OAAY;GACnBJ,WAAWI,EAAOJ;GAClBT,UAAUa,EAAOb;GACjBU,eAAeG,EAAOH;EACxB;CACF,CAAA;CAEAlB,EAAiBe,EAAMO,IAAIJ,CAAAA;CAE3B,IAAM,EAAEK,WAAQC,WAAQC,kBAAeC,WAAQC,YAASZ,EAAMa,UAAS;CAEvE,OACE,gBAAA,GAAA,EAAA,UAAA;EACGpB,MAAaN,EAAiBY,QAAQ,gBAAC,GAAA,EAAa,YAAYI,EAAAA,CAAAA;EAChEV,MAAaN,EAAiB2B,SAAS,gBAAC,GAAA,EAA+BX,iBAAAA,CAAAA;EAIxE,gBAAC,OAAA;GAAI,WAAWV,MAAaN,EAAiB2B,QAAQ,SAASjB,KAAAA;GAC5DK,UAAAA,IACC,gBAAC,GAAA;IACC,WAAW;KAACA;KAAWT;KAAUU;KAAeK;KAAQC;KAAQC;KAAeC;KAAQC;IAAK;IAC5F,UACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAIH,iBAAC;KACA,QAAQnB,GAAR;MACE,KAAKN,EAAiB2B,OACpB,OAAO,gBAAC,GAAA;OAAuBrB;OAAyBU;;MAC1D,KAAKhB,EAAiBY,MAOpB,OALS,EADLa,MAAS,oBACH,IAENA,MAAS,eACH,IAEF,GALE,EAAmB,YAAYT,EAAAA,CAAAA;MAM3C,SACE,OACE,gBAAC,OAAA;OAAI,WAAU;OACb,UAAA,gBAAA,GAAA;;QAAiBA,QAAAA,EAAAA,iBAAAA;;;KAGzB;IACF,EAAA,CAAA;GAGF,CAAA,IAAA,gBAAC,OAAA;IAAI,WAAU;IACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;AAMZ;AAAC,IAAAY,IAzEoB3B"}
@@ -1,25 +0,0 @@
1
- import { i as e } from "./build-WuxXRAqf.mjs";
2
- import { t } from "./storageProviders-CJ5rOh13.mjs";
3
- import { jsx as n } from "react/jsx-runtime";
4
- import { useNavigate as r, useParams as i } from "@tanstack/react-router";
5
- import { useLingui as a } from "@lingui/react";
6
- //#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-shared=1
7
- function o() {
8
- let { i18n: o, _: s } = a(), c = r(), { projectId: l, provider: u, storageType: d } = i({ strict: !1 });
9
- if (!(!l || !u || !d)) return /*#__PURE__*/ n(e, {
10
- variant: "primary",
11
- onClick: () => c({
12
- to: "/projects/$projectId/storage/$provider/$storageType",
13
- params: {
14
- projectId: l,
15
- provider: u,
16
- storageType: d
17
- }
18
- }),
19
- children: u === t.CEPH ? o._({ id: "Rzahyj" }) : o._({ id: "6nrGLS" })
20
- });
21
- }
22
- //#endregion
23
- export { o as t };
24
-
25
- //# sourceMappingURL=objects-_g7nGIn5.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"objects-_g7nGIn5.mjs","names":["useNavigate","useParams","Button","useLingui","STORAGE_PROVIDER","useBackToContainerList","ReactNode","t","navigate","projectId","provider","storageType","strict","undefined","to","params","CEPH"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-shared=1"],"sourcesContent":["import {\n createFileRoute,\n useNavigate,\n useParams,\n type ErrorComponentProps,\n type NotFoundRouteComponent,\n} from \"@tanstack/react-router\"\nimport type { ReactNode } from \"react\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { isTRPCClientError } from \"@trpc/client\"\nimport { guardStorageRoute, type StorageNotFoundReason } from \"../../../../-components/utils/serviceAvailability\"\nimport { CONTAINER_NOT_FOUND, requireContainerExists } from \"../../../../-components/utils/containerExistence\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { CephCorsRules, CephLifecycleRules } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\nimport { ContainerHeader } from \"../../../../-components/Swift/Containers/ContainerHeader\"\nimport { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\nimport { StorageNotFound } from \"../../../../-components/StorageNotFound\"\nimport { STORAGE_PROVIDER } from \"@/client/utils/storageProviders\"\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, lifecycle-rules shows lifecycle 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\n// - lifecycleSortBy: active sort column for lifecycle rules tab (ID, Status, Expiration) — separate from objects sortBy\n// - lifecycleSortDirection: \"asc\" | \"desc\" for lifecycle rules — separate from objects sortDirection\n// - lifecycleSearch: search term for filtering lifecycle 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\", \"lifecycle-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 lifecycleSortBy: z.enum([\"ID\", \"Status\", \"Expiration\"]).optional().default(\"ID\"),\n lifecycleSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n lifecycleSearch: z.string().optional(),\n})\n\n/**\n * \"Back to Buckets\"/\"Back to Containers\" — the exit both boundaries below want. The list\n * is the one page that is certainly still there, so it beats `RouteIdLevelDefaultError`'s\n * default \"Go to Project Home\", which leaves storage altogether.\n *\n * Returns undefined when the params aren't readable, so the caller falls back to that\n * default rather than rendering a button that can't build a target.\n */\nfunction useBackToContainerList(): ReactNode {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId, provider, storageType } = useParams({ strict: false })\n\n if (!projectId || !provider || !storageType) return undefined\n\n return (\n <Button\n variant=\"primary\"\n onClick={() =>\n navigate({\n to: \"/projects/$projectId/storage/$provider/$storageType\",\n params: { projectId, provider, storageType },\n })\n }\n >\n {provider === STORAGE_PROVIDER.CEPH ? t`Back to Buckets` : t`Back to Containers`}\n </Button>\n )\n}\n\n/**\n * The route's single notFound boundary serves two unrelated 404s, so it dispatches on the\n * reason the throw carried:\n *\n * - the address is wrong (bad provider, non-canonical storage-type) → `StorageNotFound`,\n * whose action leads out of storage entirely, because no storage page here is valid;\n * - the address is fine but the container isn't there → `RouteIdLevelDefaultError`, whose\n * action leads back to the list, which is a page the user can actually use.\n *\n * (The router spreads the whole notFound error object into these props, so the reason\n * arrives nested under `data` — see StorageNotFound for the three files that establish it.)\n */\nfunction ObjectsNotFound({ data }: { data?: { reason?: StorageNotFoundReason | typeof CONTAINER_NOT_FOUND } }) {\n const { t } = useLingui()\n const { provider } = useParams({ strict: false })\n const backToList = useBackToContainerList()\n\n const reason = data?.reason\n\n if (reason !== CONTAINER_NOT_FOUND) {\n return <StorageNotFound data={reason ? { reason } : undefined} />\n }\n\n const isCeph = provider === STORAGE_PROVIDER.CEPH\n\n return (\n <RouteIdLevelDefaultError\n errorTitle={isCeph ? t`Bucket Not Found` : t`Container Not Found`}\n errorDescription={\n isCeph\n ? t`This bucket does not exist or is not accessible in this project.`\n : t`This container does not exist or is not accessible in this project.`\n }\n action={backToList}\n />\n )\n}\n\n/**\n * Route-level error boundary — for a request that failed, as opposed to a resource that\n * isn't there. Deliberately a boundary of its own: #1304 points one component at both, and\n * since that component hardcodes `code={404}` a 500 arrives labelled \"Resource Not Found\".\n * The split is in what the two say, not in which component they use — `code` is what lets\n * this one state the real status instead of inheriting that default.\n *\n * Catching here rather than letting it reach the root keeps everything the parent routes\n * render — shell, nav, the breadcrumb trail up to this page — on screen, and lets the\n * boundary reset when the user navigates.\n */\nfunction ObjectsError({ error }: ErrorComponentProps) {\n const { t } = useLingui()\n const backToList = useBackToContainerList()\n const trpcError = isTRPCClientError(error) ? error : undefined\n\n return (\n <RouteIdLevelDefaultError\n code={trpcError?.data?.httpStatus ?? null}\n errorTitle={t`Unable to Load Content`}\n errorDescription={trpcError?.message ?? t`An unexpected error occurred.`}\n action={backToList}\n />\n )\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 } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: ObjectsNotFound as NotFoundRouteComponent,\n errorComponent: ObjectsError,\n loader: async ({ context, params }) => {\n const { trpcClient } = context\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n const availableServices = (await trpcClient.auth.getAvailableServices.query()) ?? []\n const provider = guardStorageRoute(availableServices, params)\n return requireContainerExists(trpcClient, { ...params, provider })\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 useSetBreadcrumb(Route.id, containerName)\n\n const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n return (\n <>\n {provider === STORAGE_PROVIDER.CEPH && <BucketHeader bucketName={containerName} />}\n {provider === STORAGE_PROVIDER.SWIFT && <ContainerHeader containerName={containerName} />}\n {/* Ceph gets extra breathing room below its header from BucketHeader's own\n tabs block; Swift has no such block, so pad the content wrapper directly\n to avoid the overflow menu sitting too close to the toolbar below it. */}\n <div className={provider === STORAGE_PROVIDER.SWIFT ? \"pt-4\" : undefined}>\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 STORAGE_PROVIDER.SWIFT:\n return <SwiftObjects provider={provider} containerName={containerName} />\n case STORAGE_PROVIDER.CEPH:\n if (view === \"lifecycle-rules\") {\n return <CephLifecycleRules bucketName={containerName} />\n }\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":";;;;;;AAgEA,SAASK,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQF,EAAAA,GACRK,IAAWR,EAAAA,GACX,EAAES,cAAWC,aAAUC,mBAAgBV,EAAU,EAAEW,QAAQ,GAAM,CAAA;CAEnE,OAACH,KAAa,CAACC,KAAY,CAACC,IAEhC,OACE,gBAAC,GAAA;EACC,SAAQ;EACR,eACEH,EAAS;GACPM,IAAI;GACJC,QAAQ;IAAEN;IAAWC;IAAUC;GAAY;EAC7C,CAAA;EAGDD,UAAAA,MAAaN,EAAiBY,OAAOT,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,IAAoBA,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;;AAGlE"}
@@ -1,78 +0,0 @@
1
- import { t as e } from "./storageProviders-CJ5rOh13.mjs";
2
- import { C as t, S as n, b as r, n as i, t as a, v as o, x as s } from "./objects-BudUAfWY.mjs";
3
- import { t as c } from "./RouteIdLevelDefaultError-DPF_x2tG.mjs";
4
- import { t as l } from "./useSetBreadcrumb-tn7lBaQV.mjs";
5
- import { t as u } from "./objects-_g7nGIn5.mjs";
6
- import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
7
- import { useParams as m } from "@tanstack/react-router";
8
- import { isTRPCClientError as h } from "@trpc/client";
9
- import { Trans as g, useLingui as _ } from "@lingui/react";
10
- import { ErrorBoundary as v } from "react-error-boundary";
11
- //#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=errorComponent
12
- function y({ error: e }) {
13
- let { i18n: t, _: n } = _(), r = u(), i = h(e) ? e : void 0;
14
- return /*#__PURE__*/ f(c, {
15
- code: i?.data?.httpStatus ?? null,
16
- errorTitle: t._({ id: "Gfx1qQ" }),
17
- errorDescription: i?.message ?? t._({ id: "W5A0Ly" }),
18
- action: r
19
- });
20
- }
21
- function b() {
22
- let { projectId: c, provider: u, containerName: h } = m({
23
- from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
24
- select: (e) => ({
25
- projectId: e.projectId,
26
- provider: e.provider,
27
- containerName: e.containerName
28
- })
29
- });
30
- l(a.id, h);
31
- let { prefix: _, sortBy: y, sortDirection: b, search: x, view: S } = a.useSearch();
32
- return /*#__PURE__*/ p(d, { children: [
33
- u === e.CEPH && /*#__PURE__*/ f(o, { bucketName: h }),
34
- u === e.SWIFT && /*#__PURE__*/ f(i, { containerName: h }),
35
- /*#__PURE__*/ f("div", {
36
- className: u === e.SWIFT ? "pt-4" : void 0,
37
- children: c ? /*#__PURE__*/ f(v, {
38
- resetKeys: [
39
- c,
40
- u,
41
- h,
42
- _,
43
- y,
44
- b,
45
- x,
46
- S
47
- ],
48
- fallback: /*#__PURE__*/ f("div", {
49
- className: "p-4 text-center",
50
- children: /*#__PURE__*/ f(g, { id: "diFNkW" })
51
- }),
52
- children: (() => {
53
- switch (u) {
54
- case e.SWIFT: return /*#__PURE__*/ f(t, {
55
- provider: u,
56
- containerName: h
57
- });
58
- case e.CEPH: return f(S === "lifecycle-rules" ? r : S === "cors-rules" ? s : n, { bucketName: h });
59
- default: return /*#__PURE__*/ f("div", {
60
- className: "p-4",
61
- children: /*#__PURE__*/ f(g, {
62
- id: "ubUrot",
63
- values: { containerName: h }
64
- })
65
- });
66
- }
67
- })()
68
- }) : /*#__PURE__*/ f("div", {
69
- className: "p-4 text-center",
70
- children: /*#__PURE__*/ f(g, { id: "Z2fZGD" })
71
- })
72
- })
73
- ] });
74
- }
75
- //#endregion
76
- export { b as ObjectsDashboard, y as errorComponent };
77
-
78
- //# sourceMappingURL=objects-eBxvY6_n.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"objects-eBxvY6_n.mjs","names":["useParams","isTRPCClientError","RouteIdLevelDefaultError","ErrorBoundary","Trans","useLingui","SwiftObjects","CephObjects","CephCorsRules","CephLifecycleRules","BucketHeader","ContainerHeader","useSetBreadcrumb","STORAGE_PROVIDER","ObjectsError","error","ErrorComponentProps","t","backToList","useBackToContainerList","trpcError","undefined","data","httpStatus","message","Route","ObjectsDashboard","projectId","provider","containerName","from","select","params","id","prefix","sortBy","sortDirection","search","view","useSearch","CEPH","SWIFT","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import {\n createFileRoute,\n useNavigate,\n useParams,\n type ErrorComponentProps,\n type NotFoundRouteComponent,\n} from \"@tanstack/react-router\"\nimport type { ReactNode } from \"react\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { isTRPCClientError } from \"@trpc/client\"\nimport { guardStorageRoute, type StorageNotFoundReason } from \"../../../../-components/utils/serviceAvailability\"\nimport { CONTAINER_NOT_FOUND, requireContainerExists } from \"../../../../-components/utils/containerExistence\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { CephCorsRules, CephLifecycleRules } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\nimport { ContainerHeader } from \"../../../../-components/Swift/Containers/ContainerHeader\"\nimport { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\nimport { StorageNotFound } from \"../../../../-components/StorageNotFound\"\nimport { STORAGE_PROVIDER } from \"@/client/utils/storageProviders\"\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, lifecycle-rules shows lifecycle 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\n// - lifecycleSortBy: active sort column for lifecycle rules tab (ID, Status, Expiration) — separate from objects sortBy\n// - lifecycleSortDirection: \"asc\" | \"desc\" for lifecycle rules — separate from objects sortDirection\n// - lifecycleSearch: search term for filtering lifecycle 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\", \"lifecycle-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 lifecycleSortBy: z.enum([\"ID\", \"Status\", \"Expiration\"]).optional().default(\"ID\"),\n lifecycleSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n lifecycleSearch: z.string().optional(),\n})\n\n/**\n * \"Back to Buckets\"/\"Back to Containers\" — the exit both boundaries below want. The list\n * is the one page that is certainly still there, so it beats `RouteIdLevelDefaultError`'s\n * default \"Go to Project Home\", which leaves storage altogether.\n *\n * Returns undefined when the params aren't readable, so the caller falls back to that\n * default rather than rendering a button that can't build a target.\n */\nfunction useBackToContainerList(): ReactNode {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId, provider, storageType } = useParams({ strict: false })\n\n if (!projectId || !provider || !storageType) return undefined\n\n return (\n <Button\n variant=\"primary\"\n onClick={() =>\n navigate({\n to: \"/projects/$projectId/storage/$provider/$storageType\",\n params: { projectId, provider, storageType },\n })\n }\n >\n {provider === STORAGE_PROVIDER.CEPH ? t`Back to Buckets` : t`Back to Containers`}\n </Button>\n )\n}\n\n/**\n * The route's single notFound boundary serves two unrelated 404s, so it dispatches on the\n * reason the throw carried:\n *\n * - the address is wrong (bad provider, non-canonical storage-type) → `StorageNotFound`,\n * whose action leads out of storage entirely, because no storage page here is valid;\n * - the address is fine but the container isn't there → `RouteIdLevelDefaultError`, whose\n * action leads back to the list, which is a page the user can actually use.\n *\n * (The router spreads the whole notFound error object into these props, so the reason\n * arrives nested under `data` — see StorageNotFound for the three files that establish it.)\n */\nfunction ObjectsNotFound({ data }: { data?: { reason?: StorageNotFoundReason | typeof CONTAINER_NOT_FOUND } }) {\n const { t } = useLingui()\n const { provider } = useParams({ strict: false })\n const backToList = useBackToContainerList()\n\n const reason = data?.reason\n\n if (reason !== CONTAINER_NOT_FOUND) {\n return <StorageNotFound data={reason ? { reason } : undefined} />\n }\n\n const isCeph = provider === STORAGE_PROVIDER.CEPH\n\n return (\n <RouteIdLevelDefaultError\n errorTitle={isCeph ? t`Bucket Not Found` : t`Container Not Found`}\n errorDescription={\n isCeph\n ? t`This bucket does not exist or is not accessible in this project.`\n : t`This container does not exist or is not accessible in this project.`\n }\n action={backToList}\n />\n )\n}\n\n/**\n * Route-level error boundary — for a request that failed, as opposed to a resource that\n * isn't there. Deliberately a boundary of its own: #1304 points one component at both, and\n * since that component hardcodes `code={404}` a 500 arrives labelled \"Resource Not Found\".\n * The split is in what the two say, not in which component they use — `code` is what lets\n * this one state the real status instead of inheriting that default.\n *\n * Catching here rather than letting it reach the root keeps everything the parent routes\n * render — shell, nav, the breadcrumb trail up to this page — on screen, and lets the\n * boundary reset when the user navigates.\n */\nfunction ObjectsError({ error }: ErrorComponentProps) {\n const { t } = useLingui()\n const backToList = useBackToContainerList()\n const trpcError = isTRPCClientError(error) ? error : undefined\n\n return (\n <RouteIdLevelDefaultError\n code={trpcError?.data?.httpStatus ?? null}\n errorTitle={t`Unable to Load Content`}\n errorDescription={trpcError?.message ?? t`An unexpected error occurred.`}\n action={backToList}\n />\n )\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 } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: ObjectsNotFound as NotFoundRouteComponent,\n errorComponent: ObjectsError,\n loader: async ({ context, params }) => {\n const { trpcClient } = context\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n const availableServices = (await trpcClient.auth.getAvailableServices.query()) ?? []\n const provider = guardStorageRoute(availableServices, params)\n return requireContainerExists(trpcClient, { ...params, provider })\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 useSetBreadcrumb(Route.id, containerName)\n\n const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n return (\n <>\n {provider === STORAGE_PROVIDER.CEPH && <BucketHeader bucketName={containerName} />}\n {provider === STORAGE_PROVIDER.SWIFT && <ContainerHeader containerName={containerName} />}\n {/* Ceph gets extra breathing room below its header from BucketHeader's own\n tabs block; Swift has no such block, so pad the content wrapper directly\n to avoid the overflow menu sitting too close to the toolbar below it. */}\n <div className={provider === STORAGE_PROVIDER.SWIFT ? \"pt-4\" : undefined}>\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 STORAGE_PROVIDER.SWIFT:\n return <SwiftObjects provider={provider} containerName={containerName} />\n case STORAGE_PROVIDER.CEPH:\n if (view === \"lifecycle-rules\") {\n return <CephLifecycleRules bucketName={containerName} />\n }\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":";;;;;;;;;;;AAuIA,SAASc,EAAa,EAAEC,YAA4B;CAClD,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQV,EAAAA,GACRa,IAAaC,EAAAA,GACbC,IAAYnB,EAAkBc,CAAAA,IAASA,IAAQM,KAAAA;CAErD,OACE,gBAAC,GAAA;EACC,MAAMD,GAAWE,MAAMC,cAAc;EACrC,YAAYN,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;EACb,kBAAkBG,GAAWI,WAAWP,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;EACzC,QAAQC;;AAGd;AAgCA,SAAgBQ,IAAAA;CACd,IAAM,EAAEC,cAAWC,aAAUC,qBAAkB7B,EAAU;EACvD8B,MAAM;EACNC,SAASC,OAAY;GACnBL,WAAWK,EAAOL;GAClBC,UAAUI,EAAOJ;GACjBC,eAAeG,EAAOH;EACxB;CACF,CAAA;CAEAjB,EAAiBa,EAAMQ,IAAIJ,CAAAA;CAE3B,IAAM,EAAEK,WAAQC,WAAQC,kBAAeC,WAAQC,YAASb,EAAMc,UAAS;CAEvE,OACE,gBAAA,GAAA,EAAA,UAAA;EACGX,MAAaf,EAAiB2B,QAAQ,gBAAC,GAAA,EAAa,YAAYX,EAAAA,CAAAA;EAChED,MAAaf,EAAiB4B,SAAS,gBAAC,GAAA,EAA+BZ,iBAAAA,CAAAA;EAIxE,gBAAC,OAAA;GAAI,WAAWD,MAAaf,EAAiB4B,QAAQ,SAASpB,KAAAA;GAC5DM,UAAAA,IACC,gBAAC,GAAA;IACC,WAAW;KAACA;KAAWC;KAAUC;KAAeK;KAAQC;KAAQC;KAAeC;KAAQC;IAAK;IAC5F,UACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAIH,iBAAC;KACA,QAAQV,GAAR;MACE,KAAKf,EAAiB4B,OACpB,OAAO,gBAAC,GAAA;OAAuBb;OAAyBC;;MAC1D,KAAKhB,EAAiB2B,MAOpB,OALS,EADLF,MAAS,oBACH,IAENA,MAAS,eACH,IAEF,GALE,EAAmB,YAAYT,EAAAA,CAAAA;MAM3C,SACE,OACE,gBAAC,OAAA;OAAI,WAAU;OACb,UAAA,gBAAA,GAAA;;QAAiBA,QAAAA,EAAAA,iBAAAA;;;KAGzB;IACF,EAAA,CAAA;GAGF,CAAA,IAAA,gBAAC,OAAA;IAAI,WAAU;IACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;AAMZ"}
@@ -1,7 +0,0 @@
1
- import { jsx as e } from "react/jsx-runtime";
2
- //#region src/client/routes/_auth/projects/index.tsx?tsr-split=notFoundComponent
3
- var t = () => /*#__PURE__*/ e("p", { children: "Projects not found" });
4
- //#endregion
5
- export { t as notFoundComponent };
6
-
7
- //# sourceMappingURL=projects-yiK0HGSA.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects-yiK0HGSA.mjs","names":["ProjectsContentProps","searchTerm","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Suspense } from \"react\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { createFileRoute, useRouteContext } from \"@tanstack/react-router\"\nimport { ProjectsOverviewNavBar } from \"@/client/routes/_auth/projects/-components/ProjectOverviewNavBar\"\nimport { ProjectCardView } from \"@/client/routes/_auth/projects/-components/ProjectCardView\"\nimport { RouteError } from \"@/client/components/Errors/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading, Status } from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\nimport { Slot } from \"@/client/components/Slot\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n staticData: {\n analytics: {\n name: \"projects.list\",\n },\n } satisfies RouteInfo,\n component: ProjectsOverview,\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n})\n\ninterface ProjectsContentProps {\n searchTerm: string\n}\n\nfunction ProjectsContent({ searchTerm }: ProjectsContentProps) {\n const [projects] = trpcReact.project.listProjectsWithSearch.useSuspenseQuery({\n searchTerm: searchTerm.trim() || undefined,\n })\n\n return <ProjectCardView projects={projects} />\n}\n\nexport function ProjectsOverview() {\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n const { slots } = useRouteContext({ strict: false })\n const { t } = useLingui()\n\n const handleSearch = (value: string) => {\n navigate({ search: (prev) => ({ ...prev, search: value || undefined }), replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n {slots?.projectsBanner && (\n <ErrorBoundary fallbackRender={() => null}>\n <Suspense fallback={null}>\n <Slot component={slots.projectsBanner} useShadowDOM={false} />\n </Suspense>\n </ErrorBoundary>\n )}\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n )}\n >\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <Suspense fallback={<Status status=\"progress\" title={t`Loading...`} />}>\n <ProjectsContent searchTerm={search} />\n </Suspense>\n </div>\n </ErrorBoundary>\n </Container>\n )\n}\n"],"mappings":";;AAiCC,IAAAE,UAPU,gBAAC,KAAA,EAAE,UAAA,qBAAA,CAAA"}
@@ -1,19 +0,0 @@
1
- import { z as e } from "zod";
2
- //#region src/client/routes/routeInfo.ts
3
- var t = e.object({
4
- text: e.custom().optional(),
5
- to: e.string().optional(),
6
- icon: e.string().optional()
7
- }), n = e.object({ name: e.string() }), r = e.object({
8
- section: e.string().optional(),
9
- service: e.string().optional(),
10
- crumb: t.optional(),
11
- analytics: n.optional()
12
- });
13
- function i(e) {
14
- return r.safeParse(e).success;
15
- }
16
- //#endregion
17
- export { i as t };
18
-
19
- //# sourceMappingURL=routeInfo-DP3v74Wg.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routeInfo-DP3v74Wg.mjs","names":["z","CrumbSchema","object","text","custom","optional","to","string","icon","AnalyticsSchema","name","RouteInfoSchema","section","service","crumb","analytics","isRouteInfo","data","safeParse","success"],"sources":["../../src/client/routes/routeInfo.ts"],"sourcesContent":["import { z } from \"zod\"\nimport type { MessageDescriptor } from \"@lingui/core\"\n\nconst CrumbSchema = z.object({\n text: z.custom<MessageDescriptor | string>().optional(),\n to: z.string().optional(),\n icon: z.string().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 crumb: 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":";;AAGA,IAAMC,IAAcD,EAAEE,OAAO;CAC3BC,MAAMH,EAAEI,OAAM,CAAA,CAA+BC,SAAQ;CACrDC,IAAIN,EAAEO,OAAM,CAAA,CAAGF,SAAQ;CACvBG,MAAMR,EAAEO,OAAM,CAAA,CAAGF,SAAQ;AAC3B,CAAA,GAEMI,IAAkBT,EAAEE,OAAO,EAC/BQ,MAAMV,EAAEO,OAAM,EAChB,CAAA,GAEMI,IAAkBX,EAAEE,OAAO;CAC/BU,SAASZ,EAAEO,OAAM,CAAA,CAAGF,SAAQ;CAC5BQ,SAASb,EAAEO,OAAM,CAAA,CAAGF,SAAQ;CAC5BS,OAAOb,EAAYI,SAAQ;CAC3BU,WAAWN,EAAgBJ,SAAQ;AACrC,CAAA;AAMA,SAAgBW,EAAYC,GAAa;CACvC,OAAON,EAAgBO,UAAUD,CAAAA,CAAAA,CAAME;AACzC"}
@@ -1,10 +0,0 @@
1
- import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
2
- import { z as n } from "zod";
3
- var r = e("/")({
4
- validateSearch: n.object({ redirect: n.string().optional().catch("") }),
5
- component: t(() => import("./routes-xofA3ksU.mjs"), "component")
6
- });
7
- //#endregion
8
- export { r as t };
9
-
10
- //# sourceMappingURL=routes-CJj7SR_K.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes-CJj7SR_K.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 { Status } 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\"\nimport { useLingui } from \"@lingui/react/macro\"\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 { t } = useLingui()\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 <Status status=\"progress\" title={t`Loading...`} />\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":";;AAaA,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"}
@@ -1,110 +0,0 @@
1
- import { L as e, at as t, h as n, i as r, m as i, rt as a } from "./build-WuxXRAqf.mjs";
2
- import { n as o } from "./AuthProvider-CVSAwW9f.mjs";
3
- import { t as s } from "./Slot-CWb612-_.mjs";
4
- import { t as c } from "./routes-CJj7SR_K.mjs";
5
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
- import { useEffect as d } from "react";
7
- import { useNavigate as f } from "@tanstack/react-router";
8
- import { Trans as p, useLingui as m } from "@lingui/react";
9
- //#region src/client/components/Auth/LoginForm.tsx
10
- function h() {
11
- let { isLoading: a, error: s, login: c } = o();
12
- return /*#__PURE__*/ l("div", {
13
- className: "mt-8 flex justify-center",
14
- children: /*#__PURE__*/ u("div", {
15
- className: "border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg",
16
- children: [
17
- /*#__PURE__*/ l(t, {
18
- className: "text-center",
19
- children: /*#__PURE__*/ l(p, { id: "MDQl/K" })
20
- }),
21
- /*#__PURE__*/ l("p", {
22
- className: "mb-6 text-center",
23
- children: /*#__PURE__*/ l(p, { id: "N5vGcw" })
24
- }),
25
- /*#__PURE__*/ u("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
- s && /*#__PURE__*/ l(e, {
38
- text: s,
39
- variant: "error"
40
- }),
41
- /*#__PURE__*/ l(n, { children: /*#__PURE__*/ l(i, {
42
- id: "domain",
43
- name: "domain",
44
- label: "Domain",
45
- autoComplete: "domain",
46
- required: !0
47
- }) }),
48
- /*#__PURE__*/ l(n, { children: /*#__PURE__*/ l(i, {
49
- id: "user",
50
- name: "user",
51
- label: "User",
52
- autoComplete: "user",
53
- required: !0
54
- }) }),
55
- /*#__PURE__*/ l(n, { children: /*#__PURE__*/ l(i, {
56
- id: "password",
57
- name: "password",
58
- type: "password",
59
- label: "Password",
60
- autoComplete: "password",
61
- required: !0
62
- }) }),
63
- /*#__PURE__*/ l(r, {
64
- type: "submit",
65
- variant: "primary",
66
- className: "mt-2 w-full",
67
- disabled: a,
68
- children: a ? /*#__PURE__*/ l(p, { id: "Z3FXyt" }) : /*#__PURE__*/ l(p, { 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 { i18n: e, _: t } = m(), { isLoading: n, isAuthenticated: r } = o(), { slots: i } = c.useRouteContext(), { redirect: u } = c.useSearch(), p = f();
83
- return d(() => {
84
- if (r && !n) {
85
- let e = g(u) ? u : "/projects";
86
- p({
87
- to: e,
88
- replace: !0
89
- });
90
- }
91
- }, [
92
- r,
93
- n,
94
- p,
95
- u
96
- ]), n ? /*#__PURE__*/ l(a, {
97
- status: "progress",
98
- title: e._({ id: "Z3FXyt" })
99
- }) : i?.login && !r ? /*#__PURE__*/ l("div", {
100
- className: "mt-8 flex justify-center",
101
- children: /*#__PURE__*/ l(s, {
102
- component: i.login,
103
- useShadowDOM: !1
104
- })
105
- }) : r ? null : /*#__PURE__*/ l(h, {});
106
- }
107
- //#endregion
108
- export { _ as component };
109
-
110
- //# sourceMappingURL=routes-xofA3ksU.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes-xofA3ksU.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","Status","useEffect","LoginForm","Slot","useAuth","useLingui","isSafeRedirect","path","startsWith","Route","LandingPage","t","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 { Status } 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\"\nimport { useLingui } from \"@lingui/react/macro\"\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 { t } = useLingui()\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 <Status status=\"progress\" title={t`Loading...`} />\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;;;AC7CA,SAASmC,EAAeC,GAAa;CACnC,OAAO,OAAOA,KAAS,YAAYA,EAAKC,WAAW,GAAA,KAAQ,CAACD,EAAKC,WAAW,IAAA;AAC9E;AASA,SAASE,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQL,EAAAA,GACR,EAAEO,cAAWC,uBAAoBT,EAAAA,GACjC,EAAEU,aAAUL,EAAMM,gBAAe,GACjC,EAAEC,UAAUC,MAAmBR,EAAMS,UAAS,GAC9CC,IAAWpB,EAAAA;CA2BjB,OAxBAE,QAAU;EACR,IAAIY,KAAmB,CAACD,GAAW;GACjC,IAAMQ,IAASd,EAAeW,CAAAA,IAAkBA,IAAiB;GACjEE,EAAS;IAAEE,IAAID;IAAQE,SAAS;GAAK,CAAA;EACvC;CACF,GAAG;EAACT;EAAiBD;EAAWO;EAAUF;CAAe,CAAA,GAErDL,IACK,gBAAC,GAAA;EAAO,QAAO;EAAW,OAAOD,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;MAGvCG,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"}