@cobaltcore-dev/aurora 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/client/DeleteVersionsModal-CyYZfB8d.mjs +331 -0
  2. package/dist/client/DeleteVersionsModal-CyYZfB8d.mjs.map +1 -0
  3. package/dist/client/{SortInput-VK7IYqQv.mjs → SortInput-DLcusjGZ.mjs} +8 -8
  4. package/dist/client/SortInput-DLcusjGZ.mjs.map +1 -0
  5. package/dist/client/_auth-DXJkv9QO.mjs.map +1 -1
  6. package/dist/client/{_pcaId-BwTvJJgh.mjs → _pcaId-Bo7yHkNW.mjs} +3 -3
  7. package/dist/client/{_pcaId-BwTvJJgh.mjs.map → _pcaId-Bo7yHkNW.mjs.map} +1 -1
  8. package/dist/client/{_pcaId-DUHQd0rB.mjs → _pcaId-CKkCVC7b.mjs} +2 -2
  9. package/dist/client/{_pcaId-DUHQd0rB.mjs.map → _pcaId-CKkCVC7b.mjs.map} +1 -1
  10. package/dist/client/_projectId-B_2sZKk-.mjs.map +1 -1
  11. package/dist/client/{_projectId-DR_2U10f.mjs → _projectId-CY8W0IF6.mjs} +2 -2
  12. package/dist/client/_projectId-CY8W0IF6.mjs.map +1 -0
  13. package/dist/client/{_projectId-BaqZ4W50.mjs → _projectId-Dbck_MFa.mjs} +43 -49
  14. package/dist/client/_projectId-Dbck_MFa.mjs.map +1 -0
  15. package/dist/client/{_securityGroupId-DYxmXUOP.mjs → _securityGroupId-CkN0CGVg.mjs} +3 -3
  16. package/dist/client/{_securityGroupId-DYxmXUOP.mjs.map → _securityGroupId-CkN0CGVg.mjs.map} +1 -1
  17. package/dist/client/{_securityGroupId-fhK1CuZh.mjs → _securityGroupId-gSEZbBII.mjs} +2 -2
  18. package/dist/client/{_securityGroupId-fhK1CuZh.mjs.map → _securityGroupId-gSEZbBII.mjs.map} +1 -1
  19. package/dist/client/{_storageType-D7-_Xwwl.mjs → _storageType-6k8lUnQo.mjs} +2 -2
  20. package/dist/client/{_storageType-D7-_Xwwl.mjs.map → _storageType-6k8lUnQo.mjs.map} +1 -1
  21. package/dist/client/_storageType-CLTxXjQZ.mjs +3048 -0
  22. package/dist/client/_storageType-CLTxXjQZ.mjs.map +1 -0
  23. package/dist/client/{constants-J5nm9hbP.mjs → constants-PMXUGI4Q.mjs} +2 -2
  24. package/dist/client/{constants-J5nm9hbP.mjs.map → constants-PMXUGI4Q.mjs.map} +1 -1
  25. package/dist/client/{flavors-Dwy1ID_f.mjs → flavors-BclEwobO.mjs} +2 -2
  26. package/dist/client/{flavors-Dwy1ID_f.mjs.map → flavors-BclEwobO.mjs.map} +1 -1
  27. package/dist/client/{flavors-C-gY4XeQ.mjs → flavors-p2TKcqP-.mjs} +3 -3
  28. package/dist/client/{flavors-C-gY4XeQ.mjs.map → flavors-p2TKcqP-.mjs.map} +1 -1
  29. package/dist/client/{floatingips-Dq4DXQYb.mjs → floatingips-ph0ZxJw8.mjs} +3 -3
  30. package/dist/client/{floatingips-Dq4DXQYb.mjs.map → floatingips-ph0ZxJw8.mjs.map} +1 -1
  31. package/dist/client/{images-HG7TneK0.mjs → images-BblnyWJq.mjs} +3 -3
  32. package/dist/client/{images-HG7TneK0.mjs.map → images-BblnyWJq.mjs.map} +1 -1
  33. package/dist/client/{images-bG-MZZ7V.mjs → images-CXdghaMW.mjs} +2 -2
  34. package/dist/client/{images-bG-MZZ7V.mjs.map → images-CXdghaMW.mjs.map} +1 -1
  35. package/dist/client/index.js +121 -117
  36. package/dist/client/index.js.map +1 -1
  37. package/dist/client/{md-CYTrL5dq.mjs → md-CyCflQee.mjs} +10 -28
  38. package/dist/client/{md-CYTrL5dq.mjs.map → md-CyCflQee.mjs.map} +1 -1
  39. package/dist/client/{objects-DKWp9RtR.mjs → objects-B9Jh3SMG.mjs} +4 -3
  40. package/dist/client/objects-B9Jh3SMG.mjs.map +1 -0
  41. package/dist/client/objects-Bw25cE1m.mjs +5970 -0
  42. package/dist/client/objects-Bw25cE1m.mjs.map +1 -0
  43. package/dist/client/objects-o2Cj_ndZ.mjs.map +1 -1
  44. package/dist/client/{pca-BBxPCAH0.mjs → pca-CiLPHmK7.mjs} +3 -3
  45. package/dist/client/{pca-BBxPCAH0.mjs.map → pca-CiLPHmK7.mjs.map} +1 -1
  46. package/dist/client/{pca-D7DF_BZZ.mjs → pca-DUrQ_tIg.mjs} +2 -2
  47. package/dist/client/{pca-D7DF_BZZ.mjs.map → pca-DUrQ_tIg.mjs.map} +1 -1
  48. package/dist/client/{securitygroups-CNFLu9zS.mjs → securitygroups-CcA2TpAt.mjs} +2 -2
  49. package/dist/client/{securitygroups-CNFLu9zS.mjs.map → securitygroups-CcA2TpAt.mjs.map} +1 -1
  50. package/dist/client/{useListWithFiltering-v2A0-SZb.mjs → useListWithFiltering-CVzhMyEA.mjs} +2 -2
  51. package/dist/client/{useListWithFiltering-v2A0-SZb.mjs.map → useListWithFiltering-CVzhMyEA.mjs.map} +1 -1
  52. package/dist/server/index.js +282 -48
  53. package/package.json +3 -3
  54. package/dist/client/SortInput-VK7IYqQv.mjs.map +0 -1
  55. package/dist/client/_projectId-BaqZ4W50.mjs.map +0 -1
  56. package/dist/client/_projectId-DR_2U10f.mjs.map +0 -1
  57. package/dist/client/_storageType-B0eJODiQ.mjs +0 -3244
  58. package/dist/client/_storageType-B0eJODiQ.mjs.map +0 -1
  59. package/dist/client/objects-DKWp9RtR.mjs.map +0 -1
  60. package/dist/client/objects-DaCuy_CB.mjs +0 -5708
  61. package/dist/client/objects-DaCuy_CB.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"_pcaId-BwTvJJgh.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","PcaCertificatesTableRow","certificate","useLingui","navigate","navigateToCertificateDetailsPage","from","to","params","prev","certificateId","id","data-testid","onClick","certificate_authority_id","e","stopPropagation","className","label","t","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Spinner","Message","Textarea","trpcReact","useProjectId","IssueEndEntityCertificateModal","open","onClose","pcaId","useLingui","navigate","projectId","utils","useUtils","isPending","createCertificateMutation","services","pca","createCertificate","useMutation","onSettled","listCertificates","invalidate","formSchema","object","csr","string","trim","min","form","defaultValues","validators","onSubmit","value","createdCertificate","mutateAsync","project_id","certificate_authority_id","replace","configuration","validity","not_after","Math","floor","Date","now","handleClose","to","params","certificateId","id","reset","currentCsr","store","state","values","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","length","error","dismissible","variant","className","message","div","span","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","placeholder","errortext","meta","errors","map","join","disabled","useState","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","Pagination","trpcReact","useProjectId","useModal","PcaCertificatesTableRow","IssueEndEntityCertificateModal","ITEMS_PER_PAGE","PcaCertificatesListContainer","pcaId","pcaState","useLingui","projectId","createIssueEndEntityOpen","toggleIssueEndEntity","pageMarkers","setPageMarkers","undefined","currentPage","setCurrentPage","columns","t","columnsLength","length","currentMarker","data","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","limit","next_page_marker","certificates","nextMarker","hasNextPage","computedTotal","totalPages","Math","max","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","div","label","onClick","open","onClose","data-testid","colSpan","p","map","certificate","id","pages","onPressPrevious","onPressNext","Modal","Spinner","Message","trpcReact","useProjectId","VALIDITY_SECONDS","IssueSelfSignedCertificateModal","open","onClose","pca","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","createCertificate","useMutation","onSettled","listCertificates","invalidate","handleConfirm","csr","mutateAsync","project_id","certificate_authority_id","id","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","disableConfirmButton","error","dismissible","variant","className","message","div","span","useRef","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","Button","trpcReact","useProjectId","ImportExternallySignedCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","importMutation","services","pca","import","useMutation","onSettled","getById","invalidate","formSchema","object","imported_certificate_chain","string","trim","min","form","defaultValues","validators","onSubmit","mutateAsync","project_id","certificate_authority_id","state","values","handleClose","reset","fileInputRef","currentChain","store","handleFileChange","e","file","target","files","reader","FileReader","onload","event","text","result","chainValue","name","endsWith","parsed","JSON","parse","setFieldValue","error","console","readAsText","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","message","div","span","id","preventDefault","onClick","current","click","input","ref","type","accept","onChange","Field","children","field","value","onBlur","handleBlur","handleChange","placeholder","errortext","meta","errors","map","join","disabled","Fragment","useNavigate","Button","CodeBlock","DescriptionDefinition","DescriptionList","DescriptionTerm","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","IssueSelfSignedCertificateModal","ImportExternallySignedCertificateModal","PcaDetailsView","pca","useLingui","navigate","projectId","subjectCommonName","configuration","subject","common_name","certificateHeading","t","issueSelfSignedModalOpen","toggleIssueSelfSignedModal","importExternallySignedModalOpen","toggleImportExternallySignedModal","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","value","id","project_id","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","badge","onClick","p","alignTerms","map","heading","content","csr","wrap","pcaId","open","onClose","onSuccess","pcaState","useNavigate","Trans","Button","Spinner","Stack","trpcReact","useProjectId","PcaDetailsView","Route","RouteComponent","navigate","projectId","pcaId","useParams","isLoading","isError","error","data","pca","services","getById","useQuery","project_id","certificate_authority_id","handleBack","to","params","errorMessage","message","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueEndEntityCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaCertificatesListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueSelfSignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/ImportExternallySignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Certificate } from \"@/server/Services/types/pca\"\n\ninterface PcaCertificatesTableRowProps {\n certificate: Certificate\n}\n\nexport const PcaCertificatesTableRow = ({ certificate }: PcaCertificatesTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n\n const navigateToCertificateDetailsPage = () =>\n navigate({\n from: \"/projects/$projectId/services/pca/$pcaId/\",\n to: \"$certificateId\",\n params: (prev) => ({ ...prev, certificateId: certificate.id }),\n })\n\n return (\n <DataGridRow\n key={certificate.id}\n data-testid={`pca-certificate-row-${certificate.id}`}\n onClick={navigateToCertificateDetailsPage}\n >\n <DataGridCell>{certificate.certificate_authority_id}</DataGridCell>\n <DataGridCell>{certificate.id}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToCertificateDetailsPage} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface IssueEndEntityCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const IssueEndEntityCertificateModal = ({ open, onClose, pcaId }: IssueEndEntityCertificateModalProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const formSchema = z.object({\n csr: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n csr: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const createdCertificate = await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n // Normalize to one format so users can paste raw multi-line CSRs with \\n along with already formatted ones\n csr: value.csr.replace(/\\\\n/g, \"\\n\"),\n configuration: { validity: { not_after: Math.floor(Date.now() / 1000) + 8 * 60 * 60 } },\n })\n handleClose()\n\n await navigate({\n to: \"/projects/$projectId/services/pca/$pcaId/$certificateId\",\n params: { projectId, pcaId, certificateId: createdCertificate.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createCertificateMutation.reset()\n onClose()\n }\n\n const currentCsr = useStore(form.store, (state) => state.values.csr)\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Issue End-Entity Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !(currentCsr.trim().length > 0)}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing End-Entity Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"issue-end-entity-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"csr\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Paste CSR code`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useState } from \"react\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { PcaCertificatesTableRow } from \"./-table/PcaCertificatesTableRow\"\nimport { IssueEndEntityCertificateModal } from \"./-modals/IssueEndEntityCertificateModal\"\n\nconst ITEMS_PER_PAGE = 50\n\ninterface PcaCertificatesListContainerProps {\n pcaId: string\n pcaState: CertificateAuthority[\"state\"]\n}\n\nexport const PcaCertificatesListContainer = ({ pcaId, pcaState }: PcaCertificatesListContainerProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [createIssueEndEntityOpen, toggleIssueEndEntity] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\n\n const columns = () =>\n [\n t`CA ID`,\n t`ID`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n const columnsLength = columns().length\n\n const currentMarker = pageMarkers[currentPage - 1]\n\n const { data, isLoading, isError, error } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n limit: ITEMS_PER_PAGE,\n next_page_marker: currentMarker,\n })\n\n const certificates = data?.certificates ?? []\n const nextMarker = data?.next_page_marker\n const hasNextPage = !!nextMarker\n const computedTotal = hasNextPage ? currentPage + 1 : currentPage\n const totalPages = Math.max(computedTotal, pageMarkers.length)\n\n const goToPage = (page: number) => {\n if (page < 1 || page > totalPages) return\n if (page > currentPage && nextMarker) {\n setPageMarkers((prev) => {\n const updated = [...prev]\n updated[page - 1] = nextMarker\n return updated\n })\n }\n setCurrentPage(page)\n }\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificates issued by Certificate Authority...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load Certificates issued by Certificate Authority.`}\n </Stack>\n )\n }\n\n return (\n <div className=\"relative\">\n {pcaState === \"READY\" && (\n <>\n <Stack className=\"pt-3 pb-2\" distribution=\"end\">\n <Button variant=\"primary\" label={t`Issue End-Entity Certificate`} onClick={toggleIssueEndEntity} />\n </Stack>\n {createIssueEndEntityOpen && (\n <IssueEndEntityCertificateModal\n open={createIssueEndEntityOpen}\n onClose={toggleIssueEndEntity}\n pcaId={pcaId}\n />\n )}\n </>\n )}\n\n {certificates.length === 0 && currentPage === 1 ? (\n <DataGrid columns={columnsLength} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columnsLength}>\n <ContentHeading>\n <Trans>No Certificates issued by this Certificate Authority found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no Certificates available for this Certificate Authority.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n ) : (\n <DataGrid columns={columnsLength}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {certificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\n )}\n\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => goToPage(currentPage - 1)}\n onPressNext={() => goToPage(currentPage + 1)}\n />\n </div>\n )}\n </div>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Spinner, Message } from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nconst VALIDITY_SECONDS = 86400 // 1 day\n\nexport interface IssueSelfSignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pca: CertificateAuthority\n}\n\nexport const IssueSelfSignedCertificateModal = ({ open, onClose, pca }: IssueSelfSignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const handleConfirm = async () => {\n if (isPending || !pca.csr) return\n\n await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pca.id,\n csr: pca.csr,\n configuration: {\n validity: {\n not_after: Math.floor(Date.now() / 1000) + VALIDITY_SECONDS,\n },\n },\n })\n onClose()\n }\n\n const handleClose = () => {\n if (isPending) return\n\n createCertificateMutation.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n title={t`Issue Self-Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Issue Certificate`}\n onConfirm={handleConfirm}\n disableConfirmButton={isPending || !pca.csr}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending ? (\n <div className=\"flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing Self-Signed Certificate...</Trans>\n </span>\n </div>\n ) : (\n <Trans>This action will create a self-signed CA certificate.</Trans>\n )}\n </Modal>\n )\n}\n","import { useRef } from \"react\"\nimport { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea, Button } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface ImportExternallySignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const ImportExternallySignedCertificateModal = ({\n open,\n onClose,\n pcaId,\n}: ImportExternallySignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...importMutation } = trpcReact.services.pca.import.useMutation({\n onSettled: () => utils.services.pca.getById.invalidate(),\n })\n\n const formSchema = z.object({\n imported_certificate_chain: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n imported_certificate_chain: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isPending) return\n\n await importMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n imported_certificate_chain: form.state.values.imported_certificate_chain,\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n importMutation.reset()\n onClose()\n }\n\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const currentChain = useStore(form.store, (state) => state.values.imported_certificate_chain)\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n\n const reader = new FileReader()\n reader.onload = (event) => {\n try {\n const text = event.target?.result as string\n let chainValue = text\n\n if (file.name.endsWith(\".json\")) {\n try {\n const parsed = JSON.parse(text)\n // Validate that imported_certificate_chain is a string, fallback to raw text\n chainValue =\n typeof parsed.imported_certificate_chain === \"string\" ? parsed.imported_certificate_chain : text\n } catch {\n // If JSON parsing fails, use raw text\n chainValue = text\n }\n }\n\n form.setFieldValue(\"imported_certificate_chain\", chainValue)\n } catch (error) {\n console.error(\"Failed to read certificate file:\", error)\n }\n }\n reader.readAsText(file)\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Import Externally Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !currentChain.trim()}\n >\n {importMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {importMutation.error?.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Importing Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"import-externally-signed-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <div className=\"mb-2\">\n <Button onClick={() => fileInputRef.current?.click()}>{t`Choose Certificate to Import`}</Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pem,.crt,.cer,.json\"\n className=\"sr-only\"\n onChange={handleFileChange}\n />\n </div>\n <form.Field\n name=\"imported_certificate_chain\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Paste the code`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Fragment } from \"react\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n CodeBlock,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Stack,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { DeletePcaModal } from \"../../-components/-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"../../-components/-table/constants\"\nimport { PcaCertificatesListContainer } from \"./PcaCertificatesListContainer\"\nimport { IssueSelfSignedCertificateModal } from \"./-modals/IssueSelfSignedCertificateModal\"\nimport { ImportExternallySignedCertificateModal } from \"./-modals/ImportExternallySignedCertificateModal\"\n\ninterface PcaDetailsViewProps {\n pca: CertificateAuthority\n}\n\nexport const PcaDetailsView = ({ pca }: PcaDetailsViewProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const subjectCommonName = pca.configuration?.subject?.common_name ?? \"\"\n const certificateHeading = t`Certificate ${subjectCommonName}`\n const [issueSelfSignedModalOpen, toggleIssueSelfSignedModal] = useModal(false)\n const [importExternallySignedModalOpen, toggleImportExternallySignedModal] = useModal(false)\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToPcaList = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n const basicInfo = [\n { label: t`CA ID`, value: pca.id },\n { label: t`Project ID`, value: pca.project_id },\n { label: t`Subject`, value: pca.configuration?.subject?.common_name },\n {\n label: t`Duration/validity`,\n value:\n pca.certificate?.validity.not_before !== undefined && pca.certificate?.validity.not_after !== undefined\n ? `${Math.round(\n (pca.certificate.validity.not_after - pca.certificate.validity.not_before) / (60 * 60 * 24)\n )} days`\n : undefined,\n },\n ] as const\n\n return (\n <>\n <Stack direction=\"vertical\" gap=\"3\">\n <Stack direction=\"horizontal\" distribution=\"between\">\n <Stack gap=\"2\" alignment=\"center\">\n <div className=\"text-theme-default text-2xl font-semibold\">\n {`${pca.configuration?.subject?.common_name} Certificate Authority Details`}\n </div>\n {STATE_CONFIG[pca.state].badge}\n </Stack>\n <Button onClick={toggleDeletePcaModal}>\n <Trans>Delete Certificate Authority</Trans>\n </Button>\n </Stack>\n\n <p className=\"text-theme-highest text-sm\">\n <Trans>Manage your Private Certificate Authority infrastructure</Trans>\n </p>\n\n {pca.state === \"AWAITING_CERTIFICATE\" && (\n <Stack direction=\"vertical\" gap=\"1\" className=\"bg-dt-background mb-1 rounded-sm p-2\">\n <Stack direction=\"vertical\" gap=\"1\">\n <div className=\"text-base font-bold\">\n <Trans>Lifecycle action</Trans>\n </div>\n <div>\n <Trans>Add a Signed Certificate to your CA to activate it</Trans>\n </div>\n </Stack>\n <Stack direction=\"horizontal\" gap=\"2\" distribution=\"end\">\n <Button onClick={toggleIssueSelfSignedModal}>\n <Trans>Issue Self-Signed Certificate</Trans>\n </Button>\n <Button onClick={toggleImportExternallySignedModal}>\n <Trans>Import Signed Certificate</Trans>\n </Button>\n </Stack>\n </Stack>\n )}\n\n <Stack gap=\"4\" className=\"grid grid-cols-2 items-start\">\n <DescriptionList alignTerms=\"right\" className=\"w-full\">\n {basicInfo.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value || \"—\"}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <CodeBlock\n heading={certificateHeading}\n content={pca?.csr ?? \"\"}\n className=\"w-full [&_pre_code]:block [&_pre_code]:w-full\"\n wrap\n />\n </Stack>\n </Stack>\n\n {importExternallySignedModalOpen && (\n <ImportExternallySignedCertificateModal\n pcaId={pca.id}\n open={importExternallySignedModalOpen}\n onClose={toggleImportExternallySignedModal}\n />\n )}\n\n {issueSelfSignedModalOpen && (\n <IssueSelfSignedCertificateModal\n pca={pca}\n open={issueSelfSignedModalOpen}\n onClose={toggleIssueSelfSignedModal}\n />\n )}\n\n {deletePcaModalOpen && (\n <DeletePcaModal\n pca={pca}\n open={deletePcaModalOpen}\n onClose={toggleDeletePcaModal}\n onSuccess={navigateToPcaList}\n />\n )}\n\n <PcaCertificatesListContainer pcaId={pca.id} pcaState={pca.state} />\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_pcaId-Bo7yHkNW.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","PcaCertificatesTableRow","certificate","useLingui","navigate","navigateToCertificateDetailsPage","from","to","params","prev","certificateId","id","data-testid","onClick","certificate_authority_id","e","stopPropagation","className","label","t","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Spinner","Message","Textarea","trpcReact","useProjectId","IssueEndEntityCertificateModal","open","onClose","pcaId","useLingui","navigate","projectId","utils","useUtils","isPending","createCertificateMutation","services","pca","createCertificate","useMutation","onSettled","listCertificates","invalidate","formSchema","object","csr","string","trim","min","form","defaultValues","validators","onSubmit","value","createdCertificate","mutateAsync","project_id","certificate_authority_id","replace","configuration","validity","not_after","Math","floor","Date","now","handleClose","to","params","certificateId","id","reset","currentCsr","store","state","values","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","length","error","dismissible","variant","className","message","div","span","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","placeholder","errortext","meta","errors","map","join","disabled","useState","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","Pagination","trpcReact","useProjectId","useModal","PcaCertificatesTableRow","IssueEndEntityCertificateModal","ITEMS_PER_PAGE","PcaCertificatesListContainer","pcaId","pcaState","useLingui","projectId","createIssueEndEntityOpen","toggleIssueEndEntity","pageMarkers","setPageMarkers","undefined","currentPage","setCurrentPage","columns","t","columnsLength","length","currentMarker","data","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","limit","next_page_marker","certificates","nextMarker","hasNextPage","computedTotal","totalPages","Math","max","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","div","label","onClick","open","onClose","data-testid","colSpan","p","map","certificate","id","pages","onPressPrevious","onPressNext","Modal","Spinner","Message","trpcReact","useProjectId","VALIDITY_SECONDS","IssueSelfSignedCertificateModal","open","onClose","pca","useLingui","projectId","utils","useUtils","isPending","createCertificateMutation","services","createCertificate","useMutation","onSettled","listCertificates","invalidate","handleConfirm","csr","mutateAsync","project_id","certificate_authority_id","id","configuration","validity","not_after","Math","floor","Date","now","handleClose","reset","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","disableConfirmButton","error","dismissible","variant","className","message","div","span","useRef","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","Button","trpcReact","useProjectId","ImportExternallySignedCertificateModal","open","onClose","pcaId","useLingui","projectId","utils","useUtils","isPending","importMutation","services","pca","import","useMutation","onSettled","getById","invalidate","formSchema","object","imported_certificate_chain","string","trim","min","form","defaultValues","validators","onSubmit","mutateAsync","project_id","certificate_authority_id","state","values","handleClose","reset","fileInputRef","currentChain","store","handleFileChange","e","file","target","files","reader","FileReader","onload","event","text","result","chainValue","name","endsWith","parsed","JSON","parse","setFieldValue","error","console","readAsText","size","title","t","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","message","div","span","id","preventDefault","onClick","current","click","input","ref","type","accept","onChange","Field","children","field","value","onBlur","handleBlur","handleChange","placeholder","errortext","meta","errors","map","join","disabled","Fragment","useNavigate","Button","CodeBlock","DescriptionDefinition","DescriptionList","DescriptionTerm","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","IssueSelfSignedCertificateModal","ImportExternallySignedCertificateModal","PcaDetailsView","pca","useLingui","navigate","projectId","subjectCommonName","configuration","subject","common_name","certificateHeading","t","issueSelfSignedModalOpen","toggleIssueSelfSignedModal","importExternallySignedModalOpen","toggleImportExternallySignedModal","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","value","id","project_id","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","badge","onClick","p","alignTerms","map","heading","content","csr","wrap","pcaId","open","onClose","onSuccess","pcaState","useNavigate","Trans","Button","Spinner","Stack","trpcReact","useProjectId","PcaDetailsView","Route","RouteComponent","navigate","projectId","pcaId","useParams","isLoading","isError","error","data","pca","services","getById","useQuery","project_id","certificate_authority_id","handleBack","to","params","errorMessage","message","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueEndEntityCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaCertificatesListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/IssueSelfSignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-modals/ImportExternallySignedCertificateModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Certificate } from \"@/server/Services/types/pca\"\n\ninterface PcaCertificatesTableRowProps {\n certificate: Certificate\n}\n\nexport const PcaCertificatesTableRow = ({ certificate }: PcaCertificatesTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n\n const navigateToCertificateDetailsPage = () =>\n navigate({\n from: \"/projects/$projectId/services/pca/$pcaId/\",\n to: \"$certificateId\",\n params: (prev) => ({ ...prev, certificateId: certificate.id }),\n })\n\n return (\n <DataGridRow\n key={certificate.id}\n data-testid={`pca-certificate-row-${certificate.id}`}\n onClick={navigateToCertificateDetailsPage}\n >\n <DataGridCell>{certificate.certificate_authority_id}</DataGridCell>\n <DataGridCell>{certificate.id}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToCertificateDetailsPage} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface IssueEndEntityCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const IssueEndEntityCertificateModal = ({ open, onClose, pcaId }: IssueEndEntityCertificateModalProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const formSchema = z.object({\n csr: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n csr: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const createdCertificate = await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n // Normalize to one format so users can paste raw multi-line CSRs with \\n along with already formatted ones\n csr: value.csr.replace(/\\\\n/g, \"\\n\"),\n configuration: { validity: { not_after: Math.floor(Date.now() / 1000) + 8 * 60 * 60 } },\n })\n handleClose()\n\n await navigate({\n to: \"/projects/$projectId/services/pca/$pcaId/$certificateId\",\n params: { projectId, pcaId, certificateId: createdCertificate.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createCertificateMutation.reset()\n onClose()\n }\n\n const currentCsr = useStore(form.store, (state) => state.values.csr)\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Issue End-Entity Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !(currentCsr.trim().length > 0)}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing End-Entity Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"issue-end-entity-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"csr\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Paste CSR code`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useState } from \"react\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { PcaCertificatesTableRow } from \"./-table/PcaCertificatesTableRow\"\nimport { IssueEndEntityCertificateModal } from \"./-modals/IssueEndEntityCertificateModal\"\n\nconst ITEMS_PER_PAGE = 50\n\ninterface PcaCertificatesListContainerProps {\n pcaId: string\n pcaState: CertificateAuthority[\"state\"]\n}\n\nexport const PcaCertificatesListContainer = ({ pcaId, pcaState }: PcaCertificatesListContainerProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [createIssueEndEntityOpen, toggleIssueEndEntity] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\n\n const columns = () =>\n [\n t`CA ID`,\n t`ID`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n const columnsLength = columns().length\n\n const currentMarker = pageMarkers[currentPage - 1]\n\n const { data, isLoading, isError, error } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n limit: ITEMS_PER_PAGE,\n next_page_marker: currentMarker,\n })\n\n const certificates = data?.certificates ?? []\n const nextMarker = data?.next_page_marker\n const hasNextPage = !!nextMarker\n const computedTotal = hasNextPage ? currentPage + 1 : currentPage\n const totalPages = Math.max(computedTotal, pageMarkers.length)\n\n const goToPage = (page: number) => {\n if (page < 1 || page > totalPages) return\n if (page > currentPage && nextMarker) {\n setPageMarkers((prev) => {\n const updated = [...prev]\n updated[page - 1] = nextMarker\n return updated\n })\n }\n setCurrentPage(page)\n }\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificates issued by Certificate Authority...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load Certificates issued by Certificate Authority.`}\n </Stack>\n )\n }\n\n return (\n <div className=\"relative\">\n {pcaState === \"READY\" && (\n <>\n <Stack className=\"pt-3 pb-2\" distribution=\"end\">\n <Button variant=\"primary\" label={t`Issue End-Entity Certificate`} onClick={toggleIssueEndEntity} />\n </Stack>\n {createIssueEndEntityOpen && (\n <IssueEndEntityCertificateModal\n open={createIssueEndEntityOpen}\n onClose={toggleIssueEndEntity}\n pcaId={pcaId}\n />\n )}\n </>\n )}\n\n {certificates.length === 0 && currentPage === 1 ? (\n <DataGrid columns={columnsLength} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columnsLength}>\n <ContentHeading>\n <Trans>No Certificates issued by this Certificate Authority found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no Certificates available for this Certificate Authority.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n ) : (\n <DataGrid columns={columnsLength}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {certificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\n )}\n\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => goToPage(currentPage - 1)}\n onPressNext={() => goToPage(currentPage + 1)}\n />\n </div>\n )}\n </div>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Spinner, Message } from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nconst VALIDITY_SECONDS = 86400 // 1 day\n\nexport interface IssueSelfSignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pca: CertificateAuthority\n}\n\nexport const IssueSelfSignedCertificateModal = ({ open, onClose, pca }: IssueSelfSignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createCertificateMutation } = trpcReact.services.pca.createCertificate.useMutation({\n onSettled: () => utils.services.pca.listCertificates.invalidate(),\n })\n\n const handleConfirm = async () => {\n if (isPending || !pca.csr) return\n\n await createCertificateMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pca.id,\n csr: pca.csr,\n configuration: {\n validity: {\n not_after: Math.floor(Date.now() / 1000) + VALIDITY_SECONDS,\n },\n },\n })\n onClose()\n }\n\n const handleClose = () => {\n if (isPending) return\n\n createCertificateMutation.reset()\n onClose()\n }\n\n return (\n <Modal\n open={open}\n title={t`Issue Self-Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Issue Certificate`}\n onConfirm={handleConfirm}\n disableConfirmButton={isPending || !pca.csr}\n >\n {createCertificateMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createCertificateMutation.error?.message}\n </Message>\n )}\n\n {isPending ? (\n <div className=\"flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Issuing Self-Signed Certificate...</Trans>\n </span>\n </div>\n ) : (\n <Trans>This action will create a self-signed CA certificate.</Trans>\n )}\n </Modal>\n )\n}\n","import { useRef } from \"react\"\nimport { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, Message, Textarea, Button } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface ImportExternallySignedCertificateModalProps {\n open: boolean\n onClose: () => void\n pcaId: string\n}\n\nexport const ImportExternallySignedCertificateModal = ({\n open,\n onClose,\n pcaId,\n}: ImportExternallySignedCertificateModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...importMutation } = trpcReact.services.pca.import.useMutation({\n onSettled: () => utils.services.pca.getById.invalidate(),\n })\n\n const formSchema = z.object({\n imported_certificate_chain: z.string().trim().min(1),\n })\n\n const form = useForm({\n defaultValues: {\n imported_certificate_chain: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (isPending) return\n\n await importMutation.mutateAsync({\n project_id: projectId,\n certificate_authority_id: pcaId,\n imported_certificate_chain: form.state.values.imported_certificate_chain,\n })\n handleClose()\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n importMutation.reset()\n onClose()\n }\n\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const currentChain = useStore(form.store, (state) => state.values.imported_certificate_chain)\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n\n const reader = new FileReader()\n reader.onload = (event) => {\n try {\n const text = event.target?.result as string\n let chainValue = text\n\n if (file.name.endsWith(\".json\")) {\n try {\n const parsed = JSON.parse(text)\n // Validate that imported_certificate_chain is a string, fallback to raw text\n chainValue =\n typeof parsed.imported_certificate_chain === \"string\" ? parsed.imported_certificate_chain : text\n } catch {\n // If JSON parsing fails, use raw text\n chainValue = text\n }\n }\n\n form.setFieldValue(\"imported_certificate_chain\", chainValue)\n } catch (error) {\n console.error(\"Failed to read certificate file:\", error)\n }\n }\n reader.readAsText(file)\n }\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Import Externally Signed Certificate`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !currentChain.trim()}\n >\n {importMutation.error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {importMutation.error?.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Importing Certificate...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"import-externally-signed-certificate-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <div className=\"mb-2\">\n <Button onClick={() => fileInputRef.current?.click()}>{t`Choose Certificate to Import`}</Button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pem,.crt,.cer,.json\"\n className=\"sr-only\"\n onChange={handleFileChange}\n />\n </div>\n <form.Field\n name=\"imported_certificate_chain\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Paste the code`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Fragment } from \"react\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n CodeBlock,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Stack,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { DeletePcaModal } from \"../../-components/-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"../../-components/-table/constants\"\nimport { PcaCertificatesListContainer } from \"./PcaCertificatesListContainer\"\nimport { IssueSelfSignedCertificateModal } from \"./-modals/IssueSelfSignedCertificateModal\"\nimport { ImportExternallySignedCertificateModal } from \"./-modals/ImportExternallySignedCertificateModal\"\n\ninterface PcaDetailsViewProps {\n pca: CertificateAuthority\n}\n\nexport const PcaDetailsView = ({ pca }: PcaDetailsViewProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const subjectCommonName = pca.configuration?.subject?.common_name ?? \"\"\n const certificateHeading = t`Certificate ${subjectCommonName}`\n const [issueSelfSignedModalOpen, toggleIssueSelfSignedModal] = useModal(false)\n const [importExternallySignedModalOpen, toggleImportExternallySignedModal] = useModal(false)\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToPcaList = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n const basicInfo = [\n { label: t`CA ID`, value: pca.id },\n { label: t`Project ID`, value: pca.project_id },\n { label: t`Subject`, value: pca.configuration?.subject?.common_name },\n {\n label: t`Duration/validity`,\n value:\n pca.certificate?.validity.not_before !== undefined && pca.certificate?.validity.not_after !== undefined\n ? `${Math.round(\n (pca.certificate.validity.not_after - pca.certificate.validity.not_before) / (60 * 60 * 24)\n )} days`\n : undefined,\n },\n ] as const\n\n return (\n <>\n <Stack direction=\"vertical\" gap=\"3\">\n <Stack direction=\"horizontal\" distribution=\"between\">\n <Stack gap=\"2\" alignment=\"center\">\n <div className=\"text-theme-default text-2xl font-semibold\">\n {`${pca.configuration?.subject?.common_name} Certificate Authority Details`}\n </div>\n {STATE_CONFIG[pca.state].badge}\n </Stack>\n <Button onClick={toggleDeletePcaModal}>\n <Trans>Delete Certificate Authority</Trans>\n </Button>\n </Stack>\n\n <p className=\"text-theme-highest text-sm\">\n <Trans>Manage your Private Certificate Authority infrastructure</Trans>\n </p>\n\n {pca.state === \"AWAITING_CERTIFICATE\" && (\n <Stack direction=\"vertical\" gap=\"1\" className=\"bg-dt-background mb-1 rounded-sm p-2\">\n <Stack direction=\"vertical\" gap=\"1\">\n <div className=\"text-base font-bold\">\n <Trans>Lifecycle action</Trans>\n </div>\n <div>\n <Trans>Add a Signed Certificate to your CA to activate it</Trans>\n </div>\n </Stack>\n <Stack direction=\"horizontal\" gap=\"2\" distribution=\"end\">\n <Button onClick={toggleIssueSelfSignedModal}>\n <Trans>Issue Self-Signed Certificate</Trans>\n </Button>\n <Button onClick={toggleImportExternallySignedModal}>\n <Trans>Import Signed Certificate</Trans>\n </Button>\n </Stack>\n </Stack>\n )}\n\n <Stack gap=\"4\" className=\"grid grid-cols-2 items-start\">\n <DescriptionList alignTerms=\"right\" className=\"w-full\">\n {basicInfo.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value || \"—\"}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <CodeBlock\n heading={certificateHeading}\n content={pca?.csr ?? \"\"}\n className=\"w-full [&_pre_code]:block [&_pre_code]:w-full\"\n wrap\n />\n </Stack>\n </Stack>\n\n {importExternallySignedModalOpen && (\n <ImportExternallySignedCertificateModal\n pcaId={pca.id}\n open={importExternallySignedModalOpen}\n onClose={toggleImportExternallySignedModal}\n />\n )}\n\n {issueSelfSignedModalOpen && (\n <IssueSelfSignedCertificateModal\n pca={pca}\n open={issueSelfSignedModalOpen}\n onClose={toggleIssueSelfSignedModal}\n />\n )}\n\n {deletePcaModalOpen && (\n <DeletePcaModal\n pca={pca}\n open={deletePcaModalOpen}\n onClose={toggleDeletePcaModal}\n onSuccess={navigateToPcaList}\n />\n )}\n\n <PcaCertificatesListContainer pcaId={pca.id} pcaState={pca.state} />\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":"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"}
