@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
@@ -1 +1 @@
1
- {"version":3,"file":"_pcaId-CFuKY82d.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","disabled","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","trpcReact","useProjectId","IssueEndEntityCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","pca","createCertificate","useMutation","onSettled","listCertificates","invalidate","formSchema","object","csr","string","trim","min","form","defaultValues","validators","onSubmit","value","mutateAsync","project_id","certificate_authority_id","replace","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","currentCsr","store","state","values","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","length","error","dismissible","variant","className","message","div","span","id","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","placeholder","errortext","meta","errors","map","join","disabled","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","trpcReact","useProjectId","useModal","PcaCertificatesTableRow","IssueEndEntityCertificateModal","PcaCertificatesListContainer","pcaId","pcaState","useLingui","projectId","createIssueEndEntityOpen","toggleIssueEndEntity","columns","t","data","pcaCertificates","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","className","distribution","alignment","direction","variant","size","message","div","label","onClick","open","onClose","length","data-testid","colSpan","p","map","certificate","id","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","Fragment","MdDownload","MdContentCopy","useNavigate","Button","DescriptionDefinition","DescriptionList","DescriptionTerm","Divider","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","IssueSelfSignedCertificateModal","PcaDetailsView","pca","useLingui","navigate","projectId","issueSelfSignedModalOpen","toggleIssueSelfSignedModal","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","t","value","id","project_id","configuration","subject","common_name","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","icon","text","onClick","p","alignTerms","map","csr","open","onClose","onSuccess","pcaId","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/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 {/* I will enable this button on create-certificate task of the EPIC */}\n <PopupMenuItem label={t`Create Certificate`} disabled />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\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 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 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 })\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 {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\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\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\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\n const {\n data: pcaCertificates = [],\n isLoading,\n isError,\n error,\n } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\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 <Button variant=\"primary\" label={t`Issue End Entity Certificate`} onClick={toggleIssueEndEntity} />\n {createIssueEndEntityOpen && (\n <IssueEndEntityCertificateModal\n open={createIssueEndEntityOpen}\n onClose={toggleIssueEndEntity}\n pcaId={pcaId}\n />\n )}\n </>\n )}\n\n {pcaCertificates.length === 0 ? (\n <DataGrid columns={columns().length} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columns().length}>\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={columns().length}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcaCertificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\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 { Fragment } from \"react\"\nimport { MdDownload, MdContentCopy } from \"react-icons/md\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Divider,\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\"\n// import { ImportExternallySignedCertificateModal } from \"./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 [issueSelfSignedModalOpen, toggleIssueSelfSignedModal] = useModal(false)\n // I will enable this modal on import-certificate task of the EPIC\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 {/* temporary bg, I will resolve this as soon as I will have sync with designers */}\n <div className=\"bg-aurora-blue-200 flex items-center gap-1 rounded-sm px-1 py-0.5\">\n {STATE_CONFIG[pca.state].icon} {STATE_CONFIG[pca.state].text}\n </div>\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 <div className=\"bg-dt-background w-full rounded-sm\">\n <div className=\"text-theme-default p-4 text-xl font-bold\">\n Certificate {`${pca.configuration?.subject?.common_name}`}\n </div>\n <Divider />\n\n <div className=\"p-4 text-sm break-all whitespace-pre-wrap\">{pca?.csr}</div>\n\n {/* I will implement downloading-copying functionality at issue/import part of the epic as I need to clarify some stuff with design-clavis team */}\n <Divider />\n <Stack gap=\"2\" distribution=\"end\" className=\"p-4\">\n <Button>\n <MdDownload />\n </Button>\n <Button>\n <MdContentCopy />\n </Button>\n </Stack>\n </div>\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-CwlH1Kvl.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","disabled","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","trpcReact","useProjectId","IssueEndEntityCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","pca","createCertificate","useMutation","onSettled","listCertificates","invalidate","formSchema","object","csr","string","trim","min","form","defaultValues","validators","onSubmit","value","mutateAsync","project_id","certificate_authority_id","replace","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","currentCsr","store","state","values","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","length","error","dismissible","variant","className","message","div","span","id","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","placeholder","errortext","meta","errors","map","join","disabled","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","trpcReact","useProjectId","useModal","PcaCertificatesTableRow","IssueEndEntityCertificateModal","PcaCertificatesListContainer","pcaId","pcaState","useLingui","projectId","createIssueEndEntityOpen","toggleIssueEndEntity","columns","t","data","pcaCertificates","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","className","distribution","alignment","direction","variant","size","message","div","label","onClick","open","onClose","length","data-testid","colSpan","p","map","certificate","id","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","Fragment","MdDownload","MdContentCopy","useNavigate","Button","DescriptionDefinition","DescriptionList","DescriptionTerm","Divider","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","IssueSelfSignedCertificateModal","PcaDetailsView","pca","useLingui","navigate","projectId","issueSelfSignedModalOpen","toggleIssueSelfSignedModal","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","t","value","id","project_id","configuration","subject","common_name","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","icon","text","onClick","p","alignTerms","map","csr","open","onClose","onSuccess","pcaId","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/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 {/* I will enable this button on create-certificate task of the EPIC */}\n <PopupMenuItem label={t`Create Certificate`} disabled />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\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 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 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 })\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 {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\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\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\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\n const {\n data: pcaCertificates = [],\n isLoading,\n isError,\n error,\n } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\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 <Button variant=\"primary\" label={t`Issue End Entity Certificate`} onClick={toggleIssueEndEntity} />\n {createIssueEndEntityOpen && (\n <IssueEndEntityCertificateModal\n open={createIssueEndEntityOpen}\n onClose={toggleIssueEndEntity}\n pcaId={pcaId}\n />\n )}\n </>\n )}\n\n {pcaCertificates.length === 0 ? (\n <DataGrid columns={columns().length} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columns().length}>\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={columns().length}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcaCertificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\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 { Fragment } from \"react\"\nimport { MdDownload, MdContentCopy } from \"react-icons/md\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Divider,\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\"\n// import { ImportExternallySignedCertificateModal } from \"./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 [issueSelfSignedModalOpen, toggleIssueSelfSignedModal] = useModal(false)\n // I will enable this modal on import-certificate task of the EPIC\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 {/* temporary bg, I will resolve this as soon as I will have sync with designers */}\n <div className=\"bg-aurora-blue-200 flex items-center gap-1 rounded-sm px-1 py-0.5\">\n {STATE_CONFIG[pca.state].icon} {STATE_CONFIG[pca.state].text}\n </div>\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 <div className=\"bg-dt-background w-full rounded-sm\">\n <div className=\"text-theme-default p-4 text-xl font-bold\">\n Certificate {`${pca.configuration?.subject?.common_name}`}\n </div>\n <Divider />\n\n <div className=\"p-4 text-sm break-all whitespace-pre-wrap\">{pca?.csr}</div>\n\n {/* I will implement downloading-copying functionality at issue/import part of the epic as I need to clarify some stuff with design-clavis team */}\n <Divider />\n <Stack gap=\"2\" distribution=\"end\" className=\"p-4\">\n <Button>\n <MdDownload />\n </Button>\n <Button>\n <MdContentCopy />\n </Button>\n </Stack>\n </div>\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-CFuKY82d.mjs"), "component"),
22
+ component: n(() => import("./_pcaId-CwlH1Kvl.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-Bck7S7gJ.mjs.map
34
+ //# sourceMappingURL=_pcaId-D1ZEaCdp.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_pcaId-Bck7S7gJ.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,kDAAA,CAAmD;CACtFI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,YAAW;EACrCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;GAAoC;EAC7E;CACAE,QAAQ,OAAO,EAAEC,YAASC,gBAAQ;EAChC,IAAMC,IAAM,MAAMF,EAAQG,YAAYC,SAASF,IAAIG,QAAQC,MAAM;GAC/DC,YAAYN,EAAOO;GACnBC,0BAA0BR,EAAOS;GACnC,CAAA;AACA,SAAO,EAAEC,UAAUT,GAAKU,eAAeC,SAASC,eAAeZ,GAAKa,MAAM,MAAK;;CAEjFC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYN,YAAY,yBAAwB,CAAC,EACnE;CACAS,WAASC,yCAAA,YAAA;CACTE,YAAY,OAAO,EAAEvB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAEjB2B,IAAevC,EADK,MAAOe,GAAYsB,KAAKC,qBAAqBpB,OAAAA,IAAY,EAAE,CAChDkB;AAKrC,MAAI,EAHgBG,EAAa,MAAS,kBAAkBA,EAAa,MAAS,eAIhF,OAAMxC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,WAAU;GACxC,CAAA;;CAGN,CAAA"}
1
+ {"version":3,"file":"_pcaId-D1ZEaCdp.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,kDAAA,CAAmD;CACtFI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,YAAW;EACrCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;GAAoC;EAC7E;CACAE,QAAQ,OAAO,EAAEC,YAASC,gBAAQ;EAChC,IAAMC,IAAM,MAAMF,EAAQG,YAAYC,SAASF,IAAIG,QAAQC,MAAM;GAC/DC,YAAYN,EAAOO;GACnBC,0BAA0BR,EAAOS;GACnC,CAAA;AACA,SAAO,EAAEC,UAAUT,GAAKU,eAAeC,SAASC,eAAeZ,GAAKa,MAAM,MAAK;;CAEjFC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYN,YAAY,yBAAwB,CAAC,EACnE;CACAS,WAASC,yCAAA,YAAA;CACTE,YAAY,OAAO,EAAEvB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAEjB2B,IAAevC,EADK,MAAOe,GAAYsB,KAAKC,qBAAqBpB,OAAAA,IAAY,EAAE,CAChDkB;AAKrC,MAAI,EAHgBG,EAAa,MAAS,kBAAkBA,EAAa,MAAS,eAIhF,OAAMxC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,WAAU;GACxC,CAAA;;CAGN,CAAA"}
@@ -0,0 +1,316 @@
1
+ import { D as e, K as t, V as n, X as r, g as i, k as a, nt as o, z as s } from "./build-BJDfnAyi.mjs";
2
+ import { t as c } from "./_projectId-Dj_InfSc.mjs";
3
+ import { t as l } from "./helpers--JWXi40U.mjs";
4
+ import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
5
+ import { useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
6
+ import { createPortal as _ } from "react-dom";
7
+ import { Outlet as v, useLoaderData as y, useMatches as b, useNavigate as x, useParams as S, useRouteContext as C } from "@tanstack/react-router";
8
+ import { useLingui as w } from "@lingui/react";
9
+ import { z as T } from "zod";
10
+ var E = T.object({
11
+ labelKey: T.enum([
12
+ "Compute",
13
+ "Network",
14
+ "Storage",
15
+ "Services",
16
+ "Images",
17
+ "Flavors",
18
+ "Security Groups",
19
+ "Floating IPs",
20
+ "PCA (Clavis)"
21
+ ]).optional(),
22
+ to: T.string().optional(),
23
+ useParamAsLabel: T.string().optional()
24
+ }), D = T.object({
25
+ section: T.string(),
26
+ service: T.string().optional(),
27
+ isDetail: T.boolean().optional(),
28
+ crumb: E.optional(),
29
+ sectionCrumb: E.optional()
30
+ });
31
+ function O(e) {
32
+ return D.safeParse(e).success;
33
+ }
34
+ //#endregion
35
+ //#region src/client/components/Slot.tsx
36
+ function k({ children: e }) {
37
+ let t = h(null), [n, r] = g(null);
38
+ return p(() => {
39
+ t.current && r(t.current.shadowRoot ?? t.current.attachShadow({ mode: "open" }));
40
+ }, []), /* @__PURE__ */ d("div", {
41
+ ref: t,
42
+ style: { display: "contents" },
43
+ children: n && /* @__PURE__ */ _(e, n)
44
+ });
45
+ }
46
+ function A({ component: e }) {
47
+ let { trpcClient: t } = C({ strict: !1 });
48
+ return t ? /* @__PURE__ */ d(k, { children: /* @__PURE__ */ d(e, { auroraContext: { client: t } }) }) : null;
49
+ }
50
+ //#endregion
51
+ //#region src/client/routes/_auth/projects/-components/SideNavBar.tsx
52
+ var j = ({ projectId: e, projectName: r, availableServices: i }) => {
53
+ let { i18n: o, _: s } = w(), c = x(), m = b(), { provider: h } = S({ strict: !1 }), { slots: _ } = C({ strict: !1 }), v = [...m].reverse().find((e) => O(e.staticData)), y = v && O(v.staticData) ? v.staticData : void 0, T = y?.section ?? null, E = y?.service ?? null, D = l(i), [k, j] = g({
54
+ compute: !0,
55
+ network: !0,
56
+ storage: !0,
57
+ services: !0
58
+ }), M = (e) => j((t) => ({
59
+ ...t,
60
+ [e]: !t[e]
61
+ })), [N, P] = g({
62
+ compute: 0,
63
+ network: 0,
64
+ storage: 0,
65
+ services: 0
66
+ });
67
+ p(() => {
68
+ T && T in N && (P((e) => ({
69
+ ...e,
70
+ [T]: e[T] + 1
71
+ })), j((e) => ({
72
+ ...e,
73
+ [T]: !0
74
+ })));
75
+ }, [T]);
76
+ let F = T === null, I = (e) => (t) => {
77
+ let n = t.target.closest(".juno-sidenavigation-item");
78
+ n && n.parentElement?.querySelector(".expand-icon") && M(e);
79
+ }, L = [...D.image?.glance ? [{
80
+ service: "images",
81
+ label: o._({ id: "an5hVd" }),
82
+ to: "/projects/$projectId/compute/images",
83
+ params: { projectId: e }
84
+ }] : [], ...D?.compute?.nova ? [{
85
+ service: "flavors",
86
+ label: o._({ id: "neiJm0" }),
87
+ to: "/projects/$projectId/compute/flavors",
88
+ params: { projectId: e }
89
+ }] : []], R = [...D.network ? [{
90
+ service: "securitygroups",
91
+ label: o._({ id: "4opp4r" }),
92
+ to: "/projects/$projectId/network/securitygroups",
93
+ params: { projectId: e }
94
+ }, {
95
+ service: "floatingips",
96
+ label: o._({ id: "u77/s4" }),
97
+ to: "/projects/$projectId/network/floatingips",
98
+ params: { projectId: e }
99
+ }] : []], z = [...D?.["object-store"]?.swift ? [{
100
+ service: "containers",
101
+ label: o._({ id: "+OEi73" }),
102
+ to: "/projects/$projectId/storage/$provider/containers",
103
+ params: {
104
+ projectId: e,
105
+ provider: "swift"
106
+ }
107
+ }] : [], {
108
+ service: "ceph-containers",
109
+ label: o._({ id: "KhNDX4" }),
110
+ to: "/projects/$projectId/storage/$provider/containers",
111
+ params: {
112
+ projectId: e,
113
+ provider: "ceph"
114
+ }
115
+ }], B = [...D.pca?.["clavis-beta"] || D.pca?.["clavis-dev"] ? [{
116
+ service: "pca",
117
+ label: o._({ id: "miy5mb" }),
118
+ to: "/projects/$projectId/services/pca",
119
+ params: { projectId: e }
120
+ }] : []];
121
+ return /* @__PURE__ */ d(t, {
122
+ ariaLabel: "Project Side Navigation",
123
+ children: /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d(a, { children: /* @__PURE__ */ f(u, { children: [
124
+ /* @__PURE__ */ d(n, {
125
+ icon: "home",
126
+ label: r,
127
+ onClick: () => c({
128
+ to: "/projects/$projectId",
129
+ params: { projectId: e }
130
+ }),
131
+ selected: F
132
+ }),
133
+ /* @__PURE__ */ d("div", {
134
+ onClickCapture: I("compute"),
135
+ children: /* @__PURE__ */ d(n, {
136
+ label: o._({ id: "rp0Bd0" }),
137
+ open: k.compute,
138
+ children: L.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
139
+ onClick: () => c({
140
+ to: r,
141
+ params: i
142
+ }),
143
+ label: t,
144
+ selected: T === "compute" && E === e
145
+ }, t))
146
+ }, N.compute)
147
+ }),
148
+ R.length > 0 && /* @__PURE__ */ d("div", {
149
+ onClickCapture: I("network"),
150
+ children: /* @__PURE__ */ d(n, {
151
+ label: o._({ id: "OR475H" }),
152
+ open: k.network,
153
+ children: R.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
154
+ onClick: () => c({
155
+ to: r,
156
+ params: i
157
+ }),
158
+ label: t,
159
+ selected: T === "network" && E === e
160
+ }, t))
161
+ }, N.network)
162
+ }),
163
+ z.length > 0 && /* @__PURE__ */ d("div", {
164
+ onClickCapture: I("storage"),
165
+ children: /* @__PURE__ */ d(n, {
166
+ label: o._({ id: "BrrIs8" }),
167
+ open: k.storage,
168
+ children: z.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
169
+ onClick: () => c({
170
+ to: r,
171
+ params: i
172
+ }),
173
+ label: t,
174
+ selected: T === "storage" && E === "containers" ? i.provider === h : E === e
175
+ }, t))
176
+ }, N.storage)
177
+ }),
178
+ B.length > 0 && /* @__PURE__ */ d("div", {
179
+ onClickCapture: I("services"),
180
+ children: /* @__PURE__ */ d(n, {
181
+ label: o._({ id: "MILoeL" }),
182
+ open: k.services,
183
+ children: B.map(({ service: e, label: t, to: r, params: i }) => /* @__PURE__ */ d(n, {
184
+ onClick: () => c({
185
+ to: r,
186
+ params: i
187
+ }),
188
+ label: t,
189
+ selected: T === "services" && E === e
190
+ }, t))
191
+ }, N.services)
192
+ })
193
+ ] }) }), _?.sideNavBanner && /* @__PURE__ */ d(A, { component: _.sideNavBanner })] })
194
+ });
195
+ };
196
+ //#endregion
197
+ //#region src/client/components/ProjectView/ProjectInfoBox.tsx
198
+ function M({ projectInfo: t }) {
199
+ let { i18n: n, _: i } = w(), a = x(), o = b(), { projectId: s } = S({ strict: !1 });
200
+ return /* @__PURE__ */ d(r, {
201
+ className: "mt-8 mb-4",
202
+ children: m(() => {
203
+ let e = {
204
+ Compute: n._({ id: "rp0Bd0" }),
205
+ Network: n._({ id: "OR475H" }),
206
+ Storage: n._({ id: "BrrIs8" }),
207
+ Services: n._({ id: "MILoeL" }),
208
+ Images: n._({ id: "an5hVd" }),
209
+ Flavors: n._({ id: "neiJm0" }),
210
+ "Security Groups": n._({ id: "4opp4r" }),
211
+ "Floating IPs": n._({ id: "u77/s4" }),
212
+ "PCA (Clavis)": n._({ id: "miy5mb" })
213
+ }, r = (e) => e === "swift" ? n._({ id: "+OEi73" }) : e === "ceph" ? n._({ id: "KhNDX4" }) : n._({ id: "BrrIs8" }), i = [];
214
+ i.push({
215
+ icon: "home",
216
+ label: n._({ id: "i0qMbr" }),
217
+ onClick: () => a({ to: "/projects" })
218
+ }), t.domain?.name && i.push({ label: t.domain.name }), i.push({
219
+ label: t.name,
220
+ onClick: () => a({
221
+ to: "/projects/$projectId",
222
+ params: { projectId: s }
223
+ })
224
+ });
225
+ let c = o.filter((e) => e.routeId !== "/_auth/projects/$projectId" && e.routeId.startsWith("/_auth/projects/$projectId")), l = c[c.length - 1];
226
+ if (!l) return i;
227
+ let u = O(l.staticData) ? l.staticData : void 0;
228
+ if (!u) return i;
229
+ let d = l.params;
230
+ if (u.sectionCrumb) {
231
+ let { labelKey: t, to: n } = u.sectionCrumb, r = t ? e[t] : void 0, o = !u.crumb;
232
+ i.push(n ? {
233
+ label: r,
234
+ onClick: () => a({
235
+ to: n,
236
+ params: d
237
+ })
238
+ } : {
239
+ label: r,
240
+ active: o
241
+ });
242
+ }
243
+ if (u.crumb) {
244
+ let { labelKey: t, to: n, useParamAsLabel: o } = u.crumb, s = o ? r(d[o]) : t ? e[t] : void 0;
245
+ if (u.isDetail) {
246
+ i.push({
247
+ label: s,
248
+ onClick: () => a({
249
+ to: n,
250
+ params: d
251
+ })
252
+ });
253
+ let e = l.meta?.find((e) => e != null && "title" in e)?.title;
254
+ e && i.push({
255
+ label: e,
256
+ active: !0
257
+ });
258
+ } else i.push(n ? {
259
+ label: s,
260
+ onClick: () => a({
261
+ to: n,
262
+ params: d
263
+ })
264
+ } : {
265
+ label: s,
266
+ active: !0
267
+ });
268
+ }
269
+ return i;
270
+ }, [
271
+ o,
272
+ t,
273
+ s,
274
+ a,
275
+ i
276
+ ]).map((t, n) => /* @__PURE__ */ d(e, {
277
+ label: t.label,
278
+ icon: t.icon,
279
+ onClick: t.onClick,
280
+ active: t.active
281
+ }, n))
282
+ });
283
+ }
284
+ //#endregion
285
+ //#region src/client/routes/_auth/projects/$projectId.tsx?tsr-split=component
286
+ function N() {
287
+ let { availableServices: e, projectId: t, crumbProject: n } = y({ from: c.id });
288
+ return /* @__PURE__ */ d(i, {
289
+ embedded: !0,
290
+ sideNavigation: /* @__PURE__ */ d(j, {
291
+ availableServices: e,
292
+ projectId: t,
293
+ projectName: n?.name || t
294
+ }),
295
+ className: "h-min-screen",
296
+ children: /* @__PURE__ */ d(s, { children: /* @__PURE__ */ d(o, {
297
+ direction: "vertical",
298
+ distribution: "start",
299
+ alignment: "stretch",
300
+ className: "xl:flex-row",
301
+ gap: "6",
302
+ children: /* @__PURE__ */ f("div", {
303
+ className: "min-w-0 flex-1",
304
+ children: [/* @__PURE__ */ d(M, { projectInfo: {
305
+ id: t,
306
+ name: n?.name || t,
307
+ domain: n?.domain
308
+ } }), /* @__PURE__ */ d(v, {})]
309
+ })
310
+ }) })
311
+ });
312
+ }
313
+ //#endregion
314
+ export { N as component };
315
+
316
+ //# sourceMappingURL=_projectId-D1gGribM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_projectId-D1gGribM.mjs","names":["z","CRUMB_LABEL_KEYS","CrumbSchema","object","labelKey","enum","optional","to","string","useParamAsLabel","RouteInfoSchema","section","service","isDetail","boolean","crumb","sectionCrumb","isRouteInfo","data","safeParse","success","useRef","useState","useEffect","createPortal","useRouteContext","SlotShadowRoot","children","ref","root","setRoot","current","shadowRoot","attachShadow","mode","div","style","display","Slot","component","Component","trpcClient","strict","auroraContext","client","useNavigate","useMatches","useParams","useRouteContext","useState","useEffect","getServiceIndex","SideNavigation","SideNavigationList","SideNavigationItem","isRouteInfo","Slot","SideNavBar","projectId","projectName","availableServices","useLingui","navigate","matches","provider","strict","slots","activeMatch","reverse","find","m","staticData","activeRouteInfo","undefined","activeSection","section","activeService","service","serviceIndex","openSections","setOpenSections","compute","network","storage","services","toggle","prev","sectionKeys","setSectionKeys","isOverviewActive","handleSectionClick","e","clickedItem","target","closest","parentElement","querySelector","computeServices","label","t","to","params","networkServices","storageServices","pcaServices","clavisServices","ariaLabel","icon","onClick","selected","div","onClickCapture","open","map","length","isStorageContainers","isSelected","sideNavBanner","component","Breadcrumb","BreadcrumbItem","useMatches","useNavigate","useParams","useMemo","isRouteInfo","ProjectInfoBox","projectInfo","useLingui","navigate","matches","projectId","strict","breadcrumbs","crumbLabels","Compute","t","Network","Storage","Services","Images","Flavors","resolveProviderLabel","provider","items","push","icon","label","onClick","to","domain","name","params","projectMatches","filter","m","routeId","startsWith","deepest","length","info","staticData","undefined","sectionCrumb","labelKey","isLeaf","crumb","active","useParamAsLabel","resolvedLabel","isDetail","title","meta","find","className","map","item","index","Outlet","useLoaderData","AppShell","Container","Stack","SideNavBar","ProjectInfoBox","Route","RouteComponent","availableServices","projectId","crumbProject","from","id","name","domain","component"],"sources":["../../src/client/routes/routeInfo.ts","../../src/client/components/Slot.tsx","../../src/client/routes/_auth/projects/-components/SideNavBar.tsx","../../src/client/components/ProjectView/ProjectInfoBox.tsx","../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=component"],"sourcesContent":["import { z } from \"zod\"\n\nexport const CRUMB_LABEL_KEYS = [\n \"Compute\",\n \"Network\",\n \"Storage\",\n \"Services\",\n \"Images\",\n \"Flavors\",\n \"Security Groups\",\n \"Floating IPs\",\n \"PCA (Clavis)\",\n] as const\n\nexport type CrumbLabelKey = (typeof CRUMB_LABEL_KEYS)[number]\n\nconst CrumbSchema = z.object({\n labelKey: z.enum(CRUMB_LABEL_KEYS).optional(),\n to: z.string().optional(),\n useParamAsLabel: z.string().optional(),\n})\n\nconst RouteInfoSchema = z.object({\n section: z.string(),\n service: z.string().optional(),\n isDetail: z.boolean().optional(),\n crumb: CrumbSchema.optional(),\n sectionCrumb: CrumbSchema.optional(),\n})\n\nexport type Crumb = z.infer<typeof CrumbSchema>\nexport type RouteInfo = z.infer<typeof RouteInfoSchema>\n\nexport function isRouteInfo(data: unknown): data is RouteInfo {\n return RouteInfoSchema.safeParse(data).success\n}\n","import { useRef, useState, useEffect, type ReactNode, type FC } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { useRouteContext } from \"@tanstack/react-router\"\nimport type { SlotProps } from \"../AuroraApp\"\n\nfunction SlotShadowRoot({ children }: { children: ReactNode }) {\n const ref = useRef<HTMLDivElement>(null)\n const [root, setRoot] = useState<ShadowRoot | null>(null)\n\n useEffect(() => {\n if (!ref.current) return\n setRoot(ref.current.shadowRoot ?? ref.current.attachShadow({ mode: \"open\" }))\n }, [])\n\n return (\n <div ref={ref} style={{ display: \"contents\" }}>\n {root && createPortal(children, root)}\n </div>\n )\n}\n\nexport function Slot({ component: Component }: { component: FC<SlotProps> }) {\n const { trpcClient } = useRouteContext({ strict: false })\n\n if (!trpcClient) return null\n\n return (\n <SlotShadowRoot>\n <Component auroraContext={{ client: trpcClient }} />\n </SlotShadowRoot>\n )\n}\n","import { useNavigate, useMatches, useParams, useRouteContext } from \"@tanstack/react-router\"\nimport { type MouseEvent, useState, useEffect } from \"react\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { SideNavigation, SideNavigationList, SideNavigationItem } from \"@cloudoperators/juno-ui-components/index\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { isRouteInfo } from \"@/client/routes/routeInfo\"\nimport { Slot } from \"@/client/components/Slot\"\n\ninterface SideNavBarProps {\n projectId: string\n projectName: string\n availableServices: {\n type: string\n name: string\n }[]\n}\n\nexport const SideNavBar = ({ projectId, projectName, availableServices }: SideNavBarProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const matches = useMatches()\n const { provider } = useParams({ strict: false }) as { provider?: string }\n const { slots } = useRouteContext({ strict: false })\n\n // Read active section/service from the deepest match that has valid RouteInfo staticData\n const activeMatch = [...matches].reverse().find((m) => isRouteInfo(m.staticData))\n const activeRouteInfo = activeMatch && isRouteInfo(activeMatch.staticData) ? activeMatch.staticData : undefined\n const activeSection = activeRouteInfo?.section ?? null\n const activeService = activeRouteInfo?.service ?? null\n\n const serviceIndex = getServiceIndex(availableServices)\n\n const [openSections, setOpenSections] = useState({ compute: true, network: true, storage: true, services: true })\n const toggle = (section: keyof typeof openSections) =>\n setOpenSections((prev) => ({ ...prev, [section]: !prev[section] }))\n\n // When navigating into a section, force Juno to re-open it by resetting the key\n const [sectionKeys, setSectionKeys] = useState({ compute: 0, network: 0, storage: 0, services: 0 })\n\n useEffect(() => {\n if (activeSection && activeSection in sectionKeys) {\n setSectionKeys((prev) => ({ ...prev, [activeSection]: prev[activeSection as keyof typeof sectionKeys] + 1 }))\n setOpenSections((prev) => ({ ...prev, [activeSection]: true }))\n }\n }, [activeSection])\n\n const isOverviewActive = activeSection === null\n\n const handleSectionClick = (section: keyof typeof openSections) => (e: MouseEvent<HTMLDivElement>) => {\n // Only toggle if the click is on the header row (has expand-icon sibling), not on child items\n const clickedItem = (e.target as HTMLElement).closest(\".juno-sidenavigation-item\")\n if (clickedItem && clickedItem.parentElement?.querySelector(\".expand-icon\")) {\n toggle(section)\n }\n }\n\n const computeServices = [\n ...(serviceIndex[\"image\"]?.[\"glance\"]\n ? [\n {\n service: \"images\",\n label: t`Images`,\n to: \"/projects/$projectId/compute/images\" as const,\n params: { projectId },\n },\n ]\n : []),\n ...(serviceIndex?.[\"compute\"]?.[\"nova\"]\n ? [\n {\n service: \"flavors\",\n label: t`Flavors`,\n to: \"/projects/$projectId/compute/flavors\" as const,\n params: { projectId },\n },\n ]\n : []),\n ]\n\n const networkServices = [\n ...(serviceIndex[\"network\"]\n ? [\n {\n service: \"securitygroups\",\n label: t`Security Groups`,\n to: \"/projects/$projectId/network/securitygroups\" as const,\n params: { projectId },\n },\n {\n service: \"floatingips\",\n label: t`Floating IPs`,\n to: \"/projects/$projectId/network/floatingips\" as const,\n params: { projectId },\n },\n ]\n : []),\n ]\n\n const storageServices = [\n ...(serviceIndex?.[\"object-store\"]?.[\"swift\"]\n ? [\n {\n service: \"containers\",\n label: t`Object Storage (Swift)`,\n to: \"/projects/$projectId/storage/$provider/containers\" as const,\n params: { projectId, provider: \"swift\" },\n },\n ]\n : []),\n {\n service: \"ceph-containers\",\n label: t`Object Storage (Ceph)`,\n to: \"/projects/$projectId/storage/$provider/containers\" as const,\n params: { projectId, provider: \"ceph\" },\n },\n ]\n\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n const clavisServices = [\n ...(pcaServices\n ? [\n {\n service: \"pca\",\n label: t`PCA (Clavis)`,\n to: \"/projects/$projectId/services/pca\" as const,\n params: { projectId },\n },\n ]\n : []),\n ]\n\n return (\n <SideNavigation ariaLabel=\"Project Side Navigation\">\n <>\n <SideNavigationList>\n <>\n <SideNavigationItem\n icon=\"home\"\n label={projectName}\n onClick={() => navigate({ to: \"/projects/$projectId\", params: { projectId } })}\n selected={isOverviewActive}\n />\n {/* onClickCapture fires before Juno's chevron stopPropagation, keeping our state in sync */}\n <div onClickCapture={handleSectionClick(\"compute\")}>\n <SideNavigationItem key={sectionKeys.compute} label={t`Compute`} open={openSections.compute}>\n {computeServices.map(({ service, label, to, params }) => (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={activeSection === \"compute\" && activeService === service}\n />\n ))}\n </SideNavigationItem>\n </div>\n\n {networkServices.length > 0 && (\n <div onClickCapture={handleSectionClick(\"network\")}>\n <SideNavigationItem key={sectionKeys.network} label={t`Network`} open={openSections.network}>\n {networkServices.map(({ service, label, to, params }) => (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={activeSection === \"network\" && activeService === service}\n />\n ))}\n </SideNavigationItem>\n </div>\n )}\n\n {storageServices.length > 0 && (\n <div onClickCapture={handleSectionClick(\"storage\")}>\n <SideNavigationItem key={sectionKeys.storage} label={t`Storage`} open={openSections.storage}>\n {storageServices.map(({ service, label, to, params }) => {\n // For storage services with provider param, match against current provider\n const isStorageContainers = activeSection === \"storage\" && activeService === \"containers\"\n const isSelected = isStorageContainers ? params.provider === provider : activeService === service\n\n return (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={isSelected}\n />\n )\n })}\n </SideNavigationItem>\n </div>\n )}\n\n {clavisServices.length > 0 && (\n <div onClickCapture={handleSectionClick(\"services\")}>\n <SideNavigationItem key={sectionKeys.services} label={t`Services`} open={openSections.services}>\n {clavisServices.map(({ service, label, to, params }) => (\n <SideNavigationItem\n key={label}\n onClick={() => navigate({ to, params })}\n label={label}\n selected={activeSection === \"services\" && activeService === service}\n />\n ))}\n </SideNavigationItem>\n </div>\n )}\n </>\n </SideNavigationList>\n {slots?.sideNavBanner && <Slot component={slots.sideNavBanner} />}\n </>\n </SideNavigation>\n )\n}\n","import { Breadcrumb, BreadcrumbItem, KnownIcons } from \"@cloudoperators/juno-ui-components\"\nimport { useMatches, useNavigate, useParams } from \"@tanstack/react-router\"\nimport { useMemo } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { isRouteInfo, CrumbLabelKey } from \"@/client/routes/routeInfo\"\n\ninterface ProjectInfoBoxProps {\n projectInfo: {\n id: string\n name: string\n description?: string\n domain?: {\n name?: string\n }\n }\n}\n\nexport function ProjectInfoBox({ projectInfo }: ProjectInfoBoxProps) {\n const { t } = useLingui()\n const navigate = useNavigate()\n const matches = useMatches()\n const { projectId } = useParams({ strict: false }) as { projectId: string }\n\n const breadcrumbs = useMemo(() => {\n const crumbLabels: Record<CrumbLabelKey, string> = {\n Compute: t`Compute`,\n Network: t`Network`,\n Storage: t`Storage`,\n Services: t`Services`,\n Images: t`Images`,\n Flavors: t`Flavors`,\n \"Security Groups\": t`Security Groups`,\n \"Floating IPs\": t`Floating IPs`,\n \"PCA (Clavis)\": t`PCA (Clavis)`,\n }\n\n const resolveProviderLabel = (provider: string | undefined) => {\n if (provider === \"swift\") return t`Object Storage (Swift)`\n if (provider === \"ceph\") return t`Object Storage (Ceph)`\n return t`Storage`\n }\n\n const items: Array<{ label?: string; icon?: KnownIcons; onClick?: () => void; active?: boolean }> = []\n\n items.push({ icon: \"home\", label: t`Home`, onClick: () => navigate({ to: \"/projects\" }) })\n\n if (projectInfo.domain?.name) {\n items.push({ label: projectInfo.domain.name })\n }\n\n items.push({\n label: projectInfo.name,\n onClick: () => navigate({ to: \"/projects/$projectId\", params: { projectId } }),\n })\n\n const projectMatches = matches.filter(\n (m) => m.routeId !== \"/_auth/projects/$projectId\" && m.routeId.startsWith(\"/_auth/projects/$projectId\")\n )\n const deepest = projectMatches[projectMatches.length - 1]\n if (!deepest) return items\n\n const info = isRouteInfo(deepest.staticData) ? deepest.staticData : undefined\n if (!info) return items\n\n const params = deepest.params as Record<string, string>\n\n if (info.sectionCrumb) {\n const { labelKey, to } = info.sectionCrumb\n const label = labelKey ? crumbLabels[labelKey] : undefined\n const isLeaf = !info.crumb\n items.push(\n to\n ? { label, onClick: () => navigate({ to: to as never, params: params as never }) }\n : { label, active: isLeaf }\n )\n }\n\n if (info.crumb) {\n const { labelKey, to, useParamAsLabel } = info.crumb\n const resolvedLabel = useParamAsLabel\n ? resolveProviderLabel(params[useParamAsLabel])\n : labelKey\n ? crumbLabels[labelKey]\n : undefined\n\n if (info.isDetail) {\n items.push({ label: resolvedLabel, onClick: () => navigate({ to: to as never, params: params as never }) })\n const title = deepest.meta?.find((m) => m != null && \"title\" in m)?.title as string | undefined\n if (title) items.push({ label: title, active: true })\n } else {\n items.push(\n to\n ? { label: resolvedLabel, onClick: () => navigate({ to: to as never, params: params as never }) }\n : { label: resolvedLabel, active: true }\n )\n }\n }\n\n return items\n }, [matches, projectInfo, projectId, navigate, t])\n\n return (\n <Breadcrumb className=\"mt-8 mb-4\">\n {breadcrumbs.map((item, index) => (\n <BreadcrumbItem key={index} label={item.label} icon={item.icon} onClick={item.onClick} active={item.active} />\n ))}\n </Breadcrumb>\n )\n}\n","import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":"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"}