import { useState } from "react"; import { Helmet } from "react-helmet"; import { useTranslation } from "react-i18next"; import { faCertificate, faCog, faEllipsis, faPencil, faPlus, faTrash } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { format } from "date-fns"; import { twMerge } from "tailwind-merge"; import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Button, DeleteActionModal, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, EmptyState, Modal, ModalContent, PageHeader, Pagination, Table, TableContainer, TableSkeleton, Tag, TBody, Td, Th, THead, Tooltip, Tr } from "@app/components/v2"; import { ProjectPermissionPkiTemplateActions, ProjectPermissionSub, useProject, useSubscription } from "@app/context"; import { usePopUp } from "@app/hooks"; import { useDeleteCertTemplateV2 } from "@app/hooks/api"; import { useListCertificateTemplates } from "@app/hooks/api/certificateTemplates/queries"; import { ProjectType } from "@app/hooks/api/projects/types"; import { CertificateTemplateEnrollmentModal } from "../CertificatesPage/components/CertificateTemplateEnrollmentModal"; import { PkiTemplateForm } from "./components/PkiTemplateForm"; const PER_PAGE_INIT = 25; export const PkiTemplateListPage = () => { const { t } = useTranslation(); const { currentProject } = useProject(); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(PER_PAGE_INIT); const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ "certificateTemplate", "deleteTemplate", "enrollmentOptions", "estUpgradePlan" ] as const); const { subscription } = useSubscription(); const { data, isPending } = useListCertificateTemplates({ projectId: currentProject.id, offset: (page - 1) * perPage, limit: perPage }); const deleteCertTemplate = useDeleteCertTemplateV2(); const onRemovePkiSubscriberSubmit = async () => { try { const pkiTemplate = await deleteCertTemplate.mutateAsync({ projectId: currentProject.id, templateName: popUp?.deleteTemplate?.data?.name }); createNotification({ text: `Successfully deleted PKI template: ${pkiTemplate.name}`, type: "success" }); handlePopUpClose("deleteTemplate"); } catch (err) { console.error(err); createNotification({ text: "Failed to delete PKI subscriber", type: "error" }); } }; return ( <> {t("common.head-title", { title: "PKI Templates" })}
{subscription?.pkiLegacyTemplates && (

Templates

{(isAllowed) => ( )}
)} {isPending && } {!isPending && data?.certificateTemplates?.map((template) => { return ( ); })} {!isPending && !data?.certificateTemplates?.length && ( )}
Name Issuing CA Last Updated At
{template.name} {template.ca.name} {format(new Date(template.updatedAt), "yyyy-MM-dd | HH:mm:ss")}
{(isAllowed) => ( { e.stopPropagation(); handlePopUpOpen("certificateTemplate", template); }} disabled={!isAllowed} icon={} > Edit Template )} {(isAllowed) => ( { e.stopPropagation(); if (!subscription.pkiEst) { handlePopUpOpen("estUpgradePlan"); return; } handlePopUpOpen("enrollmentOptions", { id: template.id }); }} disabled={!isAllowed} icon={} > Manage Enrollment )} {(isAllowed) => ( { e.stopPropagation(); handlePopUpOpen("deleteTemplate", template); }} disabled={!isAllowed} icon={} > Delete Template )}
{!isPending && data?.totalCount !== undefined && data.totalCount >= PER_PAGE_INIT && ( setPage(newPage)} onChangePerPage={(newPerPage) => setPerPage(newPerPage)} /> )}
handlePopUpToggle("deleteTemplate", isOpen)} deleteKey="confirm" onDeleteApproved={() => onRemovePkiSubscriberSubmit()} />
handlePopUpToggle("certificateTemplate", isOpen)} > handlePopUpToggle("certificateTemplate", isOpen)} />
handlePopUpToggle("estUpgradePlan", isOpen)} text="You can only configure template enrollment methods if you switch to Infisical's Enterprise plan." /> ); };