@cobaltcore-dev/aurora 0.9.0 → 0.11.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 (127) hide show
  1. package/README.md +2 -1
  2. package/dist/client/AuroraApp.d.ts +2 -0
  3. package/dist/client/AuthProvider-DZqOvceF.mjs +64 -0
  4. package/dist/client/AuthProvider-DZqOvceF.mjs.map +1 -0
  5. package/dist/client/ContentHeader-DsuZD8fa.mjs +110 -0
  6. package/dist/client/ContentHeader-DsuZD8fa.mjs.map +1 -0
  7. package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs → DeleteFlavorModal-RnbspW_2.mjs} +135 -135
  8. package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs.map → DeleteFlavorModal-RnbspW_2.mjs.map} +1 -1
  9. package/dist/client/DeleteVersionsModal-CsBJzXoW.mjs +331 -0
  10. package/dist/client/DeleteVersionsModal-CsBJzXoW.mjs.map +1 -0
  11. package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs → EditSecurityGroupModal-BPv3d7am.mjs} +15 -15
  12. package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs.map → EditSecurityGroupModal-BPv3d7am.mjs.map} +1 -1
  13. package/dist/client/{FiltersInput-GzR4D0q6.mjs → FiltersInput-CViamP59.mjs} +2 -2
  14. package/dist/client/{FiltersInput-GzR4D0q6.mjs.map → FiltersInput-CViamP59.mjs.map} +1 -1
  15. package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs → FloatingIpActionModals-DTn3HFei.mjs} +45 -45
  16. package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs.map → FloatingIpActionModals-DTn3HFei.mjs.map} +1 -1
  17. package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs → ImageToastNotifications-CFKQZTgf.mjs} +261 -261
  18. package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs.map → ImageToastNotifications-CFKQZTgf.mjs.map} +1 -1
  19. package/dist/client/{RouteError-DVAiT0mT.mjs → RouteError-BebIhFpQ.mjs} +2 -2
  20. package/dist/client/{RouteError-DVAiT0mT.mjs.map → RouteError-BebIhFpQ.mjs.map} +1 -1
  21. package/dist/client/{SortInput-VK7IYqQv.mjs → SortInput-D0Vb864D.mjs} +9 -9
  22. package/dist/client/SortInput-D0Vb864D.mjs.map +1 -0
  23. package/dist/client/{_auth-DXJkv9QO.mjs → _auth-DnImOqR-.mjs} +2 -2
  24. package/dist/client/_auth-DnImOqR-.mjs.map +1 -0
  25. package/dist/client/{_flavorId-Dy7EYQum.mjs → _flavorId-C9SZd1jL.mjs} +8 -8
  26. package/dist/client/{_flavorId-Dy7EYQum.mjs.map → _flavorId-C9SZd1jL.mjs.map} +1 -1
  27. package/dist/client/{_flavorId-DsD2VTKA.mjs → _flavorId-DINgWoeV.mjs} +38 -38
  28. package/dist/client/{_flavorId-DsD2VTKA.mjs.map → _flavorId-DINgWoeV.mjs.map} +1 -1
  29. package/dist/client/{_floatingIpId-j17rCQqG2.mjs → _floatingIpId-BACLbMzi2.mjs} +32 -32
  30. package/dist/client/{_floatingIpId-j17rCQqG2.mjs.map → _floatingIpId-BACLbMzi2.mjs.map} +1 -1
  31. package/dist/client/{_floatingIpId-BjVbeNw_.mjs → _floatingIpId-BzVMOv97.mjs} +2 -2
  32. package/dist/client/{_floatingIpId-BjVbeNw_.mjs.map → _floatingIpId-BzVMOv97.mjs.map} +1 -1
  33. package/dist/client/_imageId-DCvaU7-S.mjs +534 -0
  34. package/dist/client/_imageId-DCvaU7-S.mjs.map +1 -0
  35. package/dist/client/{_pcaId-BwTvJJgh.mjs → _pcaId-B3PqECyO.mjs} +115 -115
  36. package/dist/client/{_pcaId-BwTvJJgh.mjs.map → _pcaId-B3PqECyO.mjs.map} +1 -1
  37. package/dist/client/{_pcaId-DUHQd0rB.mjs → _pcaId-DAJEt3ZI.mjs} +2 -2
  38. package/dist/client/{_pcaId-DUHQd0rB.mjs.map → _pcaId-DAJEt3ZI.mjs.map} +1 -1
  39. package/dist/client/{_projectId-CARHuZTU.mjs → _projectId-B2hG5peP.mjs} +3 -3
  40. package/dist/client/_projectId-B2hG5peP.mjs.map +1 -0
  41. package/dist/client/{_projectId-DR_2U10f.mjs → _projectId-BnWXWTBR.mjs} +3 -3
  42. package/dist/client/_projectId-BnWXWTBR.mjs.map +1 -0
  43. package/dist/client/{_projectId-BaqZ4W50.mjs → _projectId-DRr9rLST.mjs} +103 -109
  44. package/dist/client/_projectId-DRr9rLST.mjs.map +1 -0
  45. package/dist/client/{_projectId-B_2sZKk-.mjs → _projectId-DU8qRiZk.mjs} +2 -2
  46. package/dist/client/_projectId-DU8qRiZk.mjs.map +1 -0
  47. package/dist/client/{_securityGroupId-fhK1CuZh.mjs → _securityGroupId-Cj9IotMJ.mjs} +2 -2
  48. package/dist/client/{_securityGroupId-fhK1CuZh.mjs.map → _securityGroupId-Cj9IotMJ.mjs.map} +1 -1
  49. package/dist/client/{_securityGroupId-DYxmXUOP.mjs → _securityGroupId-ClJiFh4R.mjs} +267 -267
  50. package/dist/client/{_securityGroupId-DYxmXUOP.mjs.map → _securityGroupId-ClJiFh4R.mjs.map} +1 -1
  51. package/dist/client/_storageType-BrHDa2bD.mjs +3005 -0
  52. package/dist/client/_storageType-BrHDa2bD.mjs.map +1 -0
  53. package/dist/client/{_storageType-D7-_Xwwl.mjs → _storageType-CSLH93js.mjs} +2 -2
  54. package/dist/client/{_storageType-D7-_Xwwl.mjs.map → _storageType-CSLH93js.mjs.map} +1 -1
  55. package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
  56. package/dist/client/{about-Nsxkyh9U.mjs → about-BnU297yB.mjs} +2 -2
  57. package/dist/client/about-BnU297yB.mjs.map +1 -0
  58. package/dist/client/{aurora-DDzsst74.mjs → aurora-6RsAZtnz.mjs} +2 -2
  59. package/dist/client/aurora-6RsAZtnz.mjs.map +1 -0
  60. package/dist/client/{build-BdRRmNf5.mjs → build-DF7MTyXG.mjs} +3582 -3114
  61. package/dist/client/{build-BdRRmNf5.mjs.map → build-DF7MTyXG.mjs.map} +1 -1
  62. package/dist/client/{constants-J5nm9hbP.mjs → constants-BskfpGYY.mjs} +17 -17
  63. package/dist/client/{constants-J5nm9hbP.mjs.map → constants-BskfpGYY.mjs.map} +1 -1
  64. package/dist/client/{flavors-C-gY4XeQ.mjs → flavors-DAbtRoep.mjs} +151 -151
  65. package/dist/client/{flavors-C-gY4XeQ.mjs.map → flavors-DAbtRoep.mjs.map} +1 -1
  66. package/dist/client/{flavors-Dwy1ID_f.mjs → flavors-DODudzrA.mjs} +2 -2
  67. package/dist/client/{flavors-Dwy1ID_f.mjs.map → flavors-DODudzrA.mjs.map} +1 -1
  68. package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
  69. package/dist/client/{floatingips-Dq4DXQYb.mjs → floatingips-DJW9ftN_.mjs} +84 -84
  70. package/dist/client/floatingips-DJW9ftN_.mjs.map +1 -0
  71. package/dist/client/{hooks-dSArr2Ca.mjs → hooks-CMgoYcDG.mjs} +1 -1
  72. package/dist/client/{images-bG-MZZ7V.mjs → images-BbLnuYrL.mjs} +2 -2
  73. package/dist/client/{images-bG-MZZ7V.mjs.map → images-BbLnuYrL.mjs.map} +1 -1
  74. package/dist/client/{images-Dbjo4yKn.mjs → images-C3JyPwer.mjs} +2 -2
  75. package/dist/client/images-C3JyPwer.mjs.map +1 -0
  76. package/dist/client/{images-HG7TneK0.mjs → images-Cp6V1nF5.mjs} +455 -455
  77. package/dist/client/{images-HG7TneK0.mjs.map → images-Cp6V1nF5.mjs.map} +1 -1
  78. package/dist/client/images-NBf2bV43.mjs.map +1 -1
  79. package/dist/client/index.js +270 -266
  80. package/dist/client/index.js.map +1 -1
  81. package/dist/client/{md-CYTrL5dq.mjs → md-CyCflQee.mjs} +10 -28
  82. package/dist/client/{md-CYTrL5dq.mjs.map → md-CyCflQee.mjs.map} +1 -1
  83. package/dist/client/network-DuZm76BZ.mjs.map +1 -1
  84. package/dist/client/{objects-DKWp9RtR.mjs → objects-Bw96WXOs.mjs} +4 -3
  85. package/dist/client/objects-Bw96WXOs.mjs.map +1 -0
  86. package/dist/client/objects-DUmK3WgA.mjs +5998 -0
  87. package/dist/client/objects-DUmK3WgA.mjs.map +1 -0
  88. package/dist/client/objects-o2Cj_ndZ.mjs.map +1 -1
  89. package/dist/client/{pca-D7DF_BZZ.mjs → pca-DKeGzbww.mjs} +2 -2
  90. package/dist/client/{pca-D7DF_BZZ.mjs.map → pca-DKeGzbww.mjs.map} +1 -1
  91. package/dist/client/{pca-BBxPCAH0.mjs → pca-Dc_tdh4-.mjs} +47 -47
  92. package/dist/client/{pca-BBxPCAH0.mjs.map → pca-Dc_tdh4-.mjs.map} +1 -1
  93. package/dist/client/{projects-DNd3UTas.mjs → projects-CRL37ftA.mjs} +16 -16
  94. package/dist/client/{projects-DNd3UTas.mjs.map → projects-CRL37ftA.mjs.map} +1 -1
  95. package/dist/client/{projects-B5topuei.mjs → projects-DUWOgB3m.mjs} +2 -2
  96. package/dist/client/{projects-B5topuei.mjs.map → projects-DUWOgB3m.mjs.map} +1 -1
  97. package/dist/client/{projects-CHYn7L5e.mjs → projects-DpXQYfKc.mjs} +2 -2
  98. package/dist/client/projects-DpXQYfKc.mjs.map +1 -0
  99. package/dist/client/{securitygroups-CNFLu9zS.mjs → securitygroups-CWWFSjjj.mjs} +94 -94
  100. package/dist/client/securitygroups-CWWFSjjj.mjs.map +1 -0
  101. package/dist/client/{useListWithFiltering-v2A0-SZb.mjs → useListWithFiltering-C9k7xWqz.mjs} +7 -7
  102. package/dist/client/{useListWithFiltering-v2A0-SZb.mjs.map → useListWithFiltering-C9k7xWqz.mjs.map} +1 -1
  103. package/dist/server/index.js +979 -454
  104. package/package.json +3 -3
  105. package/dist/client/AuthProvider-Co4d0WzB.mjs +0 -100
  106. package/dist/client/AuthProvider-Co4d0WzB.mjs.map +0 -1
  107. package/dist/client/ContentHeader-D4jlOG-9.mjs +0 -96
  108. package/dist/client/ContentHeader-D4jlOG-9.mjs.map +0 -1
  109. package/dist/client/SortInput-VK7IYqQv.mjs.map +0 -1
  110. package/dist/client/_auth-DXJkv9QO.mjs.map +0 -1
  111. package/dist/client/_imageId-BjfhqAje.mjs +0 -534
  112. package/dist/client/_imageId-BjfhqAje.mjs.map +0 -1
  113. package/dist/client/_projectId-B_2sZKk-.mjs.map +0 -1
  114. package/dist/client/_projectId-BaqZ4W50.mjs.map +0 -1
  115. package/dist/client/_projectId-CARHuZTU.mjs.map +0 -1
  116. package/dist/client/_projectId-DR_2U10f.mjs.map +0 -1
  117. package/dist/client/_storageType-B0eJODiQ.mjs +0 -3244
  118. package/dist/client/_storageType-B0eJODiQ.mjs.map +0 -1
  119. package/dist/client/about-Nsxkyh9U.mjs.map +0 -1
  120. package/dist/client/aurora-DDzsst74.mjs.map +0 -1
  121. package/dist/client/floatingips-Dq4DXQYb.mjs.map +0 -1
  122. package/dist/client/images-Dbjo4yKn.mjs.map +0 -1
  123. package/dist/client/objects-DKWp9RtR.mjs.map +0 -1
  124. package/dist/client/objects-DaCuy_CB.mjs +0 -5708
  125. package/dist/client/objects-DaCuy_CB.mjs.map +0 -1
  126. package/dist/client/projects-CHYn7L5e.mjs.map +0 -1
  127. package/dist/client/securitygroups-CNFLu9zS.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"_pcaId-BwTvJJgh.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","PcaCertificatesTableRow","certificate","useLingui","navigate","navigateToCertificateDetailsPage","from","to","params","prev","certificateId","id","data-testid","onClick","certificate_authority_id","e","stopPropagation","className","label","t","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Spinner","Message","Textarea","trpcReact","useProjectId","IssueEndEntityCertificateModal","open","onClose","pcaId","useLingui","navigate","projectId","utils","useUtils","isPending","createCertificateMutation","services","pca","createCertificate","useMutation","onSettled","listCertificates","invalidate","formSchema","object","csr","string","trim","min","form","defaultValues","validators","onSubmit","value","createdCertificate","mutateAsync","project_id","certificate_authority_id","replace","configuration","validity","not_after","Math","floor","Date","now","handleClose","to","params","certificateId","id","reset","currentCsr","store","state","values","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","length","error","dismissible","variant","className","message","div","span","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","placeholder","errortext","meta","errors","map","join","disabled","useState","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","Pagination","trpcReact","useProjectId","useModal","PcaCertificatesTableRow","IssueEndEntityCertificateModal","ITEMS_PER_PAGE","PcaCertificatesListContainer","pcaId","pcaState","useLingui","projectId","createIssueEndEntityOpen","toggleIssueEndEntity","pageMarkers","setPageMarkers","undefined","currentPage","setCurrentPage","columns","t","columnsLength","length","currentMarker","data","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","limit","next_page_marker","certificates","nextMarker","hasNextPage","computedTotal","totalPages","Math","max","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","div","label","onClick","open","onClose","data-testid","colSpan","p","map","certificate","id","pages","onPressPrevious","onPressNext","Modal","Spinner","Message","trpcReact","useProjectId","VALIDITY_SECONDS","IssueSelfSignedCertificateModal","open","onClose","pca","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","createCertificate","useMutation","onSettled","listCertificates","invalidate","handleConfirm","csr","mutateAsync","project_id","certificate_authority_id","id","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","disableConfirmButton","error","dismissible","variant","className","message","div","span","useRef","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","Button","trpcReact","useProjectId","ImportExternallySignedCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","importMutation","services","pca","import","useMutation","onSettled","getById","invalidate","formSchema","object","imported_certificate_chain","string","trim","min","form","defaultValues","validators","onSubmit","mutateAsync","project_id","certificate_authority_id","state","values","handleClose","reset","fileInputRef","currentChain","store","handleFileChange","e","file","target","files","reader","FileReader","onload","event","text","result","chainValue","name","endsWith","parsed","JSON","parse","setFieldValue","error","console","readAsText","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","message","div","span","id","preventDefault","onClick","current","click","input","ref","type","accept","onChange","Field","children","field","value","onBlur","handleBlur","handleChange","placeholder","errortext","meta","errors","map","join","disabled","Fragment","useNavigate","Button","CodeBlock","DescriptionDefinition","DescriptionList","DescriptionTerm","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","IssueSelfSignedCertificateModal","ImportExternallySignedCertificateModal","PcaDetailsView","pca","useLingui","navigate","projectId","subjectCommonName","configuration","subject","common_name","certificateHeading","t","issueSelfSignedModalOpen","toggleIssueSelfSignedModal","importExternallySignedModalOpen","toggleImportExternallySignedModal","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","value","id","project_id","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","badge","onClick","p","alignTerms","map","heading","content","csr","wrap","pcaId","open","onClose","onSuccess","pcaState","useNavigate","Trans","Button","Spinner","Stack","trpcReact","useProjectId","PcaDetailsView","Route","RouteComponent","navigate","projectId","pcaId","useParams","isLoading","isError","error","data","pca","services","getById","useQuery","project_id","certificate_authority_id","handleBack","to","params","errorMessage","message","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueEndEntityCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaCertificatesListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueSelfSignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/ImportExternallySignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/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 { Certificate } from \"@/server/Services/types/pca\"\n\ninterface PcaCertificatesTableRowProps {\n certificate: Certificate\n}\n\nexport const PcaCertificatesTableRow = ({ certificate }: PcaCertificatesTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n\n const navigateToCertificateDetailsPage = () =>\n navigate({\n from: \"/projects/$projectId/services/pca/$pcaId/\",\n to: \"$certificateId\",\n params: (prev) => ({ ...prev, certificateId: certificate.id }),\n })\n\n return (\n <DataGridRow\n key={certificate.id}\n data-testid={`pca-certificate-row-${certificate.id}`}\n onClick={navigateToCertificateDetailsPage}\n >\n <DataGridCell>{certificate.certificate_authority_id}</DataGridCell>\n <DataGridCell>{certificate.id}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToCertificateDetailsPage} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface IssueEndEntityCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const IssueEndEntityCertificateModal = ({ open, onClose, pcaId }: IssueEndEntityCertificateModalProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const formSchema = z.object({\n csr: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n csr: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const createdCertificate = await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n // Normalize to one format so users can paste raw multi-line CSRs with \\n along with already formatted ones\n csr: value.csr.replace(/\\\\n/g, \"\\n\"),\n configuration: { validity: { not_after: Math.floor(Date.now() / 1000) + 8 * 60 * 60 } },\n })\n handleClose()\n\n await navigate({\n to: \"/projects/$projectId/services/pca/$pcaId/$certificateId\",\n params: { projectId, pcaId, certificateId: createdCertificate.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createCertificateMutation.reset()\n onClose()\n }\n\n const currentCsr = useStore(form.store, (state) => state.values.csr)\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Issue End-Entity Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !(currentCsr.trim().length > 0)}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.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>Issuing End-Entity Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"issue-end-entity-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"csr\"\n children={(field) => (\n <Textarea\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 placeholder={t`Paste CSR code`}\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 { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useState } from \"react\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { PcaCertificatesTableRow } from \"./-table/PcaCertificatesTableRow\"\nimport { IssueEndEntityCertificateModal } from \"./-modals/IssueEndEntityCertificateModal\"\n\nconst ITEMS_PER_PAGE = 50\n\ninterface PcaCertificatesListContainerProps {\n pcaId: string\n pcaState: CertificateAuthority[\"state\"]\n}\n\nexport const PcaCertificatesListContainer = ({ pcaId, pcaState }: PcaCertificatesListContainerProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [createIssueEndEntityOpen, toggleIssueEndEntity] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\n\n const columns = () =>\n [\n t`CA ID`,\n t`ID`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n const columnsLength = columns().length\n\n const currentMarker = pageMarkers[currentPage - 1]\n\n const { data, isLoading, isError, error } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n limit: ITEMS_PER_PAGE,\n next_page_marker: currentMarker,\n })\n\n const certificates = data?.certificates ?? []\n const nextMarker = data?.next_page_marker\n const hasNextPage = !!nextMarker\n const computedTotal = hasNextPage ? currentPage + 1 : currentPage\n const totalPages = Math.max(computedTotal, pageMarkers.length)\n\n const goToPage = (page: number) => {\n if (page < 1 || page > totalPages) return\n if (page > currentPage && nextMarker) {\n setPageMarkers((prev) => {\n const updated = [...prev]\n updated[page - 1] = nextMarker\n return updated\n })\n }\n setCurrentPage(page)\n }\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 Certificates issued by Certificate Authority...</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 Certificates issued by Certificate Authority.`}\n </Stack>\n )\n }\n\n return (\n <div className=\"relative\">\n {pcaState === \"READY\" && (\n <>\n <Stack className=\"pt-3 pb-2\" distribution=\"end\">\n <Button variant=\"primary\" label={t`Issue End-Entity Certificate`} onClick={toggleIssueEndEntity} />\n </Stack>\n {createIssueEndEntityOpen && (\n <IssueEndEntityCertificateModal\n open={createIssueEndEntityOpen}\n onClose={toggleIssueEndEntity}\n pcaId={pcaId}\n />\n )}\n </>\n )}\n\n {certificates.length === 0 && currentPage === 1 ? (\n <DataGrid columns={columnsLength} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columnsLength}>\n <ContentHeading>\n <Trans>No Certificates issued by this Certificate Authority found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no Certificates available for this Certificate Authority.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n ) : (\n <DataGrid columns={columnsLength}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {certificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\n )}\n\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => goToPage(currentPage - 1)}\n onPressNext={() => goToPage(currentPage + 1)}\n />\n </div>\n )}\n </div>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Spinner, Message } from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nconst VALIDITY_SECONDS = 86400 // 1 day\n\nexport interface IssueSelfSignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pca: CertificateAuthority\n}\n\nexport const IssueSelfSignedCertificateModal = ({ open, onClose, pca }: IssueSelfSignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const handleConfirm = async () => {\n if (isPending || !pca.csr) return\n\n await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pca.id,\n csr: pca.csr,\n configuration: {\n validity: {\n not_after: Math.floor(Date.now() / 1000) + VALIDITY_SECONDS,\n },\n },\n })\n onClose()\n }\n\n const handleClose = () => {\n if (isPending) return\n\n createCertificateMutation.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n title={t`Issue Self-Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Issue Certificate`}\n onConfirm={handleConfirm}\n disableConfirmButton={isPending || !pca.csr}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending ? (\n <div className=\"flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing Self-Signed Certificate...</Trans>\n </span>\n </div>\n ) : (\n <Trans>This action will create a self-signed CA certificate.</Trans>\n )}\n </Modal>\n )\n}\n","import { useRef } from \"react\"\nimport { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea, Button } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface ImportExternallySignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const ImportExternallySignedCertificateModal = ({\n open,\n onClose,\n pcaId,\n}: ImportExternallySignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...importMutation } = trpcReact.services.pca.import.useMutation({\n onSettled: () => utils.services.pca.getById.invalidate(),\n })\n\n const formSchema = z.object({\n imported_certificate_chain: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n imported_certificate_chain: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isPending) return\n\n await importMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n imported_certificate_chain: form.state.values.imported_certificate_chain,\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n importMutation.reset()\n onClose()\n }\n\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const currentChain = useStore(form.store, (state) => state.values.imported_certificate_chain)\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n\n const reader = new FileReader()\n reader.onload = (event) => {\n try {\n const text = event.target?.result as string\n let chainValue = text\n\n if (file.name.endsWith(\".json\")) {\n try {\n const parsed = JSON.parse(text)\n // Validate that imported_certificate_chain is a string, fallback to raw text\n chainValue =\n typeof parsed.imported_certificate_chain === \"string\" ? parsed.imported_certificate_chain : text\n } catch {\n // If JSON parsing fails, use raw text\n chainValue = text\n }\n }\n\n form.setFieldValue(\"imported_certificate_chain\", chainValue)\n } catch (error) {\n console.error(\"Failed to read certificate file:\", error)\n }\n }\n reader.readAsText(file)\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Import Externally Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !currentChain.trim()}\n >\n {importMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {importMutation.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>Importing Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"import-externally-signed-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <div className=\"mb-2\">\n <Button onClick={() => fileInputRef.current?.click()}>{t`Choose Certificate to Import`}</Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pem,.crt,.cer,.json\"\n className=\"sr-only\"\n onChange={handleFileChange}\n />\n </div>\n <form.Field\n name=\"imported_certificate_chain\"\n children={(field) => (\n <Textarea\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 placeholder={t`Paste the code`}\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 { Fragment } from \"react\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n CodeBlock,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Stack,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { DeletePcaModal } from \"../../-components/-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"../../-components/-table/constants\"\nimport { PcaCertificatesListContainer } from \"./PcaCertificatesListContainer\"\nimport { IssueSelfSignedCertificateModal } from \"./-modals/IssueSelfSignedCertificateModal\"\nimport { ImportExternallySignedCertificateModal } from \"./-modals/ImportExternallySignedCertificateModal\"\n\ninterface PcaDetailsViewProps {\n pca: CertificateAuthority\n}\n\nexport const PcaDetailsView = ({ pca }: PcaDetailsViewProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const subjectCommonName = pca.configuration?.subject?.common_name ?? \"\"\n const certificateHeading = t`Certificate ${subjectCommonName}`\n const [issueSelfSignedModalOpen, toggleIssueSelfSignedModal] = useModal(false)\n const [importExternallySignedModalOpen, toggleImportExternallySignedModal] = useModal(false)\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToPcaList = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n const basicInfo = [\n { label: t`CA ID`, value: pca.id },\n { label: t`Project ID`, value: pca.project_id },\n { label: t`Subject`, value: pca.configuration?.subject?.common_name },\n {\n label: t`Duration/validity`,\n value:\n pca.certificate?.validity.not_before !== undefined && pca.certificate?.validity.not_after !== undefined\n ? `${Math.round(\n (pca.certificate.validity.not_after - pca.certificate.validity.not_before) / (60 * 60 * 24)\n )} days`\n : undefined,\n },\n ] as const\n\n return (\n <>\n <Stack direction=\"vertical\" gap=\"3\">\n <Stack direction=\"horizontal\" distribution=\"between\">\n <Stack gap=\"2\" alignment=\"center\">\n <div className=\"text-theme-default text-2xl font-semibold\">\n {`${pca.configuration?.subject?.common_name} Certificate Authority Details`}\n </div>\n {STATE_CONFIG[pca.state].badge}\n </Stack>\n <Button onClick={toggleDeletePcaModal}>\n <Trans>Delete Certificate Authority</Trans>\n </Button>\n </Stack>\n\n <p className=\"text-theme-highest text-sm\">\n <Trans>Manage your Private Certificate Authority infrastructure</Trans>\n </p>\n\n {pca.state === \"AWAITING_CERTIFICATE\" && (\n <Stack direction=\"vertical\" gap=\"1\" className=\"bg-dt-background mb-1 rounded-sm p-2\">\n <Stack direction=\"vertical\" gap=\"1\">\n <div className=\"text-base font-bold\">\n <Trans>Lifecycle action</Trans>\n </div>\n <div>\n <Trans>Add a Signed Certificate to your CA to activate it</Trans>\n </div>\n </Stack>\n <Stack direction=\"horizontal\" gap=\"2\" distribution=\"end\">\n <Button onClick={toggleIssueSelfSignedModal}>\n <Trans>Issue Self-Signed Certificate</Trans>\n </Button>\n <Button onClick={toggleImportExternallySignedModal}>\n <Trans>Import Signed Certificate</Trans>\n </Button>\n </Stack>\n </Stack>\n )}\n\n <Stack gap=\"4\" className=\"grid grid-cols-2 items-start\">\n <DescriptionList alignTerms=\"right\" className=\"w-full\">\n {basicInfo.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value || \"—\"}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <CodeBlock\n heading={certificateHeading}\n content={pca?.csr ?? \"\"}\n className=\"w-full [&_pre_code]:block [&_pre_code]:w-full\"\n wrap\n />\n </Stack>\n </Stack>\n\n {importExternallySignedModalOpen && (\n <ImportExternallySignedCertificateModal\n pcaId={pca.id}\n open={importExternallySignedModalOpen}\n onClose={toggleImportExternallySignedModal}\n />\n )}\n\n {issueSelfSignedModalOpen && (\n <IssueSelfSignedCertificateModal\n pca={pca}\n open={issueSelfSignedModalOpen}\n onClose={toggleIssueSelfSignedModal}\n />\n )}\n\n {deletePcaModalOpen && (\n <DeletePcaModal\n pca={pca}\n open={deletePcaModalOpen}\n onClose={toggleDeletePcaModal}\n onSuccess={navigateToPcaList}\n />\n )}\n\n <PcaCertificatesListContainer pcaId={pca.id} pcaState={pca.state} />\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\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\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_pcaId-B3PqECyO.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","PcaCertificatesTableRow","certificate","useLingui","navigate","navigateToCertificateDetailsPage","from","to","params","prev","certificateId","id","data-testid","onClick","certificate_authority_id","e","stopPropagation","className","label","t","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Spinner","Message","Textarea","trpcReact","useProjectId","IssueEndEntityCertificateModal","open","onClose","pcaId","useLingui","navigate","projectId","utils","useUtils","isPending","createCertificateMutation","services","pca","createCertificate","useMutation","onSettled","listCertificates","invalidate","formSchema","object","csr","string","trim","min","form","defaultValues","validators","onSubmit","value","createdCertificate","mutateAsync","project_id","certificate_authority_id","replace","configuration","validity","not_after","Math","floor","Date","now","handleClose","to","params","certificateId","id","reset","currentCsr","store","state","values","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","length","error","dismissible","variant","className","message","div","span","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","placeholder","errortext","meta","errors","map","join","disabled","useState","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","Pagination","trpcReact","useProjectId","useModal","PcaCertificatesTableRow","IssueEndEntityCertificateModal","ITEMS_PER_PAGE","PcaCertificatesListContainer","pcaId","pcaState","useLingui","projectId","createIssueEndEntityOpen","toggleIssueEndEntity","pageMarkers","setPageMarkers","undefined","currentPage","setCurrentPage","columns","t","columnsLength","length","currentMarker","data","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","limit","next_page_marker","certificates","nextMarker","hasNextPage","computedTotal","totalPages","Math","max","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","div","label","onClick","open","onClose","data-testid","colSpan","p","map","certificate","id","pages","onPressPrevious","onPressNext","Modal","Spinner","Message","trpcReact","useProjectId","VALIDITY_SECONDS","IssueSelfSignedCertificateModal","open","onClose","pca","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","createCertificate","useMutation","onSettled","listCertificates","invalidate","handleConfirm","csr","mutateAsync","project_id","certificate_authority_id","id","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","disableConfirmButton","error","dismissible","variant","className","message","div","span","useRef","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","Button","trpcReact","useProjectId","ImportExternallySignedCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","importMutation","services","pca","import","useMutation","onSettled","getById","invalidate","formSchema","object","imported_certificate_chain","string","trim","min","form","defaultValues","validators","onSubmit","mutateAsync","project_id","certificate_authority_id","state","values","handleClose","reset","fileInputRef","currentChain","store","handleFileChange","e","file","target","files","reader","FileReader","onload","event","text","result","chainValue","name","endsWith","parsed","JSON","parse","setFieldValue","error","console","readAsText","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","message","div","span","id","preventDefault","onClick","current","click","input","ref","type","accept","onChange","Field","children","field","value","onBlur","handleBlur","handleChange","placeholder","errortext","meta","errors","map","join","disabled","Fragment","useNavigate","Button","CodeBlock","DescriptionDefinition","DescriptionList","DescriptionTerm","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","IssueSelfSignedCertificateModal","ImportExternallySignedCertificateModal","PcaDetailsView","pca","useLingui","navigate","projectId","subjectCommonName","configuration","subject","common_name","certificateHeading","t","issueSelfSignedModalOpen","toggleIssueSelfSignedModal","importExternallySignedModalOpen","toggleImportExternallySignedModal","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","value","id","project_id","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","badge","onClick","p","alignTerms","map","heading","content","csr","wrap","pcaId","open","onClose","onSuccess","pcaState","useNavigate","Trans","Button","Spinner","Stack","trpcReact","useProjectId","PcaDetailsView","Route","RouteComponent","navigate","projectId","pcaId","useParams","isLoading","isError","error","data","pca","services","getById","useQuery","project_id","certificate_authority_id","handleBack","to","params","errorMessage","message","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueEndEntityCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaCertificatesListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueSelfSignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/ImportExternallySignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/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 { Certificate } from \"@/server/Services/types/pca\"\n\ninterface PcaCertificatesTableRowProps {\n certificate: Certificate\n}\n\nexport const PcaCertificatesTableRow = ({ certificate }: PcaCertificatesTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n\n const navigateToCertificateDetailsPage = () =>\n navigate({\n from: \"/projects/$projectId/services/pca/$pcaId/\",\n to: \"$certificateId\",\n params: (prev) => ({ ...prev, certificateId: certificate.id }),\n })\n\n return (\n <DataGridRow\n key={certificate.id}\n data-testid={`pca-certificate-row-${certificate.id}`}\n onClick={navigateToCertificateDetailsPage}\n >\n <DataGridCell>{certificate.certificate_authority_id}</DataGridCell>\n <DataGridCell>{certificate.id}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToCertificateDetailsPage} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface IssueEndEntityCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const IssueEndEntityCertificateModal = ({ open, onClose, pcaId }: IssueEndEntityCertificateModalProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const formSchema = z.object({\n csr: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n csr: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const createdCertificate = await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n // Normalize to one format so users can paste raw multi-line CSRs with \\n along with already formatted ones\n csr: value.csr.replace(/\\\\n/g, \"\\n\"),\n configuration: { validity: { not_after: Math.floor(Date.now() / 1000) + 8 * 60 * 60 } },\n })\n handleClose()\n\n await navigate({\n to: \"/projects/$projectId/services/pca/$pcaId/$certificateId\",\n params: { projectId, pcaId, certificateId: createdCertificate.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createCertificateMutation.reset()\n onClose()\n }\n\n const currentCsr = useStore(form.store, (state) => state.values.csr)\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Issue End-Entity Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !(currentCsr.trim().length > 0)}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.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>Issuing End-Entity Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"issue-end-entity-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"csr\"\n children={(field) => (\n <Textarea\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 placeholder={t`Paste CSR code`}\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 { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useState } from \"react\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { PcaCertificatesTableRow } from \"./-table/PcaCertificatesTableRow\"\nimport { IssueEndEntityCertificateModal } from \"./-modals/IssueEndEntityCertificateModal\"\n\nconst ITEMS_PER_PAGE = 50\n\ninterface PcaCertificatesListContainerProps {\n pcaId: string\n pcaState: CertificateAuthority[\"state\"]\n}\n\nexport const PcaCertificatesListContainer = ({ pcaId, pcaState }: PcaCertificatesListContainerProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [createIssueEndEntityOpen, toggleIssueEndEntity] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\n\n const columns = () =>\n [\n t`CA ID`,\n t`ID`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n const columnsLength = columns().length\n\n const currentMarker = pageMarkers[currentPage - 1]\n\n const { data, isLoading, isError, error } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n limit: ITEMS_PER_PAGE,\n next_page_marker: currentMarker,\n })\n\n const certificates = data?.certificates ?? []\n const nextMarker = data?.next_page_marker\n const hasNextPage = !!nextMarker\n const computedTotal = hasNextPage ? currentPage + 1 : currentPage\n const totalPages = Math.max(computedTotal, pageMarkers.length)\n\n const goToPage = (page: number) => {\n if (page < 1 || page > totalPages) return\n if (page > currentPage && nextMarker) {\n setPageMarkers((prev) => {\n const updated = [...prev]\n updated[page - 1] = nextMarker\n return updated\n })\n }\n setCurrentPage(page)\n }\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 Certificates issued by Certificate Authority...</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 Certificates issued by Certificate Authority.`}\n </Stack>\n )\n }\n\n return (\n <div className=\"relative\">\n {pcaState === \"READY\" && (\n <>\n <Stack className=\"pt-3 pb-2\" distribution=\"end\">\n <Button variant=\"primary\" label={t`Issue End-Entity Certificate`} onClick={toggleIssueEndEntity} />\n </Stack>\n {createIssueEndEntityOpen && (\n <IssueEndEntityCertificateModal\n open={createIssueEndEntityOpen}\n onClose={toggleIssueEndEntity}\n pcaId={pcaId}\n />\n )}\n </>\n )}\n\n {certificates.length === 0 && currentPage === 1 ? (\n <DataGrid columns={columnsLength} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columnsLength}>\n <ContentHeading>\n <Trans>No Certificates issued by this Certificate Authority found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no Certificates available for this Certificate Authority.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n ) : (\n <DataGrid columns={columnsLength}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {certificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\n )}\n\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => goToPage(currentPage - 1)}\n onPressNext={() => goToPage(currentPage + 1)}\n />\n </div>\n )}\n </div>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Spinner, Message } from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nconst VALIDITY_SECONDS = 86400 // 1 day\n\nexport interface IssueSelfSignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pca: CertificateAuthority\n}\n\nexport const IssueSelfSignedCertificateModal = ({ open, onClose, pca }: IssueSelfSignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const handleConfirm = async () => {\n if (isPending || !pca.csr) return\n\n await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pca.id,\n csr: pca.csr,\n configuration: {\n validity: {\n not_after: Math.floor(Date.now() / 1000) + VALIDITY_SECONDS,\n },\n },\n })\n onClose()\n }\n\n const handleClose = () => {\n if (isPending) return\n\n createCertificateMutation.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n title={t`Issue Self-Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Issue Certificate`}\n onConfirm={handleConfirm}\n disableConfirmButton={isPending || !pca.csr}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending ? (\n <div className=\"flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing Self-Signed Certificate...</Trans>\n </span>\n </div>\n ) : (\n <Trans>This action will create a self-signed CA certificate.</Trans>\n )}\n </Modal>\n )\n}\n","import { useRef } from \"react\"\nimport { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea, Button } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface ImportExternallySignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const ImportExternallySignedCertificateModal = ({\n open,\n onClose,\n pcaId,\n}: ImportExternallySignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...importMutation } = trpcReact.services.pca.import.useMutation({\n onSettled: () => utils.services.pca.getById.invalidate(),\n })\n\n const formSchema = z.object({\n imported_certificate_chain: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n imported_certificate_chain: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isPending) return\n\n await importMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n imported_certificate_chain: form.state.values.imported_certificate_chain,\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n importMutation.reset()\n onClose()\n }\n\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const currentChain = useStore(form.store, (state) => state.values.imported_certificate_chain)\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n\n const reader = new FileReader()\n reader.onload = (event) => {\n try {\n const text = event.target?.result as string\n let chainValue = text\n\n if (file.name.endsWith(\".json\")) {\n try {\n const parsed = JSON.parse(text)\n // Validate that imported_certificate_chain is a string, fallback to raw text\n chainValue =\n typeof parsed.imported_certificate_chain === \"string\" ? parsed.imported_certificate_chain : text\n } catch {\n // If JSON parsing fails, use raw text\n chainValue = text\n }\n }\n\n form.setFieldValue(\"imported_certificate_chain\", chainValue)\n } catch (error) {\n console.error(\"Failed to read certificate file:\", error)\n }\n }\n reader.readAsText(file)\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Import Externally Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !currentChain.trim()}\n >\n {importMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {importMutation.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>Importing Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"import-externally-signed-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <div className=\"mb-2\">\n <Button onClick={() => fileInputRef.current?.click()}>{t`Choose Certificate to Import`}</Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pem,.crt,.cer,.json\"\n className=\"sr-only\"\n onChange={handleFileChange}\n />\n </div>\n <form.Field\n name=\"imported_certificate_chain\"\n children={(field) => (\n <Textarea\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 placeholder={t`Paste the code`}\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 { Fragment } from \"react\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n CodeBlock,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Stack,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { DeletePcaModal } from \"../../-components/-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"../../-components/-table/constants\"\nimport { PcaCertificatesListContainer } from \"./PcaCertificatesListContainer\"\nimport { IssueSelfSignedCertificateModal } from \"./-modals/IssueSelfSignedCertificateModal\"\nimport { ImportExternallySignedCertificateModal } from \"./-modals/ImportExternallySignedCertificateModal\"\n\ninterface PcaDetailsViewProps {\n pca: CertificateAuthority\n}\n\nexport const PcaDetailsView = ({ pca }: PcaDetailsViewProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const subjectCommonName = pca.configuration?.subject?.common_name ?? \"\"\n const certificateHeading = t`Certificate ${subjectCommonName}`\n const [issueSelfSignedModalOpen, toggleIssueSelfSignedModal] = useModal(false)\n const [importExternallySignedModalOpen, toggleImportExternallySignedModal] = useModal(false)\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToPcaList = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n const basicInfo = [\n { label: t`CA ID`, value: pca.id },\n { label: t`Project ID`, value: pca.project_id },\n { label: t`Subject`, value: pca.configuration?.subject?.common_name },\n {\n label: t`Duration/validity`,\n value:\n pca.certificate?.validity.not_before !== undefined && pca.certificate?.validity.not_after !== undefined\n ? `${Math.round(\n (pca.certificate.validity.not_after - pca.certificate.validity.not_before) / (60 * 60 * 24)\n )} days`\n : undefined,\n },\n ] as const\n\n return (\n <>\n <Stack direction=\"vertical\" gap=\"3\">\n <Stack direction=\"horizontal\" distribution=\"between\">\n <Stack gap=\"2\" alignment=\"center\">\n <div className=\"text-theme-default text-2xl font-semibold\">\n {`${pca.configuration?.subject?.common_name} Certificate Authority Details`}\n </div>\n {STATE_CONFIG[pca.state].badge}\n </Stack>\n <Button onClick={toggleDeletePcaModal}>\n <Trans>Delete Certificate Authority</Trans>\n </Button>\n </Stack>\n\n <p className=\"text-theme-highest text-sm\">\n <Trans>Manage your Private Certificate Authority infrastructure</Trans>\n </p>\n\n {pca.state === \"AWAITING_CERTIFICATE\" && (\n <Stack direction=\"vertical\" gap=\"1\" className=\"bg-dt-background mb-1 rounded-sm p-2\">\n <Stack direction=\"vertical\" gap=\"1\">\n <div className=\"text-base font-bold\">\n <Trans>Lifecycle action</Trans>\n </div>\n <div>\n <Trans>Add a Signed Certificate to your CA to activate it</Trans>\n </div>\n </Stack>\n <Stack direction=\"horizontal\" gap=\"2\" distribution=\"end\">\n <Button onClick={toggleIssueSelfSignedModal}>\n <Trans>Issue Self-Signed Certificate</Trans>\n </Button>\n <Button onClick={toggleImportExternallySignedModal}>\n <Trans>Import Signed Certificate</Trans>\n </Button>\n </Stack>\n </Stack>\n )}\n\n <Stack gap=\"4\" className=\"grid grid-cols-2 items-start\">\n <DescriptionList alignTerms=\"right\" className=\"w-full\">\n {basicInfo.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value || \"—\"}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <CodeBlock\n heading={certificateHeading}\n content={pca?.csr ?? \"\"}\n className=\"w-full [&_pre_code]:block [&_pre_code]:w-full\"\n wrap\n />\n </Stack>\n </Stack>\n\n {importExternallySignedModalOpen && (\n <ImportExternallySignedCertificateModal\n pcaId={pca.id}\n open={importExternallySignedModalOpen}\n onClose={toggleImportExternallySignedModal}\n />\n )}\n\n {issueSelfSignedModalOpen && (\n <IssueSelfSignedCertificateModal\n pca={pca}\n open={issueSelfSignedModalOpen}\n onClose={toggleIssueSelfSignedModal}\n />\n )}\n\n {deletePcaModalOpen && (\n <DeletePcaModal\n pca={pca}\n open={deletePcaModalOpen}\n onClose={toggleDeletePcaModal}\n onSuccess={navigateToPcaList}\n />\n )}\n\n <PcaCertificatesListContainer pcaId={pca.id} pcaState={pca.state} />\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\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\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":"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"}
