@cobaltcore-dev/aurora 0.3.1 → 0.5.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 (168) hide show
  1. package/README.md +73 -77
  2. package/dist/client/AuroraApp.d.ts +15 -0
  3. package/dist/client/{AuthProvider-D-5Jpa6F.mjs → AuthProvider-Co4d0WzB.mjs} +3 -3
  4. package/dist/client/{AuthProvider-D-5Jpa6F.mjs.map → AuthProvider-Co4d0WzB.mjs.map} +1 -1
  5. package/dist/client/{ContentHeader-BXZoN3B9.mjs → ContentHeader-xQVhO2yT.mjs} +20 -20
  6. package/dist/client/{ContentHeader-BXZoN3B9.mjs.map → ContentHeader-xQVhO2yT.mjs.map} +1 -1
  7. package/dist/client/{DeleteFlavorModal-BusYn32r.mjs → DeleteFlavorModal-CHTUZ3YV.mjs} +211 -202
  8. package/dist/client/DeleteFlavorModal-CHTUZ3YV.mjs.map +1 -0
  9. package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs → EditSecurityGroupModal-CWHHx2Xk.mjs} +22 -22
  10. package/dist/client/{EditSecurityGroupModal-Dl6m7wUe.mjs.map → EditSecurityGroupModal-CWHHx2Xk.mjs.map} +1 -1
  11. package/dist/client/{FiltersInput-BgNaHFBt.mjs → FiltersInput-UKJpNFdr.mjs} +11 -11
  12. package/dist/client/FiltersInput-UKJpNFdr.mjs.map +1 -0
  13. package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs → FloatingIpActionModals-caXn6bYo.mjs} +54 -54
  14. package/dist/client/{FloatingIpActionModals-By2hXR9m.mjs.map → FloatingIpActionModals-caXn6bYo.mjs.map} +1 -1
  15. package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs → ImageToastNotifications-BWimIzu_.mjs} +227 -227
  16. package/dist/client/{ImageToastNotifications-fHI8jB2j.mjs.map → ImageToastNotifications-BWimIzu_.mjs.map} +1 -1
  17. package/dist/client/{RouteError-pDEWC_k7.mjs → RouteError-CUj_m3gu.mjs} +6 -6
  18. package/dist/client/{RouteError-pDEWC_k7.mjs.map → RouteError-CUj_m3gu.mjs.map} +1 -1
  19. package/dist/client/{SortInput-DXWSqSny.mjs → SortInput-GQlQBlAj.mjs} +6 -6
  20. package/dist/client/{SortInput-DXWSqSny.mjs.map → SortInput-GQlQBlAj.mjs.map} +1 -1
  21. package/dist/client/{_auth-CJj1Cnbm.mjs → _auth-DXJkv9QO.mjs} +3 -3
  22. package/dist/client/{_auth-CJj1Cnbm.mjs.map → _auth-DXJkv9QO.mjs.map} +1 -1
  23. package/dist/client/_flavorId-C5dc1N_j.mjs +194 -0
  24. package/dist/client/_flavorId-C5dc1N_j.mjs.map +1 -0
  25. package/dist/client/{_flavorId-BoNcxYmF.mjs → _flavorId-sUWG0xuy.mjs} +15 -15
  26. package/dist/client/_flavorId-sUWG0xuy.mjs.map +1 -0
  27. package/dist/client/{_floatingIpId-BpUfL8Im2.mjs → _floatingIpId-COK_TBrz2.mjs} +42 -42
  28. package/dist/client/{_floatingIpId-BpUfL8Im2.mjs.map → _floatingIpId-COK_TBrz2.mjs.map} +1 -1
  29. package/dist/client/{_floatingIpId-CwHiXazi.mjs → _floatingIpId-CT4y-60o.mjs} +3 -3
  30. package/dist/client/{_floatingIpId-CwHiXazi.mjs.map → _floatingIpId-CT4y-60o.mjs.map} +1 -1
  31. package/dist/client/_imageId-n3RcnhAR.mjs +534 -0
  32. package/dist/client/_imageId-n3RcnhAR.mjs.map +1 -0
  33. package/dist/client/_pcaId-B-f_6kqs.mjs +466 -0
  34. package/dist/client/_pcaId-B-f_6kqs.mjs.map +1 -0
  35. package/dist/client/{_pcaId-D1ZEaCdp.mjs → _pcaId-ChnM_t-9.mjs} +3 -3
  36. package/dist/client/{_pcaId-D1ZEaCdp.mjs.map → _pcaId-ChnM_t-9.mjs.map} +1 -1
  37. package/dist/client/_projectId-26bw-_rm.mjs +46 -0
  38. package/dist/client/_projectId-26bw-_rm.mjs.map +1 -0
  39. package/dist/client/{_projectId-DhLpIalx.mjs → _projectId-BK9UqeYw.mjs} +14 -14
  40. package/dist/client/{_projectId-DhLpIalx.mjs.map → _projectId-BK9UqeYw.mjs.map} +1 -1
  41. package/dist/client/{_projectId-D1gGribM.mjs → _projectId-CCtpAQ8m.mjs} +79 -96
  42. package/dist/client/_projectId-CCtpAQ8m.mjs.map +1 -0
  43. package/dist/client/{_projectId-OW2xkK43.mjs → _projectId-Dhb4AyBD.mjs} +3 -3
  44. package/dist/client/{_projectId-OW2xkK43.mjs.map → _projectId-Dhb4AyBD.mjs.map} +1 -1
  45. package/dist/client/{_securityGroupId-B0llWH9A.mjs → _securityGroupId-CR1mKICQ.mjs} +3 -3
  46. package/dist/client/{_securityGroupId-B0llWH9A.mjs.map → _securityGroupId-CR1mKICQ.mjs.map} +1 -1
  47. package/dist/client/{_securityGroupId-gbUnd5Wv.mjs → _securityGroupId-DroYG6cA.mjs} +254 -255
  48. package/dist/client/{_securityGroupId-gbUnd5Wv.mjs.map → _securityGroupId-DroYG6cA.mjs.map} +1 -1
  49. package/dist/client/about-969pIiZ9.mjs +92 -0
  50. package/dist/client/{about-DCe6LsKz.mjs.map → about-969pIiZ9.mjs.map} +1 -1
  51. package/dist/client/aurora-DDzsst74.mjs +19 -0
  52. package/dist/client/{aurora-CRcxVUCo.mjs.map → aurora-DDzsst74.mjs.map} +1 -1
  53. package/dist/client/{build-BJDfnAyi.mjs → build-DracvfrJ.mjs} +5 -5
  54. package/dist/client/{build-BJDfnAyi.mjs.map → build-DracvfrJ.mjs.map} +1 -1
  55. package/dist/client/{buildFilterParams-By33pG59.mjs → buildFilterParams-DoZzMKX9.mjs} +1 -1
  56. package/dist/client/{buildFilterParams-By33pG59.mjs.map → buildFilterParams-DoZzMKX9.mjs.map} +1 -1
  57. package/dist/client/{cn-C3laVXMm.mjs → cn-DM4Cy3jv.mjs} +1 -1
  58. package/dist/client/{cn-C3laVXMm.mjs.map → cn-DM4Cy3jv.mjs.map} +1 -1
  59. package/dist/client/{constants-CAjjRTo_.mjs → constants-4lVQXort.mjs} +22 -22
  60. package/dist/client/{constants-CAjjRTo_.mjs.map → constants-4lVQXort.mjs.map} +1 -1
  61. package/dist/client/{containers-NW7RnHTI.mjs → containers-DGY2hoWw.mjs} +3 -3
  62. package/dist/client/containers-DGY2hoWw.mjs.map +1 -0
  63. package/dist/client/containers-ZMFTRaQL.mjs +3277 -0
  64. package/dist/client/containers-ZMFTRaQL.mjs.map +1 -0
  65. package/dist/client/{containers-Ca5V1EBS.mjs → containers-xfsYgRyf.mjs} +2 -2
  66. package/dist/client/containers-xfsYgRyf.mjs.map +1 -0
  67. package/dist/client/{flavors-D8oElC2K.mjs → flavors-C4GtoybP.mjs} +2 -2
  68. package/dist/client/{flavors-D8oElC2K.mjs.map → flavors-C4GtoybP.mjs.map} +1 -1
  69. package/dist/client/{flavors-qvgPSI7J.mjs → flavors-CpirO_nr.mjs} +167 -148
  70. package/dist/client/flavors-CpirO_nr.mjs.map +1 -0
  71. package/dist/client/{flavors-BXPYAFyQ.mjs → flavors-DWMZ6TuJ.mjs} +2 -2
  72. package/dist/client/{flavors-BXPYAFyQ.mjs.map → flavors-DWMZ6TuJ.mjs.map} +1 -1
  73. package/dist/client/{floatingips-Be3zLoaD.mjs → floatingips-BUf_oLRl.mjs} +74 -75
  74. package/dist/client/{floatingips-Be3zLoaD.mjs.map → floatingips-BUf_oLRl.mjs.map} +1 -1
  75. package/dist/client/{formatBytes-D6oa0wU9.mjs → formatBytes-CZv_XyCY.mjs} +1 -1
  76. package/dist/client/{formatBytes-D6oa0wU9.mjs.map → formatBytes-CZv_XyCY.mjs.map} +1 -1
  77. package/dist/client/{helpers--JWXi40U.mjs → helpers-1PpYf-fC.mjs} +1 -1
  78. package/dist/client/{helpers--JWXi40U.mjs.map → helpers-1PpYf-fC.mjs.map} +1 -1
  79. package/dist/client/hooks-dSArr2Ca.mjs +2 -0
  80. package/dist/client/images-CsonlmFx.mjs +8 -0
  81. package/dist/client/images-CsonlmFx.mjs.map +1 -0
  82. package/dist/client/{images-CCYBAphP2.mjs → images-Da1t5KPh.mjs} +509 -536
  83. package/dist/client/images-Da1t5KPh.mjs.map +1 -0
  84. package/dist/client/{images-DM9I8G0p.mjs → images-NBf2bV43.mjs} +2 -2
  85. package/dist/client/images-NBf2bV43.mjs.map +1 -0
  86. package/dist/client/{images-BiEBENaj.mjs → images-QnWf63uj.mjs} +2 -2
  87. package/dist/client/{images-BiEBENaj.mjs.map → images-QnWf63uj.mjs.map} +1 -1
  88. package/dist/client/index.js +232 -236
  89. package/dist/client/index.js.map +1 -1
  90. package/dist/client/{md-BivyCkGC.mjs → md-sBiSNVSQ.mjs} +7 -7
  91. package/dist/client/{md-BivyCkGC.mjs.map → md-sBiSNVSQ.mjs.map} +1 -1
  92. package/dist/client/{network-nbSbl0X0.mjs → network-DuZm76BZ.mjs} +2 -2
  93. package/dist/client/{network-nbSbl0X0.mjs.map → network-DuZm76BZ.mjs.map} +1 -1
  94. package/dist/client/{objects-CU5ws07o.mjs → objects-B89dYCBq.mjs} +3 -3
  95. package/dist/client/objects-B89dYCBq.mjs.map +1 -0
  96. package/dist/client/{objects-GmuIOaHd.mjs → objects-CuFLUOe1.mjs} +2 -2
  97. package/dist/client/objects-CuFLUOe1.mjs.map +1 -0
  98. package/dist/client/objects-H0NN_Sja.mjs +5460 -0
  99. package/dist/client/objects-H0NN_Sja.mjs.map +1 -0
  100. package/dist/client/{pca-x9if8xU-.mjs → pca-C-UFjicP.mjs} +51 -51
  101. package/dist/client/pca-C-UFjicP.mjs.map +1 -0
  102. package/dist/client/{pca-DSM71LhW.mjs → pca-CtU6REww.mjs} +2 -2
  103. package/dist/client/{pca-DSM71LhW.mjs.map → pca-CtU6REww.mjs.map} +1 -1
  104. package/dist/client/{projects-B6BPo2Ar.mjs → projects-C-sjd9T5.mjs} +3 -3
  105. package/dist/client/{projects-B6BPo2Ar.mjs.map → projects-C-sjd9T5.mjs.map} +1 -1
  106. package/dist/client/{projects-CnmZIB2Q.mjs → projects-DNXsDnJM.mjs} +29 -25
  107. package/dist/client/projects-DNXsDnJM.mjs.map +1 -0
  108. package/dist/client/{projects-Bt0XptpG.mjs → projects-dhnQkuvV.mjs} +2 -2
  109. package/dist/client/{projects-Bt0XptpG.mjs.map → projects-dhnQkuvV.mjs.map} +1 -1
  110. package/dist/client/{projects-BilrmHLu.mjs → projects-yiK0HGSA.mjs} +2 -2
  111. package/dist/client/{projects-BilrmHLu.mjs.map → projects-yiK0HGSA.mjs.map} +1 -1
  112. package/dist/client/{securitygroups-BdzieS7Z.mjs → securitygroups-wHdrxZXd.mjs} +72 -73
  113. package/dist/client/{securitygroups-BdzieS7Z.mjs.map → securitygroups-wHdrxZXd.mjs.map} +1 -1
  114. package/dist/client/{trpcClient-BxguzNYF.mjs → trpcClient-BzPUgiM2.mjs} +1 -1
  115. package/dist/client/{trpcClient-BxguzNYF.mjs.map → trpcClient-BzPUgiM2.mjs.map} +1 -1
  116. package/dist/client/{useErrorTranslation-TZVwIAzq.mjs → useErrorTranslation-Dc0eE8Zt.mjs} +1 -1
  117. package/dist/client/{useErrorTranslation-TZVwIAzq.mjs.map → useErrorTranslation-Dc0eE8Zt.mjs.map} +1 -1
  118. package/dist/client/useListWithFiltering-DrgUwXef.mjs +157 -0
  119. package/dist/client/useListWithFiltering-DrgUwXef.mjs.map +1 -0
  120. package/dist/client/{useModal-DxxlilRm.mjs → useModal-DCs1OJh7.mjs} +1 -1
  121. package/dist/client/{useModal-DxxlilRm.mjs.map → useModal-DCs1OJh7.mjs.map} +1 -1
  122. package/dist/client/{useProjectId-CgOTejka.mjs → useProjectId-DBc5lpoU.mjs} +1 -1
  123. package/dist/client/{useProjectId-CgOTejka.mjs.map → useProjectId-DBc5lpoU.mjs.map} +1 -1
  124. package/dist/server/index.d.ts +7 -1
  125. package/dist/server/index.js +1363 -453
  126. package/package.json +7 -7
  127. package/dist/client/DeleteFlavorModal-BusYn32r.mjs.map +0 -1
  128. package/dist/client/FiltersInput-BgNaHFBt.mjs.map +0 -1
  129. package/dist/client/ListToolbar-BvtCo8dk.mjs +0 -129
  130. package/dist/client/ListToolbar-BvtCo8dk.mjs.map +0 -1
  131. package/dist/client/_flavorId-BRonXvCo.mjs +0 -188
  132. package/dist/client/_flavorId-BRonXvCo.mjs.map +0 -1
  133. package/dist/client/_flavorId-BoNcxYmF.mjs.map +0 -1
  134. package/dist/client/_imageId-CdOOJjw0.mjs +0 -527
  135. package/dist/client/_imageId-CdOOJjw0.mjs.map +0 -1
  136. package/dist/client/_pcaId-CwlH1Kvl.mjs +0 -369
  137. package/dist/client/_pcaId-CwlH1Kvl.mjs.map +0 -1
  138. package/dist/client/_projectId-D1gGribM.mjs.map +0 -1
  139. package/dist/client/_projectId-Dj_InfSc.mjs +0 -26
  140. package/dist/client/_projectId-Dj_InfSc.mjs.map +0 -1
  141. package/dist/client/about-DCe6LsKz.mjs +0 -92
  142. package/dist/client/aurora-CRcxVUCo.mjs +0 -19
  143. package/dist/client/containers-BuXUVb1N.mjs +0 -3031
  144. package/dist/client/containers-BuXUVb1N.mjs.map +0 -1
  145. package/dist/client/containers-Ca5V1EBS.mjs.map +0 -1
  146. package/dist/client/containers-NW7RnHTI.mjs.map +0 -1
  147. package/dist/client/flavors-qvgPSI7J.mjs.map +0 -1
  148. package/dist/client/hooks-D0krAKvo.mjs +0 -2
  149. package/dist/client/images-CCYBAphP2.mjs.map +0 -1
  150. package/dist/client/images-DM9I8G0p.mjs.map +0 -1
  151. package/dist/client/objects-CU5ws07o.mjs.map +0 -1
  152. package/dist/client/objects-FXN0VWLI.mjs +0 -4760
  153. package/dist/client/objects-FXN0VWLI.mjs.map +0 -1
  154. package/dist/client/objects-GmuIOaHd.mjs.map +0 -1
  155. package/dist/client/overview-B3gdnWTG.mjs +0 -15
  156. package/dist/client/overview-B3gdnWTG.mjs.map +0 -1
  157. package/dist/client/overview-DzYBiNfD.mjs +0 -15
  158. package/dist/client/overview-DzYBiNfD.mjs.map +0 -1
  159. package/dist/client/overview-EhfPY8Je.mjs +0 -15
  160. package/dist/client/overview-EhfPY8Je.mjs.map +0 -1
  161. package/dist/client/overview-XueZI4LQ.mjs +0 -173
  162. package/dist/client/overview-XueZI4LQ.mjs.map +0 -1
  163. package/dist/client/pca-x9if8xU-.mjs.map +0 -1
  164. package/dist/client/projects-CnmZIB2Q.mjs.map +0 -1
  165. package/dist/client/useListWithFiltering-CqQbAjEe.mjs +0 -32
  166. package/dist/client/useListWithFiltering-CqQbAjEe.mjs.map +0 -1
  167. package/permission_policies/compute.yaml +0 -975
  168. package/permission_policies/image.yaml +0 -71
