From 4e0134b70a330d6a784e1a28c09ac9e62c75a915 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Sat, 7 Dec 2024 17:11:36 +0800 Subject: [PATCH] feat(ui): new CertificateDetail UI using antd --- ui/package-lock.json | 23 ++++ ui/package.json | 2 + .../certificate/CertificateDetail.tsx | 100 ++++++++++-------- .../certificate/CertificateDetailDrawer.tsx | 26 +++++ .../certificate/CertificateList.tsx | 4 +- ui/src/i18n/locales/en/nls.certificate.json | 2 +- ui/src/i18n/locales/zh/nls.certificate.json | 2 +- ui/src/lib/file.ts | 7 +- ui/src/pages/ConsoleLayout.tsx | 6 +- ui/src/pages/certificates/CertificateList.tsx | 23 +++- 10 files changed, 134 insertions(+), 61 deletions(-) create mode 100644 ui/src/components/certificate/CertificateDetailDrawer.tsx diff --git a/ui/package-lock.json b/ui/package-lock.json index 0045e7c8..1377450b 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -45,6 +45,7 @@ "nanoid": "^5.0.7", "pocketbase": "^0.21.4", "react": "^18.3.1", + "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.3.1", "react-hook-form": "^7.52.1", "react-i18next": "^15.0.2", @@ -59,6 +60,7 @@ "@types/fs-extra": "^11.0.4", "@types/node": "^22.0.0", "@types/react": "^18.3.3", + "@types/react-copy-to-clipboard": "^5.0.7", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", @@ -3459,6 +3461,15 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-copy-to-clipboard": { + "version": "5.0.7", + "resolved": "https://registry.npmmirror.com/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.7.tgz", + "integrity": "sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-dom": { "version": "18.3.0", "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.0.tgz", @@ -6931,6 +6942,18 @@ "node": ">=0.10.0" } }, + "node_modules/react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "dependencies": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^15.3.0 || 16 || 17 || 18" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", diff --git a/ui/package.json b/ui/package.json index eda46449..022aff59 100644 --- a/ui/package.json +++ b/ui/package.json @@ -47,6 +47,7 @@ "nanoid": "^5.0.7", "pocketbase": "^0.21.4", "react": "^18.3.1", + "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.3.1", "react-hook-form": "^7.52.1", "react-i18next": "^15.0.2", @@ -61,6 +62,7 @@ "@types/fs-extra": "^11.0.4", "@types/node": "^22.0.0", "@types/react": "^18.3.3", + "@types/react-copy-to-clipboard": "^5.0.7", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", diff --git a/ui/src/components/certificate/CertificateDetail.tsx b/ui/src/components/certificate/CertificateDetail.tsx index d58367ab..95864003 100644 --- a/ui/src/components/certificate/CertificateDetail.tsx +++ b/ui/src/components/certificate/CertificateDetail.tsx @@ -1,64 +1,74 @@ -import { Sheet, SheetContent, SheetHeader, SheetTitle } from "../ui/sheet"; - -import { Certificate } from "@/domain/certificate"; -import { Textarea } from "../ui/textarea"; -import { Button } from "../ui/button"; -import { Label } from "../ui/label"; -import { CustomFile, saveFiles2ZIP } from "@/lib/file"; import { useTranslation } from "react-i18next"; +import { Button, Form, Input, Tooltip } from "antd"; +import { CopyToClipboard } from "react-copy-to-clipboard"; +import { Clipboard as ClipboardIcon } from "lucide-react"; -type WorkflowLogDetailProps = { - open: boolean; - onOpenChange: (open: boolean) => void; - certificate?: Certificate; +import { type Certificate } from "@/domain/certificate"; +import { saveFiles2Zip } from "@/lib/file"; + +type CertificateDetailProps = { + data: Certificate; }; -const CertificateDetail = ({ open, onOpenChange, certificate }: WorkflowLogDetailProps) => { + +const CertificateDetail = ({ data }: CertificateDetailProps) => { const { t } = useTranslation(); + const handleDownloadClick = async () => { - const zipName = `${certificate?.id}-${certificate?.san}.zip`; - const files: CustomFile[] = [ + // TODO: 支持下载多种格式 + const zipName = `${data.id}-${data.san}.zip`; + const files = [ { - name: `${certificate?.san}.pem`, - content: certificate?.certificate ? certificate?.certificate : "", + name: `${data.san}.pem`, + content: data.certificate ?? "", }, { - name: `${certificate?.san}.key`, - content: certificate?.privateKey ? certificate?.privateKey : "", + name: `${data.san}.key`, + content: data.privateKey ?? "", }, ]; - await saveFiles2ZIP(zipName, files); + await saveFiles2Zip(zipName, files); }; return ( - - - - - +
+
+ +
+ + + + + + +
+ +
-
-
- + +
+ + + + + +
-
- -