@cobaltcore-dev/aurora 0.1.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 (142) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +141 -0
  3. package/dist/client/AuroraApp.d.ts +7 -0
  4. package/dist/client/AuthProvider-D-5Jpa6F.mjs +100 -0
  5. package/dist/client/AuthProvider-D-5Jpa6F.mjs.map +1 -0
  6. package/dist/client/ContentHeader-H8KGY3Wd.mjs +81 -0
  7. package/dist/client/ContentHeader-H8KGY3Wd.mjs.map +1 -0
  8. package/dist/client/DeleteFlavorModal-B98oiHWx.mjs +629 -0
  9. package/dist/client/DeleteFlavorModal-B98oiHWx.mjs.map +1 -0
  10. package/dist/client/EditSecurityGroupModal-wQVNIVg1.mjs +137 -0
  11. package/dist/client/EditSecurityGroupModal-wQVNIVg1.mjs.map +1 -0
  12. package/dist/client/FloatingIpActionModals-qu1NMI5a.mjs +417 -0
  13. package/dist/client/FloatingIpActionModals-qu1NMI5a.mjs.map +1 -0
  14. package/dist/client/ImageToastNotifications-wsQDNEh7.mjs +1267 -0
  15. package/dist/client/ImageToastNotifications-wsQDNEh7.mjs.map +1 -0
  16. package/dist/client/ListToolbar-CHlkZrpl.mjs +223 -0
  17. package/dist/client/ListToolbar-CHlkZrpl.mjs.map +1 -0
  18. package/dist/client/RouteError-BwgDIwJE.mjs +25 -0
  19. package/dist/client/RouteError-BwgDIwJE.mjs.map +1 -0
  20. package/dist/client/_auth-CsliQdkJ.mjs +11 -0
  21. package/dist/client/_auth-CsliQdkJ.mjs.map +1 -0
  22. package/dist/client/_flavorId-D_A53VYa.mjs +56 -0
  23. package/dist/client/_flavorId-D_A53VYa.mjs.map +1 -0
  24. package/dist/client/_flavorId-DbhYLFxY.mjs +190 -0
  25. package/dist/client/_flavorId-DbhYLFxY.mjs.map +1 -0
  26. package/dist/client/_floatingIpId-BGgftRBQ.mjs +21 -0
  27. package/dist/client/_floatingIpId-BGgftRBQ.mjs.map +1 -0
  28. package/dist/client/_floatingIpId-D5myuLFz.mjs +228 -0
  29. package/dist/client/_floatingIpId-D5myuLFz.mjs.map +1 -0
  30. package/dist/client/_imageId-BoHX155h.mjs +27 -0
  31. package/dist/client/_imageId-BoHX155h.mjs.map +1 -0
  32. package/dist/client/_imageId-CTa0c3Av.mjs +530 -0
  33. package/dist/client/_imageId-CTa0c3Av.mjs.map +1 -0
  34. package/dist/client/_pcaId-C7Lrv1H_.mjs +242 -0
  35. package/dist/client/_pcaId-C7Lrv1H_.mjs.map +1 -0
  36. package/dist/client/_pcaId-DBgz5V_9.mjs +21 -0
  37. package/dist/client/_pcaId-DBgz5V_9.mjs.map +1 -0
  38. package/dist/client/_projectId-B9fln31N.mjs +8 -0
  39. package/dist/client/_projectId-B9fln31N.mjs.map +1 -0
  40. package/dist/client/_projectId-Be1Erj68.mjs +300 -0
  41. package/dist/client/_projectId-Be1Erj68.mjs.map +1 -0
  42. package/dist/client/_projectId-C-E4NNgo.mjs +84 -0
  43. package/dist/client/_projectId-C-E4NNgo.mjs.map +1 -0
  44. package/dist/client/_projectId-INhedXor.mjs +26 -0
  45. package/dist/client/_projectId-INhedXor.mjs.map +1 -0
  46. package/dist/client/_securityGroupId-DQoRQ-yA.mjs +1647 -0
  47. package/dist/client/_securityGroupId-DQoRQ-yA.mjs.map +1 -0
  48. package/dist/client/_securityGroupId-ihjy8Lcd.mjs +21 -0
  49. package/dist/client/_securityGroupId-ihjy8Lcd.mjs.map +1 -0
  50. package/dist/client/about-oT6ccz8T.mjs +92 -0
  51. package/dist/client/about-oT6ccz8T.mjs.map +1 -0
  52. package/dist/client/aurora-D_NPTbo-.mjs +19 -0
  53. package/dist/client/aurora-D_NPTbo-.mjs.map +1 -0
  54. package/dist/client/build-eu9eg0zF.mjs +14619 -0
  55. package/dist/client/build-eu9eg0zF.mjs.map +1 -0
  56. package/dist/client/buildFilterParams-BDOIRDeD.mjs +15 -0
  57. package/dist/client/buildFilterParams-BDOIRDeD.mjs.map +1 -0
  58. package/dist/client/cn-C3laVXMm.mjs +10 -0
  59. package/dist/client/cn-C3laVXMm.mjs.map +1 -0
  60. package/dist/client/constants-ByHCdNsI.mjs +128 -0
  61. package/dist/client/constants-ByHCdNsI.mjs.map +1 -0
  62. package/dist/client/containers-B_ozmVlx.mjs +74 -0
  63. package/dist/client/containers-B_ozmVlx.mjs.map +1 -0
  64. package/dist/client/containers-Dx7TYruP.mjs +7 -0
  65. package/dist/client/containers-Dx7TYruP.mjs.map +1 -0
  66. package/dist/client/containers-rn_ntCJu.mjs +3029 -0
  67. package/dist/client/containers-rn_ntCJu.mjs.map +1 -0
  68. package/dist/client/flavors-CT4auvLO.mjs +565 -0
  69. package/dist/client/flavors-CT4auvLO.mjs.map +1 -0
  70. package/dist/client/flavors-DRZb9LJP.mjs +8 -0
  71. package/dist/client/flavors-DRZb9LJP.mjs.map +1 -0
  72. package/dist/client/flavors-DtgMd0Ii.mjs +12 -0
  73. package/dist/client/flavors-DtgMd0Ii.mjs.map +1 -0
  74. package/dist/client/floatingips-DG5cFJSZ.mjs +12 -0
  75. package/dist/client/floatingips-DG5cFJSZ.mjs.map +1 -0
  76. package/dist/client/floatingips-iCMR0ZiL.mjs +436 -0
  77. package/dist/client/floatingips-iCMR0ZiL.mjs.map +1 -0
  78. package/dist/client/formatBytes-GYujK0dP.mjs +38 -0
  79. package/dist/client/formatBytes-GYujK0dP.mjs.map +1 -0
  80. package/dist/client/helpers--JWXi40U.mjs +6 -0
  81. package/dist/client/helpers--JWXi40U.mjs.map +1 -0
  82. package/dist/client/hooks-s-I8vWww.mjs +2 -0
  83. package/dist/client/images-BTqRflJv2.mjs +1794 -0
  84. package/dist/client/images-BTqRflJv2.mjs.map +1 -0
  85. package/dist/client/images-DRTfx8k2.mjs +8 -0
  86. package/dist/client/images-DRTfx8k2.mjs.map +1 -0
  87. package/dist/client/images-xBfsjxkX.mjs +12 -0
  88. package/dist/client/images-xBfsjxkX.mjs.map +1 -0
  89. package/dist/client/index.d.ts +1 -0
  90. package/dist/client/index.js +1033 -0
  91. package/dist/client/index.js.map +1 -0
  92. package/dist/client/md-CI9FmfYv.mjs +390 -0
  93. package/dist/client/md-CI9FmfYv.mjs.map +1 -0
  94. package/dist/client/network-DFVVVNS5.mjs +8 -0
  95. package/dist/client/network-DFVVVNS5.mjs.map +1 -0
  96. package/dist/client/objects-CKk6cST_.mjs +4762 -0
  97. package/dist/client/objects-CKk6cST_.mjs.map +1 -0
  98. package/dist/client/objects-DkDKVSmQ.mjs +8 -0
  99. package/dist/client/objects-DkDKVSmQ.mjs.map +1 -0
  100. package/dist/client/objects-r_Vl31oj.mjs +80 -0
  101. package/dist/client/objects-r_Vl31oj.mjs.map +1 -0
  102. package/dist/client/overview-B7pXx6bt.mjs +173 -0
  103. package/dist/client/overview-B7pXx6bt.mjs.map +1 -0
  104. package/dist/client/overview-CKGLIu6W.mjs +12 -0
  105. package/dist/client/overview-CKGLIu6W.mjs.map +1 -0
  106. package/dist/client/overview-Ca8r3SAz.mjs +16 -0
  107. package/dist/client/overview-Ca8r3SAz.mjs.map +1 -0
  108. package/dist/client/overview-DkPM0Od5.mjs +12 -0
  109. package/dist/client/overview-DkPM0Od5.mjs.map +1 -0
  110. package/dist/client/overview-Dxm7Ef3X.mjs +12 -0
  111. package/dist/client/overview-Dxm7Ef3X.mjs.map +1 -0
  112. package/dist/client/overview-ag4Envez.mjs +16 -0
  113. package/dist/client/overview-ag4Envez.mjs.map +1 -0
  114. package/dist/client/pca-BGv7Mprl.mjs +12 -0
  115. package/dist/client/pca-BGv7Mprl.mjs.map +1 -0
  116. package/dist/client/pca-DpULpMu5.mjs +167 -0
  117. package/dist/client/pca-DpULpMu5.mjs.map +1 -0
  118. package/dist/client/projects-BuN69cxO.mjs +144 -0
  119. package/dist/client/projects-BuN69cxO.mjs.map +1 -0
  120. package/dist/client/projects-D1pP0XdA.mjs +12 -0
  121. package/dist/client/projects-D1pP0XdA.mjs.map +1 -0
  122. package/dist/client/projects-MbS1USl2.mjs +7 -0
  123. package/dist/client/projects-MbS1USl2.mjs.map +1 -0
  124. package/dist/client/projects-_Dfn6eQT.mjs +22 -0
  125. package/dist/client/projects-_Dfn6eQT.mjs.map +1 -0
  126. package/dist/client/securitygroups-DURjFfYK.mjs +12 -0
  127. package/dist/client/securitygroups-DURjFfYK.mjs.map +1 -0
  128. package/dist/client/securitygroups-KC2qvmH8.mjs +442 -0
  129. package/dist/client/securitygroups-KC2qvmH8.mjs.map +1 -0
  130. package/dist/client/trpcClient-BxguzNYF.mjs +57 -0
  131. package/dist/client/trpcClient-BxguzNYF.mjs.map +1 -0
  132. package/dist/client/useErrorTranslation-TZVwIAzq.mjs +83 -0
  133. package/dist/client/useErrorTranslation-TZVwIAzq.mjs.map +1 -0
  134. package/dist/client/useListWithFiltering-mMX_EfyI.mjs +32 -0
  135. package/dist/client/useListWithFiltering-mMX_EfyI.mjs.map +1 -0
  136. package/dist/client/useModal-Dg4CBeqL.mjs +12 -0
  137. package/dist/client/useModal-Dg4CBeqL.mjs.map +1 -0
  138. package/dist/client/useProjectId-BWaeJZOy.mjs +11 -0
  139. package/dist/client/useProjectId-BWaeJZOy.mjs.map +1 -0
  140. package/dist/server/index.d.ts +35 -0
  141. package/dist/server/index.js +36514 -0
  142. package/package.json +129 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_imageId-CTa0c3Av.mjs","names":["React","useState","DescriptionList","DescriptionTerm","DescriptionDefinition","Container","ContentHeading","Stack","Message","Box","Button","ButtonRow","SizeDisplay","trpcReact","MEMBER_STATUSES","ImageMembersTable","SharedImageBox","image","myMemberData","canUpdateMember","onStatusChange","isLoading","useLingui","isPending","status","PENDING","isRejected","REJECTED","isAccepted","ACCEPTED","sharedAt","created_at","Date","toLocaleString","t","updatedAt","updated_at","ownerProject","owner","p","className","span","ul","li","onClick","disabled","variant","GeneralImageData","px","py","alignTerms","id","name","size","min_disk","min_ram","disk_format","container_format","toLocaleDateString","SecuritySection","currentProjectId","isSharedWithMe","visibility","undefined","protected","checksum","CustomPropertiesSection","knownFields","Set","customProperties","Object","entries","filter","key","has","sort","a","b","localeCompare","hasProperties","length","map","value","Fragment","JSON","stringify","String","getTabClassName","active","base","SharingDetailsTab","permissions","isAddingMember","setIsAddingMember","message","setMessage","data","imageMembers","isMembersLoading","compute","listImageMembers","useQuery","project_id","imageId","enabled","text","type","onDismiss","canAdd","canCreateMember","canRemove","canDeleteMember","projectId","ImageDetailsView","activeTab","onTabChange","onMemberStatusChange","isMemberStatusChanging","actions","isImageOwner","showTabs","direction","gap","div","button","Button","ButtonRow","Stack","Spinner","PopupMenu","PopupMenuToggle","PopupMenuOptions","PopupMenuItem","Toast","ToastProps","useNavigate","useParams","useSearch","Trans","useLingui","trpcReact","ImageDetailsView","EditImageDetailsModal","EditImageMetadataModal","DeleteImageModal","ActivateImageModal","DeactivateImageModal","IMAGE_STATUSES","IMAGE_VISIBILITY","GlanceImage","MemberStatus","TRPCClientError","InferrableClientTypes","getImageAccessStatusUpdatedToast","getImageAccessStatusErrorToast","useState","ContentHeader","Route","RouteComponent","projectId","imageId","from","tab","setPageTitle","useRouteContext","navigate","t","data","image","status","error","compute","getImageById","useQuery","project_id","permissionsData","canUser","permission","permissions","canDelete","canUpdate","canCreateMember","canDeleteMember","canUpdateMember","utils","useUtils","editDetailsModalOpen","setEditDetailsModalOpen","editMetadataModalOpen","setEditMetadataModalOpen","deleteModalOpen","setDeleteModalOpen","activateModalOpen","setActivateModalOpen","deactivateModalOpen","setDeactivateModalOpen","toastData","setToastData","updateImageMutation","updateImage","useMutation","onSuccess","updatedImage","setData","listImagesWithPagination","invalidate","deleteImageMutation","deleteImage","deactivateImageMutation","deactivateImage","reactivateImageMutation","reactivateImage","updateImageVisibilityMutation","updateImageVisibility","isSharedWithMe","visibility","SHARED","owner","undefined","myMemberData","getImageMember","memberId","enabled","updateMemberMutation","updateImageMember","listImageMembers","listSharedImagesByMemberStatus","handleMemberStatusChange","newStatus","mutateAsync","onDismiss","errorMessage","message","name","id","handleBack","to","params","isLoading","isPending","convertToJsonPatchOperations","updatedProperties","Partial","originalImage","Array","op","path","value","operations","Object","entries","forEach","key","push","propertyExists","handleSaveEdit","Promise","handleDelete","deletedImage","handleActivate","img","handleDeactivate","handleUpdateVisibility","newVisibility","isDeactivated","DEACTIVATED","isPrivate","PRIVATE","hasMoreActions","protected","headerActions","String","newTab","search","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/ImageDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/$imageId.tsx?tsr-split=component"],"sourcesContent":["import React, { useState } from \"react\"\nimport {\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n Container,\n ContentHeading,\n Stack,\n Message,\n Box,\n Button,\n ButtonRow,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { GlanceImage, ImageMember, MemberStatus } from \"@/server/Compute/types/image\"\nimport { SizeDisplay } from \"./SizeDisplay\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { MEMBER_STATUSES } from \"../../../-constants/filters\"\nimport { ImageMembersTable } from \"./ImageMembersTable\"\n\ninterface ImageDetailsViewProps {\n image: GlanceImage\n currentProjectId?: string\n activeTab?: \"details\" | \"sharing\"\n onTabChange?: (tab: \"details\" | \"sharing\") => void\n permissions?: {\n canCreateMember: boolean\n canDeleteMember: boolean\n canUpdateMember: boolean\n }\n myMemberData?: ImageMember\n onMemberStatusChange?: (status: MemberStatus) => void\n isMemberStatusChanging?: boolean\n actions?: React.ReactNode\n}\n\nconst SharedImageBox: React.FC<{\n image: GlanceImage\n myMemberData: ImageMember\n canUpdateMember: boolean\n onStatusChange: (status: MemberStatus) => void\n isLoading: boolean\n}> = ({ image, myMemberData, canUpdateMember, onStatusChange, isLoading }) => {\n const { t } = useLingui()\n const isPending = myMemberData.status === MEMBER_STATUSES.PENDING\n const isRejected = myMemberData.status === MEMBER_STATUSES.REJECTED\n const isAccepted = myMemberData.status === MEMBER_STATUSES.ACCEPTED\n\n const sharedAt = myMemberData.created_at ? new Date(myMemberData.created_at).toLocaleString() : t`N/A`\n const updatedAt = myMemberData.updated_at ? new Date(myMemberData.updated_at).toLocaleString() : t`N/A`\n const ownerProject = image.owner ?? \"\"\n\n return (\n <Box>\n {isPending && (\n <p className=\"text-theme-highest font-semibold\">\n <Trans>Your action is required</Trans>\n </p>\n )}\n <p>\n <Trans>\n This image was shared with you by <span className=\"font-semibold\">{ownerProject}</span> on {sharedAt}.\n </Trans>\n </p>\n <ul>\n <li>\n <span className=\"font-semibold\">\n <Trans>Access Status:</Trans>\n </span>{\" \"}\n {myMemberData.status}\n </li>\n <li>\n <span className=\"font-semibold\">\n <Trans>Shared:</Trans>\n </span>{\" \"}\n {sharedAt}\n </li>\n <li>\n <span className=\"font-semibold\">\n <Trans>Updated:</Trans>\n </span>{\" \"}\n {updatedAt}\n </li>\n </ul>\n\n {canUpdateMember && (\n <ButtonRow>\n {isPending && (\n <Button onClick={() => onStatusChange(MEMBER_STATUSES.REJECTED)} disabled={isLoading} variant=\"subdued\">\n <Trans>Reject</Trans>\n </Button>\n )}\n {(isPending || isRejected) && (\n <Button onClick={() => onStatusChange(MEMBER_STATUSES.ACCEPTED)} disabled={isLoading} variant=\"primary\">\n <Trans>Accept</Trans>\n </Button>\n )}\n {isAccepted && (\n <Button\n onClick={() => onStatusChange(MEMBER_STATUSES.REJECTED)}\n disabled={isLoading}\n variant=\"primary-danger\"\n >\n <Trans>Reject</Trans>\n </Button>\n )}\n </ButtonRow>\n )}\n </Box>\n )\n}\n\nexport const GeneralImageData: React.FC<{ image: GlanceImage }> = ({ image }) => {\n const { t } = useLingui()\n\n return (\n <Container px={false} py>\n <ContentHeading>{t`General Image Data`}</ContentHeading>\n <DescriptionList alignTerms=\"right\">\n <DescriptionTerm>{t`ID`}</DescriptionTerm>\n <DescriptionDefinition>{image.id}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Name`}</DescriptionTerm>\n <DescriptionDefinition>{image.name}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Status`}</DescriptionTerm>\n <DescriptionDefinition>{image.status}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Size`}</DescriptionTerm>\n <DescriptionDefinition>\n <SizeDisplay size={image.size} />\n </DescriptionDefinition>\n\n <DescriptionTerm>{t`Min. Disk`}</DescriptionTerm>\n <DescriptionDefinition>{image.min_disk} GB</DescriptionDefinition>\n\n <DescriptionTerm>{t`Min. RAM`}</DescriptionTerm>\n <DescriptionDefinition>{image.min_ram} MB</DescriptionDefinition>\n\n <DescriptionTerm>{t`Disk Format`}</DescriptionTerm>\n <DescriptionDefinition>\n <span className=\"uppercase\">{image.disk_format}</span>\n </DescriptionDefinition>\n\n <DescriptionTerm>{t`Container Format`}</DescriptionTerm>\n <DescriptionDefinition>\n <span className=\"uppercase\">{image.container_format}</span>\n </DescriptionDefinition>\n\n <DescriptionTerm>{t`Created At`}</DescriptionTerm>\n <DescriptionDefinition>\n {image.created_at ? new Date(image.created_at).toLocaleDateString() : t`N/A`}\n </DescriptionDefinition>\n\n <DescriptionTerm>{t`Updated At`}</DescriptionTerm>\n <DescriptionDefinition>\n {image.updated_at ? new Date(image.updated_at).toLocaleDateString() : t`N/A`}\n </DescriptionDefinition>\n </DescriptionList>\n </Container>\n )\n}\n\nexport const SecuritySection: React.FC<{ image: GlanceImage; currentProjectId?: string }> = ({\n image,\n currentProjectId,\n}) => {\n const { t } = useLingui()\n\n const isSharedWithMe = image.visibility === \"shared\" && image.owner !== undefined && image.owner !== currentProjectId\n\n return (\n <Container px={false} py>\n <ContentHeading>{t`Security`}</ContentHeading>\n <DescriptionList alignTerms=\"right\">\n <DescriptionTerm>{isSharedWithMe ? t`Shared by Project` : t`Owner Project ID`}</DescriptionTerm>\n <DescriptionDefinition>{image.owner}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Visibility`}</DescriptionTerm>\n <DescriptionDefinition>{image.visibility}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Protected`}</DescriptionTerm>\n <DescriptionDefinition>{image.protected ? t`Yes` : t`No`}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Checksum`}</DescriptionTerm>\n <DescriptionDefinition>{image?.checksum ? image.checksum : \"\"}</DescriptionDefinition>\n </DescriptionList>\n </Container>\n )\n}\n\nexport const CustomPropertiesSection: React.FC<{ image: GlanceImage }> = ({ image }) => {\n const { t } = useLingui()\n\n const knownFields = new Set([\n \"id\",\n \"name\",\n \"status\",\n \"visibility\",\n \"size\",\n \"disk_format\",\n \"container_format\",\n \"min_disk\",\n \"min_ram\",\n \"owner\",\n \"protected\",\n \"created_at\",\n \"updated_at\",\n \"checksum\",\n ])\n\n const customProperties = Object.entries(image)\n .filter(([key]) => !knownFields.has(key))\n .sort(([a], [b]) => a.localeCompare(b))\n\n const hasProperties = customProperties.length > 0\n\n return (\n <Container px={false} py>\n <ContentHeading>{t`Custom Properties / Metadata`}</ContentHeading>\n {hasProperties ? (\n <DescriptionList alignTerms=\"right\" className=\"grid-cols-4\">\n {customProperties.map(([key, value]) => (\n <React.Fragment key={key}>\n <DescriptionTerm className=\"col-span-1\">{key}</DescriptionTerm>\n <DescriptionDefinition className=\"col-span-1\">\n {value === null || value === undefined ? (\n <span>null</span>\n ) : typeof value === \"object\" ? (\n <span className=\"break-all\">{JSON.stringify(value)}</span>\n ) : typeof value === \"boolean\" ? (\n value ? (\n t`True`\n ) : (\n t`False`\n )\n ) : (\n <span className=\"break-all\">{String(value)}</span>\n )}\n </DescriptionDefinition>\n </React.Fragment>\n ))}\n </DescriptionList>\n ) : (\n <p className=\"text-theme-light\">{t`No custom properties defined`}</p>\n )}\n </Container>\n )\n}\n\nconst getTabClassName = (active: boolean) => {\n const base = \"px-6 py-3 font-semibold border-b-2 transition-colors\"\n return active\n ? `${base} border-theme-accent text-theme-highest`\n : `${base} border-transparent text-theme-secondary hover:text-theme-high`\n}\n\nconst SharingDetailsTab: React.FC<ImageDetailsViewProps> = ({ image, permissions, currentProjectId }) => {\n const [isAddingMember, setIsAddingMember] = useState(false)\n const [message, setMessage] = useState<{ text: string; type: \"error\" | \"info\" } | null>(null)\n\n const { data: imageMembers, isLoading: isMembersLoading } = trpcReact.compute.listImageMembers.useQuery(\n { project_id: currentProjectId!, imageId: image.id },\n { enabled: !!image.id && !!currentProjectId }\n )\n\n return (\n <Container px={false} py>\n {message && (\n <Message text={message.text} variant={message.type} onDismiss={() => setMessage(null)} className=\"mb-4\" />\n )}\n <ImageMembersTable\n image={image}\n imageMembers={imageMembers}\n isMembersLoading={isMembersLoading}\n canAdd={permissions?.canCreateMember ?? false}\n canRemove={permissions?.canDeleteMember ?? false}\n isAddingMember={isAddingMember}\n setIsAddingMember={setIsAddingMember}\n setMessage={setMessage}\n projectId={currentProjectId!}\n />\n </Container>\n )\n}\n\nexport const ImageDetailsView: React.FC<ImageDetailsViewProps> = ({\n image,\n currentProjectId,\n activeTab = \"details\",\n onTabChange,\n permissions,\n myMemberData,\n onMemberStatusChange,\n isMemberStatusChanging,\n actions,\n}) => {\n const { t } = useLingui()\n\n const isSharedWithMe = image.visibility === \"shared\" && image.owner !== undefined && image.owner !== currentProjectId\n const isImageOwner = image.owner === currentProjectId\n const showTabs = isImageOwner && image.visibility === \"shared\"\n\n return (\n <Stack direction=\"vertical\" gap=\"6\">\n {isSharedWithMe && myMemberData && onMemberStatusChange && (\n <SharedImageBox\n image={image}\n myMemberData={myMemberData}\n canUpdateMember={permissions?.canUpdateMember ?? false}\n onStatusChange={onMemberStatusChange}\n isLoading={isMemberStatusChanging ?? false}\n />\n )}\n\n {showTabs && (\n <div className=\"border-theme-background-lvl-3 border-b\">\n <Stack direction=\"horizontal\" gap=\"0\">\n <button className={getTabClassName(activeTab === \"details\")} onClick={() => onTabChange?.(\"details\")}>\n {t`Details`}\n </button>\n <button className={getTabClassName(activeTab === \"sharing\")} onClick={() => onTabChange?.(\"sharing\")}>\n {t`Sharing Details`}\n </button>\n </Stack>\n </div>\n )}\n\n {(activeTab === \"details\" || !showTabs) && (\n <>\n {actions}\n <GeneralImageData image={image} />\n <SecuritySection image={image} currentProjectId={currentProjectId} />\n <CustomPropertiesSection image={image} />\n </>\n )}\n\n {activeTab === \"sharing\" && showTabs && <SharingDetailsTab image={image} permissions={permissions} />}\n </Stack>\n )\n}\n","import {\n Button,\n ButtonRow,\n Stack,\n Spinner,\n PopupMenu,\n PopupMenuToggle,\n PopupMenuOptions,\n PopupMenuItem,\n Toast,\n ToastProps,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { createFileRoute, redirect, useNavigate, useParams, useSearch } from \"@tanstack/react-router\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { ImageDetailsView } from \"../-components/Images/-components/ImageDetailsView\"\nimport { EditImageDetailsModal } from \"../-components/Images/-components/EditImageDetailsModal\"\nimport { EditImageMetadataModal } from \"../-components/Images/-components/EditImageMetadataModal\"\nimport { DeleteImageModal } from \"../-components/Images/-components/DeleteImageModal\"\nimport { ActivateImageModal } from \"../-components/Images/-components/ActivateImageModal\"\nimport { DeactivateImageModal } from \"../-components/Images/-components/DeactivateImageModal\"\nimport { IMAGE_STATUSES, IMAGE_VISIBILITY } from \"../-constants/filters\"\nimport { GlanceImage, MemberStatus } from \"@/server/Compute/types/image\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { InferrableClientTypes } from \"@trpc/server/unstable-core-do-not-import\"\nimport {\n getImageAccessStatusUpdatedToast,\n getImageAccessStatusErrorToast,\n} from \"../-components/Images/-components/ImageToastNotifications\"\nimport { useState } from \"react\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/images/$imageId\")({\n staticData: { section: \"compute\", service: \"images\", isDetail: true } satisfies RouteInfo,\n validateSearch: z.object({\n tab: z.enum([\"details\", \"sharing\"]).optional(),\n }),\n component: RouteComponent,\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const { projectId } = params\n\n const availableServices = (await trpcClient?.auth.getAvailableServices.query()) || []\n\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect to the \"Projects Overview\" page if none of compute services available\n if (!serviceIndex[\"image\"] && !serviceIndex[\"compute\"]) {\n throw redirect({\n to: \"/projects/$projectId/compute/overview\",\n params: { projectId },\n })\n }\n\n if (!serviceIndex[\"image\"][\"glance\"]) {\n // Redirect to the \"Compute Services Overview\" page if the \"Glance\" service is not available\n throw redirect({\n to: \"/projects/$projectId/compute/overview\",\n params: { projectId: params.projectId },\n })\n }\n },\n})\n\nfunction RouteComponent() {\n const { projectId, imageId } = useParams({\n from: \"/_auth/projects/$projectId/compute/images/$imageId\",\n })\n const { tab } = useSearch({\n from: \"/_auth/projects/$projectId/compute/images/$imageId\",\n })\n\n const { setPageTitle } = Route.useRouteContext()\n const navigate = useNavigate()\n const { t } = useLingui()\n\n const {\n data: image,\n status,\n error,\n } = trpcReact.compute.getImageById.useQuery({ project_id: projectId, imageId: imageId })\n\n const { data: permissionsData } = trpcReact.compute.canUser.useQuery({\n project_id: projectId,\n permission: [\n \"images:delete\",\n \"images:update\",\n \"images:create_member\",\n \"images:delete_member\",\n \"images:update_member\",\n ],\n })\n\n const permissions = {\n canDelete: permissionsData?.[0] ?? false,\n canUpdate: permissionsData?.[1] ?? false,\n canCreateMember: permissionsData?.[2] ?? false,\n canDeleteMember: permissionsData?.[3] ?? false,\n canUpdateMember: permissionsData?.[4] ?? false,\n }\n\n const utils = trpcReact.useUtils()\n\n const [editDetailsModalOpen, setEditDetailsModalOpen] = useState(false)\n const [editMetadataModalOpen, setEditMetadataModalOpen] = useState(false)\n const [deleteModalOpen, setDeleteModalOpen] = useState(false)\n const [activateModalOpen, setActivateModalOpen] = useState(false)\n const [deactivateModalOpen, setDeactivateModalOpen] = useState(false)\n const [toastData, setToastData] = useState<ToastProps | null>(null)\n\n const updateImageMutation = trpcReact.compute.updateImage.useMutation({\n onSuccess: (updatedImage) => {\n utils.compute.getImageById.setData({ project_id: projectId, imageId }, updatedImage)\n utils.compute.listImagesWithPagination.invalidate()\n },\n })\n\n const deleteImageMutation = trpcReact.compute.deleteImage.useMutation({\n onSuccess: () => {\n utils.compute.listImagesWithPagination.invalidate()\n },\n })\n\n const deactivateImageMutation = trpcReact.compute.deactivateImage.useMutation({\n onSuccess: () => {\n utils.compute.getImageById.invalidate({ project_id: projectId, imageId })\n },\n })\n\n const reactivateImageMutation = trpcReact.compute.reactivateImage.useMutation({\n onSuccess: () => {\n utils.compute.getImageById.invalidate({ project_id: projectId, imageId })\n },\n })\n\n const updateImageVisibilityMutation = trpcReact.compute.updateImageVisibility.useMutation({\n onSuccess: (updatedImage) => {\n utils.compute.getImageById.setData({ project_id: projectId, imageId }, updatedImage)\n },\n })\n\n const isSharedWithMe =\n image?.visibility === IMAGE_VISIBILITY.SHARED && image?.owner !== undefined && image?.owner !== projectId\n\n const { data: myMemberData } = trpcReact.compute.getImageMember.useQuery(\n { project_id: projectId, imageId: imageId, memberId: projectId },\n { enabled: isSharedWithMe && !!imageId && !!projectId }\n )\n\n const updateMemberMutation = trpcReact.compute.updateImageMember.useMutation({\n onSuccess: () => {\n utils.compute.getImageMember.invalidate({ project_id: projectId, imageId: imageId, memberId: projectId })\n utils.compute.listImageMembers.invalidate({ project_id: projectId, imageId: imageId })\n utils.compute.listImagesWithPagination.invalidate()\n utils.compute.listSharedImagesByMemberStatus.invalidate()\n },\n })\n\n const handleMemberStatusChange = async (newStatus: MemberStatus) => {\n try {\n await updateMemberMutation.mutateAsync({ project_id: projectId, imageId, memberId: projectId, status: newStatus })\n setToastData(getImageAccessStatusUpdatedToast(newStatus, { onDismiss: () => setToastData(null) }))\n } catch (error) {\n const errorMessage = (error as TRPCClientError<InferrableClientTypes>)?.message\n setToastData(getImageAccessStatusErrorToast(errorMessage, { onDismiss: () => setToastData(null) }))\n }\n }\n\n // Type-safe: name kann string | undefined | null sein\n if (image?.name && typeof image.name === \"string\") {\n setPageTitle(image.name)\n } else if (image?.id) {\n setPageTitle(image.id)\n } else if (status === \"error\") {\n setPageTitle(t`Error - Image Details`)\n } else if (status === \"pending\") {\n setPageTitle(t`Loading Image...`)\n } else {\n setPageTitle(t`Image Details`)\n }\n\n const handleBack = () => {\n navigate({\n to: \"/projects/$projectId/compute/images\",\n params: { projectId },\n })\n }\n\n const isLoading =\n updateImageMutation.isPending ||\n deleteImageMutation.isPending ||\n deactivateImageMutation.isPending ||\n reactivateImageMutation.isPending ||\n updateImageVisibilityMutation.isPending\n\n const convertToJsonPatchOperations = (\n updatedProperties: Partial<GlanceImage>,\n originalImage: GlanceImage\n ): Array<{ op: \"add\" | \"replace\" | \"remove\"; path: string; value?: unknown }> => {\n const operations: Array<{ op: \"add\" | \"replace\" | \"remove\"; path: string; value?: unknown }> = []\n Object.entries(updatedProperties).forEach(([key, value]) => {\n const path = `/${key}`\n if (value === null || value === undefined) {\n if (key in originalImage) operations.push({ op: \"remove\", path })\n } else {\n const propertyExists = key in originalImage\n operations.push({ op: propertyExists ? \"replace\" : \"add\", path, value })\n }\n })\n return operations\n }\n\n const handleSaveEdit = async (updatedProperties: Partial<GlanceImage>): Promise<boolean> => {\n if (!image) return false\n const operations = convertToJsonPatchOperations(updatedProperties, image)\n try {\n await updateImageMutation.mutateAsync({ project_id: projectId, imageId, operations })\n setEditDetailsModalOpen(false)\n return true\n } catch {\n return false\n }\n }\n\n const handleDelete = async (deletedImage: GlanceImage) => {\n try {\n await deleteImageMutation.mutateAsync({ project_id: projectId, imageId: deletedImage.id })\n setDeleteModalOpen(false)\n handleBack()\n } catch {\n setDeleteModalOpen(false)\n }\n }\n\n const handleActivate = async (img: GlanceImage) => {\n try {\n await reactivateImageMutation.mutateAsync({ project_id: projectId, imageId: img.id })\n setActivateModalOpen(false)\n } catch {\n setActivateModalOpen(false)\n }\n }\n\n const handleDeactivate = async (img: GlanceImage) => {\n try {\n await deactivateImageMutation.mutateAsync({ project_id: projectId, imageId: img.id })\n setDeactivateModalOpen(false)\n } catch {\n setDeactivateModalOpen(false)\n }\n }\n\n const handleUpdateVisibility = async (newVisibility: \"public\" | \"private\" | \"shared\" | \"community\") => {\n if (!image) return\n try {\n await updateImageVisibilityMutation.mutateAsync({\n project_id: projectId,\n imageId: image.id,\n visibility: newVisibility,\n })\n } catch {\n // error handled by mutation state\n }\n }\n\n // Handle loading state\n if (status === \"pending\") {\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 Image Details...</Trans>\n </Stack>\n )\n }\n\n // Handle error state\n if (status === \"error\") {\n const errorMessage = error?.message || \"Unknown error\"\n\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 image</Trans>\n </p>\n <p className=\"text-theme-highest\">{errorMessage}</p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Images</Trans>\n </Button>\n </Stack>\n )\n }\n\n // Handle no data state\n if (!image) {\n return (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\" direction=\"vertical\" gap=\"5\">\n <p className=\"text-theme-highest\">\n <Trans>Image not found</Trans>\n </p>\n <Button onClick={handleBack} variant=\"primary\">\n <Trans>Back to Images</Trans>\n </Button>\n </Stack>\n )\n }\n\n const isDeactivated = image.status === IMAGE_STATUSES.DEACTIVATED\n const isPrivate = image.visibility === IMAGE_VISIBILITY.PRIVATE\n const hasMoreActions = !isSharedWithMe && (permissions.canUpdate || (permissions.canDelete && !image.protected))\n\n const headerActions =\n !isSharedWithMe && (hasMoreActions || permissions.canUpdate) ? (\n <ButtonRow>\n {hasMoreActions && (\n <PopupMenu>\n <PopupMenuToggle as=\"div\">\n <Button icon=\"moreVert\" disabled={isLoading}>\n <Trans>More Actions</Trans>\n </Button>\n </PopupMenuToggle>\n <PopupMenuOptions>\n {permissions.canUpdate && (\n <PopupMenuItem\n label={isDeactivated ? t`Activate` : t`Deactivate`}\n onClick={() => (isDeactivated ? setActivateModalOpen(true) : setDeactivateModalOpen(true))}\n />\n )}\n {permissions.canUpdate && isPrivate && (\n <PopupMenuItem label={t`Set to \"Shared\"`} onClick={() => handleUpdateVisibility(\"shared\")} />\n )}\n {permissions.canDelete && !image.protected && (\n <PopupMenuItem label={t`Delete`} onClick={() => setDeleteModalOpen(true)} />\n )}\n </PopupMenuOptions>\n </PopupMenu>\n )}\n {permissions.canUpdate && (\n <Button onClick={() => setEditMetadataModalOpen(true)} disabled={isLoading}>\n <Trans>Edit Metadata</Trans>\n </Button>\n )}\n {permissions.canUpdate && (\n <Button onClick={() => setEditDetailsModalOpen(true)} variant=\"primary\" disabled={isLoading}>\n <Trans>Edit Details</Trans>\n </Button>\n )}\n </ButtonRow>\n ) : undefined\n\n // Render success state\n return (\n <>\n <ContentHeader title={String(image.name ?? image.id)} projectId={projectId} actions={headerActions} />\n <ImageDetailsView\n key={image.id}\n image={image}\n currentProjectId={projectId}\n activeTab={tab ?? \"details\"}\n onTabChange={(newTab) =>\n navigate({\n search: { tab: newTab === \"details\" ? undefined : newTab } as unknown as true,\n })\n }\n permissions={{\n canCreateMember: permissions.canCreateMember,\n canDeleteMember: permissions.canDeleteMember,\n canUpdateMember: permissions.canUpdateMember,\n }}\n myMemberData={myMemberData}\n onMemberStatusChange={handleMemberStatusChange}\n isMemberStatusChanging={updateMemberMutation.isPending}\n />\n\n {toastData && <Toast {...toastData} />}\n\n {editDetailsModalOpen && (\n <EditImageDetailsModal\n image={image}\n isOpen={editDetailsModalOpen}\n isLoading={updateImageMutation.isPending}\n onClose={() => setEditDetailsModalOpen(false)}\n onSave={handleSaveEdit}\n />\n )}\n\n {editMetadataModalOpen && (\n <EditImageMetadataModal\n image={image}\n isOpen={editMetadataModalOpen}\n isLoading={updateImageMutation.isPending}\n onClose={() => setEditMetadataModalOpen(false)}\n onSave={handleSaveEdit}\n />\n )}\n\n {deleteModalOpen && (\n <DeleteImageModal\n image={image}\n isOpen={deleteModalOpen}\n isLoading={deleteImageMutation.isPending}\n isDisabled={!!image.protected}\n onClose={() => setDeleteModalOpen(false)}\n onDelete={handleDelete}\n />\n )}\n\n {activateModalOpen && (\n <ActivateImageModal\n image={image}\n isOpen={activateModalOpen}\n isLoading={reactivateImageMutation.isPending}\n onClose={() => setActivateModalOpen(false)}\n onActivate={handleActivate}\n />\n )}\n\n {deactivateModalOpen && (\n <DeactivateImageModal\n image={image}\n isOpen={deactivateModalOpen}\n isLoading={deactivateImageMutation.isPending}\n onClose={() => setDeactivateModalOpen(false)}\n onDeactivate={handleDeactivate}\n />\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;;AAoCA,IAAMgB,KAMA,EAAEC,UAAOC,iBAAcC,oBAAiBC,mBAAgBC,mBAAW;CACvE,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EACRC,IAAYL,EAAaM,WAAWV,EAAgBW,SACpDC,IAAaR,EAAaM,WAAWV,EAAgBa,UACrDC,IAAaV,EAAaM,WAAWV,EAAgBe,UAErDC,IAAWZ,EAAaa,aAAa,IAAIC,KAAKd,EAAaa,WAAU,CAAEE,gBAAc,GAAKC,EAAAA,EAAC,EAAA,IAAA,UAAI,CAAA,EAC/FC,IAAYjB,EAAakB,aAAa,IAAIJ,KAAKd,EAAakB,WAAU,CAAEH,gBAAc,GAAKC,EAAAA,EAAC,EAAA,IAAA,UAAI,CAAA,EAChGG,IAAepB,EAAMqB,SAAS;AAEpC,QACE,kBAAC7B,GAAAA,EAAAA,UAAAA;EACEc,KACC,kBAACgB,KAAAA;GAAEC,WAAU;aACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;EAGJ,kBAACD,KAAAA,EAAAA,UACC,kBAAA,GAAA;;;IACqEF;IAAyBP;;sCAAzDW,QAAAA,EAAKD,WAAU,iBAAA,CAAA,EAAA;;EAGtD,kBAACE,MAAAA,EAAAA,UAAAA;GACC,kBAACC,MAAAA,EAAAA,UAAAA;IACC,kBAACF,QAAAA;KAAKD,WAAU;eACd,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IACM;IACPtB,EAAaM;;GAEhB,kBAACmB,MAAAA,EAAAA,UAAAA;IACC,kBAACF,QAAAA;KAAKD,WAAU;eACd,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IACM;IACPV;;GAEH,kBAACa,MAAAA,EAAAA,UAAAA;IACC,kBAACF,QAAAA;KAAKD,WAAU;eACd,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IACM;IACPL;;;EAIJhB,KACC,kBAACR,GAAAA,EAAAA,UAAAA;GACEY,KACC,kBAACb,GAAAA;IAAOkC,eAAexB,EAAeN,EAAgBa,SAAQ;IAAGkB,UAAUxB;IAAWyB,SAAQ;cAC5F,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAGFvB,KAAaG,MACb,kBAAChB,GAAAA;IAAOkC,eAAexB,EAAeN,EAAgBe,SAAQ;IAAGgB,UAAUxB;IAAWyB,SAAQ;cAC5F,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;GAGHlB,KACC,kBAAClB,GAAAA;IACCkC,eAAexB,EAAeN,EAAgBa,SAAQ;IACtDkB,UAAUxB;IACVyB,SAAQ;cAER,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;;GASDC,KAAsD,EAAE9B,eAAO;CAC1E,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQK,GAAAA;AAEd,QACE,kBAACjB,GAAAA;EAAU2C,IAAI;EAAOC,IAAE;aACtB,kBAAC3C,GAAAA,EAAAA,UAAgB4B,EAAAA,EAAC,EAAA,IAAA,UAAmB,CAAA,EAAA,CAAA,EACrC,kBAAChC,GAAAA;GAAgBgD,YAAW;;IAC1B,kBAAC/C,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAG,CAAA,EAAA,CAAA;IACtB,kBAAC9B,GAAAA,EAAAA,UAAuBa,EAAMkC,IAAAA,CAAAA;IAE9B,kBAAChD,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAK,CAAA,EAAA,CAAA;IACxB,kBAAC9B,GAAAA,EAAAA,UAAuBa,EAAMmC,MAAAA,CAAAA;IAE9B,kBAACjD,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAO,CAAA,EAAA,CAAA;IAC1B,kBAAC9B,GAAAA,EAAAA,UAAuBa,EAAMO,QAAAA,CAAAA;IAE9B,kBAACrB,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAK,CAAA,EAAA,CAAA;IACxB,kBAAC9B,GAAAA,EAAAA,UACC,kBAACQ,GAAAA,EAAYyC,MAAMpC,EAAMoC,MAAAA,CAAAA,EAAAA,CAAAA;IAG3B,kBAAClD,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA,EAAA,CAAA;IAC7B,kBAAC9B,GAAAA,EAAAA,UAAAA,CAAuBa,EAAMqC,UAAS,MAAA,EAAA,CAAA;IAEvC,kBAACnD,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAS,CAAA,EAAA,CAAA;IAC5B,kBAAC9B,GAAAA,EAAAA,UAAAA,CAAuBa,EAAMsC,SAAQ,MAAA,EAAA,CAAA;IAEtC,kBAACpD,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAY,CAAA,EAAA,CAAA;IAC/B,kBAAC9B,GAAAA,EAAAA,UACC,kBAACqC,QAAAA;KAAKD,WAAU;eAAavB,EAAMuC;;IAGrC,kBAACrD,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAiB,CAAA,EAAA,CAAA;IACpC,kBAAC9B,GAAAA,EAAAA,UACC,kBAACqC,QAAAA;KAAKD,WAAU;eAAavB,EAAMwC;;IAGrC,kBAACtD,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA,EAAA,CAAA;IAC9B,kBAAC9B,GAAAA,EAAAA,UACEa,EAAMc,aAAa,IAAIC,KAAKf,EAAMc,WAAU,CAAE2B,oBAAkB,GAAKxB,EAAAA,EAAC,EAAA,IAAA,UAAI,CAAA,EAAA,CAAA;IAG7E,kBAAC/B,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA,EAAA,CAAA;IAC9B,kBAAC9B,GAAAA,EAAAA,UACEa,EAAMmB,aAAa,IAAIJ,KAAKf,EAAMmB,WAAU,CAAEsB,oBAAkB,GAAKxB,EAAAA,EAAC,EAAA,IAAA,UAAI,CAAA,EAAA,CAAA;;;;GAOxEyB,KAAgF,EAC3F1C,UACA2C,0BACD;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQtC,GAAAA,EAERuC,IAAiB5C,EAAM6C,eAAe,YAAY7C,EAAMqB,UAAUyB,KAAAA,KAAa9C,EAAMqB,UAAUsB;AAErG,QACE,kBAACvD,GAAAA;EAAU2C,IAAI;EAAOC,IAAE;aACtB,kBAAC3C,GAAAA,EAAAA,UAAgB4B,EAAAA,EAAC,EAAA,IAAA,UAAS,CAAA,EAAA,CAAA,EAC3B,kBAAChC,GAAAA;GAAgBgD,YAAW;;IAC1B,kBAAC/C,GAAAA,EAAAA,UAAiB0D,IAAiB3B,EAAAA,EAAC,EAAA,IAAA,UAAkB,CAAA,GAAIA,EAAAA,EAAC,EAAA,IAAA,UAAiB,CAAA,EAAA,CAAA;IAC5E,kBAAC9B,GAAAA,EAAAA,UAAuBa,EAAMqB,OAAAA,CAAAA;IAE9B,kBAACnC,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAW,CAAA,EAAA,CAAA;IAC9B,kBAAC9B,GAAAA,EAAAA,UAAuBa,EAAM6C,YAAAA,CAAAA;IAE9B,kBAAC3D,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA,EAAA,CAAA;IAC7B,kBAAC9B,GAAAA,EAAAA,UAAuBa,EAAM+C,YAAY9B,EAAAA,EAAC,EAAA,IAAA,UAAI,CAAA,GAAIA,EAAAA,EAAC,EAAA,IAAA,UAAG,CAAA,EAAA,CAAA;IAEvD,kBAAC/B,GAAAA,EAAAA,UAAiB+B,EAAAA,EAAC,EAAA,IAAA,UAAS,CAAA,EAAA,CAAA;IAC5B,kBAAC9B,GAAAA,EAAAA,UAAuBa,GAAOgD,WAAWhD,EAAMgD,WAAW,IAAA,CAAA;;;;GAMtDC,KAA6D,EAAEjD,eAAO;CACjF,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQK,GAAAA,EAER6C,IAAc,IAAIC,IAAI;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAA,EAEKC,IAAmBC,OAAOC,QAAQtD,EAAAA,CACrCuD,QAAQ,CAACC,OAAS,CAACN,EAAYO,IAAID,EAAAA,CAAAA,CACnCE,MAAM,CAACC,IAAI,CAACC,OAAOD,EAAEE,cAAcD,EAAAA,CAAAA,EAEhCE,IAAgBV,EAAiBW,SAAS;AAEhD,QACE,kBAAC3E,GAAAA;EAAU2C,IAAI;EAAOC,IAAE;aACtB,kBAAC3C,GAAAA,EAAAA,UAAgB4B,EAAAA,EAAC,EAAA,IAAA,UAA6B,CAAA,EAAA,CAAA,EAC9C6C,IACC,kBAAC7E,GAAAA;GAAgBgD,YAAW;GAAQV,WAAU;aAC3C6B,EAAiBY,KAAK,CAACR,GAAKS,OAC3B,kBAAClF,EAAMmF,UAAQ,EAAA,UAAA,CACb,kBAAChF,GAAAA;IAAgBqC,WAAU;cAAciC;OACzC,kBAACrE,GAAAA;IAAsBoC,WAAU;cAC9B0C,KAAU,OACT,kBAACzC,QAAAA,EAAAA,UAAK,QAAA,CAAA,GACJ,OAAOyC,KAAU,WACnB,kBAACzC,QAAAA;KAAKD,WAAU;eAAa4C,KAAKC,UAAUH,EAAAA;SAC1C,OAAOA,KAAU,YACnBA,IACEhD,EAAAA,EAAC,EAAA,IAAA,UAAK,CAAA,GAENA,EAAAA,EAAC,EAAA,IAAA,UAAM,CAAA,GAGT,kBAACO,QAAAA;KAAKD,WAAU;eAAa8C,OAAOJ,EAAAA;;UAdrBT,EAAAA,CAAAA;OAqBzB,kBAAClC,KAAAA;GAAEC,WAAU;aAAoBN,EAAAA,EAAC,EAAA,IAAA,UAA6B,CAAA;;;GAMjEqD,KAAmBC,MAAAA;CACvB,IAAMC,IAAO;AACb,QAAOD,IACH,GAAGC,EAAK,2CACR,GAAGA,EAAK;GAGRC,KAAsD,EAAEzE,UAAO0E,gBAAa/B,0BAAkB;CAClG,IAAM,CAACgC,GAAgBC,KAAqB5F,EAAS,GAAA,EAC/C,CAAC6F,GAASC,KAAc9F,EAA0D,KAAA,EAElF,EAAE+F,MAAMC,GAAc5E,WAAW6E,MAAqBrF,EAAUsF,QAAQC,iBAAiBC,SAC7F;EAAEC,YAAY1C;EAAmB2C,SAAStF,EAAMkC;EAAG,EACnD,EAAEqD,SAAS,CAAC,CAACvF,EAAMkC,MAAM,CAAC,CAACS,GAAiB,CAAA;AAG9C,QACE,kBAACvD,GAAAA;EAAU2C,IAAI;EAAOC,IAAE;aACrB6C,KACC,kBAACtF,GAAAA;GAAQiG,MAAMX,EAAQW;GAAM3D,SAASgD,EAAQY;GAAMC,iBAAiBZ,EAAW,KAAA;GAAOvD,WAAU;MAEnG,kBAACzB,GAAAA;GACQE;GACOgF;GACIC;GAClBU,QAAQjB,GAAakB,mBAAmB;GACxCC,WAAWnB,GAAaoB,mBAAmB;GAC3BnB;GACGC;GACPE;GACZiB,WAAWpD;;;GAMNqD,MAAqD,EAChEhG,UACA2C,qBACAsD,eAAY,WACZC,gBACAxB,gBACAzE,iBACAkG,yBACAC,2BACAC,iBACD;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQhG,GAAAA,EAERuC,IAAiB5C,EAAM6C,eAAe,YAAY7C,EAAMqB,UAAUyB,KAAAA,KAAa9C,EAAMqB,UAAUsB,GAE/F4D,IADevG,EAAMqB,UAAUsB,KACJ3C,EAAM6C,eAAe;AAEtD,QACE,kBAACvD,GAAAA;EAAMkH,WAAU;EAAWC,KAAI;;GAC7B7D,KAAkB3C,KAAgBkG,KACjC,kBAACpG,GAAAA;IACQC;IACOC;IACdC,iBAAiBwE,GAAaxE,mBAAmB;IACjDC,gBAAgBgG;IAChB/F,WAAWgG,KAA0B;;GAIxCG,KACC,kBAACG,OAAAA;IAAInF,WAAU;cACb,kBAACjC,GAAAA;KAAMkH,WAAU;KAAaC,KAAI;gBAChC,kBAACE,UAAAA;MAAOpF,WAAW+C,EAAgB2B,MAAc,UAAA;MAAYtE,eAAeuE,IAAc,UAAA;gBACvFjF,EAAAA,EAAC,EAAA,IAAA,UAAQ,CAAA;SAEZ,kBAAC0F,UAAAA;MAAOpF,WAAW+C,EAAgB2B,MAAc,UAAA;MAAYtE,eAAeuE,IAAc,UAAA;gBACvFjF,EAAAA,EAAC,EAAA,IAAA,UAAgB,CAAA;;;;IAMxBgF,MAAc,aAAa,CAACM,MAC5B,kBAAA,GAAA,EAAA,UAAA;IACGF;IACD,kBAACvE,GAAAA,EAAwB9B,UAAAA,CAAAA;IACzB,kBAAC0C,GAAAA;KAAuB1C;KAAyB2C;;IACjD,kBAACM,GAAAA,EAA+BjD,UAAAA,CAAAA;;GAInCiG,MAAc,aAAaM,KAAY,kBAAC9B,GAAAA;IAAyBzE;IAAoB0E;;;;;;;AC9Q5F,SAASmE,IAAAA;CACP,IAAM,EAAEC,cAAWC,eAAYxB,GAAU,EACvCyB,MAAM,sDACR,CAAA,EACM,EAAEC,WAAQzB,GAAU,EACxBwB,MAAM,sDACR,CAAA,EAEM,EAAEE,oBAAiBN,GAAMO,iBAAe,EACxCC,IAAW9B,IAAAA,EACX,EAAA,MAAA,GAAA,GAAA,MAAQI,GAAAA,EAER,EACJ4B,MAAMC,GACNC,WACAC,aACE9B,EAAU+B,QAAQC,aAAaC,SAAS;EAAEC,YAAYf;EAAoBC;EAAQ,CAAA,EAEhF,EAAEO,MAAMQ,MAAoBnC,EAAU+B,QAAQK,QAAQH,SAAS;EACnEC,YAAYf;EACZkB,YAAY;GACV;GACA;GACA;GACA;GACA;GAAsB;EAE1B,CAAA,EAEMC,IAAc;EAClBC,WAAWJ,IAAkB,MAAM;EACnCK,WAAWL,IAAkB,MAAM;EACnCM,iBAAiBN,IAAkB,MAAM;EACzCO,iBAAiBP,IAAkB,MAAM;EACzCQ,iBAAiBR,IAAkB,MAAM;EAC3C,EAEMS,IAAQ5C,EAAU6C,UAAQ,EAE1B,CAACC,GAAsBC,KAA2BhC,EAAS,GAAA,EAC3D,CAACiC,GAAuBC,KAA4BlC,EAAS,GAAA,EAC7D,CAACmC,GAAiBC,KAAsBpC,EAAS,GAAA,EACjD,CAACqC,GAAmBC,KAAwBtC,EAAS,GAAA,EACrD,CAACuC,GAAqBC,KAA0BxC,EAAS,GAAA,EACzD,CAACyC,GAAWC,KAAgB1C,EAA4B,KAAA,EAExD2C,IAAsB1D,EAAU+B,QAAQ4B,YAAYC,YAAY,EACpEC,YAAYC,MAAAA;AAEVlB,EADAA,EAAMb,QAAQC,aAAa+B,QAAQ;GAAE7B,YAAYf;GAAWC;GAAQ,EAAG0C,EAAAA,EACvElB,EAAMb,QAAQiC,yBAAyBC,YAAU;IAErD,CAAA,EAEMC,IAAsBlE,EAAU+B,QAAQoC,YAAYP,YAAY,EACpEC,iBAAWA;AACTjB,IAAMb,QAAQiC,yBAAyBC,YAAU;IAErD,CAAA,EAEMG,IAA0BpE,EAAU+B,QAAQsC,gBAAgBT,YAAY,EAC5EC,iBAAWA;AACTjB,IAAMb,QAAQC,aAAaiC,WAAW;GAAE/B,YAAYf;GAAWC;GAAQ,CAAA;IAE3E,CAAA,EAEMkD,IAA0BtE,EAAU+B,QAAQwC,gBAAgBX,YAAY,EAC5EC,iBAAWA;AACTjB,IAAMb,QAAQC,aAAaiC,WAAW;GAAE/B,YAAYf;GAAWC;GAAQ,CAAA;IAE3E,CAAA,EAEMoD,IAAgCxE,EAAU+B,QAAQ0C,sBAAsBb,YAAY,EACxFC,YAAYC,MAAAA;AACVlB,IAAMb,QAAQC,aAAa+B,QAAQ;GAAE7B,YAAYf;GAAWC;GAAQ,EAAG0C,EAAAA;IAE3E,CAAA,EAEMY,IACJ9C,GAAO+C,eAAenE,EAAiBoE,UAAUhD,GAAOiD,UAAUC,KAAAA,KAAalD,GAAOiD,UAAU1D,GAE5F,EAAEQ,MAAMoD,OAAiB/E,EAAU+B,QAAQiD,eAAe/C,SAC9D;EAAEC,YAAYf;EAAoBC;EAAS6D,UAAU9D;EAAU,EAC/D,EAAE+D,SAASR,KAAkB,CAAC,CAACtD,KAAW,CAAC,CAACD,GAAU,CAAA,EAGlDgE,IAAuBnF,EAAU+B,QAAQqD,kBAAkBxB,YAAY,EAC3EC,iBAAWA;AAITjB,EAHAA,EAAMb,QAAQiD,eAAef,WAAW;GAAE/B,YAAYf;GAAoBC;GAAS6D,UAAU9D;GAAU,CAAA,EACvGyB,EAAMb,QAAQsD,iBAAiBpB,WAAW;GAAE/B,YAAYf;GAAoBC;GAAQ,CAAA,EACpFwB,EAAMb,QAAQiC,yBAAyBC,YAAU,EACjDrB,EAAMb,QAAQuD,+BAA+BrB,YAAU;IAE3D,CAAA,EAEMsB,KAA2B,OAAOC,MAAAA;AACtC,MAAI;AAEF/B,GADA,MAAM0B,EAAqBM,YAAY;IAAEvD,YAAYf;IAAWC;IAAS6D,UAAU9D;IAAWU,QAAQ2D;IAAU,CAAA,EAChH/B,EAAa5C,GAAiC2E,GAAW,EAAEE,iBAAiBjC,EAAa,KAAA,EAAM,CAAA,CAAA;WACxF3B,GAAO;GACd,IAAM6D,IAAgB7D,GAAkD8D;AACxEnC,KAAa3C,GAA+B6E,GAAc,EAAED,iBAAiBjC,EAAa,KAAA,EAAM,CAAA,CAAA;;;AAKpG,CAAI7B,GAAOiE,QAAQ,OAAOjE,EAAMiE,QAAS,WACvCtE,EAAaK,EAAMiE,KAAI,GACdjE,GAAOkE,KAChBvE,EAAaK,EAAMkE,GAAE,GAErBvE,EADSM,MAAW,UACPH,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,GACLG,MAAW,YACPH,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,GAEDA,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,CAAA;CAGhB,IAAMqE,UAAaA;AACjBtE,IAAS;GACPuE,IAAI;GACJC,QAAQ,EAAE9E,cAAU;GACtB,CAAA;IAGI+E,IACJxC,EAAoByC,aACpBjC,EAAoBiC,aACpB/B,EAAwB+B,aACxB7B,EAAwB6B,aACxB3B,EAA8B2B,WAE1BC,MACJC,GACAE,MAAAA;EAEA,IAAMK,IAAyF,EAAE;AAUjG,SATAC,OAAOC,QAAQT,EAAAA,CAAmBU,SAAS,CAACC,GAAKL,OAAM;GACrD,IAAMD,IAAO,IAAIM;AACjB,OAAIL,KAAU,MACRK,KAAOT,KAAeK,EAAWK,KAAK;IAAER,IAAI;IAAUC;IAAK,CAAA;QAC1D;IACL,IAAMQ,IAAiBF,KAAOT;AAC9BK,MAAWK,KAAK;KAAER,IAAIS,IAAiB,YAAY;KAAOR;KAAMC;KAAM,CAAA;;IAE1E,EACOC;IAGHO,IAAiB,OAAOd,MAAAA;AAC5B,MAAI,CAACzE,EAAO,QAAO;EACnB,IAAMgF,IAAaR,GAA6BC,GAAmBzE,EAAAA;AACnE,MAAI;AAGF,UAFA,MAAM8B,EAAoB+B,YAAY;IAAEvD,YAAYf;IAAWC;IAASwF;IAAW,CAAA,EACnF7D,EAAwB,GAAA,EACjB;UACD;AACN,UAAO;;IAILsE,KAAe,OAAOC,MAAAA;AAC1B,MAAI;AAGFvB,GAFA,MAAM7B,EAAoBuB,YAAY;IAAEvD,YAAYf;IAAWC,SAASkG,EAAaxB;IAAG,CAAA,EACxF3C,EAAmB,GAAA,EACnB4C,GAAAA;UACM;AACN5C,KAAmB,GAAA;;IAIjBoE,KAAiB,OAAOC,MAAAA;AAC5B,MAAI;AAEFnE,GADA,MAAMiB,EAAwBmB,YAAY;IAAEvD,YAAYf;IAAWC,SAASoG,EAAI1B;IAAG,CAAA,EACnFzC,EAAqB,GAAA;UACf;AACNA,KAAqB,GAAA;;IAInBoE,KAAmB,OAAOD,MAAAA;AAC9B,MAAI;AAEFjE,GADA,MAAMa,EAAwBqB,YAAY;IAAEvD,YAAYf;IAAWC,SAASoG,EAAI1B;IAAG,CAAA,EACnFvC,EAAuB,GAAA;UACjB;AACNA,KAAuB,GAAA;;IAIrBmE,KAAyB,OAAOC,MAAAA;AAC/B/F,QACL,KAAI;AACF,SAAM4C,EAA8BiB,YAAY;IAC9CvD,YAAYf;IACZC,SAASQ,EAAMkE;IACfnB,YAAYgD;IACd,CAAA;UACM;;AAMV,KAAI9F,MAAW,UACb,QACE,kBAAC,GAAA;EAAM,WAAU;EAAgB,cAAa;EAAS,WAAU;EAAS,WAAU;aAClF,kBAAC,GAAA;GAAQ,SAAQ;GAAU,MAAK;GAAQ,WAAU;MAClD,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,CAAA;;AAMN,KAAIA,MAAW,SAAS;EACtB,IAAM8D,IAAe7D,GAAO8D,WAAW;AAEvC,SACE,kBAAC,GAAA;GAAM,WAAU;GAAgB,cAAa;GAAS,WAAU;GAAS,WAAU;GAAW,KAAI;;IACjG,kBAAC,KAAA;KAAE,WAAU;eACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;IAEF,kBAAC,KAAA;KAAE,WAAU;eAAsBD;;IACnC,kBAAC,GAAA;KAAO,SAASI;KAAY,SAAQ;eACnC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;;;AAOR,KAAI,CAACnE,EACH,QACE,kBAAC,GAAA;EAAM,WAAU;EAAgB,cAAa;EAAS,WAAU;EAAS,WAAU;EAAW,KAAI;aACjG,kBAAC,KAAA;GAAE,WAAU;aACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;MAEF,kBAAC,GAAA;GAAO,SAASmE;GAAY,SAAQ;aACnC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;CAMR,IAAM6B,IAAgBhG,EAAMC,WAAWtB,GAAesH,aAChDC,KAAYlG,EAAM+C,eAAenE,EAAiBuH,SAClDC,IAAiB,CAACtD,MAAmBpC,EAAYE,aAAcF,EAAYC,aAAa,CAACX,EAAMqG,YAE/FC,KACJ,CAACxD,MAAmBsD,KAAkB1F,EAAYE,aAChD,kBAAC,GAAA,EAAA,UAAA;EACEwF,KACC,kBAAC,GAAA,EAAA,UAAA,CACC,kBAAC,GAAA;GAAgB,IAAG;aAClB,kBAAC,GAAA;IAAO,MAAK;IAAW,UAAU9B;cAChC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;MAGJ,kBAAC,GAAA,EAAA,UAAA;GACE5D,EAAYE,aACX,kBAAC,GAAA;IACC,OAAOoF,IAAgBlG,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,GAAaA,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA;IACtC,eAAgBkG,IAAgBvE,EAAqB,GAAA,GAAQE,EAAuB,GAAA;;GAGvFjB,EAAYE,aAAasF,MACxB,kBAAC,GAAA;IAAc,OAAOpG,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA;IAAmB,eAAegG,GAAuB,SAAA;;GAEjFpF,EAAYC,aAAa,CAACX,EAAMqG,aAC/B,kBAAC,GAAA;IAAc,OAAOvG,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA;IAAU,eAAeyB,EAAmB,GAAA;;;EAK1Eb,EAAYE,aACX,kBAAC,GAAA;GAAO,eAAeS,EAAyB,GAAA;GAAO,UAAUiD;aAC/D,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;EAGH5D,EAAYE,aACX,kBAAC,GAAA;GAAO,eAAeO,EAAwB,GAAA;GAAO,SAAQ;GAAU,UAAUmD;aAChF,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;QAIJpB,KAAAA;AAGN,QACE,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,IAAA;GAAc,OAAOqD,OAAOvG,EAAMiE,QAAQjE,EAAMkE,GAAE;GAAc3E;GAAW,SAAS+G;;EACrF,kBAAC,IAAA;GAEQtG;GACP,kBAAkBT;GAClB,WAAWG,KAAO;GAClB,cAAc8G,MACZ3G,EAAS,EACP4G,QAAQ,EAAE/G,KAAK8G,MAAW,YAAYtD,KAAAA,IAAYsD,GAAO,EAC3D,CAAA;GAEF,aAAa;IACX3F,iBAAiBH,EAAYG;IAC7BC,iBAAiBJ,EAAYI;IAC7BC,iBAAiBL,EAAYK;IAC/B;GACcoC;GACd,sBAAsBQ;GACtB,wBAAwBJ,EAAqBgB;KAhBxCvE,EAAMkE,GAAE;EAmBdtC,KAAa,kBAAC,GAAA,EAAM,GAAIA,GAAAA,CAAAA;EAExBV,KACC,kBAAC,IAAA;GACQlB;GACP,QAAQkB;GACR,WAAWY,EAAoByC;GAC/B,eAAepD,EAAwB,GAAA;GACvC,QAAQoE;;EAIXnE,KACC,kBAAC,IAAA;GACQpB;GACP,QAAQoB;GACR,WAAWU,EAAoByC;GAC/B,eAAelD,EAAyB,GAAA;GACxC,QAAQkE;;EAIXjE,KACC,kBAAC,IAAA;GACQtB;GACP,QAAQsB;GACR,WAAWgB,EAAoBiC;GAC/B,YAAY,CAAC,CAACvE,EAAMqG;GACpB,eAAe9E,EAAmB,GAAA;GAClC,UAAUkE;;EAIbjE,KACC,kBAAC,IAAA;GACQxB;GACP,QAAQwB;GACR,WAAWkB,EAAwB6B;GACnC,eAAe9C,EAAqB,GAAA;GACpC,YAAYkE;;EAIfjE,KACC,kBAAC,IAAA;GACQ1B;GACP,QAAQ0B;GACR,WAAWc,EAAwB+B;GACnC,eAAe5C,EAAuB,GAAA;GACtC,cAAckE"}
