feat: add issues 124

This commit is contained in:
liburdi 2024-09-30 18:22:16 +08:00
parent 49fdf8213a
commit 995349ab3e
16 changed files with 424 additions and 343 deletions

322
ui/dist/assets/index-CYRy01hP.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
ui/dist/index.html vendored
View File

@ -5,7 +5,7 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Certimate - Your Trusted SSL Automation Partner</title> <title>Certimate - Your Trusted SSL Automation Partner</title>
<script type="module" crossorigin src="/assets/index-TzNEc_kS.js"></script> <script type="module" crossorigin src="/assets/index-CYRy01hP.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-I--T0qY3.css"> <link rel="stylesheet" crossorigin href="/assets/index-I--T0qY3.css">
</head> </head>
<body class="bg-background"> <body class="bg-background">

View File

@ -24,9 +24,11 @@ import { PbErrorData } from "@/domain/base";
const AccessAliyunForm = ({ const AccessAliyunForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess } = useConfig(); const { addAccess, updateAccess } = useConfig();
@ -69,6 +71,7 @@ const AccessAliyunForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -76,10 +79,11 @@ const AccessAliyunForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
return; return;
} }
console.log(req);
addAccess(req); addAccess(req);
} catch (e) { } catch (e) {
const err = e as ClientResponseError; const err = e as ClientResponseError;

View File

@ -23,9 +23,11 @@ import { PbErrorData } from "@/domain/base";
const AccessCloudflareForm = ({ const AccessCloudflareForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess } = useConfig(); const { addAccess, updateAccess } = useConfig();
@ -65,6 +67,7 @@ const AccessCloudflareForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -72,7 +75,7 @@ const AccessCloudflareForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
return; return;
} }

View File

