@cobaltcore-dev/aurora 0.2.2 → 0.3.1

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 (130) hide show
  1. package/dist/client/AuroraApp.d.ts +10 -0
  2. package/dist/client/{ContentHeader-DtBiIwRY.mjs → ContentHeader-BXZoN3B9.mjs} +15 -15
  3. package/dist/client/{ContentHeader-DtBiIwRY.mjs.map → ContentHeader-BXZoN3B9.mjs.map} +1 -1
  4. package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs → DeleteFlavorModal-BusYn32r.mjs} +148 -148
  5. package/dist/client/{DeleteFlavorModal-rmuYIafD.mjs.map → DeleteFlavorModal-BusYn32r.mjs.map} +1 -1
  6. package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs → EditSecurityGroupModal-Dl6m7wUe.mjs} +16 -16
  7. package/dist/client/{EditSecurityGroupModal-B7Sz9puM.mjs.map → EditSecurityGroupModal-Dl6m7wUe.mjs.map} +1 -1
  8. package/dist/client/FiltersInput-BgNaHFBt.mjs +81 -0
  9. package/dist/client/FiltersInput-BgNaHFBt.mjs.map +1 -0
  10. package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs → FloatingIpActionModals-By2hXR9m.mjs} +51 -51
  11. package/dist/client/{FloatingIpActionModals-CfRJiZqD.mjs.map → FloatingIpActionModals-By2hXR9m.mjs.map} +1 -1
  12. package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs → ImageToastNotifications-fHI8jB2j.mjs} +369 -369
  13. package/dist/client/{ImageToastNotifications-Cw30RXsw.mjs.map → ImageToastNotifications-fHI8jB2j.mjs.map} +1 -1
  14. package/dist/client/ListToolbar-BvtCo8dk.mjs +129 -0
  15. package/dist/client/ListToolbar-BvtCo8dk.mjs.map +1 -0
  16. package/dist/client/{RouteError-Cyto623-.mjs → RouteError-pDEWC_k7.mjs} +2 -2
  17. package/dist/client/{RouteError-Cyto623-.mjs.map → RouteError-pDEWC_k7.mjs.map} +1 -1
  18. package/dist/client/SortInput-DXWSqSny.mjs +34 -0
  19. package/dist/client/SortInput-DXWSqSny.mjs.map +1 -0
  20. package/dist/client/{_flavorId-B-1fYadl.mjs → _flavorId-BRonXvCo.mjs} +46 -46
  21. package/dist/client/_flavorId-BRonXvCo.mjs.map +1 -0
  22. package/dist/client/{_flavorId-BYfIHIV_.mjs → _flavorId-BoNcxYmF.mjs} +10 -10
  23. package/dist/client/_flavorId-BoNcxYmF.mjs.map +1 -0
  24. package/dist/client/_floatingIpId-BpUfL8Im2.mjs +228 -0
  25. package/dist/client/_floatingIpId-BpUfL8Im2.mjs.map +1 -0
  26. package/dist/client/{_floatingIpId-IrnN-ozB.mjs → _floatingIpId-CwHiXazi.mjs} +2 -2
  27. package/dist/client/{_floatingIpId-IrnN-ozB.mjs.map → _floatingIpId-CwHiXazi.mjs.map} +1 -1
  28. package/dist/client/{_imageId-Tx_9bqEc.mjs → _imageId-CdOOJjw0.mjs} +158 -158
  29. package/dist/client/_imageId-CdOOJjw0.mjs.map +1 -0
  30. package/dist/client/{_pcaId-CFuKY82d.mjs → _pcaId-CwlH1Kvl.mjs} +132 -132
  31. package/dist/client/{_pcaId-CFuKY82d.mjs.map → _pcaId-CwlH1Kvl.mjs.map} +1 -1
  32. package/dist/client/{_pcaId-Bck7S7gJ.mjs → _pcaId-D1ZEaCdp.mjs} +2 -2
  33. package/dist/client/{_pcaId-Bck7S7gJ.mjs.map → _pcaId-D1ZEaCdp.mjs.map} +1 -1
  34. package/dist/client/_projectId-D1gGribM.mjs +316 -0
  35. package/dist/client/_projectId-D1gGribM.mjs.map +1 -0
  36. package/dist/client/{_projectId-PSpuCKO7.mjs → _projectId-DhLpIalx.mjs} +9 -9
  37. package/dist/client/{_projectId-PSpuCKO7.mjs.map → _projectId-DhLpIalx.mjs.map} +1 -1
  38. package/dist/client/{_projectId-B1VjDd0Z.mjs → _projectId-Dj_InfSc.mjs} +3 -3
  39. package/dist/client/{_projectId-B1VjDd0Z.mjs.map → _projectId-Dj_InfSc.mjs.map} +1 -1
  40. package/dist/client/{_projectId-Pxp-RXK4.mjs → _projectId-OW2xkK43.mjs} +2 -2
  41. package/dist/client/{_projectId-Pxp-RXK4.mjs.map → _projectId-OW2xkK43.mjs.map} +1 -1
  42. package/dist/client/{_securityGroupId-VV2lUcGQ.mjs → _securityGroupId-B0llWH9A.mjs} +2 -2
  43. package/dist/client/{_securityGroupId-VV2lUcGQ.mjs.map → _securityGroupId-B0llWH9A.mjs.map} +1 -1
  44. package/dist/client/{_securityGroupId-Dqi6ddw4.mjs → _securityGroupId-gbUnd5Wv.mjs} +363 -363
  45. package/dist/client/{_securityGroupId-Dqi6ddw4.mjs.map → _securityGroupId-gbUnd5Wv.mjs.map} +1 -1
  46. package/dist/client/{about-B2AzqxFI.mjs → about-DCe6LsKz.mjs} +8 -8
  47. package/dist/client/{about-B2AzqxFI.mjs.map → about-DCe6LsKz.mjs.map} +1 -1
  48. package/dist/client/{build-Cf7iWbpH.mjs → build-BJDfnAyi.mjs} +1573 -1564
  49. package/dist/client/{build-Cf7iWbpH.mjs.map → build-BJDfnAyi.mjs.map} +1 -1
  50. package/dist/client/{buildFilterParams-ngVK3ybs.mjs → buildFilterParams-By33pG59.mjs} +1 -1
  51. package/dist/client/{buildFilterParams-ngVK3ybs.mjs.map → buildFilterParams-By33pG59.mjs.map} +1 -1
  52. package/dist/client/{constants-CCgR6fKI.mjs → constants-CAjjRTo_.mjs} +9 -9
  53. package/dist/client/{constants-CCgR6fKI.mjs.map → constants-CAjjRTo_.mjs.map} +1 -1
  54. package/dist/client/{containers-BWERuY0O.mjs → containers-BuXUVb1N.mjs} +811 -811
  55. package/dist/client/{containers-BWERuY0O.mjs.map → containers-BuXUVb1N.mjs.map} +1 -1
  56. package/dist/client/{containers-Cs5vOeR2.mjs → containers-Ca5V1EBS.mjs} +1 -1
  57. package/dist/client/containers-Ca5V1EBS.mjs.map +1 -0
  58. package/dist/client/{containers-DovytjVP.mjs → containers-NW7RnHTI.mjs} +6 -6
  59. package/dist/client/containers-NW7RnHTI.mjs.map +1 -0
  60. package/dist/client/flavors-BXPYAFyQ.mjs.map +1 -1
  61. package/dist/client/{flavors-CUiALHcB.mjs → flavors-D8oElC2K.mjs} +2 -2
  62. package/dist/client/{flavors-CUiALHcB.mjs.map → flavors-D8oElC2K.mjs.map} +1 -1
  63. package/dist/client/flavors-qvgPSI7J.mjs +613 -0
  64. package/dist/client/flavors-qvgPSI7J.mjs.map +1 -0
  65. package/dist/client/{floatingips-BrjDiY2t.mjs → floatingips-Be3zLoaD.mjs} +126 -126
  66. package/dist/client/{floatingips-BrjDiY2t.mjs.map → floatingips-Be3zLoaD.mjs.map} +1 -1
  67. package/dist/client/{images-BZP3pBqj.mjs → images-BiEBENaj.mjs} +2 -2
  68. package/dist/client/{images-BZP3pBqj.mjs.map → images-BiEBENaj.mjs.map} +1 -1
  69. package/dist/client/images-CCYBAphP2.mjs +1900 -0
  70. package/dist/client/images-CCYBAphP2.mjs.map +1 -0
  71. package/dist/client/images-DM9I8G0p.mjs.map +1 -1
  72. package/dist/client/index.d.ts +2 -1
  73. package/dist/client/index.js +410 -412
  74. package/dist/client/index.js.map +1 -1
  75. package/dist/client/{network-SCVadZsv.mjs → network-nbSbl0X0.mjs} +1 -1
  76. package/dist/client/{network-SCVadZsv.mjs.map → network-nbSbl0X0.mjs.map} +1 -1
  77. package/dist/client/{objects-D4zBka5e.mjs → objects-CU5ws07o.mjs} +6 -6
  78. package/dist/client/objects-CU5ws07o.mjs.map +1 -0
  79. package/dist/client/objects-FXN0VWLI.mjs +4760 -0
  80. package/dist/client/{objects-Cw4Vu01M.mjs.map → objects-FXN0VWLI.mjs.map} +1 -1
  81. package/dist/client/{objects-B4yrYf_a.mjs → objects-GmuIOaHd.mjs} +1 -1
  82. package/dist/client/objects-GmuIOaHd.mjs.map +1 -0
  83. package/dist/client/{overview-BtIXpYBo.mjs → overview-B3gdnWTG.mjs} +2 -2
  84. package/dist/client/{overview-BtIXpYBo.mjs.map → overview-B3gdnWTG.mjs.map} +1 -1
  85. package/dist/client/{overview-2J54-loz.mjs → overview-DzYBiNfD.mjs} +2 -2
  86. package/dist/client/{overview-2J54-loz.mjs.map → overview-DzYBiNfD.mjs.map} +1 -1
  87. package/dist/client/{overview-D0AAvsmL.mjs → overview-EhfPY8Je.mjs} +2 -2
  88. package/dist/client/{overview-D0AAvsmL.mjs.map → overview-EhfPY8Je.mjs.map} +1 -1
  89. package/dist/client/{overview-BnmukbFh.mjs → overview-XueZI4LQ.mjs} +7 -7
  90. package/dist/client/{overview-BnmukbFh.mjs.map → overview-XueZI4LQ.mjs.map} +1 -1
  91. package/dist/client/{pca-BqZycwCu.mjs → pca-DSM71LhW.mjs} +2 -2
  92. package/dist/client/{pca-BqZycwCu.mjs.map → pca-DSM71LhW.mjs.map} +1 -1
  93. package/dist/client/{pca-V2aaOxZA.mjs → pca-x9if8xU-.mjs} +59 -59
  94. package/dist/client/{pca-V2aaOxZA.mjs.map → pca-x9if8xU-.mjs.map} +1 -1
  95. package/dist/client/{projects-jyIHL6DE.mjs → projects-B6BPo2Ar.mjs} +2 -2
  96. package/dist/client/projects-B6BPo2Ar.mjs.map +1 -0
  97. package/dist/client/{projects-BsN4bvU2.mjs → projects-BilrmHLu.mjs} +1 -1
  98. package/dist/client/projects-BilrmHLu.mjs.map +1 -0
  99. package/dist/client/{projects-0feOw_b6.mjs → projects-Bt0XptpG.mjs} +2 -2
  100. package/dist/client/projects-Bt0XptpG.mjs.map +1 -0
  101. package/dist/client/projects-CnmZIB2Q.mjs +95 -0
  102. package/dist/client/projects-CnmZIB2Q.mjs.map +1 -0
  103. package/dist/client/{securitygroups-B4MkSBtI.mjs → securitygroups-BdzieS7Z.mjs} +121 -121
  104. package/dist/client/{securitygroups-B4MkSBtI.mjs.map → securitygroups-BdzieS7Z.mjs.map} +1 -1
  105. package/dist/client/{useListWithFiltering-CEDh1LO-.mjs → useListWithFiltering-CqQbAjEe.mjs} +1 -1
  106. package/dist/client/{useListWithFiltering-CEDh1LO-.mjs.map → useListWithFiltering-CqQbAjEe.mjs.map} +1 -1
  107. package/package.json +2 -2
  108. package/dist/client/ListToolbar-DuazvsAu.mjs +0 -223
  109. package/dist/client/ListToolbar-DuazvsAu.mjs.map +0 -1
  110. package/dist/client/_flavorId-B-1fYadl.mjs.map +0 -1
  111. package/dist/client/_flavorId-BYfIHIV_.mjs.map +0 -1
  112. package/dist/client/_floatingIpId-FQ5P2qMV.mjs +0 -228
  113. package/dist/client/_floatingIpId-FQ5P2qMV.mjs.map +0 -1
  114. package/dist/client/_imageId-Tx_9bqEc.mjs.map +0 -1
  115. package/dist/client/_projectId-Bs4W9hos.mjs +0 -283
  116. package/dist/client/_projectId-Bs4W9hos.mjs.map +0 -1
  117. package/dist/client/containers-Cs5vOeR2.mjs.map +0 -1
  118. package/dist/client/containers-DovytjVP.mjs.map +0 -1
  119. package/dist/client/flavors-Bovz-I2U.mjs +0 -565
  120. package/dist/client/flavors-Bovz-I2U.mjs.map +0 -1
  121. package/dist/client/images-DaaCUXMI.mjs +0 -1797
  122. package/dist/client/images-DaaCUXMI.mjs.map +0 -1
  123. package/dist/client/objects-B4yrYf_a.mjs.map +0 -1
  124. package/dist/client/objects-Cw4Vu01M.mjs +0 -4760
  125. package/dist/client/objects-D4zBka5e.mjs.map +0 -1
  126. package/dist/client/projects-0feOw_b6.mjs.map +0 -1
  127. package/dist/client/projects-BsN4bvU2.mjs.map +0 -1
  128. package/dist/client/projects-C1IYOvFQ.mjs +0 -144
  129. package/dist/client/projects-C1IYOvFQ.mjs.map +0 -1
  130. package/dist/client/projects-jyIHL6DE.mjs.map +0 -1