@@ -0,0 +1,242 @@
1
+ import { A as e, G as t, I as n, K as r, L as i, N as a, P as o, W as s, g as c, it as l, k as u, n as d, q as f, rt as p, w as m } from "./build-eu9eg0zF.mjs";
2
+ import { r as h } from "./trpcClient-BxguzNYF.mjs";
3
+ import { t as g } from "./_pcaId-DBgz5V_9.mjs";
4
+ import { i as _, s as v } from "./md-CI9FmfYv.mjs";
5
+ import { t as y } from "./useModal-Dg4CBeqL.mjs";
6
+ import { t as b } from "./useProjectId-BWaeJZOy.mjs";
7
+ import "./hooks-s-I8vWww.mjs";
8
+ import { r as x, t as S } from "./constants-ByHCdNsI.mjs";
9
+ import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
10
+ import { Fragment as E } from "react";
11
+ import { useNavigate as D } from "@tanstack/react-router";
12
+ import { Trans as O, useLingui as k } from "@lingui/react";
13
+ //#region src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/-table/PcaCertificatesTableRow.tsx
14
+ var A = ({ certificate: e }) => {
15
+ let { i18n: t, _: i } = k(), o = D();
16
+ return /* @__PURE__ */ T(n, {
17
+ "data-testid": `pca-certificate-row-${e.id}`,
18
+ onClick: () => o({
19
+ from: "/projects/$projectId/services/pca/$pcaId/",
20
+ to: "$certificateId",
21
+ params: (t) => ({
22
+ ...t,
23
+ certificateId: e.id
24
+ })
25
+ }),
26
+ children: [
27
+ /* @__PURE__ */ w(a, { children: e.certificate_authority_id }),
28
+ /* @__PURE__ */ w(a, { children: e.id }),
29
+ /* @__PURE__ */ w(a, {
30
+ onClick: (e) => e.stopPropagation(),
31
+ className: "items-end pr-0",
32
+ children: /* @__PURE__ */ w(d, { children: /* @__PURE__ */ w(p, { children: /* @__PURE__ */ w(r, {
33
+ label: t._({ id: "WIx31g" }),
34
+ disabled: !0
35
+ }) }) })
36
+ })
37
+ ]
38
+ }, e.id);
39
+ }, j = ({ pcaId: e }) => {
40
+ let { i18n: t, _: r } = k(), i = b(), o = () => [
41
+ t._({ id: "c1OE1x" }),
42
+ t._({ id: "S0kLOH" }),
43
+ ""
44
+ ], { data: d = [], isLoading: p, isError: g, error: _ } = h.services.pca.listCertificates.useQuery({
45
+ project_id: i,
46
+ certificate_authority_id: e
47
+ });
48
+ return p ? /* @__PURE__ */ T(f, {
49
+ className: "py-8",
50
+ distribution: "center",
51
+ alignment: "center",
52
+ direction: "vertical",
53
+ children: [/* @__PURE__ */ w(s, {
54
+ variant: "primary",
55
+ size: "large",
56
+ className: "mb-2"
57
+ }), /* @__PURE__ */ w(O, { id: "T9o/az" })]
58
+ }) : g ? /* @__PURE__ */ w(f, {
59
+ className: "py-8",
60
+ distribution: "center",
61
+ alignment: "center",
62
+ direction: "vertical",
63
+ children: _?.message ?? t._({ id: "hz9da7" })
64
+ }) : d.length === 0 ? /* @__PURE__ */ w(u, {
65
+ columns: o().length,
66
+ className: "pca-certificates",
67
+ "data-testid": "no-pcas-certificates",
68
+ children: /* @__PURE__ */ w(n, { children: /* @__PURE__ */ T(a, {
69
+ colSpan: o().length,
70
+ children: [/* @__PURE__ */ w(m, { children: /* @__PURE__ */ w(O, { id: "kNeZrV" }) }), /* @__PURE__ */ w("p", { children: /* @__PURE__ */ w(O, { id: "7huC4O" }) })]
71
+ }) })
72
+ }) : /* @__PURE__ */ T("div", {
73
+ className: "relative",
74
+ children: [/* @__PURE__ */ w(c, {
75
+ variant: "primary",
76
+ label: t._({ id: "BMogtG" }),
77
+ disabled: !0
78
+ }), /* @__PURE__ */ T(u, {
79
+ columns: o().length,
80
+ children: [/* @__PURE__ */ w(n, { children: o().map((e) => /* @__PURE__ */ w(l, { children: e }, e)) }), d.map((e) => /* @__PURE__ */ w(A, { certificate: e }, e.id))]
81
+ })]
82
+ });
83
+ }, M = ({ pca: n }) => {
84
+ let { i18n: r, _: a } = k(), s = D(), l = b(), [u, d] = y(!1), p = () => s({
85
+ to: "/projects/$projectId/services/pca",
86
+ params: { projectId: l }
87
+ }), m = [
88
+ {
89
+ label: r._({ id: "c1OE1x" }),
90
+ value: n.id
91
+ },
92
+ {
93
+ label: r._({ id: "mSfwLL" }),
94
+ value: n.project_id
95
+ },
96
+ {
97
+ label: r._({ id: "UJmAAK" }),
98
+ value: n.configuration?.subject?.common_name
99
+ },
100
+ {
101
+ label: r._({ id: "UbWeJA" }),
102
+ value: n.certificate?.validity.not_before !== void 0 && n.certificate?.validity.not_after !== void 0 ? `${Math.round((n.certificate.validity.not_after - n.certificate.validity.not_before) / (3600 * 24))} days` : void 0
103
+ }
104
+ ];
105
+ return /* @__PURE__ */ T(C, { children: [
106
+ /* @__PURE__ */ T(f, {
107
+ direction: "vertical",
108
+ gap: "3",
109
+ children: [
110
+ /* @__PURE__ */ T(f, {
111
+ direction: "horizontal",
112
+ distribution: "between",
113
+ children: [/* @__PURE__ */ T(f, {
114
+ gap: "2",
115
+ alignment: "center",
116
+ children: [/* @__PURE__ */ w("div", {
117
+ className: "text-theme-default text-2xl font-semibold",
118
+ children: `${n.configuration?.subject?.common_name} Certificate Authority Details`
119
+ }), /* @__PURE__ */ T("div", {
120
+ className: "bg-aurora-blue-200 flex items-center gap-1 rounded-sm px-1 py-0.5",
121
+ children: [
122
+ S[n.state].icon,
123
+ " ",
124
+ S[n.state].text
125
+ ]
126
+ })]
127
+ }), /* @__PURE__ */ w(c, {
128
+ onClick: d,
129
+ children: /* @__PURE__ */ w(O, { id: "Blsc/x" })
130
+ })]
131
+ }),
132
+ /* @__PURE__ */ w("p", {
133
+ className: "text-theme-highest text-sm",
134
+ children: /* @__PURE__ */ w(O, { id: "dxMaZH" })
135
+ }),
136
+ /* @__PURE__ */ T(f, {
137
+ gap: "4",
138
+ className: "grid grid-cols-2 items-start",
139
+ children: [/* @__PURE__ */ w(e, {
140
+ alignTerms: "right",
141
+ className: "w-full",
142
+ children: m.map(({ label: e, value: t }) => /* @__PURE__ */ T(E, { children: [/* @__PURE__ */ w(o, { children: e }), /* @__PURE__ */ w(i, { children: t || "—" })] }, e))
143
+ }), /* @__PURE__ */ T("div", {
144
+ className: "bg-dt-background w-full rounded-sm",
145
+ children: [
146
+ /* @__PURE__ */ T("div", {
147
+ className: "text-theme-default p-4 text-xl font-bold",
148
+ children: ["Certificate ", `${n.configuration?.subject?.common_name}`]
149
+ }),
150
+ /* @__PURE__ */ w(t, {}),
151
+ /* @__PURE__ */ w("div", {
152
+ className: "p-4 text-sm break-all whitespace-pre-wrap",
153
+ children: n?.csr
154
+ }),
155
+ /* @__PURE__ */ w(t, {}),
156
+ /* @__PURE__ */ T(f, {
157
+ gap: "2",
158
+ distribution: "end",
159
+ className: "p-4",
160
+ children: [/* @__PURE__ */ w(c, { children: /* @__PURE__ */ w(v, {}) }), /* @__PURE__ */ w(c, { children: /* @__PURE__ */ w(_, {}) })]
161
+ })
162
+ ]
163
+ })]
164
+ })
165
+ ]
166
+ }),
167
+ u && /* @__PURE__ */ w(x, {
168
+ pca: n,
169
+ open: u,
170
+ onClose: d,
171
+ onSuccess: p
172
+ }),
173
+ /* @__PURE__ */ w(j, { pcaId: n.id })
174
+ ] });
175
+ };
176
+ //#endregion
177
+ //#region src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx?tsr-split=component
178
+ function N() {
179
+ let { i18n: e, _: t } = k(), n = D(), r = b(), { pcaId: i } = g.useParams(), { setPageTitle: a } = g.useRouteContext(), { isLoading: o, isError: l, error: u, data: d } = h.services.pca.getById.useQuery({
180
+ project_id: r,
181
+ certificate_authority_id: i
182
+ });
183
+ if (o) return a(e._({ id: "Z3FXyt" })), /* @__PURE__ */ T(f, {
184
+ className: "fixed inset-0",
185
+ distribution: "center",
186
+ alignment: "center",
187
+ direction: "vertical",
188
+ children: [/* @__PURE__ */ w(s, {
189
+ variant: "primary",
190
+ size: "large",
191
+ className: "mb-2"
192
+ }), /* @__PURE__ */ w(O, { id: "og1m+J" })]
193
+ });
194
+ let p = () => n({
195
+ to: "/projects/$projectId/services/pca",
196
+ params: { projectId: r }
197
+ });
198
+ if (l) {
199
+ let e = u?.message || "Unknown error";
200
+ return /* @__PURE__ */ T(f, {
201
+ className: "fixed inset-0",
202
+ distribution: "center",
203
+ alignment: "center",
204
+ direction: "vertical",
205
+ gap: "5",
206
+ children: [
207
+ /* @__PURE__ */ w("p", {
208
+ className: "text-theme-error font-semibold",
209
+ children: /* @__PURE__ */ w(O, { id: "IQSLN+" })
210
+ }),
211
+ /* @__PURE__ */ w("p", {
212
+ className: "text-theme-highest",
213
+ children: e
214
+ }),
215
+ /* @__PURE__ */ w(c, {
216
+ onClick: p,
217
+ variant: "primary",
218
+ children: /* @__PURE__ */ w(O, { id: "HG0uMz" })
219
+ })
220
+ ]
221
+ });
222
+ }
223
+ return d ? (a(d.configuration?.subject?.common_name || d.id), /* @__PURE__ */ w(M, { pca: d })) : /* @__PURE__ */ T(f, {
224
+ className: "fixed inset-0",
225
+ distribution: "center",
226
+ alignment: "center",
227
+ direction: "vertical",
228
+ gap: "5",
229
+ children: [/* @__PURE__ */ w("p", {
230
+ className: "text-theme-secondary",
231
+ children: /* @__PURE__ */ w(O, { id: "Io2Dvq" })
232
+ }), /* @__PURE__ */ w(c, {
233
+ onClick: p,
234
+ variant: "primary",
235
+ children: /* @__PURE__ */ w(O, { id: "HG0uMz" })
236
+ })]
237
+ });
238
+ }
239
+ //#endregion
240
+ export { N as component };
241
+
242
+ //# sourceMappingURL=_pcaId-C7Lrv1H_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_pcaId-C7Lrv1H_.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","PcaCertificatesTableRow","certificate","useLingui","navigate","navigateToCertificateDetailsPage","from","to","params","prev","certificateId","id","data-testid","onClick","certificate_authority_id","e","stopPropagation","className","label","t","disabled","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","trpcReact","useProjectId","PcaCertificatesTableRow","PcaCertificatesListContainer","pcaId","useLingui","projectId","columns","t","data","pcaCertificates","isLoading","isError","error","services","pca","listCertificates","useQuery","project_id","certificate_authority_id","className","distribution","alignment","direction","variant","size","message","length","data-testid","colSpan","p","div","label","disabled","map","certificate","id","Fragment","MdDownload","MdContentCopy","useNavigate","Button","DescriptionDefinition","DescriptionList","DescriptionTerm","Divider","Stack","useProjectId","useModal","DeletePcaModal","STATE_CONFIG","PcaCertificatesListContainer","PcaDetailsView","pca","useLingui","navigate","projectId","deletePcaModalOpen","toggleDeletePcaModal","navigateToPcaList","to","params","basicInfo","label","t","value","id","project_id","configuration","subject","common_name","certificate","validity","not_before","undefined","not_after","Math","round","direction","gap","distribution","alignment","div","className","state","icon","text","onClick","p","alignTerms","map","csr","open","onClose","onSuccess","pcaId","useNavigate","Trans","useLingui","Button","Spinner","Stack","trpcReact","useProjectId","PcaDetailsView","Route","RouteComponent","t","navigate","projectId","pcaId","useParams","setPageTitle","useRouteContext","isLoading","isError","error","data","pca","services","getById","useQuery","project_id","certificate_authority_id","handleBack","to","params","errorMessage","message","configuration","subject","common_name","id","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/PcaCertificatesListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/-components/PcaDetailsView.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Certificate } from \"@/server/Services/types/pca\"\n\ninterface PcaCertificatesTableRowProps {\n certificate: Certificate\n}\n\nexport const PcaCertificatesTableRow = ({ certificate }: PcaCertificatesTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n\n const navigateToCertificateDetailsPage = () =>\n navigate({\n from: \"/projects/$projectId/services/pca/$pcaId/\",\n to: \"$certificateId\",\n params: (prev) => ({ ...prev, certificateId: certificate.id }),\n })\n\n return (\n <DataGridRow\n key={certificate.id}\n data-testid={`pca-certificate-row-${certificate.id}`}\n onClick={navigateToCertificateDetailsPage}\n >\n <DataGridCell>{certificate.certificate_authority_id}</DataGridCell>\n <DataGridCell>{certificate.id}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n {/* I will enable this button on create-certificate task of the EPIC */}\n <PopupMenuItem label={t`Create Certificate`} disabled />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n} from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { PcaCertificatesTableRow } from \"./-table/PcaCertificatesTableRow\"\n\ninterface PcaCertificatesListContainerProps {\n pcaId: string\n}\n\nexport const PcaCertificatesListContainer = ({ pcaId }: PcaCertificatesListContainerProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n\n const columns = () =>\n [\n t`CA ID`,\n t`ID`,\n \"\", // empty column for item-action with context menu containing \"Delete CA\" button\n ] as const\n\n const {\n data: pcaCertificates = [],\n isLoading,\n isError,\n error,\n } = trpcReact.services.pca.listCertificates.useQuery({\n project_id: projectId,\n certificate_authority_id: pcaId,\n })\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading Certificates issued by Certificate Authority...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load Certificates issued by Certificate Authority.`}\n </Stack>\n )\n }\n\n if (pcaCertificates.length === 0) {\n return (\n <DataGrid columns={columns().length} className=\"pca-certificates\" data-testid=\"no-pcas-certificates\">\n <DataGridRow>\n <DataGridCell colSpan={columns().length}>\n <ContentHeading>\n <Trans>No Certificates issued by this Certificate Authority found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no Certificates available for this Certificate Authority.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <div className=\"relative\">\n {/* I will enable this button on issue-certificate task of the EPIC */}\n <Button variant=\"primary\" label={t`Issue End Entity Certificate`} disabled />\n <DataGrid columns={columns().length}>\n <DataGridRow>\n {columns().map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcaCertificates.map((certificate) => (\n <PcaCertificatesTableRow key={certificate.id} certificate={certificate} />\n ))}\n </DataGrid>\n </div>\n )\n}\n","import { Fragment } from \"react\"\nimport { MdDownload, MdContentCopy } from \"react-icons/md\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Button,\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Divider,\n Stack,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { DeletePcaModal } from \"../../-components/-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"../../-components/-table/constants\"\nimport { PcaCertificatesListContainer } from \"./PcaCertificatesListContainer\"\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 [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToPcaList = () =>\n navigate({\n to: \"/projects/$projectId/services/pca\",\n params: { projectId },\n })\n\n const basicInfo = [\n { label: t`CA ID`, value: pca.id },\n { label: t`Project ID`, value: pca.project_id },\n { label: t`Subject`, value: pca.configuration?.subject?.common_name },\n {\n label: t`Duration/validity`,\n value:\n pca.certificate?.validity.not_before !== undefined && pca.certificate?.validity.not_after !== undefined\n ? `${Math.round(\n (pca.certificate.validity.not_after - pca.certificate.validity.not_before) / (60 * 60 * 24)\n )} days`\n : undefined,\n },\n ] as const\n\n return (\n <>\n <Stack direction=\"vertical\" gap=\"3\">\n <Stack direction=\"horizontal\" distribution=\"between\">\n <Stack gap=\"2\" alignment=\"center\">\n <div className=\"text-theme-default text-2xl font-semibold\">\n {`${pca.configuration?.subject?.common_name} Certificate Authority Details`}\n </div>\n {/* temporary bg, I will resolve this as soon as I will have sync with designers */}\n <div className=\"bg-aurora-blue-200 flex items-center gap-1 rounded-sm px-1 py-0.5\">\n {STATE_CONFIG[pca.state].icon} {STATE_CONFIG[pca.state].text}\n </div>\n </Stack>\n <Button onClick={toggleDeletePcaModal}>\n <Trans>Delete Certificate Authority</Trans>\n </Button>\n </Stack>\n\n <p className=\"text-theme-highest text-sm\">\n <Trans>Manage your Private Certificate Authority infrastructure</Trans>\n </p>\n\n <Stack gap=\"4\" className=\"grid grid-cols-2 items-start\">\n <DescriptionList alignTerms=\"right\" className=\"w-full\">\n {basicInfo.map(({ label, value }) => (\n <Fragment key={label}>\n <DescriptionTerm>{label}</DescriptionTerm>\n <DescriptionDefinition>{value || \"—\"}</DescriptionDefinition>\n </Fragment>\n ))}\n </DescriptionList>\n\n <div className=\"bg-dt-background w-full rounded-sm\">\n <div className=\"text-theme-default p-4 text-xl font-bold\">\n Certificate {`${pca.configuration?.subject?.common_name}`}\n </div>\n <Divider />\n\n <div className=\"p-4 text-sm break-all whitespace-pre-wrap\">{pca?.csr}</div>\n\n {/* I will implement downloading-copying functionality at issue/import part of the epic as I need to clarify some stuff with design-clavis team */}\n <Divider />\n <Stack gap=\"2\" distribution=\"end\" className=\"p-4\">\n <Button>\n <MdDownload />\n </Button>\n <Button>\n <MdContentCopy />\n </Button>\n </Stack>\n </div>\n </Stack>\n </Stack>\n\n {deletePcaModalOpen && (\n <DeletePcaModal\n pca={pca}\n open={deletePcaModalOpen}\n onClose={toggleDeletePcaModal}\n onSuccess={navigateToPcaList}\n />\n )}\n\n <PcaCertificatesListContainer pcaId={pca.id} />\n </>\n )\n}\n","import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } 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: { section: \"services\", service: \"pca\", isDetail: true } satisfies RouteInfo,\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 { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n const { setPageTitle } = Route.useRouteContext()\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 setPageTitle(t`Loading...`)\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 setPageTitle(pca.configuration?.subject?.common_name || pca.id)\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { t as e } from "./helpers--JWXi40U.mjs";
2
+ import { createFileRoute as t, lazyRouteComponent as n, redirect as r } from "@tanstack/react-router";
3
+ var i = t("/_auth/projects/$projectId/services/pca/$pcaId/")({
4
+ staticData: {
5
+ section: "services",
6
+ service: "pca",
7
+ isDetail: !0
8
+ },
9
+ component: n(() => import("./_pcaId-C7Lrv1H_.mjs"), "component"),
10
+ beforeLoad: async ({ context: t, params: n }) => {
11
+ let { trpcClient: i } = t, a = e(await i?.auth.getAvailableServices.query() || []);
12
+ if (!(a.pca?.["clavis-beta"] || a.pca?.["clavis-dev"])) throw r({
13
+ to: "/projects/$projectId/services/pca",
14
+ params: { projectId: n.projectId }
15
+ });
16
+ }
17
+ });
18
+ //#endregion
19
+ export { i as t };
20
+
21
+ //# sourceMappingURL=_pcaId-DBgz5V_9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_pcaId-DBgz5V_9.mjs","names":["createFileRoute","redirect","getServiceIndex","Route","staticData","section","service","isDetail","RouteInfo","component","lazyRouteComponent","$$splitComponentImporter","beforeLoad","context","params","trpcClient","availableServices","auth","getAvailableServices","query","serviceIndex","pcaServices","to","projectId"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/$pcaId/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } 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: { section: \"services\", service: \"pca\", isDetail: true } satisfies RouteInfo,\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 { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const { pcaId } = Route.useParams()\n const { setPageTitle } = Route.useRouteContext()\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 setPageTitle(t`Loading...`)\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 setPageTitle(pca.configuration?.subject?.common_name || pca.id)\n\n return <PcaDetailsView pca={pca} />\n}\n"],"mappings":";;AASA,IAAaG,IAAQH,EAAgB,kDAAA,CAAmD;CACtFI,YAAY;EAAEC,SAAS;EAAYC,SAAS;EAAOC,UAAU;EAAK;CAClEE,WAASC,yCAAA,YAAA;CACTE,YAAY,OAAO,EAAEC,YAASC,gBAAQ;EACpC,IAAM,EAAEC,kBAAeF,GAEjBO,IAAelB,EADK,MAAOa,GAAYE,KAAKC,qBAAqBC,OAAAA,IAAY,EAAE,CAChDH;AAKrC,MAAI,EAHgBI,EAAa,MAAS,kBAAkBA,EAAa,MAAS,eAIhF,OAAMnB,EAAS;GACbqB,IAAI;GACJR,QAAQ,EAAES,WAAWT,EAAOS,WAAU;GACxC,CAAA;;CAGN,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { t as e } from "./RouteError-BwgDIwJE.mjs";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ //#region src/client/routes/_auth/projects/$projectId.tsx?tsr-split=errorComponent
4
+ var n = ({ error: n }) => /* @__PURE__ */ t(e, { error: n });
5
+ //#endregion
6
+ export { n as errorComponent };
7
+
8
+ //# sourceMappingURL=_projectId-B9fln31N.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_projectId-B9fln31N.mjs","names":["RouteError","SplitErrorComponent","error","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute, Outlet, useLoaderData } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n const availableServices = await context.trpcClient?.auth.getAvailableServices.query()\n\n // Extract accountId (domain id) from the rescoped token\n // This is needed for SideNavBar navigation until we refactor it\n const accountId = data?.domain?.id || \"\"\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId, // Keep for SideNavBar compatibility\n projectId: params.projectId,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject } = useLoaderData({ from: Route.id })\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n availableServices={availableServices!}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":";;;AAIiE,IAAAC,KAI9C,EAAEC,eACV,kBAAC,GAAA,EAAkBA,UAAAA,CAAAA"}