@ -36,7 +36,7 @@ import AccessGodaddyFrom from "./AccessGodaddyForm";
import AccessLocalForm from "./AccessLocalForm"; import AccessLocalForm from "./AccessLocalForm";
type TargetConfigEditProps = { type TargetConfigEditProps = {
op: "add" | "edit"; op: "add" | "edit" | "copy";
className?: string; className?: string;
trigger: React.ReactNode; trigger: React.ReactNode;
data?: Access; data?: Access;
@ -60,6 +60,7 @@ export function AccessEdit({
form = ( form = (
<AccessTencentForm <AccessTencentForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -70,6 +71,7 @@ export function AccessEdit({
form = ( form = (
<AccessAliyunForm <AccessAliyunForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -80,6 +82,7 @@ export function AccessEdit({
form = ( form = (
<AccessSSHForm <AccessSSHForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -90,6 +93,7 @@ export function AccessEdit({
form = ( form = (
<WebhookForm <WebhookForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -100,6 +104,7 @@ export function AccessEdit({
form = ( form = (
<AccessCloudflareForm <AccessCloudflareForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -110,6 +115,7 @@ export function AccessEdit({
form = ( form = (
<AccessQiniuForm <AccessQiniuForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -120,6 +126,7 @@ export function AccessEdit({
form = ( form = (
<AccessNamesiloForm <AccessNamesiloForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -130,6 +137,7 @@ export function AccessEdit({
form = ( form = (
<AccessGodaddyFrom <AccessGodaddyFrom
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -140,6 +148,7 @@ export function AccessEdit({
form = ( form = (
<AccessLocalForm <AccessLocalForm
data={data} data={data}
op={op}
onAfterReq={() => { onAfterReq={() => {
setOpen(false); setOpen(false);
}} }}
@ -159,7 +168,7 @@ export function AccessEdit({
</DialogTrigger> </DialogTrigger>
<DialogContent className="sm:max-w-[600px] w-full dark:text-stone-200"> <DialogContent className="sm:max-w-[600px] w-full dark:text-stone-200">
<DialogHeader> <DialogHeader>
<DialogTitle>{op == "add" ? t('access.add') : t('access.edit')}</DialogTitle> <DialogTitle>{op == "add" ? t('access.add') : op == "edit" ? t('access.edit') : t('access.copy')}</DialogTitle>
</DialogHeader> </DialogHeader>
<ScrollArea className="max-h-[80vh]"> <ScrollArea className="max-h-[80vh]">
<div className="container py-3"> <div className="container py-3">

View File

@ -28,9 +28,11 @@ import { PbErrorData } from "@/domain/base";
const AccessGodaddyFrom = ({ const AccessGodaddyFrom = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess } = useConfig(); const { addAccess, updateAccess } = useConfig();
@ -74,6 +76,7 @@ const AccessGodaddyFrom = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -81,7 +84,7 @@ const AccessGodaddyFrom = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
return; return;
} }

View File

@ -26,9 +26,11 @@ import { PbErrorData } from "@/domain/base";
const AccessLocalForm = ({ const AccessLocalForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess, reloadAccessGroups } = useConfig(); const { addAccess, updateAccess, reloadAccessGroups } = useConfig();
@ -77,6 +79,7 @@ const AccessLocalForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -84,7 +87,7 @@ const AccessLocalForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
} else { } else {
addAccess(req); addAccess(req);

View File

@ -23,9 +23,11 @@ import { PbErrorData } from "@/domain/base";
const AccessNamesiloForm = ({ const AccessNamesiloForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess } = useConfig(); const { addAccess, updateAccess } = useConfig();
@ -64,6 +66,7 @@ const AccessNamesiloForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -71,7 +74,7 @@ const AccessNamesiloForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
return; return;
} }

View File

@ -24,9 +24,11 @@ import { PbErrorData } from "@/domain/base";
const AccessQiniuForm = ({ const AccessQiniuForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess } = useConfig(); const { addAccess, updateAccess } = useConfig();
@ -69,6 +71,7 @@ const AccessQiniuForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -76,7 +79,7 @@ const AccessQiniuForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
return; return;
} }

View File

@ -39,9 +39,11 @@ import { updateById } from "@/repository/access_group";
const AccessSSHForm = ({ const AccessSSHForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { const {
@ -146,6 +148,7 @@ const AccessSSHForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -153,7 +156,7 @@ const AccessSSHForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
} else { } else {
addAccess(req); addAccess(req);

View File

@ -23,9 +23,11 @@ import { PbErrorData } from "@/domain/base";
const AccessTencentForm = ({ const AccessTencentForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess } = useConfig(); const { addAccess, updateAccess } = useConfig();
@ -68,6 +70,7 @@ const AccessTencentForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -75,7 +78,7 @@ const AccessTencentForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
return; return;
} }

View File

@ -23,9 +23,11 @@ import { PbErrorData } from "@/domain/base";
const WebhookForm = ({ const WebhookForm = ({
data, data,
op,
onAfterReq, onAfterReq,
}: { }: {
data?: Access; data?: Access;
op: "add" | "edit" | "copy";
onAfterReq: () => void; onAfterReq: () => void;
}) => { }) => {
const { addAccess, updateAccess } = useConfig(); const { addAccess, updateAccess } = useConfig();
@ -64,6 +66,7 @@ const WebhookForm = ({
}; };
try { try {
req.id = op == "copy" ? "" : req.id;
const rs = await save(req); const rs = await save(req);
onAfterReq(); onAfterReq();
@ -71,7 +74,7 @@ const WebhookForm = ({
req.id = rs.id; req.id = rs.id;
req.created = rs.created; req.created = rs.created;
req.updated = rs.updated; req.updated = rs.updated;
if (data.id) { if (data.id && op == "edit") {
updateAccess(req); updateAccess(req);
return; return;
} }

View File

@ -21,6 +21,7 @@
"cancel": "Cancel", "cancel": "Cancel",
"confirm": "Confirm", "confirm": "Confirm",
"edit": "Edit", "edit": "Edit",
"copy": "Copy",
"succeed": "Successful", "succeed": "Successful",
"add": "Add", "add": "Add",
"document": "Document", "document": "Document",
@ -154,6 +155,7 @@
"access.management": "Authorization Management", "access.management": "Authorization Management",
"access.add": "Add Authorization", "access.add": "Add Authorization",
"access.edit": "Edit Authorization", "access.edit": "Edit Authorization",
"access.delete.confirm": "Are you sure you want to delete the deployment authorization?",
"access.all": "All Authorizations", "access.all": "All Authorizations",
"access.list": "Authorization List", "access.list": "Authorization List",
"access.type": "Provider", "access.type": "Provider",

View File

@ -21,6 +21,7 @@
"cancel": "取消", "cancel": "取消",
"confirm": "确认", "confirm": "确认",
"edit": "编辑", "edit": "编辑",
"copy": "复制",
"succeed": "成功", "succeed": "成功",
"add": "新增", "add": "新增",
"document": "文档", "document": "文档",
@ -154,6 +155,8 @@
"access.management": "授权管理", "access.management": "授权管理",
"access.add": "添加授权", "access.add": "添加授权",
"access.edit": "编辑授权", "access.edit": "编辑授权",
"access.copy": "复制授权",
"access.delete.confirm": "确定要删除授权吗?",
"access.all": "所有授权", "access.all": "所有授权",
"access.list": "授权列表", "access.list": "授权列表",
"access.type": "服务商", "access.type": "服务商",

View File

@ -12,6 +12,15 @@ import { remove } from "@/repository/access";
import { t } from "i18next"; import { t } from "i18next";
import { Key } from "lucide-react"; import { Key } from "lucide-react";
import { useLocation, useNavigate } from "react-router-dom"; import { useLocation, useNavigate } from "react-router-dom";
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent, AlertDialogDescription, AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger
} from "@/components/ui/alert-dialog.tsx";
const Access = () => { const Access = () => {
const { config, deleteAccess } = useConfig(); const { config, deleteAccess } = useConfig();
@ -149,15 +158,45 @@ const Access = () => {
data={access} data={access}
/> />
<Separator orientation="vertical" className="h-4 mx-2" /> <Separator orientation="vertical" className="h-4 mx-2" />
<Button <AccessEdit
variant={"link"} trigger={
className="p-0" <Button variant={"link"} className="p-0">
onClick={() => { {t("copy")}
handleDelete(access); </Button>
}} }
> op="copy"
{t("delete")} data={access}
</Button> />
<Separator orientation="vertical" className="h-4 mx-2" />
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant={"link"} size={"sm"}>
{t('delete')}
</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle className="dark:text-gray-200">
{t('access.group.delete')}
</AlertDialogTitle>
<AlertDialogDescription>
{t('access.delete.confirm')}
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel className="dark:text-gray-200">
{t('cancel')}
</AlertDialogCancel>
<AlertDialogAction
onClick={() => {
handleDelete(access);
}}
>
{t('confirm')}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</div> </div>
</div> </div>
))} ))}