@@ -19,7 +19,7 @@ var i = t("/_auth/projects/$projectId/services/pca/$pcaId/")({
19
19
  return { pcaTitle: n?.configuration?.subject?.common_name || n?.id || null };
20
20
  },
21
21
  head: ({ loaderData: e }) => ({ meta: [{ title: e?.pcaTitle ?? "Certificate Authority" }] }),
22
- component: n(() => import("./_pcaId-BwTvJJgh.mjs"), "component"),
22
+ component: n(() => import("./_pcaId-Bo7yHkNW.mjs"), "component"),
23
23
  beforeLoad: async ({ context: t, params: n }) => {
24
24
  let { trpcClient: i } = t, a = e(await i?.auth.getAvailableServices.query() || []);
25
25
  if (!(a.pca?.["clavis-beta"] || a.pca?.["clavis-dev"])) throw r({
@@ -31,4 +31,4 @@ var i = t("/_auth/projects/$projectId/services/pca/$pcaId/")({
31
31
  //#endregion
32
32
  export { i as t };
33
33
 
34
- //# sourceMappingURL=_pcaId-DUHQd0rB.mjs.map
34
+ //# sourceMappingURL=_pcaId-CKkCVC7b.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_pcaId-DUHQd0rB.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","pca","trpcClient","services","getById","query","project_id","projectId","certificate_authority_id","pcaId","pcaTitle","configuration","subject","common_name","id","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex","pcaServices"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,iDAAA,EAAmD;CACtFI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,WAAW;EACrCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;EAAoC;CAC7E;CACAE,QAAQ,OAAO,EAAEC,YAASC,gBAAQ;EAChC,IAAMC,IAAM,MAAMF,EAAQG,YAAYC,SAASF,IAAIG,QAAQC,MAAM;GAC/DC,YAAYN,EAAOO;GACnBC,0BAA0BR,EAAOS;EACnC,CAAA;EACA,OAAO,EAAEC,UAAUT,GAAKU,eAAeC,SAASC,eAAeZ,GAAKa,MAAM,KAAK;CACjF;CACAC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYN,YAAY,wBAAwB,CAAA,EAClE;CACAS,WAASC,yCAAA,WAAA;CACTE,YAAY,OAAO,EAAEvB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAEjB2B,IAAevC,EADK,MAAOe,GAAYsB,KAAKC,qBAAqBpB,MAAAA,KAAY,CAAA,CAC9CkB;EAKrC,IAAI,EAHgBG,EAAa,MAAS,kBAAkBA,EAAa,MAAS,gBAIhF,MAAMxC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,UAAU;EACxC,CAAA;CAEJ;AACF,CAAA"}
1
+ {"version":3,"file":"_pcaId-CKkCVC7b.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","to","RouteInfo","loader","context","params","pca","trpcClient","services","getById","query","project_id","projectId","certificate_authority_id","pcaId","pcaTitle","configuration","subject","common_name","id","head","loaderData","meta","title","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","availableServices","auth","getAvailableServices","serviceIndex","pcaServices"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { Button, Spinner, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\nimport { PcaDetailsView } from \"./-components/PcaDetailsView\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/$pcaId/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n isDetail: true,\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\", to: \"/projects/$projectId/services/pca\" },\n } satisfies RouteInfo,\n loader: async ({ context, params }) => {\n const pca = await context.trpcClient?.services.pca.getById.query({\n project_id: params.projectId,\n certificate_authority_id: params.pcaId,\n })\n return { pcaTitle: pca?.configuration?.subject?.common_name || pca?.id || null }\n },\n head: ({ loaderData }) => ({\n meta: [{ title: loaderData?.pcaTitle ?? \"Certificate Authority\" }],\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n const serviceIndex = getServiceIndex(availableServices)\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n\n // Redirect if clavis service not available\n if (!pcaServices) {\n throw redirect({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n\n const {\n isLoading,\n isError,\n error,\n data: pca,\n } = trpcReact.services.pca.getById.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n // Loading state\n if (isLoading) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificate Authority Details...</Trans>\n </Stack>\n )\n }\n\n const handleBack = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n // Error state\n if (isError) {\n const errorMessage = error?.message || \"Unknown error\"\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-error font-semibold\">\n <Trans>Error loading Certificate Authority</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n // No data state\n if (!pca) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-secondary\">\n <Trans>Certificate Authority not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Certificate Authorities</Trans>\n </Button>\n </Stack>\n )\n }\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,iDAAA,EAAmD;CACtFI,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,WAAW;EACrCC,OAAO;GAAED,UAAU;GAAgBE,IAAI;EAAoC;CAC7E;CACAE,QAAQ,OAAO,EAAEC,YAASC,gBAAQ;EAChC,IAAMC,IAAM,MAAMF,EAAQG,YAAYC,SAASF,IAAIG,QAAQC,MAAM;GAC/DC,YAAYN,EAAOO;GACnBC,0BAA0BR,EAAOS;EACnC,CAAA;EACA,OAAO,EAAEC,UAAUT,GAAKU,eAAeC,SAASC,eAAeZ,GAAKa,MAAM,KAAK;CACjF;CACAC,OAAO,EAAEC,qBAAkB,EACzBC,MAAM,CAAC,EAAEC,OAAOF,GAAYN,YAAY,wBAAwB,CAAA,EAClE;CACAS,WAASC,yCAAA,WAAA;CACTE,YAAY,OAAO,EAAEvB,YAASC,gBAAQ;EACpC,IAAM,EAAEE,kBAAeH,GAEjB2B,IAAevC,EADK,MAAOe,GAAYsB,KAAKC,qBAAqBpB,MAAAA,KAAY,CAAA,CAC9CkB;EAKrC,IAAI,EAHgBG,EAAa,MAAS,kBAAkBA,EAAa,MAAS,gBAIhF,MAAMxC,EAAS;GACbU,IAAI;GACJI,QAAQ,EAAEO,WAAWP,EAAOO,UAAU;EACxC,CAAA;CAEJ;AACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"_projectId-B_2sZKk-.mjs","names":["RouteError","SplitErrorComponent","error","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData, useRouteContext } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { buildNavSections } from \"@/client/routes/_auth/projects/-components/buildNavSections\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n\n const [availableServices, projects] = await Promise.all([\n context.trpcClient?.auth.getAvailableServices.query(),\n context.trpcClient?.project.getAuthProjects.query().catch(() => null),\n ])\n\n const accountId = data?.domain?.id || \"\"\n const description = projects?.find((p) => p.id === params.projectId)?.description ?? null\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId,\n projectId: params.projectId,\n description,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject, crumbDomain } = useLoaderData({ from: Route.id })\n const { enabledServices } = useRouteContext({ strict: false })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n sections={buildNavSections(projectId, availableServices!, enabledServices)}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n domainName={crumbDomain?.name}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";;;AAKiE,IAAAC,KAI9C,EAAEC,eACV,gBAAC,GAAA,EAAkBA,SAAAA,CAAAA"}
1
+ {"version":3,"file":"_projectId-B_2sZKk-.mjs","names":["RouteError","SplitErrorComponent","error","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData, useRouteContext } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { buildNavSections } from \"@/client/routes/_auth/projects/-components/buildNavSections\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { useMemo } from \"react\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n\n const [availableServices, projects] = await Promise.all([\n context.trpcClient?.auth.getAvailableServices.query(),\n context.trpcClient?.project.getAuthProjects.query().catch(() => null),\n ])\n\n const accountId = data?.domain?.id || \"\"\n const description = projects?.find((p) => p.id === params.projectId)?.description ?? null\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId,\n projectId: params.projectId,\n description,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject, crumbDomain } = useLoaderData({ from: Route.id })\n const { enabledServices } = useRouteContext({ strict: false })\n\n const sections = useMemo(\n () => buildNavSections(projectId, availableServices!, enabledServices),\n [projectId, availableServices, enabledServices]\n )\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n sections={sections}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n domainName={crumbDomain?.name}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";;;AAKiE,IAAAC,KAK9C,EAAEC,eACV,gBAAC,GAAA,EAAkBA,SAAAA,CAAAA"}
@@ -1,6 +1,6 @@
1
1
  import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
2
2
  var n = e("/_auth/projects/$projectId")({
3
- component: t(() => import("./_projectId-BaqZ4W50.mjs"), "component"),
3
+ component: t(() => import("./_projectId-Dbck_MFa.mjs"), "component"),
4
4
  errorComponent: t(() => import("./_projectId-B_2sZKk-.mjs"), "errorComponent"),
5
5
  loader: async (e) => {
6
6
  let { context: t, params: n } = e, r = await t.trpcClient?.auth.setCurrentScope.mutate({
@@ -24,4 +24,4 @@ var n = e("/_auth/projects/$projectId")({
24
24
  //#endregion
25
25
  export { n as t };
26
26
 
27
- //# sourceMappingURL=_projectId-DR_2U10f.mjs.map
27
+ //# sourceMappingURL=_projectId-CY8W0IF6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_projectId-CY8W0IF6.mjs","names":["createFileRoute","Route","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter","loader","options","context","params","data","trpcClient","auth","setCurrentScope","mutate","type","projectId","availableServices","projects","Promise","all","getAvailableServices","query","project","getAuthProjects","catch","accountId","domain","id","description","find","p","crumbDomain","path","name","crumbProject"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData, useRouteContext } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { buildNavSections } from \"@/client/routes/_auth/projects/-components/buildNavSections\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { useMemo } from \"react\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n\n const [availableServices, projects] = await Promise.all([\n context.trpcClient?.auth.getAvailableServices.query(),\n context.trpcClient?.project.getAuthProjects.query().catch(() => null),\n ])\n\n const accountId = data?.domain?.id || \"\"\n const description = projects?.find((p) => p.id === params.projectId)?.description ?? null\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId,\n projectId: params.projectId,\n description,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject, crumbDomain } = useLoaderData({ from: Route.id })\n const { enabledServices } = useRouteContext({ strict: false })\n\n const sections = useMemo(\n () => buildNavSections(projectId, availableServices!, enabledServices),\n [projectId, availableServices, enabledServices]\n )\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n sections={sections}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n domainName={crumbDomain?.name}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";AAQA,IAAaC,IAAQD,EAAgB,4BAAA,EAA8B;CACjEE,WAASC,6CAAA,WAAA;CACTE,gBAAcF,6CAAA,gBAAA;CAGdI,QAAQ,OAAOC,MAAAA;EACb,IAAM,EAAEC,YAASC,cAAWF,GACtBG,IAAO,MAAMF,EAAQG,YAAYC,KAAKC,gBAAgBC,OAAO;GACjEC,MAAM;GACNC,WAAWP,EAAOO,aAAa;EACjC,CAAA,GAEM,CAACC,GAAmBC,KAAY,MAAMC,QAAQC,IAAI,CACtDZ,EAAQG,YAAYC,KAAKS,qBAAqBC,MAAAA,GAC9Cd,EAAQG,YAAYY,QAAQC,gBAAgBF,MAAAA,EAAQG,YAAY,IAAA,CAAA,CACjE,GAEKC,IAAYhB,GAAMiB,QAAQC,MAAM,IAChCC,IAAcX,GAAUY,MAAMC,MAAMA,EAAEH,OAAOnB,EAAOO,SAAS,GAAGa,eAAe;EAErF,OAAO;GACLlB,YAAYH,EAAQG;GACpBqB,aAAa;IAAEC,MAAM;IAAaC,MAAMxB,GAAMiB,QAAQO;GAAK;GAC3DC,cAAczB,GAAMa;GACpBN;GACAS;GACAV,WAAWP,EAAOO;GAClBa;EACF;CACF;AACF,CAAA"}
@@ -1,36 +1,26 @@
1
1
  import { B as e, M as t, O as n, P as r, W as i, X as a, Y as o, a as s, st as c, y as l } from "./build-BdRRmNf5.mjs";
2
2
  import { t as u } from "./Slot-CWb612-_.mjs";
3
- import { t as d } from "./_projectId-DR_2U10f.mjs";
3
+ import { t as d } from "./_projectId-CY8W0IF6.mjs";
4
4
  import { t as f } from "./helpers-1PpYf-fC.mjs";
5
5
  import { t as p } from "./routeInfo-Dy9l-wFB.mjs";
6
6
  import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
7
- import { useEffect as _, useMemo as v, useRef as y, useState as b } from "react";
8
- import { Outlet as x, useLoaderData as S, useMatches as C, useNavigate as w, useParams as T, useRouteContext as E } from "@tanstack/react-router";
9
- import { useLingui as D } from "@lingui/react";
10
- import { i18n as O } from "@lingui/core";
7
+ import { useEffect as _, useMemo as v, useState as y } from "react";
8
+ import { Outlet as b, useLoaderData as x, useMatches as S, useNavigate as C, useParams as w, useRouteContext as T } from "@tanstack/react-router";
9
+ import { useLingui as E } from "@lingui/react";
10
+ import { i18n as D } from "@lingui/core";
11
11
  //#region src/client/routes/_auth/projects/-components/SideNavBar.tsx
12
- var k = ({ projectId: n, projectName: r, domainName: i, sections: a }) => {
13
- let o = w(), d = C(), { provider: f } = T({ strict: !1 }), { slots: v } = E({ strict: !1 }), x = (e) => v?.serviceBadge ? /*#__PURE__*/ h(u, {
12
+ var O = ({ projectId: n, projectName: r, domainName: i, sections: a }) => {
13
+ let o = C(), d = S(), { provider: f } = w({ strict: !1 }), { slots: v } = T({ strict: !1 }), b = (e) => v?.serviceBadge ? /*#__PURE__*/ h(u, {
14
14
  component: v.serviceBadge,
15
15
  useShadowDOM: !1,
16
16
  currentService: e
17
- }) : null, S = [...d].reverse().find((e) => p(e.staticData)), D = S && p(S.staticData) ? S.staticData : void 0, O = D?.section ?? null, k = D?.service ?? null, [A, j] = b(() => Object.fromEntries(a.map((e) => [e.section, !0]))), M = y(null), N = y(!1);
17
+ }) : null, x = [...d].reverse().find((e) => p(e.staticData)), E = x && p(x.staticData) ? x.staticData : void 0, D = E?.section ?? null, O = E?.service ?? null, [k, A] = y(() => Object.fromEntries(a.map((e) => [e.section, 0])));
18
18
  return _(() => {
19
- let e = M.current;
20
- M.current = O;
21
- let t = N.current;
22
- if (N.current = !0, t && O && O !== e && O in A) {
23
- j((e) => ({
24
- ...e,
25
- [O]: !1
26
- }));
27
- let e = O;
28
- setTimeout(() => j((t) => ({
29
- ...t,
30
- [e]: !0
31
- })), 0);
32
- }
33
- }, [O]), /*#__PURE__*/ h(t, {
19
+ D && A((e) => ({
20
+ ...e,
21
+ [D]: (e[D] || 0) + 1
22
+ }));
23
+ }, [D]), /*#__PURE__*/ h(t, {
34
24
  ariaLabel: "Project Side Navigation",
35
25
  children: /*#__PURE__*/ g(m, { children: [/*#__PURE__*/ h(e, { children: /*#__PURE__*/ g(m, { children: [
36
26
  /*#__PURE__*/ h(s, {
@@ -49,28 +39,28 @@ var k = ({ projectId: n, projectName: r, domainName: i, sections: a }) => {
49
39
  /*#__PURE__*/ h(c, { spacing: "1" }),
50
40
  a.map(({ section: e, label: t, services: n }) => /*#__PURE__*/ h(l, {
51
41
  label: t,
52
- open: A[e],
42
+ open: !0,
53
43
  children: n.map((t) => {
54
- let n = O === e && (O === "storage" && k === "containers" ? t.params.provider === f : k === t.service);
44
+ let n = D === e && (D === "storage" && O === "containers" ? t.params.provider === f : O === t.service);
55
45
  return /*#__PURE__*/ h(s, {
56
46
  onClick: () => t.navigate(o),
57
47
  label: /*#__PURE__*/ g("span", {
58
48
  className: "flex items-start gap-2",
59
- children: [t.label, x(t.service)]
49
+ children: [t.label, b(t.service)]
60
50
  }),
61
51
  selected: n
62
52
  }, t.service);
63
53
  })
64
- }, e))
54
+ }, `${e}-${k[e]}`))
65
55
  ] }) }), v?.sideNavBanner && /*#__PURE__*/ h(u, { component: v.sideNavBanner })] })
66
56
  });
67
57
  };
68
58
  //#endregion
69
59
  //#region src/client/routes/_auth/projects/-components/buildNavSections.ts
70
- function A(e, t, n) {
60
+ function k(e, t, n) {
71
61
  let r = f(t), i = (e) => !n || n.includes(e), a = [...r.image?.glance && i("images") ? [{
72
62
  service: "images",
73
- label: O._({ id: "an5hVd" }),
63
+ label: D._({ id: "an5hVd" }),
74
64
  navigate: (t) => t({
75
65
  to: "/projects/$projectId/compute/images",
76
66
  params: { projectId: e }
@@ -78,7 +68,7 @@ function A(e, t, n) {
78
68
  params: { projectId: e }
79
69
  }] : [], ...r?.compute?.nova && i("flavors") ? [{
80
70
  service: "flavors",
81
- label: O._({ id: "neiJm0" }),
71
+ label: D._({ id: "neiJm0" }),
82
72
  navigate: (t) => t({
83
73
  to: "/projects/$projectId/compute/flavors",
84
74
  params: { projectId: e }
@@ -86,7 +76,7 @@ function A(e, t, n) {
86
76
  params: { projectId: e }
87
77
  }] : []], o = r.network ? [...i("securitygroups") ? [{
88
78
  service: "securitygroups",
89
- label: O._({ id: "4opp4r" }),
79
+ label: D._({ id: "4opp4r" }),
90
80
  navigate: (t) => t({
91
81
  to: "/projects/$projectId/network/securitygroups",
92
82
  params: { projectId: e }
@@ -94,7 +84,7 @@ function A(e, t, n) {
94
84
  params: { projectId: e }
95
85
  }] : [], ...i("floatingips") ? [{
96
86
  service: "floatingips",
97
- label: O._({ id: "u77/s4" }),
87
+ label: D._({ id: "u77/s4" }),
98
88
  navigate: (t) => t({
99
89
  to: "/projects/$projectId/network/floatingips",
100
90
  params: { projectId: e }
@@ -102,7 +92,7 @@ function A(e, t, n) {
102
92
  params: { projectId: e }
103
93
  }] : []] : [], s = [...r?.["object-store"]?.swift && i("containers") ? [{
104
94
  service: "containers",
105
- label: O._({ id: "+OEi73" }),
95
+ label: D._({ id: "+OEi73" }),
106
96
  navigate: (t) => t({
107
97
  to: "/projects/$projectId/storage/$provider/$storageType",
108
98
  params: {
@@ -118,7 +108,7 @@ function A(e, t, n) {
118
108
  }
119
109
  }] : [], ...i("ceph-containers") ? [{
120
110
  service: "ceph-containers",
121
- label: O._({ id: "KhNDX4" }),
111
+ label: D._({ id: "KhNDX4" }),
122
112
  navigate: (t) => t({
123
113
  to: "/projects/$projectId/storage/$provider/$storageType",
124
114
  params: {
@@ -134,7 +124,7 @@ function A(e, t, n) {
134
124
  }
135
125
  }] : []], c = (r.pca?.["clavis-beta"] || r.pca?.["clavis-dev"]) && i("pca") ? [{
136
126
  service: "pca",
137
- label: O._({ id: "miy5mb" }),
127
+ label: D._({ id: "miy5mb" }),
138
128
  navigate: (t) => t({
139
129
  to: "/projects/$projectId/services/pca",
140
130
  params: { projectId: e }
@@ -144,30 +134,30 @@ function A(e, t, n) {
144
134
  return [
145
135
  {
146
136
  section: "compute",
147
- label: O._({ id: "rp0Bd0" }),
137
+ label: D._({ id: "rp0Bd0" }),
148
138
  services: a
149
139
  },
150
140
  {
151
141
  section: "network",
152
- label: O._({ id: "OR475H" }),
142
+ label: D._({ id: "OR475H" }),
153
143
  services: o
154
144
  },
155
145
  {
156
146
  section: "storage",
157
- label: O._({ id: "BrrIs8" }),
147
+ label: D._({ id: "BrrIs8" }),
158
148
  services: s
159
149
  },
160
150
  {
161
151
  section: "services",
162
- label: O._({ id: "MILoeL" }),
152
+ label: D._({ id: "MILoeL" }),
163
153
  services: c
164
154
  }
165
155
  ].filter((e) => e.services.length > 0);
166
156
  }
167
157
  //#endregion
168
158
  //#region src/client/components/ProjectView/ProjectInfoBox.tsx
169
- function j({ projectInfo: e }) {
170
- let { i18n: t, _: n } = D(), r = w(), o = C(), { projectId: s } = T({ strict: !1 });
159
+ function A({ projectInfo: e }) {
160
+ let { i18n: t, _: n } = E(), r = C(), o = S(), { projectId: s } = w({ strict: !1 });
171
161
  return /*#__PURE__*/ h(a, {
172
162
  className: "relative z-1 mt-8 mb-4",
173
163
  children: v(() => {
@@ -262,12 +252,16 @@ function j({ projectInfo: e }) {
262
252
  }
263
253
  //#endregion
264
254
  //#region src/client/routes/_auth/projects/$projectId.tsx?tsr-split=component
265
- function M() {
266
- let { availableServices: e, projectId: t, crumbProject: i, crumbDomain: a } = S({ from: d.id }), { enabledServices: s } = E({ strict: !1 });
255
+ function j() {
256
+ let { availableServices: e, projectId: t, crumbProject: i, crumbDomain: a } = x({ from: d.id }), { enabledServices: s } = T({ strict: !1 });
267
257
  return /*#__PURE__*/ h(r, {
268
258
  embedded: !0,
269
- sideNavigation: /*#__PURE__*/ h(k, {
270
- sections: A(t, e, s),
259
+ sideNavigation: /*#__PURE__*/ h(O, {
260
+ sections: v(() => k(t, e, s), [
261
+ t,
262
+ e,
263
+ s
264
+ ]),
271
265
  projectId: t,
272
266
  projectName: i?.name || t,
273
267
  domainName: a?.name
@@ -281,16 +275,16 @@ function M() {
281
275
  gap: "6",
282
276
  children: /*#__PURE__*/ g("div", {
283
277
  className: "min-w-0 flex-1",
284
- children: [/*#__PURE__*/ h(j, { projectInfo: {
278
+ children: [/*#__PURE__*/ h(A, { projectInfo: {
285
279
  id: t,
286
280
  name: i?.name || t,
287
281
  domain: i?.domain
288
- } }), /*#__PURE__*/ h(x, {})]
282
+ } }), /*#__PURE__*/ h(b, {})]
289
283
  })
290
284
  }) })
291
285
  });
292
286
  }
293
287
  //#endregion
294
- export { M as component };
288
+ export { j as component };
295
289
 
296
- //# sourceMappingURL=_projectId-BaqZ4W50.mjs.map
290
+ //# sourceMappingURL=_projectId-Dbck_MFa.mjs.map