@@ -19,7 +19,7 @@ var i = t("/_auth/projects/$projectId/services/pca/$pcaId/")({
19
19
  return { pcaTitle: n?.configuration?.subject?.common_name || n?.id || null };
20
20
  },
21
21
  head: ({ loaderData: e }) => ({ meta: [{ title: e?.pcaTitle ?? "Certificate Authority" }] }),
22
- component: n(() => import("./_pcaId-BwTvJJgh.mjs"), "component"),
22
+ component: n(() => import("./_pcaId-B3PqECyO.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.pca?.["clavis-beta"] || a.pca?.["clavis-dev"])) throw r({
@@ -31,4 +31,4 @@ var i = t("/_auth/projects/$projectId/services/pca/$pcaId/")({
31
31
  //#endregion
32
32
  export { i as t };
33
33
 
34
- //# sourceMappingURL=_pcaId-DUHQd0rB.mjs.map
34
+ //# sourceMappingURL=_pcaId-DAJEt3ZI.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_pcaId-DUHQd0rB.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","pca","trpcClient","services","getById","query","project_id","projectId","certificate_authority_id","pcaId","pcaTitle","configuration","subject","common_name","id","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex","pcaServices"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\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\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,iDAAA,EAAmD;CACtFI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,WAAW;EACrCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;EAAoC;CAC7E;CACAE,QAAQ,OAAO,EAAEC,YAASC,gBAAQ;EAChC,IAAMC,IAAM,MAAMF,EAAQG,YAAYC,SAASF,IAAIG,QAAQC,MAAM;GAC/DC,YAAYN,EAAOO;GACnBC,0BAA0BR,EAAOS;EACnC,CAAA;EACA,OAAO,EAAEC,UAAUT,GAAKU,eAAeC,SAASC,eAAeZ,GAAKa,MAAM,KAAK;CACjF;CACAC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYN,YAAY,wBAAwB,CAAA,EAClE;CACAS,WAASC,yCAAA,WAAA;CACTE,YAAY,OAAO,EAAEvB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAEjB2B,IAAevC,EADK,MAAOe,GAAYsB,KAAKC,qBAAqBpB,MAAAA,KAAY,CAAA,CAC9CkB;EAKrC,IAAI,EAHgBG,EAAa,MAAS,kBAAkBA,EAAa,MAAS,gBAIhF,MAAMxC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,UAAU;EACxC,CAAA;CAEJ;AACF,CAAA"}
1
+ {"version":3,"file":"_pcaId-DAJEt3ZI.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","pca","trpcClient","services","getById","query","project_id","projectId","certificate_authority_id","pcaId","pcaTitle","configuration","subject","common_name","id","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex","pcaServices"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\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\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,iDAAA,EAAmD;CACtFI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,WAAW;EACrCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;EAAoC;CAC7E;CACAE,QAAQ,OAAO,EAAEC,YAASC,gBAAQ;EAChC,IAAMC,IAAM,MAAMF,EAAQG,YAAYC,SAASF,IAAIG,QAAQC,MAAM;GAC/DC,YAAYN,EAAOO;GACnBC,0BAA0BR,EAAOS;EACnC,CAAA;EACA,OAAO,EAAEC,UAAUT,GAAKU,eAAeC,SAASC,eAAeZ,GAAKa,MAAM,KAAK;CACjF;CACAC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYN,YAAY,wBAAwB,CAAA,EAClE;CACAS,WAASC,yCAAA,WAAA;CACTE,YAAY,OAAO,EAAEvB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAEjB2B,IAAevC,EADK,MAAOe,GAAYsB,KAAKC,qBAAqBpB,MAAAA,KAAY,CAAA,CAC9CkB;EAKrC,IAAI,EAHgBG,EAAa,MAAS,kBAAkBA,EAAa,MAAS,gBAIhF,MAAMxC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,UAAU;EACxC,CAAA;CAEJ;AACF,CAAA"}
@@ -1,7 +1,7 @@
1
- import { Y as e, c as t, u as n } from "./build-BdRRmNf5.mjs";
1
+ import { X as e, c as t, u as n } from "./build-DF7MTyXG.mjs";
2
2
  import { t as r } from "./Slot-CWb612-_.mjs";
3
3
  import { t as i } from "./helpers-1PpYf-fC.mjs";
4
- import { t as a } from "./ContentHeader-D4jlOG-9.mjs";
4
+ import { t as a } from "./ContentHeader-DsuZD8fa.mjs";
5
5
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
6
  import { useLoaderData as c, useNavigate as l, useRouteContext as u } from "@tanstack/react-router";
7
7
  import { Trans as d, useLingui as f } from "@lingui/react";
@@ -103,4 +103,4 @@ function m() {
103
103
  //#endregion
104
104
  export { m as component };
105
105
 
106
- //# sourceMappingURL=_projectId-CARHuZTU.mjs.map
106
+ //# sourceMappingURL=_projectId-B2hG5peP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_projectId-B2hG5peP.mjs","names":["useLoaderData","useNavigate","Card","Icon","Stack","getServiceIndex","Trans","useLingui","useRouteContext","ContentHeader","Slot","Route","ServiceCardProps","group","label","to","service","ServiceCard","navigate","slots","strict","serviceBadge","RouteComponent","crumbProject","availableServices","projectId","description","from","t","enabledServices","isEnabled","includes","serviceIndex","base","cards","push","name","projectOverviewBanner","length","map","card","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, useLoaderData, useNavigate } from \"@tanstack/react-router\"\nimport { Card, Icon, 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 { useRouteContext } from \"@tanstack/react-router\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { Slot } from \"@/client/components/Slot\"\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/\")({\n component: RouteComponent,\n})\n\ninterface ServiceCardProps {\n group: string\n label: string\n to: string\n service: string\n}\n\nfunction ServiceCard({ group, label, to, service }: ServiceCardProps) {\n const navigate = useNavigate()\n const { slots } = useRouteContext({ strict: false })\n\n return (\n <Card\n onClick={() => navigate({ to: to as never })}\n className=\"flex min-h-40 flex-col gap-4 px-3 pt-2 pb-3\"\n data-testid=\"service-card\"\n >\n <div className=\"flex min-w-0 flex-col\">\n <div className=\"flex items-center gap-1\">\n <p className=\"text-theme-light text-xs leading-5 font-medium\">{group}</p>\n <Icon icon=\"expandLess\" size=\"16\" className=\"text-theme-high\" />\n </div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-theme-high text-lg leading-7 font-bold\" data-testid=\"service-card-label\">\n {label}\n </p>\n {slots?.serviceBadge && <Slot component={slots.serviceBadge} useShadowDOM={false} currentService={service} />}\n </div>\n </div>\n <div className=\"flex-1\" />\n </Card>\n )\n}\n\nfunction RouteComponent() {\n const { crumbProject, availableServices, projectId, description } = useLoaderData({\n from: \"/_auth/projects/$projectId\",\n })\n const { t } = useLingui()\n const { slots, enabledServices } = useRouteContext({ strict: false })\n const isEnabled = (service: string) => !enabledServices || enabledServices.includes(service)\n\n const serviceIndex = getServiceIndex(availableServices ?? [])\n const base = `/projects/${projectId}`\n\n const cards: ServiceCardProps[] = []\n\n if (serviceIndex[\"image\"]?.[\"glance\"] && isEnabled(\"images\"))\n cards.push({ group: t`Compute`, label: t`Images`, to: `${base}/compute/images`, service: \"images\" })\n if (serviceIndex[\"compute\"]?.[\"nova\"] && isEnabled(\"flavors\"))\n cards.push({ group: t`Compute`, label: t`Flavors`, to: `${base}/compute/flavors`, service: \"flavors\" })\n if (serviceIndex[\"network\"]) {\n if (isEnabled(\"securitygroups\"))\n cards.push({\n group: t`Network`,\n label: t`Security Groups`,\n to: `${base}/network/securitygroups`,\n service: \"securitygroups\",\n })\n if (isEnabled(\"floatingips\"))\n cards.push({\n group: t`Network`,\n label: t`Floating IPs`,\n to: `${base}/network/floatingips`,\n service: \"floatingips\",\n })\n }\n if (serviceIndex[\"object-store\"]?.[\"swift\"] && isEnabled(\"containers\"))\n cards.push({\n group: t`Storage`,\n label: t`Object Storage (Swift)`,\n to: `${base}/storage/swift/containers`,\n service: \"containers\",\n })\n if (serviceIndex[\"object-store-ceph\"]?.[\"ceph\"] && isEnabled(\"ceph-containers\"))\n cards.push({\n group: t`Storage`,\n label: t`Object Storage (Ceph)`,\n to: `${base}/storage/ceph/buckets`,\n service: \"ceph-containers\",\n })\n if ((serviceIndex[\"pca\"]?.[\"clavis-dev\"] || serviceIndex[\"pca\"]?.[\"clavis-beta\"]) && isEnabled(\"pca\")) {\n cards.push({ group: t`Services`, label: t`PCA (Clavis)`, to: `${base}/services/pca`, service: \"pca\" })\n }\n\n return (\n <Stack direction=\"vertical\" gap=\"6\" className=\"pb-4\">\n <ContentHeader title={crumbProject?.name ?? t`Project`} projectId={projectId} description={description} />\n {slots?.projectOverviewBanner && <Slot component={slots.projectOverviewBanner} useShadowDOM={false} />}\n {cards.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {cards.map((card) => (\n <ServiceCard key={card.to} {...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":"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"}
@@ -1,7 +1,7 @@
1
1
  import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
2
2
  var n = e("/_auth/projects/$projectId")({
3
- component: t(() => import("./_projectId-BaqZ4W50.mjs"), "component"),
4
- errorComponent: t(() => import("./_projectId-B_2sZKk-.mjs"), "errorComponent"),
3
+ component: t(() => import("./_projectId-DRr9rLST.mjs"), "component"),
4
+ errorComponent: t(() => import("./_projectId-DU8qRiZk.mjs"), "errorComponent"),
5
5
  loader: async (e) => {
6
6
  let { context: t, params: n } = e, r = await t.trpcClient?.auth.setCurrentScope.mutate({
7
7
  type: "project",
@@ -24,4 +24,4 @@ var n = e("/_auth/projects/$projectId")({
24
24
  //#endregion
25
25
  export { n as t };
26
26
 
27
- //# sourceMappingURL=_projectId-DR_2U10f.mjs.map
27
+ //# sourceMappingURL=_projectId-BnWXWTBR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_projectId-BnWXWTBR.mjs","names":["createFileRoute","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","loader","options","context","params","data","trpcClient","auth","setCurrentScope","mutate","type","projectId","availableServices","projects","Promise","all","getAvailableServices","query","project","getAuthProjects","catch","accountId","domain","id","description","find","p","crumbDomain","path","name","crumbProject"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData, useRouteContext } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { buildNavSections } from \"@/client/routes/_auth/projects/-components/buildNavSections\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { useMemo } from \"react\"\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\n const [availableServices, projects] = await Promise.all([\n context.trpcClient?.auth.getAvailableServices.query(),\n context.trpcClient?.project.getAuthProjects.query().catch(() => null),\n ])\n\n const accountId = data?.domain?.id || \"\"\n const description = projects?.find((p) => p.id === params.projectId)?.description ?? null\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId,\n projectId: params.projectId,\n description,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject, crumbDomain } = useLoaderData({ from: Route.id })\n const { enabledServices } = useRouteContext({ strict: false })\n\n const sections = useMemo(\n () => buildNavSections(projectId, availableServices!, enabledServices),\n [projectId, availableServices, enabledServices]\n )\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n sections={sections}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n domainName={crumbDomain?.name}\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":";AAQA,IAAaC,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,GAEM,CAACC,GAAmBC,KAAY,MAAMC,QAAQC,IAAI,CACtDZ,EAAQG,YAAYC,KAAKS,qBAAqBC,MAAAA,GAC9Cd,EAAQG,YAAYY,QAAQC,gBAAgBF,MAAAA,EAAQG,YAAY,IAAA,CAAA,CACjE,GAEKC,IAAYhB,GAAMiB,QAAQC,MAAM,IAChCC,IAAcX,GAAUY,MAAMC,MAAMA,EAAEH,OAAOnB,EAAOO,SAAS,GAAGa,eAAe;EAErF,OAAO;GACLlB,YAAYH,EAAQG;GACpBqB,aAAa;IAAEC,MAAM;IAAaC,MAAMxB,GAAMiB,QAAQO;GAAK;GAC3DC,cAAczB,GAAMa;GACpBN;GACAS;GACAV,WAAWP,EAAOO;GAClBa;EACF;CACF;AACF,CAAA"}