@@ -5,4 +5,4 @@ var n = () => /* @__PURE__ */ e("p", { children: /* @__PURE__ */ e(t, { id: "FRt
5
5
  //#endregion
6
6
  export { n as notFoundComponent };
7
7
 
8
- //# sourceMappingURL=objects-B4yrYf_a.mjs.map
8
+ //# sourceMappingURL=objects-GmuIOaHd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects-GmuIOaHd.mjs","names":["Trans","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { createFileRoute, redirect, useParams } from \"@tanstack/react-router\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { ObjectBrowserView } from \"../../../../-components/Ceph/Objects\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nexport const checkServiceAvailability = (\n availableServices: {\n type: string\n name: string\n }[],\n params: {\n projectId: string\n provider: string\n containerName: string\n }\n) => {\n const { provider, projectId, containerName } = params\n\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect to the \"Projects Overview\" page if no storage services available\n if (!serviceIndex[\"object-store\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n // Check provider availability\n const hasSwift = Boolean(serviceIndex[\"object-store\"][\"swift\"])\n const hasCeph = Boolean(serviceIndex[\"object-store\"][\"ceph\"])\n\n // TEMPORARY: Allow Ceph access even if not in catalog (relies on env config)\n // TODO: Properly register Ceph in OpenStack service catalog\n const cephFallbackEnabled = true // Set to false once Ceph is in catalog\n\n // Effective availability includes fallback flag for Ceph\n const hasEffectiveCeph = hasCeph || cephFallbackEnabled\n const fallbackProvider = hasSwift ? \"swift\" : hasEffectiveCeph ? \"ceph\" : null\n\n if (provider !== \"swift\" && provider !== \"ceph\") {\n if (!fallbackProvider) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/containers/$containerName/objects\",\n params: { projectId, provider: fallbackProvider, containerName },\n })\n }\n\n if (provider === \"swift\" && !hasSwift) {\n if (!hasEffectiveCeph) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/containers/$containerName/objects\",\n params: { projectId, provider: \"ceph\", containerName },\n })\n }\n\n if (provider === \"ceph\" && !hasEffectiveCeph) {\n if (!hasSwift) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/containers/$containerName/objects\",\n params: { projectId, provider: \"swift\", containerName },\n })\n }\n}\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\nconst objectsSearchSchema = z.object({\n prefix: z.string().optional(),\n sortBy: z.enum([\"name\", \"last_modified\", \"bytes\", \"lastModified\", \"size\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/\")(\n {\n staticData: {\n section: \"storage\",\n service: \"containers\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\", to: \"/projects/$projectId/storage/$provider/containers\" },\n } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: () => {\n return (\n <p>\n <Trans>Storage container not found</Trans>\n </p>\n )\n },\n loader: async ({ context }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n\n return {\n client: trpcClient,\n availableServices,\n }\n },\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n checkServiceAvailability(availableServices!, params)\n },\n }\n)\n\nfunction ObjectsDashboard() {\n const { project, provider, containerName } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/containers/$containerName/objects/\",\n select: (params) => ({\n project: params.projectId,\n provider: params.provider,\n containerName: params.containerName,\n }),\n })\n\n const { prefix, sortBy, sortDirection, search } = Route.useSearch()\n\n return (\n <div>\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider, containerName, prefix, sortBy, sortDirection, search]}\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Error loading component</Trans>\n </div>\n }\n >\n {(() => {\n switch (provider) {\n case \"swift\":\n return <SwiftObjects />\n case \"ceph\":\n return <ObjectBrowserView 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"],"mappings":";;;AA0FA,IAAAC,UA0BQ,kBAAC,KAAA,EAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- import { O as e } from "./build-Cf7iWbpH.mjs";
1
+ import { j as e } from "./build-BJDfnAyi.mjs";
2
2
  import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
3
  import { Trans as i, useLingui as a } from "@lingui/react";
4
4
  //#region src/client/routes/_auth/projects/$projectId/network/overview.tsx?tsr-split=component
@@ -12,4 +12,4 @@ function o() {
12
12
  //#endregion
13
13
  export { o as component };
14
14
 
15
- //# sourceMappingURL=overview-BtIXpYBo.mjs.map
15
+ //# sourceMappingURL=overview-B3gdnWTG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"overview-BtIXpYBo.mjs","names":["useLingui","Trans","ContentHeading","RouteComponent","t","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/overview.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/overview\")({\n staticData: { section: \"network\", service: \"overview\", crumb: { labelKey: \"Network\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Network Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Network Overview`}</ContentHeading>\n <div className=\"p-4 text-center\">\n <Trans>Network Overview</Trans>\n </div>\n </>\n )\n}\n"],"mappings":";;;;AAYA,SAASG,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQH,GAAAA;AACd,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA,EAAA,UAAgBI,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAClB,kBAAC,OAAA;EAAI,WAAU;YACb,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
1
+ {"version":3,"file":"overview-B3gdnWTG.mjs","names":["useLingui","Trans","ContentHeading","RouteComponent","t","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/overview.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/overview\")({\n staticData: { section: \"network\", service: \"overview\", crumb: { labelKey: \"Network\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Network Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Network Overview`}</ContentHeading>\n <div className=\"p-4 text-center\">\n <Trans>Network Overview</Trans>\n </div>\n </>\n )\n}\n"],"mappings":";;;;AAYA,SAASG,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQH,GAAAA;AACd,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA,EAAA,UAAgBI,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAClB,kBAAC,OAAA;EAAI,WAAU;YACb,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- import { O as e } from "./build-Cf7iWbpH.mjs";
1
+ import { j as e } from "./build-BJDfnAyi.mjs";
2
2
  import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
3
  import { Trans as i, useLingui as a } from "@lingui/react";
4
4
  //#region src/client/routes/_auth/projects/$projectId/services/overview.tsx?tsr-split=component
@@ -12,4 +12,4 @@ function o() {
12
12
  //#endregion
13
13
  export { o as component };
14
14
 
15
- //# sourceMappingURL=overview-2J54-loz.mjs.map
15
+ //# sourceMappingURL=overview-DzYBiNfD.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"overview-2J54-loz.mjs","names":["useLingui","Trans","ContentHeading","RouteComponent","t","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/overview.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { RouteInfo } from \"@/client/routes/routeInfo\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/overview\")({\n staticData: { section: \"services\", service: \"overview\", crumb: { labelKey: \"Services\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Services Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Services Overview`}</ContentHeading>\n <div className=\"p-4 text-center\">\n <Trans>Services Overview</Trans>\n </div>\n </>\n )\n}\n"],"mappings":";;;;AAYA,SAASG,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQH,GAAAA;AACd,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA,EAAA,UAAgBI,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAClB,kBAAC,OAAA;EAAI,WAAU;YACb,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
1
+ {"version":3,"file":"overview-DzYBiNfD.mjs","names":["useLingui","Trans","ContentHeading","RouteComponent","t","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/overview.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { RouteInfo } from \"@/client/routes/routeInfo\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/overview\")({\n staticData: { section: \"services\", service: \"overview\", crumb: { labelKey: \"Services\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Services Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Services Overview`}</ContentHeading>\n <div className=\"p-4 text-center\">\n <Trans>Services Overview</Trans>\n </div>\n </>\n )\n}\n"],"mappings":";;;;AAYA,SAASG,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQH,GAAAA;AACd,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA,EAAA,UAAgBI,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAClB,kBAAC,OAAA;EAAI,WAAU;YACb,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
@@ -7,9 +7,9 @@ var r = e("/_auth/projects/$projectId/compute/overview")({
7
7
  crumb: { labelKey: "Compute" }
8
8
  },
9
9
  head: () => ({ meta: [{ title: n._({ id: "grs4+e" }) }] }),
10
- component: t(() => import("./overview-BnmukbFh.mjs"), "component")
10
+ component: t(() => import("./overview-XueZI4LQ.mjs"), "component")
11
11
  });
12
12
  //#endregion
13
13
  export { r as t };
14
14
 
15
- //# sourceMappingURL=overview-D0AAvsmL.mjs.map
15
+ //# sourceMappingURL=overview-EhfPY8Je.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"overview-D0AAvsmL.mjs","names":["createFileRoute","t","Route","staticData","section","service","crumb","labelKey","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/overview.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Overview } from \"./-components/Overview\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/overview\")({\n staticData: { section: \"compute\", service: \"overview\", crumb: { labelKey: \"Compute\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Compute Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeading>{t`Compute Overview`}</ContentHeading>\n <Overview project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":";;AAOA,IAAaE,IAAQF,EAAgB,8CAAA,CAA+C;CAClFG,YAAY;EAAEC,SAAS;EAAWC,SAAS;EAAYC,OAAO,EAAEC,UAAU,WAAU;EAAE;CACtFE,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOV,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAmB,CAAC,EAAE;CACtDW,WAASC,2CAAA,YAAA;CACX,CAAA"}
1
+ {"version":3,"file":"overview-EhfPY8Je.mjs","names":["createFileRoute","t","Route","staticData","section","service","crumb","labelKey","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/overview.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Overview } from \"./-components/Overview\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/overview\")({\n staticData: { section: \"compute\", service: \"overview\", crumb: { labelKey: \"Compute\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Compute Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeading>{t`Compute Overview`}</ContentHeading>\n <Overview project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":";;AAOA,IAAaE,IAAQF,EAAgB,8CAAA,CAA+C;CAClFG,YAAY;EAAEC,SAAS;EAAWC,SAAS;EAAYC,OAAO,EAAEC,UAAU,WAAU;EAAE;CACtFE,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOV,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAmB,CAAC,EAAE;CACtDW,WAASC,2CAAA,YAAA;CACX,CAAA"}
@@ -1,5 +1,5 @@
1
- import { $ as e, O as t } from "./build-Cf7iWbpH.mjs";
2
- import { t as n } from "./overview-D0AAvsmL.mjs";
1
+ import { j as e, nt as t } from "./build-BJDfnAyi.mjs";
2
+ import { t as n } from "./overview-EhfPY8Je.mjs";
3
3
  import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
4
4
  import { Suspense as o, use as s } from "react";
5
5
  import { Trans as c, useLingui as l } from "@lingui/react";
@@ -56,11 +56,11 @@ var u = ({ progress: e, color: t, size: n = 100, strokeWidth: r = 8, label: o, v
56
56
  });
57
57
  };
58
58
  function d({ activityData: n }) {
59
- return /* @__PURE__ */ a(e, {
59
+ return /* @__PURE__ */ a(t, {
60
60
  distribution: "center",
61
61
  alignment: "center",
62
62
  direction: "vertical",
63
- children: [/* @__PURE__ */ i(t, {
63
+ children: [/* @__PURE__ */ i(e, {
64
64
  className: "my-6 text-xl font-semibold",
65
65
  children: "Activity Summary"
66
66
  }), /* @__PURE__ */ a("div", {
@@ -161,8 +161,8 @@ function p({ client: e, project: t }) {
161
161
  //#endregion
162
162
  //#region src/client/routes/_auth/projects/$projectId/compute/overview.tsx?tsr-split=component
163
163
  function m() {
164
- let { i18n: e, _: o } = l(), { projectId: s } = n.useParams(), { trpcClient: c } = n.useRouteContext();
165
- return /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i(t, { children: e._({ id: "grs4+e" }) }), /* @__PURE__ */ i(p, {
164
+ let { i18n: t, _: o } = l(), { projectId: s } = n.useParams(), { trpcClient: c } = n.useRouteContext();
165
+ return /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i(e, { children: t._({ id: "grs4+e" }) }), /* @__PURE__ */ i(p, {
166
166
  project: s,
167
167
  client: c
168
168
  })] });
@@ -170,4 +170,4 @@ function m() {
170
170
  //#endregion
171
171
  export { m as component };
172
172
 
173
- //# sourceMappingURL=overview-BnmukbFh.mjs.map
173
+ //# sourceMappingURL=overview-XueZI4LQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"overview-BnmukbFh.mjs","names":["ContentHeading","Stack","React","ActivityRing","progress","color","size","strokeWidth","label","value","radius","normalizedRadius","circumference","Math","PI","strokeDashoffset","div","className","style","position","width","height","svg","transform","circle","stroke","fill","r","cx","cy","strokeDasharray","strokeLinecap","top","left","textAlign","ActivitySummary","activityData","distribution","alignment","direction","instances","current","quota","total","cpu","percentage","memory","storage","ActivitySummary","Suspense","use","OverviewContainer","getDataPromise","servers","imagesResponse","images","div","className","activeServers","filter","server","status","length","totalServers","estimatedServerQuota","Math","max","ceil","totalCores","usedMemoryMB","totalDiskGB","forEach","flavor","vcpus","smallestSize","name","includes","ram","disk","activeImages","image","totalImages","cpuPercentage","min","round","memoryPercentage","storagePercentage","activityData","instances","current","total","quota","color","cpu","percentage","cores","memory","usedMB","storage","sizeGB","active","Overview","client","project","Promise","all","compute","getServersByProjectId","query","project_id","listImagesWithSearch","fallback","useLingui","Overview","ContentHeading","Route","RouteComponent","t","projectId","useParams","trpcClient","useRouteContext","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/-components/ActivitySummary.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Overview.tsx","../../src/client/routes/_auth/projects/$projectId/compute/overview.tsx?tsr-split=component"],"sourcesContent":["import { ContentHeading, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport React from \"react\"\n\ninterface ActivityRingProps {\n progress: number // Progress percentage (0-100)\n color: string // Color of the ring\n size?: number // Size of the ring (default: 100)\n strokeWidth?: number // Width of the stroke (default: 8)\n label: string // Label for the ring\n value: string // Value to display inside the ring\n}\n// Activity ring component inspired by Apple's activity rings\nconst ActivityRing = ({ progress, color, size = 100, strokeWidth = 8, label, value }: ActivityRingProps) => {\n const radius = size / 2\n const normalizedRadius = radius - strokeWidth / 2\n const circumference = normalizedRadius * 2 * Math.PI\n const strokeDashoffset = circumference - (progress / 100) * circumference\n\n return (\n <div className=\"flex flex-col items-center justify-center\">\n <div style={{ position: \"relative\", width: size, height: size }}>\n <svg height={size} width={size} style={{ transform: \"rotate(-90deg)\" }}>\n {/* Background circle */}\n <circle\n stroke={`${color}33`}\n fill=\"transparent\"\n strokeWidth={strokeWidth}\n r={normalizedRadius}\n cx={radius}\n cy={radius}\n />\n {/* Progress circle */}\n <circle\n stroke={color}\n fill=\"transparent\"\n strokeWidth={strokeWidth}\n strokeDasharray={circumference + \" \" + circumference}\n style={{ strokeDashoffset }}\n r={normalizedRadius}\n cx={radius}\n cy={radius}\n strokeLinecap=\"round\"\n />\n </svg>\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n textAlign: \"center\",\n }}\n >\n <div className=\"text-xl font-bold text-gray-200\">{value}</div>\n </div>\n </div>\n <div className=\"mt-2 text-sm text-gray-300\">{label}</div>\n </div>\n )\n}\n\n// Interface for activity data props\ninterface ActivityData {\n instances: {\n current: number\n total: number\n quota: number\n color: string\n }\n cpu: {\n percentage: number\n cores: number\n color: string\n }\n memory: {\n percentage: number\n usedMB: number\n color: string\n }\n storage: {\n percentage: number\n sizeGB: number\n color: string\n }\n images: {\n active: number\n total: number\n color: string\n }\n}\n\nexport function ActivitySummary({ activityData }: { activityData: ActivityData }) {\n return (\n <Stack distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <ContentHeading className=\"my-6 text-xl font-semibold\">Activity Summary</ContentHeading>\n <div className=\"flex flex-wrap justify-start gap-16\">\n <ActivityRing\n progress={(activityData.instances.current / activityData.instances.quota) * 100}\n color={activityData.instances.color}\n label=\"Instances\"\n value={`${activityData.instances.current}/${activityData.instances.total}`}\n size={120}\n />\n <ActivityRing\n progress={activityData.cpu.percentage}\n color={activityData.cpu.color}\n label=\"CPU\"\n value={`${activityData.cpu.percentage}%`}\n size={120}\n />\n <ActivityRing\n progress={activityData.memory.percentage}\n color={activityData.memory.color}\n label=\"Memory\"\n value={`${activityData.memory.percentage}%`}\n size={120}\n />\n <ActivityRing\n progress={activityData.storage.percentage}\n color={activityData.storage.color}\n label=\"Storage\"\n value={`${activityData.storage.percentage}%`}\n size={120}\n />\n </div>\n </Stack>\n )\n}\n","import { ActivitySummary } from \"./ActivitySummary\"\nimport { Suspense, use } from \"react\"\nimport { Server } from \"@/server/Compute/types/server\"\nimport { ImagesPaginatedResponse } from \"@/server/Compute/types/image\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface OverviewContainerProps {\n getDataPromise: Promise<[Server[] | undefined, ImagesPaginatedResponse]>\n}\nconst OverviewContainer = ({ getDataPromise }: OverviewContainerProps) => {\n const [servers, imagesResponse] = use(getDataPromise)\n const images = imagesResponse.images\n if (!servers && !images) return <div className=\"p-4 text-center\">No data found</div>\n\n // Calculate server statistics\n const activeServers = servers?.filter((server) => server.status === \"ACTIVE\")?.length || 0\n const totalServers = servers?.length || 0\n const estimatedServerQuota = Math.max(10, Math.ceil(totalServers * 1.5))\n\n // Calculate resource usage based on server flavors\n let totalCores = 0\n let usedMemoryMB = 0\n let totalDiskGB = 0\n\n // Process server data to extract resource usage\n servers?.forEach((server) => {\n // Extract core count from flavor if available\n if (server.flavor && server.flavor.vcpus) {\n totalCores += server.flavor.vcpus\n } else {\n // Fallback estimate based on server name or other heuristics\n const smallestSize = server.name?.includes(\"small\") || server.name?.includes(\"micro\")\n totalCores += smallestSize ? 1 : 2\n }\n\n // Extract memory usage from flavor if available\n if (server.flavor && server.flavor.ram) {\n usedMemoryMB += server.flavor.ram\n } else {\n // Fallback estimate\n usedMemoryMB += 1024 // Assume 1GB per instance as fallback\n }\n\n // Extract disk usage from flavor if available\n if (server.flavor && server.flavor.disk) {\n totalDiskGB += server.flavor.disk\n } else {\n // Fallback estimate\n totalDiskGB += 20 // Assume 20GB per instance as fallback\n }\n })\n\n // Calculate image statistics\n const activeImages = images?.filter((image) => image.status === \"active\")?.length || 0\n const totalImages = images?.length || 0\n\n // Calculate resource percentage utilizations\n const cpuPercentage = Math.min(100, Math.round((totalCores / 32) * 100))\n const memoryPercentage = Math.min(100, Math.round((usedMemoryMB / 131072) * 100))\n const storagePercentage = Math.min(100, Math.round((totalDiskGB / 1024) * 100))\n\n // Prepare data to pass to ActivitySummary\n const activityData = {\n instances: {\n current: activeServers,\n total: totalServers,\n quota: estimatedServerQuota,\n color: \"#FF5733\",\n },\n cpu: {\n percentage: cpuPercentage,\n cores: totalCores,\n color: \"#33A1FD\",\n },\n memory: {\n percentage: memoryPercentage,\n usedMB: usedMemoryMB,\n color: \"#9B59B6\", // Purple color for memory\n },\n storage: {\n percentage: storagePercentage,\n sizeGB: totalDiskGB,\n color: \"#4CAF50\",\n },\n images: {\n active: activeImages,\n total: totalImages,\n color: \"#F1C40F\", // Yellow color for images if you want to use it\n },\n }\n\n return (\n <div className=\"h-full\">\n <ActivitySummary activityData={activityData} />\n </div>\n )\n}\n\ninterface OverviewProps {\n client: TrpcClient\n project: string\n}\n\nexport function Overview({ client, project }: OverviewProps) {\n const getDataPromise = Promise.all([\n client.compute.getServersByProjectId.query({ project_id: project }),\n client.compute.listImagesWithSearch.query({ project_id: project }),\n ])\n\n return (\n <Suspense\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Loading...</Trans>\n </div>\n }\n >\n <OverviewContainer getDataPromise={getDataPromise} />\n </Suspense>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Overview } from \"./-components/Overview\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/overview\")({\n staticData: { section: \"compute\", service: \"overview\", crumb: { labelKey: \"Compute\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Compute Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeading>{t`Compute Overview`}</ContentHeading>\n <Overview project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"overview-XueZI4LQ.mjs","names":["ContentHeading","Stack","React","ActivityRing","progress","color","size","strokeWidth","label","value","radius","normalizedRadius","circumference","Math","PI","strokeDashoffset","div","className","style","position","width","height","svg","transform","circle","stroke","fill","r","cx","cy","strokeDasharray","strokeLinecap","top","left","textAlign","ActivitySummary","activityData","distribution","alignment","direction","instances","current","quota","total","cpu","percentage","memory","storage","ActivitySummary","Suspense","use","OverviewContainer","getDataPromise","servers","imagesResponse","images","div","className","activeServers","filter","server","status","length","totalServers","estimatedServerQuota","Math","max","ceil","totalCores","usedMemoryMB","totalDiskGB","forEach","flavor","vcpus","smallestSize","name","includes","ram","disk","activeImages","image","totalImages","cpuPercentage","min","round","memoryPercentage","storagePercentage","activityData","instances","current","total","quota","color","cpu","percentage","cores","memory","usedMB","storage","sizeGB","active","Overview","client","project","Promise","all","compute","getServersByProjectId","query","project_id","listImagesWithSearch","fallback","useLingui","Overview","ContentHeading","Route","RouteComponent","t","projectId","useParams","trpcClient","useRouteContext","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/-components/ActivitySummary.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Overview.tsx","../../src/client/routes/_auth/projects/$projectId/compute/overview.tsx?tsr-split=component"],"sourcesContent":["import { ContentHeading, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport React from \"react\"\n\ninterface ActivityRingProps {\n progress: number // Progress percentage (0-100)\n color: string // Color of the ring\n size?: number // Size of the ring (default: 100)\n strokeWidth?: number // Width of the stroke (default: 8)\n label: string // Label for the ring\n value: string // Value to display inside the ring\n}\n// Activity ring component inspired by Apple's activity rings\nconst ActivityRing = ({ progress, color, size = 100, strokeWidth = 8, label, value }: ActivityRingProps) => {\n const radius = size / 2\n const normalizedRadius = radius - strokeWidth / 2\n const circumference = normalizedRadius * 2 * Math.PI\n const strokeDashoffset = circumference - (progress / 100) * circumference\n\n return (\n <div className=\"flex flex-col items-center justify-center\">\n <div style={{ position: \"relative\", width: size, height: size }}>\n <svg height={size} width={size} style={{ transform: \"rotate(-90deg)\" }}>\n {/* Background circle */}\n <circle\n stroke={`${color}33`}\n fill=\"transparent\"\n strokeWidth={strokeWidth}\n r={normalizedRadius}\n cx={radius}\n cy={radius}\n />\n {/* Progress circle */}\n <circle\n stroke={color}\n fill=\"transparent\"\n strokeWidth={strokeWidth}\n strokeDasharray={circumference + \" \" + circumference}\n style={{ strokeDashoffset }}\n r={normalizedRadius}\n cx={radius}\n cy={radius}\n strokeLinecap=\"round\"\n />\n </svg>\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n textAlign: \"center\",\n }}\n >\n <div className=\"text-xl font-bold text-gray-200\">{value}</div>\n </div>\n </div>\n <div className=\"mt-2 text-sm text-gray-300\">{label}</div>\n </div>\n )\n}\n\n// Interface for activity data props\ninterface ActivityData {\n instances: {\n current: number\n total: number\n quota: number\n color: string\n }\n cpu: {\n percentage: number\n cores: number\n color: string\n }\n memory: {\n percentage: number\n usedMB: number\n color: string\n }\n storage: {\n percentage: number\n sizeGB: number\n color: string\n }\n images: {\n active: number\n total: number\n color: string\n }\n}\n\nexport function ActivitySummary({ activityData }: { activityData: ActivityData }) {\n return (\n <Stack distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <ContentHeading className=\"my-6 text-xl font-semibold\">Activity Summary</ContentHeading>\n <div className=\"flex flex-wrap justify-start gap-16\">\n <ActivityRing\n progress={(activityData.instances.current / activityData.instances.quota) * 100}\n color={activityData.instances.color}\n label=\"Instances\"\n value={`${activityData.instances.current}/${activityData.instances.total}`}\n size={120}\n />\n <ActivityRing\n progress={activityData.cpu.percentage}\n color={activityData.cpu.color}\n label=\"CPU\"\n value={`${activityData.cpu.percentage}%`}\n size={120}\n />\n <ActivityRing\n progress={activityData.memory.percentage}\n color={activityData.memory.color}\n label=\"Memory\"\n value={`${activityData.memory.percentage}%`}\n size={120}\n />\n <ActivityRing\n progress={activityData.storage.percentage}\n color={activityData.storage.color}\n label=\"Storage\"\n value={`${activityData.storage.percentage}%`}\n size={120}\n />\n </div>\n </Stack>\n )\n}\n","import { ActivitySummary } from \"./ActivitySummary\"\nimport { Suspense, use } from \"react\"\nimport { Server } from \"@/server/Compute/types/server\"\nimport { ImagesPaginatedResponse } from \"@/server/Compute/types/image\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface OverviewContainerProps {\n getDataPromise: Promise<[Server[] | undefined, ImagesPaginatedResponse]>\n}\nconst OverviewContainer = ({ getDataPromise }: OverviewContainerProps) => {\n const [servers, imagesResponse] = use(getDataPromise)\n const images = imagesResponse.images\n if (!servers && !images) return <div className=\"p-4 text-center\">No data found</div>\n\n // Calculate server statistics\n const activeServers = servers?.filter((server) => server.status === \"ACTIVE\")?.length || 0\n const totalServers = servers?.length || 0\n const estimatedServerQuota = Math.max(10, Math.ceil(totalServers * 1.5))\n\n // Calculate resource usage based on server flavors\n let totalCores = 0\n let usedMemoryMB = 0\n let totalDiskGB = 0\n\n // Process server data to extract resource usage\n servers?.forEach((server) => {\n // Extract core count from flavor if available\n if (server.flavor && server.flavor.vcpus) {\n totalCores += server.flavor.vcpus\n } else {\n // Fallback estimate based on server name or other heuristics\n const smallestSize = server.name?.includes(\"small\") || server.name?.includes(\"micro\")\n totalCores += smallestSize ? 1 : 2\n }\n\n // Extract memory usage from flavor if available\n if (server.flavor && server.flavor.ram) {\n usedMemoryMB += server.flavor.ram\n } else {\n // Fallback estimate\n usedMemoryMB += 1024 // Assume 1GB per instance as fallback\n }\n\n // Extract disk usage from flavor if available\n if (server.flavor && server.flavor.disk) {\n totalDiskGB += server.flavor.disk\n } else {\n // Fallback estimate\n totalDiskGB += 20 // Assume 20GB per instance as fallback\n }\n })\n\n // Calculate image statistics\n const activeImages = images?.filter((image) => image.status === \"active\")?.length || 0\n const totalImages = images?.length || 0\n\n // Calculate resource percentage utilizations\n const cpuPercentage = Math.min(100, Math.round((totalCores / 32) * 100))\n const memoryPercentage = Math.min(100, Math.round((usedMemoryMB / 131072) * 100))\n const storagePercentage = Math.min(100, Math.round((totalDiskGB / 1024) * 100))\n\n // Prepare data to pass to ActivitySummary\n const activityData = {\n instances: {\n current: activeServers,\n total: totalServers,\n quota: estimatedServerQuota,\n color: \"#FF5733\",\n },\n cpu: {\n percentage: cpuPercentage,\n cores: totalCores,\n color: \"#33A1FD\",\n },\n memory: {\n percentage: memoryPercentage,\n usedMB: usedMemoryMB,\n color: \"#9B59B6\", // Purple color for memory\n },\n storage: {\n percentage: storagePercentage,\n sizeGB: totalDiskGB,\n color: \"#4CAF50\",\n },\n images: {\n active: activeImages,\n total: totalImages,\n color: \"#F1C40F\", // Yellow color for images if you want to use it\n },\n }\n\n return (\n <div className=\"h-full\">\n <ActivitySummary activityData={activityData} />\n </div>\n )\n}\n\ninterface OverviewProps {\n client: TrpcClient\n project: string\n}\n\nexport function Overview({ client, project }: OverviewProps) {\n const getDataPromise = Promise.all([\n client.compute.getServersByProjectId.query({ project_id: project }),\n client.compute.listImagesWithSearch.query({ project_id: project }),\n ])\n\n return (\n <Suspense\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Loading...</Trans>\n </div>\n }\n >\n <OverviewContainer getDataPromise={getDataPromise} />\n </Suspense>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Overview } from \"./-components/Overview\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/overview\")({\n staticData: { section: \"compute\", service: \"overview\", crumb: { labelKey: \"Compute\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Compute Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeading>{t`Compute Overview`}</ContentHeading>\n <Overview project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":"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"}
@@ -8,9 +8,9 @@ var r = e("/_auth/projects/$projectId/services/pca/")({
8
8
  crumb: { labelKey: "PCA (Clavis)" }
9
9
  },
10
10
  head: () => ({ meta: [{ title: n._({ id: "ffw//c" }) }] }),
11
- component: t(() => import("./pca-V2aaOxZA.mjs"), "component")
11
+ component: t(() => import("./pca-x9if8xU-.mjs"), "component")
12
12
  });
13
13
  //#endregion
14
14
  export { r as t };
15
15
 
16
- //# sourceMappingURL=pca-BqZycwCu.mjs.map
16
+ //# sourceMappingURL=pca-DSM71LhW.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pca-BqZycwCu.mjs","names":["createFileRoute","t","Route","staticData","section","service","sectionCrumb","labelKey","crumb","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":";;AAOA,IAAaE,IAAQF,EAAgB,2CAAA,CAA4C;CAC/EG,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,cAAc,EAAEC,UAAU,YAAW;EACrCC,OAAO,EAAED,UAAU,gBAAe;EACpC;CACAG,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOX,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAM,CAAC,EAAE;CACzCY,WAASC,sCAAA,YAAA;CACX,CAAA"}
1
+ {"version":3,"file":"pca-DSM71LhW.mjs","names":["createFileRoute","t","Route","staticData","section","service","sectionCrumb","labelKey","crumb","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":";;AAOA,IAAaE,IAAQF,EAAgB,2CAAA,CAA4C;CAC/EG,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,cAAc,EAAEC,UAAU,YAAW;EACrCC,OAAO,EAAED,UAAU,gBAAe;EACpC;CACAG,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOX,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAM,CAAC,EAAE;CACzCY,WAASC,sCAAA,YAAA;CACX,CAAA"}
@@ -1,86 +1,86 @@
1
- import { $ as e, A as t, K as n, N as r, O as i, T as a, U as o, V as s, W as c, Y as l, it as u, l as d, r as f, rt as p, w as m, z as h } from "./build-Cf7iWbpH.mjs";
1
+ import { E as e, G as t, I as n, M as r, Q as i, T as a, U as o, Y as s, at as c, c as l, et as u, j as d, n as f, nt as p, ot as m, q as h } from "./build-BJDfnAyi.mjs";
2
2
  import { r as g } from "./trpcClient-BxguzNYF.mjs";
3
- import { t as _ } from "./pca-BqZycwCu.mjs";
3
+ import { t as _ } from "./pca-DSM71LhW.mjs";
4
4
  import { t as v } from "./useModal-DxxlilRm.mjs";
5
- import { t as y } from "./ContentHeader-DtBiIwRY.mjs";
5
+ import { t as y } from "./ContentHeader-BXZoN3B9.mjs";
6
6
  import { t as b } from "./useProjectId-CgOTejka.mjs";
7
7
  import "./hooks-D0krAKvo.mjs";
8
- import { n as x, r as S, t as C } from "./constants-CCgR6fKI.mjs";
8
+ import { n as x, r as S, t as C } from "./constants-CAjjRTo_.mjs";
9
9
  import { Fragment as w, jsx as T, jsxs as E } from "react/jsx-runtime";
10
10
  import { useNavigate as D } from "@tanstack/react-router";
11
11
  import { Trans as O, useLingui as k } from "@lingui/react";
12
12
  import { z as A } from "zod";
13
13
  import { useForm as j } from "@tanstack/react-form";
14
14
  //#region src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx
15
- var M = ({ pca: e }) => {
16
- let { i18n: n, _: i } = k(), o = D(), s = b(), [u, d] = v(!1);
17
- return /* @__PURE__ */ E(w, { children: [/* @__PURE__ */ E(r, {
18
- "data-testid": `pca-row-${e.id}`,
15
+ var M = ({ pca: t }) => {
16
+ let { i18n: i, _: a } = k(), o = D(), c = b(), [l, d] = v(!1);
17
+ return /* @__PURE__ */ E(w, { children: [/* @__PURE__ */ E(n, {
18
+ "data-testid": `pca-row-${t.id}`,
19
19
  onClick: () => o({
20
20
  to: "/projects/$projectId/services/pca/$pcaId",
21
21
  params: {
22
- projectId: s,
23
- pcaId: e.id
22
+ projectId: c,
23
+ pcaId: t.id
24
24
  }
25
25
  }),
26
26
  children: [
27
- /* @__PURE__ */ T(t, { children: /* @__PURE__ */ E("div", {
27
+ /* @__PURE__ */ T(r, { children: /* @__PURE__ */ E("div", {
28
28
  className: "flex items-center gap-2",
29
- children: [C[e.state].icon, C[e.state].text]
29
+ children: [C[t.state].icon, C[t.state].text]
30
30
  }) }),
31
- /* @__PURE__ */ T(t, { children: e.id }),
32
- /* @__PURE__ */ T(t, { children: e.configuration?.subject?.common_name || "—" }),
33
- /* @__PURE__ */ T(t, {
31
+ /* @__PURE__ */ T(r, { children: t.id }),
32
+ /* @__PURE__ */ T(r, { children: t.configuration?.subject?.common_name || "—" }),
33
+ /* @__PURE__ */ T(r, {
34
34
  onClick: (e) => e.stopPropagation(),
35
35
  className: "items-end pr-0",
36
- children: /* @__PURE__ */ T(l, { children: /* @__PURE__ */ T(a, { children: /* @__PURE__ */ T(c, {
37
- label: n._({ id: "nzFJqC" }),
36
+ children: /* @__PURE__ */ T(u, { children: /* @__PURE__ */ T(e, { children: /* @__PURE__ */ T(s, {
37
+ label: i._({ id: "nzFJqC" }),
38
38
  onClick: d
39
39
  }) }) })
40
40
  })
41
41
  ]
42
- }, e.id), u && /* @__PURE__ */ T(S, {
43
- pca: e,
44
- open: u,
42
+ }, t.id), l && /* @__PURE__ */ T(S, {
43
+ pca: t,
44
+ open: l,
45
45
  onClose: d
46
46
  })] });
47
47
  }, N = /^(?=.{1,253}$)(?:\*\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$/, P = (e) => N.test(e), F = ({ open: e, onClose: t }) => {
48
- let { i18n: r, _: i } = k(), a = b(), s = g.useUtils(), { isPending: c, ...l } = g.services.pca.create.useMutation({ onSettled: () => s.services.pca.list.invalidate() }), d = j({
48
+ let { i18n: n, _: r } = k(), o = b(), s = g.useUtils(), { isPending: l, ...u } = g.services.pca.create.useMutation({ onSettled: () => s.services.pca.list.invalidate() }), d = j({
49
49
  defaultValues: { common_name: "" },
50
- validators: { onSubmit: A.object({ common_name: A.string().trim().min(1, r._({ id: "qhDo93" })).refine((e) => P(e), { message: r._({ id: "gy6L1u" }) }) }) },
50
+ validators: { onSubmit: A.object({ common_name: A.string().trim().min(1, n._({ id: "qhDo93" })).refine((e) => P(e), { message: n._({ id: "gy6L1u" }) }) }) },
51
51
  onSubmit: async ({ value: e }) => {
52
- c || (await l.mutateAsync({
53
- project_id: a,
52
+ l || (await u.mutateAsync({
53
+ project_id: o,
54
54
  configuration: { subject: { common_name: e.common_name } }
55
- }), h());
55
+ }), p());
56
56
  }
57
- }), h = () => {
58
- c || (d.reset(), l.reset(), t());
57
+ }), p = () => {
58
+ l || (d.reset(), u.reset(), t());
59
59
  };
60
- return /* @__PURE__ */ E(u, {
60
+ return /* @__PURE__ */ E(m, {
61
61
  open: e,
62
62
  size: "large",
63
- title: r._({ id: "WidMsn" }),
64
- onCancel: h,
65
- cancelButtonLabel: r._({ id: "dEgA5A" }),
66
- confirmButtonLabel: r._({ id: "tfDRzk" }),
63
+ title: n._({ id: "WidMsn" }),
64
+ onCancel: p,
65
+ cancelButtonLabel: n._({ id: "dEgA5A" }),
66
+ confirmButtonLabel: n._({ id: "tfDRzk" }),
67
67
  onConfirm: d.handleSubmit,
68
- disableConfirmButton: c,
68
+ disableConfirmButton: l,
69
69
  children: [
70
- l.error?.message && /* @__PURE__ */ T(o, {
70
+ u.error?.message && /* @__PURE__ */ T(h, {
71
71
  dismissible: !1,
72
72
  variant: "error",
73
73
  className: "mb-4",
74
- children: l.error.message
74
+ children: u.error.message
75
75
  }),
76
- c && /* @__PURE__ */ E("div", {
76
+ l && /* @__PURE__ */ E("div", {
77
77
  className: "mb-4 flex items-center justify-center gap-2",
78
- children: [/* @__PURE__ */ T(n, { variant: "primary" }), /* @__PURE__ */ T("span", {
78
+ children: [/* @__PURE__ */ T(i, { variant: "primary" }), /* @__PURE__ */ T("span", {
79
79
  className: "text-theme-high text-sm",
80
80
  children: /* @__PURE__ */ T(O, { id: "wdUvGT" })
81
81
  })]
82
82
  }),
83
- !c && /* @__PURE__ */ T(p, {
83
+ !l && /* @__PURE__ */ T(c, {
84
84
  className: "mb-0",
85
85
  id: "create-certificate-authority-form",
86
86
  onSubmit: (e) => {
@@ -90,17 +90,17 @@ var M = ({ pca: e }) => {
90
90
  className: "mb-4",
91
91
  children: /* @__PURE__ */ T(d.Field, {
92
92
  name: "common_name",
93
- children: (e) => /* @__PURE__ */ T(m, {
93
+ children: (e) => /* @__PURE__ */ T(a, {
94
94
  id: e.name,
95
95
  name: e.name,
96
96
  value: e.state.value,
97
97
  onBlur: e.handleBlur,
98
98
  onChange: (t) => e.handleChange(t.target.value),
99
- label: r._({ id: "DHrCY6" }),
100
- placeholder: r._({ id: "RWQ6BN" }),
101
- helptext: r._({ id: "jVjr9h" }),
99
+ label: n._({ id: "DHrCY6" }),
100
+ placeholder: n._({ id: "RWQ6BN" }),
101
+ helptext: n._({ id: "jVjr9h" }),
102
102
  errortext: e.state.meta.errors.map((e) => e?.message).join(", "),
103
- disabled: c
103
+ disabled: l
104
104
  })
105
105
  })
106
106
  })
@@ -108,42 +108,42 @@ var M = ({ pca: e }) => {
108
108
  ]
109
109
  });
110
110
  }, I = () => {
111
- let { i18n: a, _: o } = k(), c = b(), l = x(), [u, f] = v(!1), { data: p = [], isLoading: m, isError: _, error: y } = g.services.pca.list.useQuery({ project_id: c });
112
- return m ? /* @__PURE__ */ E(e, {
111
+ let { i18n: e, _: a } = k(), s = b(), c = x(), [u, f] = v(!1), { data: m = [], isLoading: h, isError: _, error: y } = g.services.pca.list.useQuery({ project_id: s });
112
+ return h ? /* @__PURE__ */ E(p, {
113
113
  className: "py-8",
114
114
  distribution: "center",
115
115
  alignment: "center",
116
116
  direction: "vertical",
117
- children: [/* @__PURE__ */ T(n, {
117
+ children: [/* @__PURE__ */ T(i, {
118
118
  variant: "primary",
119
119
  size: "large",
120
120
  className: "mb-2"
121
121
  }), /* @__PURE__ */ T(O, { id: "Z3FXyt" })]
122
- }) : _ ? /* @__PURE__ */ T(e, {
122
+ }) : _ ? /* @__PURE__ */ T(p, {
123
123
  className: "py-8",
124
124
  distribution: "center",
125
125
  alignment: "center",
126
126
  direction: "vertical",
127
- children: y?.message ?? a._({ id: "Sf3Gvg" })
128
- }) : p.length === 0 ? /* @__PURE__ */ T(h, {
129
- columns: l.length,
127
+ children: y?.message ?? e._({ id: "Sf3Gvg" })
128
+ }) : m.length === 0 ? /* @__PURE__ */ T(o, {
129
+ columns: c.length,
130
130
  className: "pca",
131
131
  "data-testid": "no-pcas",
132
- children: /* @__PURE__ */ T(r, { children: /* @__PURE__ */ E(t, {
133
- colSpan: l.length,
134
- children: [/* @__PURE__ */ T(i, { children: /* @__PURE__ */ T(O, { id: "8S2nDL" }) }), /* @__PURE__ */ T("p", { children: /* @__PURE__ */ T(O, { id: "ng+PCh" }) })]
132
+ children: /* @__PURE__ */ T(n, { children: /* @__PURE__ */ E(r, {
133
+ colSpan: c.length,
134
+ children: [/* @__PURE__ */ T(d, { children: /* @__PURE__ */ T(O, { id: "8S2nDL" }) }), /* @__PURE__ */ T("p", { children: /* @__PURE__ */ T(O, { id: "ng+PCh" }) })]
135
135
  }) })
136
136
  }) : /* @__PURE__ */ E("div", {
137
137
  className: "relative",
138
138
  children: [
139
- /* @__PURE__ */ T(d, {
139
+ /* @__PURE__ */ T(l, {
140
140
  variant: "primary",
141
- label: a._({ id: "WidMsn" }),
141
+ label: e._({ id: "WidMsn" }),
142
142
  onClick: f
143
143
  }),
144
- /* @__PURE__ */ E(h, {
145
- columns: l.length,
146
- children: [/* @__PURE__ */ T(r, { children: l.map((e) => /* @__PURE__ */ T(s, { children: e }, e)) }), p.map((e) => /* @__PURE__ */ T(M, { pca: e }, e.id))]
144
+ /* @__PURE__ */ E(o, {
145
+ columns: c.length,
146
+ children: [/* @__PURE__ */ T(n, { children: c.map((e) => /* @__PURE__ */ T(t, { children: e }, e)) }), m.map((e) => /* @__PURE__ */ T(M, { pca: e }, e.id))]
147
147
  }),
148
148
  u && /* @__PURE__ */ T(F, {
149
149
  open: u,
@@ -164,4 +164,4 @@ function L() {
164
164
  //#endregion
165
165
  export { L as component };
166
166
 
167
- //# sourceMappingURL=pca-V2aaOxZA.mjs.map
167
+ //# sourceMappingURL=pca-x9if8xU-.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pca-V2aaOxZA.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","useModal","useProjectId","DeletePcaModal","STATE_CONFIG","PcaTableRow","pca","useLingui","navigate","projectId","deletePcaModalOpen","toggleDeletePcaModal","navigateToDetailsPage","to","params","pcaId","id","data-testid","onClick","div","className","state","icon","text","configuration","subject","common_name","e","stopPropagation","label","t","open","onClose","z","useForm","Modal","Form","FormSection","Spinner","TextInput","Message","trpcReact","useProjectId","csrRegex","isValidCommonName","value","test","CreatePcaModal","open","onClose","useLingui","projectId","utils","useUtils","isPending","createPcaMutation","services","pca","create","useMutation","onSettled","list","invalidate","formSchema","object","common_name","string","trim","min","t","refine","message","form","defaultValues","validators","onSubmit","mutateAsync","project_id","configuration","subject","handleClose","reset","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","error","dismissible","variant","className","div","span","id","e","preventDefault","Field","name","children","field","state","onBlur","handleBlur","onChange","handleChange","target","label","placeholder","helptext","errortext","meta","errors","map","join","disabled","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","trpcReact","useProjectId","TABLE_COLUMNS","PcaTableRow","useModal","CreatePcaModal","PcaListContainer","useLingui","projectId","columns","createCaOpen","toggleCreateCa","data","pcas","isLoading","isError","error","services","pca","list","useQuery","project_id","className","distribution","alignment","direction","variant","size","message","t","length","data-testid","colSpan","p","div","label","onClick","map","id","open","onClose","useLingui","ContentHeader","PcaListContainer","Route","RouteComponent","t","projectId","useParams","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-modals/CreatePcaModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/PcaListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { DeletePcaModal } from \"../-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"./constants\"\n\ninterface PcaTableRowProps {\n pca: CertificateAuthority\n}\n\nexport const PcaTableRow = ({ pca }: PcaTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToDetailsPage = () =>\n navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: pca.id },\n })\n\n return (\n <>\n <DataGridRow key={pca.id} data-testid={`pca-row-${pca.id}`} onClick={navigateToDetailsPage}>\n <DataGridCell>\n <div className=\"flex items-center gap-2\">\n {STATE_CONFIG[pca.state].icon}\n {STATE_CONFIG[pca.state].text}\n </div>\n </DataGridCell>\n <DataGridCell>{pca.id}</DataGridCell>\n <DataGridCell>{pca.configuration?.subject?.common_name || \"—\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Delete CA`} onClick={toggleDeletePcaModal} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n\n {deletePcaModalOpen && <DeletePcaModal pca={pca} open={deletePcaModalOpen} onClose={toggleDeletePcaModal} />}\n </>\n )\n}\n","import { z } from \"zod\"\nimport { useForm } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, TextInput, Message } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface CreateCaModalProps {\n open: boolean\n onClose: () => void\n}\n\nconst csrRegex = /^(?=.{1,253}$)(?:\\*\\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}$/\nconst isValidCommonName = (value: string) => csrRegex.test(value)\n\nexport const CreatePcaModal = ({ open, onClose }: CreateCaModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createPcaMutation } = trpcReact.services.pca.create.useMutation({\n onSettled: () => utils.services.pca.list.invalidate(),\n })\n\n const formSchema = z.object({\n common_name: z\n .string()\n .trim()\n .min(1, t`Common name is required.`)\n .refine((value) => isValidCommonName(value), { message: t`Must be a valid common name (FQDN).` }),\n })\n\n const form = useForm({\n defaultValues: {\n common_name: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n await createPcaMutation.mutateAsync({\n project_id: projectId,\n configuration: {\n subject: { common_name: value.common_name },\n },\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createPcaMutation.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Create Certificate Authority`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending}\n >\n {createPcaMutation.error?.message && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createPcaMutation.error.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Creating Certificate Authority...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"create-certificate-authority-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"common_name\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`Common name`}\n placeholder={t`Enter Common name (e.g., demo-ca.test.sci)`}\n helptext={t`Enter a valid common name in FQDN format (e.g., demo-ca.test.sci).`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { TABLE_COLUMNS } from \"./-table/constants\"\nimport { PcaTableRow } from \"./-table/PcaTableRow\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { CreatePcaModal } from \"./-modals/CreatePcaModal\"\n\nexport const PcaListContainer = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const columns = TABLE_COLUMNS()\n const [createCaOpen, toggleCreateCa] = useModal(false)\n\n // Check filtering, sorting and search API compatibility with OpenStack -> implement with <ListToolbar />\n const { data: pcas = [], isLoading, isError, error } = trpcReact.services.pca.list.useQuery({ project_id: projectId })\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load PCAs`}\n </Stack>\n )\n }\n\n if (pcas.length === 0) {\n return (\n <DataGrid columns={columns.length} className=\"pca\" data-testid=\"no-pcas\">\n <DataGridRow>\n <DataGridCell colSpan={columns.length}>\n <ContentHeading>\n <Trans>No PCAs found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no PCAs available for this project.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <div className=\"relative\">\n <Button variant=\"primary\" label={t`Create Certificate Authority`} onClick={toggleCreateCa} />\n <DataGrid columns={columns.length}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcas.map((pca) => (\n <PcaTableRow key={pca.id} pca={pca} />\n ))}\n </DataGrid>\n\n {createCaOpen && <CreatePcaModal open={createCaOpen} onClose={toggleCreateCa} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pca-x9if8xU-.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","useModal","useProjectId","DeletePcaModal","STATE_CONFIG","PcaTableRow","pca","useLingui","navigate","projectId","deletePcaModalOpen","toggleDeletePcaModal","navigateToDetailsPage","to","params","pcaId","id","data-testid","onClick","div","className","state","icon","text","configuration","subject","common_name","e","stopPropagation","label","t","open","onClose","z","useForm","Modal","Form","FormSection","Spinner","TextInput","Message","trpcReact","useProjectId","csrRegex","isValidCommonName","value","test","CreatePcaModal","open","onClose","useLingui","projectId","utils","useUtils","isPending","createPcaMutation","services","pca","create","useMutation","onSettled","list","invalidate","formSchema","object","common_name","string","trim","min","t","refine","message","form","defaultValues","validators","onSubmit","mutateAsync","project_id","configuration","subject","handleClose","reset","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","error","dismissible","variant","className","div","span","id","e","preventDefault","Field","name","children","field","state","onBlur","handleBlur","onChange","handleChange","target","label","placeholder","helptext","errortext","meta","errors","map","join","disabled","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","trpcReact","useProjectId","TABLE_COLUMNS","PcaTableRow","useModal","CreatePcaModal","PcaListContainer","useLingui","projectId","columns","createCaOpen","toggleCreateCa","data","pcas","isLoading","isError","error","services","pca","list","useQuery","project_id","className","distribution","alignment","direction","variant","size","message","t","length","data-testid","colSpan","p","div","label","onClick","map","id","open","onClose","useLingui","ContentHeader","PcaListContainer","Route","RouteComponent","t","projectId","useParams","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-modals/CreatePcaModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/PcaListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { DeletePcaModal } from \"../-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"./constants\"\n\ninterface PcaTableRowProps {\n pca: CertificateAuthority\n}\n\nexport const PcaTableRow = ({ pca }: PcaTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToDetailsPage = () =>\n navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: pca.id },\n })\n\n return (\n <>\n <DataGridRow key={pca.id} data-testid={`pca-row-${pca.id}`} onClick={navigateToDetailsPage}>\n <DataGridCell>\n <div className=\"flex items-center gap-2\">\n {STATE_CONFIG[pca.state].icon}\n {STATE_CONFIG[pca.state].text}\n </div>\n </DataGridCell>\n <DataGridCell>{pca.id}</DataGridCell>\n <DataGridCell>{pca.configuration?.subject?.common_name || \"—\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Delete CA`} onClick={toggleDeletePcaModal} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n\n {deletePcaModalOpen && <DeletePcaModal pca={pca} open={deletePcaModalOpen} onClose={toggleDeletePcaModal} />}\n </>\n )\n}\n","import { z } from \"zod\"\nimport { useForm } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, TextInput, Message } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface CreateCaModalProps {\n open: boolean\n onClose: () => void\n}\n\nconst csrRegex = /^(?=.{1,253}$)(?:\\*\\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}$/\nconst isValidCommonName = (value: string) => csrRegex.test(value)\n\nexport const CreatePcaModal = ({ open, onClose }: CreateCaModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createPcaMutation } = trpcReact.services.pca.create.useMutation({\n onSettled: () => utils.services.pca.list.invalidate(),\n })\n\n const formSchema = z.object({\n common_name: z\n .string()\n .trim()\n .min(1, t`Common name is required.`)\n .refine((value) => isValidCommonName(value), { message: t`Must be a valid common name (FQDN).` }),\n })\n\n const form = useForm({\n defaultValues: {\n common_name: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n await createPcaMutation.mutateAsync({\n project_id: projectId,\n configuration: {\n subject: { common_name: value.common_name },\n },\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createPcaMutation.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Create Certificate Authority`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending}\n >\n {createPcaMutation.error?.message && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createPcaMutation.error.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Creating Certificate Authority...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"create-certificate-authority-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"common_name\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`Common name`}\n placeholder={t`Enter Common name (e.g., demo-ca.test.sci)`}\n helptext={t`Enter a valid common name in FQDN format (e.g., demo-ca.test.sci).`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { TABLE_COLUMNS } from \"./-table/constants\"\nimport { PcaTableRow } from \"./-table/PcaTableRow\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { CreatePcaModal } from \"./-modals/CreatePcaModal\"\n\nexport const PcaListContainer = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const columns = TABLE_COLUMNS()\n const [createCaOpen, toggleCreateCa] = useModal(false)\n\n // Check filtering, sorting and search API compatibility with OpenStack -> implement with <ListToolbar />\n const { data: pcas = [], isLoading, isError, error } = trpcReact.services.pca.list.useQuery({ project_id: projectId })\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load PCAs`}\n </Stack>\n )\n }\n\n if (pcas.length === 0) {\n return (\n <DataGrid columns={columns.length} className=\"pca\" data-testid=\"no-pcas\">\n <DataGridRow>\n <DataGridCell colSpan={columns.length}>\n <ContentHeading>\n <Trans>No PCAs found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no PCAs available for this project.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <div className=\"relative\">\n <Button variant=\"primary\" label={t`Create Certificate Authority`} onClick={toggleCreateCa} />\n <DataGrid columns={columns.length}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcas.map((pca) => (\n <PcaTableRow key={pca.id} pca={pca} />\n ))}\n </DataGrid>\n\n {createCaOpen && <CreatePcaModal open={createCaOpen} onClose={toggleCreateCa} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./RouteError-Cyto623-.mjs";
1
+ import { t as e } from "./RouteError-pDEWC_k7.mjs";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  import { TRPCClientError as n } from "@trpc/client";
4
4
  //#region src/client/routes/_auth/projects/index.tsx?tsr-split=errorComponent
@@ -9,4 +9,4 @@ var r = ({ error: r }) => /* @__PURE__ */ t(e, {
9
9
  //#endregion
10
10
  export { r as errorComponent };
11
11
 
12
- //# sourceMappingURL=projects-jyIHL6DE.mjs.map
12
+ //# sourceMappingURL=projects-B6BPo2Ar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-B6BPo2Ar.mjs","names":["RouteError","TRPCClientError","SplitErrorComponent","error","message","undefined","errorComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute } 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/Error/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n component: ProjectsOverview,\n errorComponent: ({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n ),\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n loaderDeps: ({ search }) => ({\n search: search.search || \"\",\n }),\n loader: async ({ context, deps }) => {\n const allProjects = await context.trpcClient?.project.getAuthProjects.query()\n\n let projects = allProjects\n if (deps.search && deps.search.trim() !== \"\") {\n const searchTermLower = deps.search.toLowerCase()\n projects = allProjects?.filter(\n (project) =>\n project.name?.toLowerCase().includes(searchTermLower) ||\n project.description?.toLowerCase().includes(searchTermLower)\n )\n }\n\n return { projects }\n },\n})\n\nfunction ProjectsOverview() {\n const { projects } = Route.useLoaderData()\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n\n const handleSearch = (value: string) => {\n navigate({ search: { search: value }, replace: true })\n }\n\n return (\n <Container>\n <ContentHeading>\n <Trans>Projects</Trans>\n </ContentHeading>\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <ProjectCardView projects={projects} />\n </div>\n </Container>\n )\n}\n"],"mappings":";;;;AAI8C,IAAAE,KAW3B,EAAEC,eACjB,kBAAC,GAAA;CAAkBA;CAAO,kBAAkBA,aAAiBF,IAAkBE,EAAMC,UAAUC,KAAAA"}
@@ -4,4 +4,4 @@ var t = () => /* @__PURE__ */ e("p", { children: "Projects not found" });
4
4
  //#endregion
5
5
  export { t as notFoundComponent };
6
6
 
7
- //# sourceMappingURL=projects-BsN4bvU2.mjs.map
7
+ //# sourceMappingURL=projects-BilrmHLu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-BilrmHLu.mjs","names":["SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { createFileRoute } 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/Error/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n component: ProjectsOverview,\n errorComponent: ({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n ),\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n loaderDeps: ({ search }) => ({\n search: search.search || \"\",\n }),\n loader: async ({ context, deps }) => {\n const allProjects = await context.trpcClient?.project.getAuthProjects.query()\n\n let projects = allProjects\n if (deps.search && deps.search.trim() !== \"\") {\n const searchTermLower = deps.search.toLowerCase()\n projects = allProjects?.filter(\n (project) =>\n project.name?.toLowerCase().includes(searchTermLower) ||\n project.description?.toLowerCase().includes(searchTermLower)\n )\n }\n\n return { projects }\n },\n})\n\nfunction ProjectsOverview() {\n const { projects } = Route.useLoaderData()\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n\n const handleSearch = (value: string) => {\n navigate({ search: { search: value }, replace: true })\n }\n\n return (\n <Container>\n <ContentHeading>\n <Trans>Projects</Trans>\n </ContentHeading>\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <ProjectCardView projects={projects} />\n </div>\n </Container>\n )\n}\n"],"mappings":";;cAmBW,kBAAC,KAAA,EAAA,UAAE,sBAAA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
2
2
  import { z as n } from "zod";
3
3
  //#region src/client/routes/_auth/projects/index.tsx
4
- var r = () => import("./projects-BsN4bvU2.mjs"), i = () => import("./projects-jyIHL6DE.mjs"), a = () => import("./projects-C1IYOvFQ.mjs"), o = n.object({ search: n.string().optional() }), s = e("/_auth/projects/")({
4
+ var r = () => import("./projects-BilrmHLu.mjs"), i = () => import("./projects-B6BPo2Ar.mjs"), a = () => import("./projects-CnmZIB2Q.mjs"), o = n.object({ search: n.string().optional() }), s = e("/_auth/projects/")({
5
5
  component: t(a, "component"),
6
6
  errorComponent: t(i, "errorComponent"),
7
7
  notFoundComponent: t(r, "notFoundComponent"),
@@ -19,4 +19,4 @@ var r = () => import("./projects-BsN4bvU2.mjs"), i = () => import("./projects-jy
19
19
  //#endregion
20
20
  export { s as t };
21
21
 
22
- //# sourceMappingURL=projects-0feOw_b6.mjs.map
22
+ //# sourceMappingURL=projects-Bt0XptpG.mjs.map