@@ -0,0 +1,46 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { useEffect as t, useRef as n, useState as r } from "react";
3
+ import { createPortal as i } from "react-dom";
4
+ import { createFileRoute as a, lazyRouteComponent as o, useRouteContext as s } from "@tanstack/react-router";
5
+ //#region src/client/components/Slot.tsx
6
+ function c({ children: a }) {
7
+ let o = n(null), [s, c] = r(null);
8
+ return t(() => {
9
+ o.current && c(o.current.shadowRoot ?? o.current.attachShadow({ mode: "open" }));
10
+ }, []), /*#__PURE__*/ e("div", {
11
+ ref: o,
12
+ style: { display: "contents" },
13
+ children: s && /*#__PURE__*/ i(a, s)
14
+ });
15
+ }
16
+ function l({ component: t, useShadowDOM: n = !0 }) {
17
+ let { trpcClient: r } = s({ strict: !1 });
18
+ if (!r) return null;
19
+ let i = /*#__PURE__*/ e(t, { auroraContext: { client: r } });
20
+ return n ? /*#__PURE__*/ e(c, { children: i }) : i;
21
+ }
22
+ var u = a("/_auth/projects/$projectId")({
23
+ component: o(() => import("./_projectId-CCtpAQ8m.mjs"), "component"),
24
+ errorComponent: o(() => import("./_projectId-Dhb4AyBD.mjs"), "errorComponent"),
25
+ loader: async (e) => {
26
+ let { context: t, params: n } = e, r = await t.trpcClient?.auth.setCurrentScope.mutate({
27
+ type: "project",
28
+ projectId: n.projectId || ""
29
+ }), i = await t.trpcClient?.auth.getAvailableServices.query(), a = r?.domain?.id || "";
30
+ return {
31
+ trpcClient: t.trpcClient,
32
+ crumbDomain: {
33
+ path: "/projects",
34
+ name: r?.domain?.name
35
+ },
36
+ crumbProject: r?.project,
37
+ availableServices: i,
38
+ accountId: a,
39
+ projectId: n.projectId
40
+ };
41
+ }
42
+ });
43
+ //#endregion
44
+ export { l as n, u as t };
45
+
46
+ //# sourceMappingURL=_projectId-26bw-_rm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_projectId-26bw-_rm.mjs","names":["useRef","useState","useEffect","createPortal","useRouteContext","SlotShadowRoot","children","ref","root","setRoot","current","shadowRoot","attachShadow","mode","div","style","display","Slot","component","Component","useShadowDOM","trpcClient","strict","content","auroraContext","client","createFileRoute","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","loader","options","context","params","data","trpcClient","auth","setCurrentScope","mutate","type","projectId","availableServices","getAvailableServices","query","accountId","domain","id","crumbDomain","path","name","crumbProject","project"],"sources":["../../src/client/components/Slot.tsx","../../src/client/routes/_auth/projects/$projectId.tsx"],"sourcesContent":["import { useRef, useState, useEffect, type ReactNode, type FC } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useRouteContext } from \"@tanstack/react-router\"\nimport type { SlotProps } from \"../AuroraApp\"\n\nfunction SlotShadowRoot({ children }: { children: ReactNode }) {\n const ref = useRef<HTMLDivElement>(null)\n const [root, setRoot] = useState<ShadowRoot | null>(null)\n\n useEffect(() => {\n if (!ref.current) return\n setRoot(ref.current.shadowRoot ?? ref.current.attachShadow({ mode: \"open\" }))\n }, [])\n\n return (\n <div ref={ref} style={{ display: \"contents\" }}>\n {root && createPortal(children, root)}\n </div>\n )\n}\n\nexport function Slot({\n component: Component,\n useShadowDOM = true,\n}: {\n component: FC<SlotProps>\n useShadowDOM?: boolean\n}) {\n const { trpcClient } = useRouteContext({ strict: false })\n\n if (!trpcClient) return null\n\n const content = <Component auroraContext={{ client: trpcClient }} />\n\n if (!useShadowDOM) {\n return content\n }\n\n return <SlotShadowRoot>{content}</SlotShadowRoot>\n}\n","import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";;;;;AAKA,SAASK,EAAe,EAAEC,eAAmC;CAC3D,IAAMC,IAAMP,EAAuB,IAAA,GAC7B,CAACQ,GAAMC,KAAWR,EAA4B,IAAA;CAOpD,OALAC,QAAU;EACHK,EAAIG,WACTD,EAAQF,EAAIG,QAAQC,cAAcJ,EAAIG,QAAQE,aAAa,EAAEC,MAAM,OAAO,CAAA,CAAA;CAC5E,GAAG,CAAA,CAAE,GAGH,gBAACC,OAAAA;EAASP;EAAKQ,OAAO,EAAEC,SAAS,WAAW;YACzCR,KAAQL,gBAAaG,GAAUE,CAAAA;;AAGtC;AAEA,SAAgBS,EAAK,EACnBC,WAAWC,GACXC,kBAAe,MAIhB;CACC,IAAM,EAAEC,kBAAejB,EAAgB,EAAEkB,QAAQ,GAAM,CAAA;CAEvD,IAAI,CAACD,GAAY,OAAO;CAExB,IAAME,IAAU,gBAACJ,GAAAA,EAAUK,eAAe,EAAEC,QAAQJ,EAAW,EAAA,CAAA;CAM/D,OAJKD,IAIE,gBAACf,GAAAA,EAAAA,UAAgBkB,EAAAA,CAAAA,IAHfA;AAIX;ACjCA,IAAaI,IAAQD,EAAgB,4BAAA,EAA8B;CACjEE,WAASC,6CAAA,WAAA;CACTE,gBAAcF,6CAAA,gBAAA;CAGdI,QAAQ,OAAOC,MAAAA;EACb,IAAM,EAAEC,YAASC,cAAWF,GACtBG,IAAO,MAAMF,EAAQG,YAAYC,KAAKC,gBAAgBC,OAAO;GACjEC,MAAM;GACNC,WAAWP,EAAOO,aAAa;EACjC,CAAA,GACMC,IAAoB,MAAMT,EAAQG,YAAYC,KAAKM,qBAAqBC,MAAAA,GAIxEC,IAAYV,GAAMW,QAAQC,MAAM;EAEtC,OAAO;GACLX,YAAYH,EAAQG;GACpBY,aAAa;IAAEC,MAAM;IAAaC,MAAMf,GAAMW,QAAQI;GAAK;GAC3DC,cAAchB,GAAMiB;GACpBV;GACAG;GACAJ,WAAWP,EAAOO;EACpB;CACF;AACF,CAAA"}
@@ -1,19 +1,19 @@
1
- import { b as e, nt as t } from "./build-BJDfnAyi.mjs";
2
- import { t as n } from "./helpers--JWXi40U.mjs";
3
- import { t as r } from "./ContentHeader-BXZoN3B9.mjs";
1
+ import { b as e, nt as t } from "./build-DracvfrJ.mjs";
2
+ import { t as n } from "./helpers-1PpYf-fC.mjs";
3
+ import { t as r } from "./ContentHeader-xQVhO2yT.mjs";
4
4
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
5
  import { Link as o, useLoaderData as s } from "@tanstack/react-router";
