From 2690eef65b78e811048a9c98c21236dab649986e Mon Sep 17 00:00:00 2001 From: dyzulk <66510723+dyzulk@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:37:02 +0700 Subject: [PATCH] feat: show issuer_name in CA tables and support outline variant in Badge --- src/components/admin/ArchiveManagementTable.tsx | 17 ++++++++++++++++- src/components/admin/RootCaTable.tsx | 17 ++++++++++++++++- src/components/ui/badge/Badge.tsx | 16 ++++++++++++++-- src/messages/en.json | 2 ++ src/messages/id.json | 2 ++ 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/components/admin/ArchiveManagementTable.tsx b/src/components/admin/ArchiveManagementTable.tsx index f2d844c..64a48df 100644 --- a/src/components/admin/ArchiveManagementTable.tsx +++ b/src/components/admin/ArchiveManagementTable.tsx @@ -22,6 +22,7 @@ interface CaCertificate { valid_to: string; status: string; is_latest: boolean; + issuer_name?: string; } interface ArchiveManagementTableProps { @@ -80,6 +81,9 @@ export default function ArchiveManagementTable({ {t("common_name_th")} + + {t("issuer_th")} + {t("validity_th")} @@ -104,6 +108,17 @@ export default function ArchiveManagementTable({ {formatType(cert.ca_type)} + + {cert.issuer_name === "Self-Signed" ? ( + + {t("self_signed")} + + ) : ( + + {cert.issuer_name || "-"} + + )} +
{new Date(cert.valid_from).toLocaleDateString()} @@ -140,7 +155,7 @@ export default function ArchiveManagementTable({ ))} {filteredCertificates.length === 0 && ( - + No versions found. diff --git a/src/components/admin/RootCaTable.tsx b/src/components/admin/RootCaTable.tsx index 81e1807..841ae04 100644 --- a/src/components/admin/RootCaTable.tsx +++ b/src/components/admin/RootCaTable.tsx @@ -21,6 +21,7 @@ interface CaCertificate { valid_from: string; valid_to: string; status: string; + issuer_name?: string; } interface RootCaTableProps { @@ -79,6 +80,9 @@ export default function RootCaTable({ {t("common_name_th")} + + {t("issuer_th")} + {t("serial_th")} @@ -103,6 +107,17 @@ export default function RootCaTable({ {cert.common_name} + + {cert.issuer_name === "Self-Signed" ? ( + + {t("self_signed")} + + ) : ( + + {cert.issuer_name || "-"} + + )} + {cert.serial_number} @@ -127,7 +142,7 @@ export default function RootCaTable({ ))} {filteredCertificates.length === 0 && ( - + {searchTerm ? t("no_ca_search", { term: searchTerm }) : t("no_ca_found")} diff --git a/src/components/ui/badge/Badge.tsx b/src/components/ui/badge/Badge.tsx index 9c60553..a99982d 100644 --- a/src/components/ui/badge/Badge.tsx +++ b/src/components/ui/badge/Badge.tsx @@ -1,6 +1,6 @@ import React from "react"; -type BadgeVariant = "light" | "solid"; +type BadgeVariant = "light" | "solid" | "outline"; type BadgeSize = "sm" | "md"; type BadgeColor = | "primary" @@ -18,6 +18,7 @@ interface BadgeProps { startIcon?: React.ReactNode; // Icon at the start endIcon?: React.ReactNode; // Icon at the end children: React.ReactNode; // Badge content + className?: string; // Additional classes } const Badge: React.FC = ({ @@ -27,6 +28,7 @@ const Badge: React.FC = ({ startIcon, endIcon, children, + className = "", }) => { const baseStyles = "inline-flex items-center px-2.5 py-0.5 justify-center gap-1 rounded-full font-medium"; @@ -61,6 +63,16 @@ const Badge: React.FC = ({ light: "bg-gray-400 dark:bg-white/5 text-white dark:text-white/80", dark: "bg-gray-700 text-white dark:text-white", }, + outline: { + primary: "border border-brand-500 text-brand-500 dark:text-brand-400", + success: + "border border-success-500 text-success-600 dark:text-success-500", + error: "border border-error-500 text-error-600 dark:text-error-500", + warning: "border border-warning-500 text-warning-600 dark:text-orange-400", + info: "border border-blue-light-500 text-blue-light-500 dark:text-blue-light-500", + light: "border border-gray-200 text-gray-700 dark:border-white/10 dark:text-white/80", + dark: "border border-gray-700 text-white dark:border-white/20 dark:text-white", + }, }; // Get styles based on size and color variant @@ -68,7 +80,7 @@ const Badge: React.FC = ({ const colorStyles = variants[variant][color]; return ( - + {startIcon && {startIcon}} {children} {endIcon && {endIcon}} diff --git a/src/messages/en.json b/src/messages/en.json index a0e9f7b..36c9991 100644 --- a/src/messages/en.json +++ b/src/messages/en.json @@ -664,6 +664,7 @@ "search_placeholder": "Search CAs...", "type_th": "Type", "common_name_th": "Common Name", + "issuer_th": "Issued By", "serial_th": "Serial Number", "validity_th": "Validity Period", "status_th": "Status", @@ -671,6 +672,7 @@ "validity_to_label": "to", "status_valid": "Valid", "status_expired": "Expired", + "self_signed": "Self-Signed", "renew_button": "Renew Now", "no_ca_search": "No CAs matched \"{term}\"", "no_ca_found": "No Root CA certificates found. Run CA Setup from Certificates page." diff --git a/src/messages/id.json b/src/messages/id.json index c0511ac..9cb76f3 100644 --- a/src/messages/id.json +++ b/src/messages/id.json @@ -664,6 +664,7 @@ "search_placeholder": "Cari CA...", "type_th": "Tipe", "common_name_th": "Common Name", + "issuer_th": "Diterbitkan Oleh", "serial_th": "Nomor Seri", "validity_th": "Masa Berlaku", "status_th": "Status", @@ -671,6 +672,7 @@ "validity_to_label": "ke", "status_valid": "Valid", "status_expired": "Kedaluwarsa", + "self_signed": "Self-Signed", "renew_button": "Perbarui", "no_ca_search": "Tidak ada CA yang cocok dengan \"{term}\"", "no_ca_found": "Sertifikat Root CA tidak ditemukan. Jalankan Pengaturan CA dari halaman Sertifikat."