6
6
  import { Trans as c, useLingui as l } from "@lingui/react";
7
7
  //#region src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component
8
8
  function u({ title: t, links: n }) {
9
- return /* @__PURE__ */ a(e, {
9
+ return /*#__PURE__*/ a(e, {
10
10
  className: "p-5",
11
- children: [/* @__PURE__ */ i("h3", {
11
+ children: [/*#__PURE__*/ i("h3", {
12
12
  className: "text-theme-high mb-3 text-base font-semibold",
13
13
  children: t
14
- }), /* @__PURE__ */ i("ul", {
14
+ }), /*#__PURE__*/ i("ul", {
15
15
  className: "space-y-1.5",
16
- children: n.map(({ label: e, to: t }) => /* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(o, {
16
+ children: n.map(({ label: e, to: t }) => /*#__PURE__*/ i("li", { children: /*#__PURE__*/ i(o, {
17
17
  to: t,
18
18
  className: "text-theme-accent hover:text-theme-accent/80 text-sm",
19
19
  children: e
@@ -62,23 +62,23 @@ function d() {
62
62
  label: "PCA (Clavis)",
63
63
  to: `${h}/services/pca`
64
64
  }]
65
- }), /* @__PURE__ */ a(t, {
65
+ }), /*#__PURE__*/ a(t, {
66
66
  direction: "vertical",
67
67
  gap: "6",
68
68
  className: "pb-4",
69
- children: [/* @__PURE__ */ i(r, {
69
+ children: [/*#__PURE__*/ i(r, {
70
70
  title: e?.name ?? f._({ id: "e0NrBM" }),
71
71
  projectId: d
72
- }), g.length > 0 ? /* @__PURE__ */ i("div", {
72
+ }), g.length > 0 ? /*#__PURE__*/ i("div", {
73
73
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
74
- children: g.map((e) => /* @__PURE__ */ i(u, { ...e }, e.title))
75
- }) : /* @__PURE__ */ i("p", {
74
+ children: g.map((e) => /*#__PURE__*/ i(u, { ...e }, e.title))
75
+ }) : /*#__PURE__*/ i("p", {
76
76
  className: "text-theme-light text-sm",
77
- children: /* @__PURE__ */ i(c, { id: "Q1W//7" })
77
+ children: /*#__PURE__*/ i(c, { id: "Q1W//7" })
78
78
  })]
79
79
  });
80
80
  }
81
81
  //#endregion
82
82
  export { d as component };
83
83
 
84
- //# sourceMappingURL=_projectId-DhLpIalx.mjs.map
84
+ //# sourceMappingURL=_projectId-BK9UqeYw.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_projectId-DhLpIalx.mjs","names":["Link","useLoaderData","Box","Stack","getServiceIndex","Trans","useLingui","ContentHeader","ServiceCardProps","title","links","label","to","ServiceCard","map","RouteComponent","crumbProject","availableServices","projectId","from","t","serviceIndex","base","cards","push","storageLinks","name","length","card","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Link, useLoaderData } from \"@tanstack/react-router\"\nimport { Box, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/\")({\n component: RouteComponent,\n})\n\ninterface ServiceCardProps {\n title: string\n links: { label: string; to: string }[]\n}\n\nfunction ServiceCard({ title, links }: ServiceCardProps) {\n return (\n <Box className=\"p-5\">\n <h3 className=\"text-theme-high mb-3 text-base font-semibold\">{title}</h3>\n <ul className=\"space-y-1.5\">\n {links.map(({ label, to }) => (\n <li key={label}>\n <Link to={to} className=\"text-theme-accent hover:text-theme-accent/80 text-sm\">\n {label}\n </Link>\n </li>\n ))}\n </ul>\n </Box>\n )\n}\n\nfunction RouteComponent() {\n const { crumbProject, availableServices, projectId } = useLoaderData({\n from: \"/_auth/projects/$projectId\",\n })\n const { t } = useLingui()\n\n const serviceIndex = getServiceIndex(availableServices ?? [])\n const base = `/projects/${projectId}`\n\n const cards: ServiceCardProps[] = []\n\n if (serviceIndex[\"image\"]?.[\"glance\"] || serviceIndex[\"compute\"]?.[\"nova\"]) {\n const links: { label: string; to: string }[] = []\n if (serviceIndex[\"image\"]?.[\"glance\"]) links.push({ label: \"Images\", to: `${base}/compute/images` })\n if (serviceIndex[\"compute\"]?.[\"nova\"]) links.push({ label: \"Flavors\", to: `${base}/compute/flavors` })\n cards.push({ title: \"Compute\", links })\n }\n\n if (serviceIndex[\"network\"]) {\n cards.push({\n title: \"Network\",\n links: [\n { label: \"Security Groups\", to: `${base}/network/securitygroups` },\n { label: \"Floating IPs\", to: `${base}/network/floatingips` },\n ],\n })\n }\n\n // Storage section - always show Ceph, optionally add Swift\n const storageLinks: { label: string; to: string }[] = []\n if (serviceIndex[\"object-store\"]?.[\"swift\"]) {\n storageLinks.push({ label: \"Swift\", to: `${base}/storage/swift/containers` })\n }\n storageLinks.push({ label: \"Ceph\", to: `${base}/storage/ceph/containers` })\n cards.push({ title: \"Storage\", links: storageLinks })\n\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n if (serviceIndex[\"pca\"]?.[\"clavis-dev\"] || serviceIndex[\"pca\"]?.[\"clavis-beta\"]) {\n cards.push({\n title: \"Services\",\n links: [{ label: \"PCA (Clavis)\", to: `${base}/services/pca` }],\n })\n }\n\n return (\n <Stack direction=\"vertical\" gap=\"6\" className=\"pb-4\">\n <ContentHeader title={crumbProject?.name ?? t`Project`} projectId={projectId} />\n {cards.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {cards.map((card) => (\n <ServiceCard key={card.title} {...card} />\n ))}\n </div>\n ) : (\n <p className=\"text-theme-light text-sm\">\n <Trans>No services available for this project.</Trans>\n </p>\n )}\n </Stack>\n )\n}\n"],"mappings":";;;;;;;AAgBA,SAASa,EAAY,EAAEJ,UAAOC,YAAyB;AACrD,QACE,kBAAC,GAAA;EAAI,WAAU;aACb,kBAAC,MAAA;GAAG,WAAU;aAAgDD;MAC9D,kBAAC,MAAA;GAAG,WAAU;aACXC,EAAMI,KAAK,EAAEH,UAAOC,YACnB,kBAAC,MAAA,EAAA,UACC,kBAAC,GAAA;IAASA;IAAI,WAAU;cACrBD;SAFIA,EAAAA,CAAAA;;;;AAWnB,SAASI,IAAAA;CACP,IAAM,EAAEC,iBAAcC,sBAAmBC,iBAAcjB,EAAc,EACnEkB,MAAM,8BACR,CAAA,EACM,EAAA,MAAA,GAAA,GAAA,MAAQb,GAAAA,EAERe,IAAejB,EAAgBa,KAAqB,EAAE,CAAA,EACtDK,IAAO,aAAaJ,KAEpBK,IAA4B,EAAE;AAEpC,KAAIF,EAAa,OAAW,UAAaA,EAAa,SAAa,MAAS;EAC1E,IAAMX,IAAyC,EAAE;AAGjDa,EAFIF,EAAa,OAAW,UAAWX,EAAMc,KAAK;GAAEb,OAAO;GAAUC,IAAI,GAAGU,EAAI;GAAkB,CAAA,EAC9FD,EAAa,SAAa,QAASX,EAAMc,KAAK;GAAEb,OAAO;GAAWC,IAAI,GAAGU,EAAI;GAAmB,CAAA,EACpGC,EAAMC,KAAK;GAAEf,OAAO;GAAWC;GAAM,CAAA;;AAGvC,CAAIW,EAAa,WACfE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CACL;GAAEC,OAAO;GAAmBC,IAAI,GAAGU,EAAI;GAA0B,EACjE;GAAEX,OAAO;GAAgBC,IAAI,GAAGU,EAAI;GAAuB,CAAC;EAEhE,CAAA;CAIF,IAAMG,IAAgD,EAAE;AAexD,QAdIJ,EAAa,iBAAkB,SACjCI,EAAaD,KAAK;EAAEb,OAAO;EAASC,IAAI,GAAGU,EAAI;EAA4B,CAAA,EAE7EG,EAAaD,KAAK;EAAEb,OAAO;EAAQC,IAAI,GAAGU,EAAI;EAA2B,CAAA,EACzEC,EAAMC,KAAK;EAAEf,OAAO;EAAWC,OAAOe;EAAa,CAAA,GAG/CJ,EAAa,MAAS,iBAAiBA,EAAa,MAAS,mBAC/DE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CAAC;GAAEC,OAAO;GAAgBC,IAAI,GAAGU,EAAI;GAAgB,CAAC;EAC/D,CAAA,EAIA,kBAAC,GAAA;EAAM,WAAU;EAAW,KAAI;EAAI,WAAU;aAC5C,kBAAC,GAAA;GAAc,OAAON,GAAcU,QAAQN,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA;GAAsBF;MAClEK,EAAMI,SAAS,IACd,kBAAC,OAAA;GAAI,WAAU;aACZJ,EAAMT,KAAKc,MACV,kBAAC,GAAA,EAA6B,GAAIA,GAAAA,EAAhBA,EAAKnB,MAAK,CAAA;OAIhC,kBAAC,KAAA;GAAE,WAAU;aACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
1
+ {"version":3,"file":"_projectId-BK9UqeYw.mjs","names":["Link","useLoaderData","Box","Stack","getServiceIndex","Trans","useLingui","ContentHeader","ServiceCardProps","title","links","label","to","ServiceCard","map","RouteComponent","crumbProject","availableServices","projectId","from","t","serviceIndex","base","cards","push","storageLinks","name","length","card","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Link, useLoaderData } from \"@tanstack/react-router\"\nimport { Box, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/\")({\n component: RouteComponent,\n})\n\ninterface ServiceCardProps {\n title: string\n links: { label: string; to: string }[]\n}\n\nfunction ServiceCard({ title, links }: ServiceCardProps) {\n return (\n <Box className=\"p-5\">\n <h3 className=\"text-theme-high mb-3 text-base font-semibold\">{title}</h3>\n <ul className=\"space-y-1.5\">\n {links.map(({ label, to }) => (\n <li key={label}>\n <Link to={to} className=\"text-theme-accent hover:text-theme-accent/80 text-sm\">\n {label}\n </Link>\n </li>\n ))}\n </ul>\n </Box>\n )\n}\n\nfunction RouteComponent() {\n const { crumbProject, availableServices, projectId } = useLoaderData({\n from: \"/_auth/projects/$projectId\",\n })\n const { t } = useLingui()\n\n const serviceIndex = getServiceIndex(availableServices ?? [])\n const base = `/projects/${projectId}`\n\n const cards: ServiceCardProps[] = []\n\n if (serviceIndex[\"image\"]?.[\"glance\"] || serviceIndex[\"compute\"]?.[\"nova\"]) {\n const links: { label: string; to: string }[] = []\n if (serviceIndex[\"image\"]?.[\"glance\"]) links.push({ label: \"Images\", to: `${base}/compute/images` })\n if (serviceIndex[\"compute\"]?.[\"nova\"]) links.push({ label: \"Flavors\", to: `${base}/compute/flavors` })\n cards.push({ title: \"Compute\", links })\n }\n\n if (serviceIndex[\"network\"]) {\n cards.push({\n title: \"Network\",\n links: [\n { label: \"Security Groups\", to: `${base}/network/securitygroups` },\n { label: \"Floating IPs\", to: `${base}/network/floatingips` },\n ],\n })\n }\n\n // Storage section - always show Ceph, optionally add Swift\n const storageLinks: { label: string; to: string }[] = []\n if (serviceIndex[\"object-store\"]?.[\"swift\"]) {\n storageLinks.push({ label: \"Swift\", to: `${base}/storage/swift/containers` })\n }\n storageLinks.push({ label: \"Ceph\", to: `${base}/storage/ceph/containers` })\n cards.push({ title: \"Storage\", links: storageLinks })\n\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n if (serviceIndex[\"pca\"]?.[\"clavis-dev\"] || serviceIndex[\"pca\"]?.[\"clavis-beta\"]) {\n cards.push({\n title: \"Services\",\n links: [{ label: \"PCA (Clavis)\", to: `${base}/services/pca` }],\n })\n }\n\n return (\n <Stack direction=\"vertical\" gap=\"6\" className=\"pb-4\">\n <ContentHeader title={crumbProject?.name ?? t`Project`} projectId={projectId} />\n {cards.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {cards.map((card) => (\n <ServiceCard key={card.title} {...card} />\n ))}\n </div>\n ) : (\n <p className=\"text-theme-light text-sm\">\n <Trans>No services available for this project.</Trans>\n </p>\n )}\n </Stack>\n )\n}\n"],"mappings":";;;;;;;AAgBA,SAASa,EAAY,EAAEJ,UAAOC,YAAyB;CACrD,OACE,gBAAC,GAAA;EAAI,WAAU;aACb,gBAAC,MAAA;GAAG,WAAU;aAAgDD;MAC9D,gBAAC,MAAA;GAAG,WAAU;aACXC,EAAMI,KAAK,EAAEH,UAAOC,YACnB,gBAAC,MAAA,EAAA,UACC,gBAAC,GAAA;IAASA;IAAI,WAAU;cACrBD;SAFIA,CAAAA,CAAAA;;;AASnB;AAEA,SAASI,IAAAA;CACP,IAAM,EAAEC,iBAAcC,sBAAmBC,iBAAcjB,EAAc,EACnEkB,MAAM,6BACR,CAAA,GACM,EAAA,MAAA,GAAA,GAAA,MAAQb,EAAAA,GAERe,IAAejB,EAAgBa,KAAqB,CAAA,CAAE,GACtDK,IAAO,aAAaJ,KAEpBK,IAA4B,CAAA;CAElC,IAAIF,EAAa,OAAW,UAAaA,EAAa,SAAa,MAAS;EAC1E,IAAMX,IAAyC,CAAA;EAG/Ca,AAFIF,EAAa,OAAW,UAAWX,EAAMc,KAAK;GAAEb,OAAO;GAAUC,IAAI,GAAGU,EAAI;EAAkB,CAAA,GAC9FD,EAAa,SAAa,QAASX,EAAMc,KAAK;GAAEb,OAAO;GAAWC,IAAI,GAAGU,EAAI;EAAmB,CAAA,GACpGC,EAAMC,KAAK;GAAEf,OAAO;GAAWC;EAAM,CAAA;CACvC;CAEA,AAAIW,EAAa,WACfE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CACL;GAAEC,OAAO;GAAmBC,IAAI,GAAGU,EAAI;EAA0B,GACjE;GAAEX,OAAO;GAAgBC,IAAI,GAAGU,EAAI;EAAuB,CAAA;CAE/D,CAAA;CAIF,IAAMG,IAAgD,CAAA;CAetD,OAdIJ,EAAa,iBAAkB,SACjCI,EAAaD,KAAK;EAAEb,OAAO;EAASC,IAAI,GAAGU,EAAI;CAA4B,CAAA,GAE7EG,EAAaD,KAAK;EAAEb,OAAO;EAAQC,IAAI,GAAGU,EAAI;CAA2B,CAAA,GACzEC,EAAMC,KAAK;EAAEf,OAAO;EAAWC,OAAOe;CAAa,CAAA,IAG/CJ,EAAa,MAAS,iBAAiBA,EAAa,MAAS,mBAC/DE,EAAMC,KAAK;EACTf,OAAO;EACPC,OAAO,CAAC;GAAEC,OAAO;GAAgBC,IAAI,GAAGU,EAAI;EAAgB,CAAA;CAC9D,CAAA,GAIA,gBAAC,GAAA;EAAM,WAAU;EAAW,KAAI;EAAI,WAAU;aAC5C,gBAAC,GAAA;GAAc,OAAON,GAAcU,QAAQN,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;GAAsBF;MAClEK,EAAMI,SAAS,IACd,gBAAC,OAAA;GAAI,WAAU;aACZJ,EAAMT,KAAKc,MACV,gBAAC,GAAA,EAA6B,GAAIA,EAAAA,GAAhBA,EAAKnB,KAAK,CAAA;OAIhC,gBAAC,KAAA;GAAE,WAAU;aACX,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;AAKV"}
@@ -1,14 +1,13 @@
1
- import { D as e, K as t, V as n, X as r, g as i, k as a, nt as o, z as s } from "./build-BJDfnAyi.mjs";
2
- import { t as c } from "./_projectId-Dj_InfSc.mjs";
3
- import { t as l } from "./helpers--JWXi40U.mjs";
4
- import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
5
- import { useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
6
- import { createPortal as _ } from "react-dom";
7
- import { Outlet as v, useLoaderData as y, useMatches as b, useNavigate as x, useParams as S, useRouteContext as C } from "@tanstack/react-router";
8
- import { useLingui as w } from "@lingui/react";
9
- import { z as T } from "zod";
10
- var E = T.object({
11
- labelKey: T.enum([
1
+ import { D as e, K as t, V as n, X as r, g as i, k as a, nt as o, z as s } from "./build-DracvfrJ.mjs";
2
+ import { n as c, t as l } from "./_projectId-26bw-_rm.mjs";
3
+ import { t as u } from "./helpers-1PpYf-fC.mjs";
4
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
5
+ import { useEffect as m, useMemo as h, useState as g } from "react";
6
+ import { Outlet as _, useLoaderData as v, useMatches as y, useNavigate as b, useParams as x, useRouteContext as S } from "@tanstack/react-router";
7
+ import { useLingui as C } from "@lingui/react";
8
+ import { z as w } from "zod";
9
+ var T = w.object({
10
+ labelKey: w.enum([
12
11
  "Compute",
13
12
  "Network",
14
13
  "Storage",
@@ -19,38 +18,22 @@ var E = T.object({
19
18
  "Floating IPs",
20
19
  "PCA (Clavis)"
21
20
  ]).optional(),
22
- to: T.string().optional(),
23
- useParamAsLabel: T.string().optional()
24
- }), D = T.object({
25
- section: T.string(),
26
- service: T.string().optional(),
27
- isDetail: T.boolean().optional(),
28
- crumb: E.optional(),
29
- sectionCrumb: E.optional()
21
+ to: w.string().optional(),
22
+ useParamAsLabel: w.string().optional()
23
+ }), E = w.object({
24
+ section: w.string(),
25
+ service: w.string().optional(),
26
+ isDetail: w.boolean().optional(),
27
+ crumb: T.optional(),
28
+ sectionCrumb: T.optional()
30
29
  });
31
- function O(e) {
32
- return D.safeParse(e).success;
33
- }
34
- //#endregion
35
- //#region src/client/components/Slot.tsx
36
- function k({ children: e }) {
37
- let t = h(null), [n, r] = g(null);
38
- return p(() => {
39
- t.current && r(t.current.shadowRoot ?? t.current.attachShadow({ mode: "open" }));
40
- }, []), /* @__PURE__ */ d("div", {
41
- ref: t,
42
- style: { display: "contents" },
43
- children: n && /* @__PURE__ */ _(e, n)
44
- });
45
- }
46
- function A({ component: e }) {
47
- let { trpcClient: t } = C({ strict: !1 });
48
- return t ? /* @__PURE__ */ d(k, { children: /* @__PURE__ */ d(e, { auroraContext: { client: t } }) }) : null;
30
+ function D(e) {
31
+ return E.safeParse(e).success;
49
32
  }
50
33
  //#endregion
51
34
  //#region src/client/routes/_auth/projects/-components/SideNavBar.tsx
52
- var j = ({ projectId: e, projectName: r, availableServices: i }) => {
53
- let { i18n: o, _: s } = w(), c = x(), m = b(), { provider: h } = S({ strict: !1 }), { slots: _ } = C({ strict: !1 }), v = [...m].reverse().find((e) => O(e.staticData)), y = v && O(v.staticData) ? v.staticData : void 0, T = y?.section ?? null, E = y?.service ?? null, D = l(i), [k, j] = g({
35
+ var O = ({ projectId: e, projectName: r, availableServices: i }) => {
36
+ let { i18n: o, _: s } = C(), l = b(), h = y(), { provider: _ } = x({ strict: !1 }), { slots: v } = S({ strict: !1 }), w = [...h].reverse().find((e) => D(e.staticData)), T = w && D(w.staticData) ? w.staticData : void 0, E = T?.section ?? null, O = T?.service ?? null, k = u(i), [A, j] = g({
54
37
  compute: !0,
55
38
  network: !0,
56
39
  storage: !0,
@@ -64,29 +47,29 @@ var j = ({ projectId: e, projectName: r, availableServices: i }) => {
64
47
  storage: 0,
65
48
  services: 0
66
49
  });
67
- p(() => {
68
- T && T in N && (P((e) => ({
50
+ m(() => {
51
+ E && E in N && (P((e) => ({
69
52
  ...e,
70
- [T]: e[T] + 1
53
+ [E]: e[E] + 1
71
54
  })), j((e) => ({
72
55
  ...e,
73
- [T]: !0
56
+ [E]: !0
74
57
  })));
75
- }, [T]);
76
- let F = T === null, I = (e) => (t) => {
58
+ }, [E]);
59
+ let F = E === null, I = (e) => (t) => {
77
60
  let n = t.target.closest(".juno-sidenavigation-item");
78
61
  n && n.parentElement?.querySelector(".expand-icon") && M(e);
79
- }, L = [...D.image?.glance ? [{
62
+ }, L = [...k.image?.glance ? [{
80
63
  service: "images",
81
64
  label: o._({ id: "an5hVd" }),
82
65
  to: "/projects/$projectId/compute/images",
83
66
  params: { projectId: e }
84
- }] : [], ...D?.compute?.nova ? [{
67
+ }] : [], ...k?.compute?.nova ? [{
85
68
  service: "flavors",
86
69
  label: o._({ id: "neiJm0" }),
87
70
  to: "/projects/$projectId/compute/flavors",
88
71
  params: { projectId: e }
89
- }] : []], R = [...D.network ? [{
72
+ }] : []], R = [...k.network ? [{
90
73
  service: "securitygroups",
91
74
  label: o._({ id: "4opp4r" }),
92
75
  to: "/projects/$projectId/network/securitygroups",
@@ -96,7 +79,7 @@ var j = ({ projectId: e, projectName: r, availableServices: i }) => {
96
79
  label: o._({ id: "u77/s4" }),
97
80
  to: "/projects/$projectId/network/floatingips",
98
81
  params: { projectId: e }
99
- }] : []], z = [...D?.["object-store"]?.swift ? [{
82
+ }] : []], z = [...k?.["object-store"]?.swift ? [{
100
83
  service: "containers",
101
84
  label: o._({ id: "+OEi73" }),
102
85
  to: "/projects/$projectId/storage/$provider/containers",
@@ -112,94 +95,94 @@ var j = ({ projectId: e, projectName: r, availableServices: i }) => {
112
95
  projectId: e,
113
96
  provider: "ceph"
114
97
  }
115
- }], B = [...D.pca?.["clavis-beta"] || D.pca?.["clavis-dev"] ? [{
98
+ }], B = [...k.pca?.["clavis-beta"] || k.pca?.["clavis-dev"] ? [{
116
99
  service: "pca",
117
100
  label: o._({ id: "miy5mb" }),
118
101
  to: "/projects/$projectId/services/pca",
119
102
  params: { projectId: e }
120
103
  }] : []];
121
- return /* @__PURE__ */ d(t, {
104
+ return /*#__PURE__*/ f(t, {
122
105
  ariaLabel: "Project Side Navigation",
123
- children: /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d(a, { children: /* @__PURE__ */ f(u, { children: [
124
- /* @__PURE__ */ d(n, {
106
+ children: /*#__PURE__*/ p(d, { children: [/*#__PURE__*/ f(a, { children: /*#__PURE__*/ p(d, { children: [
107
+ /*#__PURE__*/ f(n, {
125
108
  icon: "home",
126
109
  label: r,
127
- onClick: () => c({
110
+ onClick: () => l({
128
111
  to: "/projects/$projectId",
129
112
  params: { projectId: e }
130
113
  }),
131
114
  selected: F
132
115
  }),
133
- /* @__PURE__ */ d("div", {
116
+ /*#__PURE__*/ f("div", {
134
117
  onClickCapture: I("compute"),
135
- children: /* @__PURE__ */ d(n, {
118
+ children: /*#__PURE__*/ f(n, {
136
119
  label: o._({ id: "rp0Bd0" }),
137
- open: k.compute,
138
- children: L.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
139
- onClick: () => c({
120
+ open: A.compute,
121
+ children: L.map(({ service: e, label: t, to: r, params: i }) => /*#__PURE__*/ f(n, {
122
+ onClick: () => l({
140
123
  to: r,
141
124
  params: i
142
125
  }),
143
126
  label: t,
144
- selected: T === "compute" && E === e
127
+ selected: E === "compute" && O === e
145
128
  }, t))
146
129
  }, N.compute)
147
130
  }),
148
- R.length > 0 && /* @__PURE__ */ d("div", {
131
+ R.length > 0 && /*#__PURE__*/ f("div", {
149
132
  onClickCapture: I("network"),
150
- children: /* @__PURE__ */ d(n, {
133
+ children: /*#__PURE__*/ f(n, {
151
134
  label: o._({ id: "OR475H" }),
152
- open: k.network,
153
- children: R.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
154
- onClick: () => c({
135
+ open: A.network,
136
+ children: R.map(({ service: e, label: t, to: r, params: i }) => /*#__PURE__*/ f(n, {
137
+ onClick: () => l({
155
138
  to: r,
156
139
  params: i
157
140
  }),
158
141
  label: t,
159
- selected: T === "network" && E === e
142
+ selected: E === "network" && O === e
160
143
  }, t))
161
144
  }, N.network)
162
145
  }),
163
- z.length > 0 && /* @__PURE__ */ d("div", {
146
+ z.length > 0 && /*#__PURE__*/ f("div", {
164
147
  onClickCapture: I("storage"),
165
- children: /* @__PURE__ */ d(n, {
148
+ children: /*#__PURE__*/ f(n, {
166
149
  label: o._({ id: "BrrIs8" }),
167
- open: k.storage,
168
- children: z.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
169
- onClick: () => c({
150
+ open: A.storage,
151
+ children: z.map(({ service: e, label: t, to: r, params: i }) => /*#__PURE__*/ f(n, {
152
+ onClick: () => l({
170
153
  to: r,
171
154
  params: i
172
155
  }),
173
156
  label: t,
174
- selected: T === "storage" && E === "containers" ? i.provider === h : E === e
157
+ selected: E === "storage" && O === "containers" ? i.provider === _ : O === e
175
158
  }, t))
176
159
  }, N.storage)
177
160
  }),
178
- B.length > 0 && /* @__PURE__ */ d("div", {
161
+ B.length > 0 && /*#__PURE__*/ f("div", {
179
162
  onClickCapture: I("services"),
180
- children: /* @__PURE__ */ d(n, {
163
+ children: /*#__PURE__*/ f(n, {
181
164
  label: o._({ id: "MILoeL" }),
182
- open: k.services,
183
- children: B.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
184
- onClick: () => c({
165
+ open: A.services,
166
+ children: B.map(({ service: e, label: t, to: r, params: i }) => /*#__PURE__*/ f(n, {
167
+ onClick: () => l({
185
168
  to: r,
186
169
  params: i
187
170
  }),
188
171
  label: t,
189
- selected: T === "services" && E === e
172
+ selected: E === "services" && O === e
190
173
  }, t))
191
174
  }, N.services)
192
175
  })
193
- ] }) }), _?.sideNavBanner && /* @__PURE__ */ d(A, { component: _.sideNavBanner })] })
176
+ ] }) }), v?.sideNavBanner && /*#__PURE__*/ f(c, { component: v.sideNavBanner })] })
194
177
  });
195
178
  };
196
179
  //#endregion
197
180
  //#region src/client/components/ProjectView/ProjectInfoBox.tsx
198
- function M({ projectInfo: t }) {
199
- let { i18n: n, _: i } = w(), a = x(), o = b(), { projectId: s } = S({ strict: !1 });
200
- return /* @__PURE__ */ d(r, {
201
- className: "mt-8 mb-4",
202
- children: m(() => {
181
+ function k({ projectInfo: t }) {
182
+ let { i18n: n, _: i } = C(), a = b(), o = y(), { projectId: s } = x({ strict: !1 });
183
+ return /*#__PURE__*/ f(r, {
184
+ className: "relative z-1 mt-8 mb-4",
185
+ children: h(() => {
203
186
  let e = {
204
187
  Compute: n._({ id: "rp0Bd0" }),
205
188
  Network: n._({ id: "OR475H" }),
@@ -224,7 +207,7 @@ function M({ projectInfo: t }) {
224
207
  });
225
208
  let c = o.filter((e) => e.routeId !== "/_auth/projects/$projectId" && e.routeId.startsWith("/_auth/projects/$projectId")), l = c[c.length - 1];
226
209
  if (!l) return i;
227
- let u = O(l.staticData) ? l.staticData : void 0;
210
+ let u = D(l.staticData) ? l.staticData : void 0;
228
211
  if (!u) return i;
229
212
  let d = l.params;
230
213
  if (u.sectionCrumb) {
@@ -273,7 +256,7 @@ function M({ projectInfo: t }) {
273
256
  s,
274
257
  a,
275
258
  i
276
- ]).map((t, n) => /* @__PURE__ */ d(e, {
259
+ ]).map((t, n) => /*#__PURE__*/ f(e, {
277
260
  label: t.label,
278
261
  icon: t.icon,
279
262
  onClick: t.onClick,
@@ -283,34 +266,34 @@ function M({ projectInfo: t }) {
283
266
  }
284
267
  //#endregion
285
268
  //#region src/client/routes/_auth/projects/$projectId.tsx?tsr-split=component
286
- function N() {
287
- let { availableServices: e, projectId: t, crumbProject: n } = y({ from: c.id });
288
- return /* @__PURE__ */ d(i, {
269
+ function A() {
270
+ let { availableServices: e, projectId: t, crumbProject: n } = v({ from: l.id });
271
+ return /*#__PURE__*/ f(i, {
289
272
  embedded: !0,
290
- sideNavigation: /* @__PURE__ */ d(j, {
273
+ sideNavigation: /*#__PURE__*/ f(O, {
291
274
  availableServices: e,
292
275
  projectId: t,
293
276
  projectName: n?.name || t
294
277
  }),
295
278
  className: "h-min-screen",
296
- children: /* @__PURE__ */ d(s, { children: /* @__PURE__ */ d(o, {
279
+ children: /*#__PURE__*/ f(s, { children: /*#__PURE__*/ f(o, {
297
280
  direction: "vertical",
298
281
  distribution: "start",
299
282
  alignment: "stretch",
300
283
  className: "xl:flex-row",
301
284
  gap: "6",
302
- children: /* @__PURE__ */ f("div", {
285
+ children: /*#__PURE__*/ p("div", {
303
286
  className: "min-w-0 flex-1",
304
- children: [/* @__PURE__ */ d(M, { projectInfo: {
287
+ children: [/*#__PURE__*/ f(k, { projectInfo: {
305
288
  id: t,
306
289
  name: n?.name || t,
307
290
  domain: n?.domain
308
- } }), /* @__PURE__ */ d(v, {})]
291
+ } }), /*#__PURE__*/ f(_, {})]
309
292
  })
310
293
  }) })
311
294
  });
312
295
  }
313
296
  //#endregion
314
- export { N as component };
297
+ export { A as component };
315
298
 
316
- //# sourceMappingURL=_projectId-D1gGribM.mjs.map
299
+ //# sourceMappingURL=_projectId-CCtpAQ8m.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_projectId-CCtpAQ8m.mjs","names":["z","CRUMB_LABEL_KEYS","CrumbSchema","object","labelKey","enum","optional","to","string","useParamAsLabel","RouteInfoSchema","section","service","isDetail","boolean","crumb","sectionCrumb","isRouteInfo","data","safeParse","success","useNavigate","useMatches","useParams","useRouteContext","useState","useEffect","getServiceIndex","SideNavigation","SideNavigationList","SideNavigationItem","isRouteInfo","Slot","SideNavBar","projectId","projectName","availableServices","useLingui","navigate","matches","provider","strict","slots","activeMatch","reverse","find","m","staticData","activeRouteInfo","undefined","activeSection","section","activeService","service","serviceIndex","openSections","setOpenSections","compute","network","storage","services","toggle","prev","sectionKeys","setSectionKeys","isOverviewActive","handleSectionClick","e","clickedItem","target","closest","parentElement","querySelector","computeServices","label","t","to","params","networkServices","storageServices","pcaServices","clavisServices","ariaLabel","icon","onClick","selected","div","onClickCapture","open","map","length","isStorageContainers","isSelected","sideNavBanner","component","Breadcrumb","BreadcrumbItem","useMatches","useNavigate","useParams","useMemo","isRouteInfo","ProjectInfoBox","projectInfo","useLingui","navigate","matches","projectId","strict","breadcrumbs","crumbLabels","Compute","t","Network","Storage","Services","Images","Flavors","resolveProviderLabel","provider","items","push","icon","label","onClick","to","domain","name","params","projectMatches","filter","m","routeId","startsWith","deepest","length","info","staticData","undefined","sectionCrumb","labelKey","isLeaf","crumb","active","useParamAsLabel","resolvedLabel","isDetail","title","meta","find","className","map","item","index","Outlet","useLoaderData","AppShell","Container","Stack","SideNavBar","ProjectInfoBox","Route","RouteComponent","availableServices","projectId","crumbProject","from","id","name","domain","component"],"sources":["../../src/client/routes/routeInfo.ts","../../src/client/routes/_auth/projects/-components/SideNavBar.tsx","../../src/client/components/ProjectView/ProjectInfoBox.tsx","../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=component"],"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 \"PCA (Clavis)\",\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 to: z.string().optional(),\n useParamAsLabel: z.string().optional(),\n})\n\nconst RouteInfoSchema = z.object({\n section: z.string(),\n service: z.string().optional(),\n isDetail: z.boolean().optional(),\n crumb: CrumbSchema.optional(),\n sectionCrumb: CrumbSchema.optional(),\n})\n\nexport type Crumb = z.infer<typeof CrumbSchema>\nexport type RouteInfo = z.infer<typeof RouteInfoSchema>\n\nexport function isRouteInfo(data: unknown): data is RouteInfo {\n return RouteInfoSchema.safeParse(data).success\n}\n","import { useNavigate, useMatches, useParams, useRouteContext } from \"@tanstack/react-router\"\nimport { type MouseEvent, useState, useEffect } from \"react\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { SideNavigation, SideNavigationList, SideNavigationItem } from \"@cloudoperators/juno-ui-components/index\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { isRouteInfo } from \"@/client/routes/routeInfo\"\nimport { Slot } from \"@/client/components/Slot\"\n\ninterface SideNavBarProps {\n projectId: string\n projectName: string\n availableServices: {\n type: string\n name: string\n }[]\n}\n\nexport const SideNavBar = ({ projectId, projectName, availableServices }: SideNavBarProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const matches = useMatches()\n const { provider } = useParams({ strict: false }) as { provider?: string }\n const { slots } = useRouteContext({ strict: false })\n\n // Read active section/service from the deepest match that has valid RouteInfo staticData\n const activeMatch = [...matches].reverse().find((m) => isRouteInfo(m.staticData))\n const activeRouteInfo = activeMatch && isRouteInfo(activeMatch.staticData) ? activeMatch.staticData : undefined\n const activeSection = activeRouteInfo?.section ?? null\n const activeService = activeRouteInfo?.service ?? null\n\n const serviceIndex = getServiceIndex(availableServices)\n\n const [openSections, setOpenSections] = useState({ compute: true, network: true, storage: true, services: true })\n const toggle = (section: keyof typeof openSections) =>\n setOpenSections((prev) => ({ ...prev, [section]: !prev[section] }))\n\n // When navigating into a section, force Juno to re-open it by resetting the key\n const [sectionKeys, setSectionKeys] = useState({ compute: 0, network: 0, storage: 0, services: 0 })\n\n useEffect(() => {\n if (activeSection && activeSection in sectionKeys) {\n setSectionKeys((prev) => ({ ...prev, [activeSection]: prev[activeSection as keyof typeof sectionKeys] + 1 }))\n setOpenSections((prev) => ({ ...prev, [activeSection]: true }))\n }\n }, [activeSection])\n\n const isOverviewActive = activeSection === null\n\n const handleSectionClick = (section: keyof typeof openSections) => (e: MouseEvent<HTMLDivElement>) => {\n // Only toggle if the click is on the header row (has expand-icon sibling), not on child items\n const clickedItem = (e.target as HTMLElement).closest(\".juno-sidenavigation-item\")\n if (clickedItem && clickedItem.parentElement?.querySelector(\".expand-icon\")) {\n toggle(section)\n }\n }\n\n const computeServices = [\n ...(serviceIndex[\"image\"]?.[\"glance\"]\n ? [\n {\n service: \"images\",\n label: t`Images`,\n to: \"/projects/$projectId/compute/images\" as const,\n params: { projectId },\n },\n ]\n : []),\n ...(serviceIndex?.[\"compute\"]?.[\"nova\"]\n ? [\n {\n service: \"flavors\",\n label: t`Flavors`,\n to: \"/projects/$projectId/compute/flavors\" as const,\n params: { projectId },\n },\n ]\n : []),\n ]\n\n const networkServices = [\n ...(serviceIndex[\"network\"]\n ? [\n {\n service: \"securitygroups\",\n label: t`Security Groups`,\n to: \"/projects/$projectId/network/securitygroups\" as const,\n params: { projectId },\n },\n {\n service: \"floatingips\",\n label: t`Floating IPs`,\n to: \"/projects/$projectId/network/floatingips\" as const,\n params: { projectId },\n },\n ]\n : []),\n ]\n\n const storageServices = [\n ...(serviceIndex?.[\"object-store\"]?.[\"swift\"]\n ? [\n {\n service: \"containers\",\n label: t`Object Storage (Swift)`,\n to: \"/projects/$projectId/storage/$provider/containers\" as const,\n params: { projectId, provider: \"swift\" },\n },\n ]\n : []),\n {\n service: \"ceph-containers\",\n label: t`Object Storage (Ceph)`,\n to: \"/projects/$projectId/storage/$provider/containers\" as const,\n params: { projectId, provider: \"ceph\" },\n },\n ]\n\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n const clavisServices = [\n ...(pcaServices\n ? [\n {\n service: \"pca\",\n label: t`PCA (Clavis)`,\n to: \"/projects/$projectId/services/pca\" as const,\n params: { projectId },\n },\n ]\n : []),\n ]\n\n return (\n <SideNavigation ariaLabel=\"Project Side Navigation\">\n <>\n <SideNavigationList>\n <>\n <SideNavigationItem\n icon=\"home\"\n label={projectName}\n onClick={() => navigate({ to: \"/projects/$projectId\", params: { projectId } })}\n selected={isOverviewActive}\n />\n {/* onClickCapture fires before Juno's chevron stopPropagation, keeping our state in sync */}\n <div onClickCapture={handleSectionClick(\"compute\")}>\n <SideNavigationItem key={sectionKeys.compute} label={t`Compute`} open={openSections.compute}>\n {computeServices.map(({ service, label, to, params }) => (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={activeSection === \"compute\" && activeService === service}\n />\n ))}\n </SideNavigationItem>\n </div>\n\n {networkServices.length > 0 && (\n <div onClickCapture={handleSectionClick(\"network\")}>\n <SideNavigationItem key={sectionKeys.network} label={t`Network`} open={openSections.network}>\n {networkServices.map(({ service, label, to, params }) => (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={activeSection === \"network\" && activeService === service}\n />\n ))}\n </SideNavigationItem>\n </div>\n )}\n\n {storageServices.length > 0 && (\n <div onClickCapture={handleSectionClick(\"storage\")}>\n <SideNavigationItem key={sectionKeys.storage} label={t`Storage`} open={openSections.storage}>\n {storageServices.map(({ service, label, to, params }) => {\n // For storage services with provider param, match against current provider\n const isStorageContainers = activeSection === \"storage\" && activeService === \"containers\"\n const isSelected = isStorageContainers ? params.provider === provider : activeService === service\n\n return (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={isSelected}\n />\n )\n })}\n </SideNavigationItem>\n </div>\n )}\n\n {clavisServices.length > 0 && (\n <div onClickCapture={handleSectionClick(\"services\")}>\n <SideNavigationItem key={sectionKeys.services} label={t`Services`} open={openSections.services}>\n {clavisServices.map(({ service, label, to, params }) => (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={activeSection === \"services\" && activeService === service}\n />\n ))}\n </SideNavigationItem>\n </div>\n )}\n </>\n </SideNavigationList>\n {slots?.sideNavBanner && <Slot component={slots.sideNavBanner} />}\n </>\n </SideNavigation>\n )\n}\n","import { Breadcrumb, BreadcrumbItem, KnownIcons } from \"@cloudoperators/juno-ui-components\"\nimport { useMatches, useNavigate, useParams } from \"@tanstack/react-router\"\nimport { useMemo } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { isRouteInfo, CrumbLabelKey } from \"@/client/routes/routeInfo\"\n\ninterface ProjectInfoBoxProps {\n projectInfo: {\n id: string\n name: string\n description?: string\n domain?: {\n name?: string\n }\n }\n}\n\nexport function ProjectInfoBox({ projectInfo }: ProjectInfoBoxProps) {\n const { t } = useLingui()\n const navigate = useNavigate()\n const matches = useMatches()\n const { projectId } = useParams({ strict: false }) as { projectId: string }\n\n const breadcrumbs = useMemo(() => {\n const crumbLabels: Record<CrumbLabelKey, string> = {\n Compute: t`Compute`,\n Network: t`Network`,\n Storage: t`Storage`,\n Services: t`Services`,\n Images: t`Images`,\n Flavors: t`Flavors`,\n \"Security Groups\": t`Security Groups`,\n \"Floating IPs\": t`Floating IPs`,\n \"PCA (Clavis)\": t`PCA (Clavis)`,\n }\n\n const resolveProviderLabel = (provider: string | undefined) => {\n if (provider === \"swift\") return t`Object Storage (Swift)`\n if (provider === \"ceph\") return t`Object Storage (Ceph)`\n return t`Storage`\n }\n\n const items: Array<{ label?: string; icon?: KnownIcons; onClick?: () => void; active?: boolean }> = []\n\n items.push({ icon: \"home\", label: t`Home`, onClick: () => navigate({ to: \"/projects\" }) })\n\n if (projectInfo.domain?.name) {\n items.push({ label: projectInfo.domain.name })\n }\n\n items.push({\n label: projectInfo.name,\n onClick: () => navigate({ to: \"/projects/$projectId\", params: { projectId } }),\n })\n\n const projectMatches = matches.filter(\n (m) => m.routeId !== \"/_auth/projects/$projectId\" && m.routeId.startsWith(\"/_auth/projects/$projectId\")\n )\n const deepest = projectMatches[projectMatches.length - 1]\n if (!deepest) return items\n\n const info = isRouteInfo(deepest.staticData) ? deepest.staticData : undefined\n if (!info) return items\n\n const params = deepest.params as Record<string, string>\n\n if (info.sectionCrumb) {\n const { labelKey, to } = info.sectionCrumb\n const label = labelKey ? crumbLabels[labelKey] : undefined\n const isLeaf = !info.crumb\n items.push(\n to\n ? { label, onClick: () => navigate({ to: to as never, params: params as never }) }\n : { label, active: isLeaf }\n )\n }\n\n if (info.crumb) {\n const { labelKey, to, useParamAsLabel } = info.crumb\n const resolvedLabel = useParamAsLabel\n ? resolveProviderLabel(params[useParamAsLabel])\n : labelKey\n ? crumbLabels[labelKey]\n : undefined\n\n if (info.isDetail) {\n items.push({ label: resolvedLabel, onClick: () => navigate({ to: to as never, params: params as never }) })\n const title = deepest.meta?.find((m) => m != null && \"title\" in m)?.title as string | undefined\n if (title) items.push({ label: title, active: true })\n } else {\n items.push(\n to\n ? { label: resolvedLabel, onClick: () => navigate({ to: to as never, params: params as never }) }\n : { label: resolvedLabel, active: true }\n )\n }\n }\n\n return items\n }, [matches, projectInfo, projectId, navigate, t])\n\n return (\n <Breadcrumb className=\"relative z-1 mt-8 mb-4\">\n {breadcrumbs.map((item, index) => (\n <BreadcrumbItem key={index} label={item.label} icon={item.icon} onClick={item.onClick} active={item.active} />\n ))}\n </Breadcrumb>\n )\n}\n","import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { t as e } from "./RouteError-pDEWC_k7.mjs";
1
+ import { t as e } from "./RouteError-CUj_m3gu.mjs";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/client/routes/_auth/projects/$projectId.tsx?tsr-split=errorComponent
4
- var n = ({ error: n }) => /* @__PURE__ */ t(e, { error: n });
4
+ var n = ({ error: n }) => /*#__PURE__*/ t(e, { error: n });
5
5
  //#endregion
6
6
  export { n as errorComponent };
7
7
 
8
- //# sourceMappingURL=_projectId-OW2xkK43.mjs.map
8
+ //# sourceMappingURL=_projectId-Dhb4AyBD.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_projectId-OW2xkK43.mjs","names":["RouteError","SplitErrorComponent","error","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";;;AAIiE,IAAAC,KAI9C,EAAEC,eACV,kBAAC,GAAA,EAAkBA,UAAAA,CAAAA"}
1
+ {"version":3,"file":"_projectId-Dhb4AyBD.mjs","names":["RouteError","SplitErrorComponent","error","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";;;AAIiE,IAAAC,KAI9C,EAAEC,eACV,gBAAC,GAAA,EAAkBA,SAAAA,CAAAA"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./helpers--JWXi40U.mjs";
1
+ import { t as e } from "./helpers-1PpYf-fC.mjs";
2
2
  import { createFileRoute as t, lazyRouteComponent as n, redirect as r } from "@tanstack/react-router";
3
3
  var i = t("/_auth/projects/$projectId/network/securitygroups/$securityGroupId/")({
4
4
  staticData: {
@@ -19,7 +19,7 @@ var i = t("/_auth/projects/$projectId/network/securitygroups/$securityGroupId/")
19
19
  return { sgTitle: n?.name || n?.id || null };
20
20
  },
21
21
  head: ({ loaderData: e }) => ({ meta: [{ title: e?.sgTitle ?? "Security Group" }] }),
22
- component: n(() => import("./_securityGroupId-gbUnd5Wv.mjs"), "component"),
22
+ component: n(() => import("./_securityGroupId-DroYG6cA.mjs"), "component"),
23
23
  beforeLoad: async ({ context: t, params: n }) => {
24
24
  let { trpcClient: i } = t, a = e(await i?.auth.getAvailableServices.query() || []);
25
25
  if (!a.network || !a.network.neutron) throw r({
@@ -31,4 +31,4 @@ var i = t("/_auth/projects/$projectId/network/securitygroups/$securityGroupId/")
31
31
  //#endregion
32
32
  export { i as t };
33
33
 
34
- //# sourceMappingURL=_securityGroupId-B0llWH9A.mjs.map
34
+ //# sourceMappingURL=_securityGroupId-CR1mKICQ.mjs.map