You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
302 lines
8.2 KiB
302 lines
8.2 KiB
import { useEffect, useMemo, useState } from 'react'
|
|
import { BetaSchemaForm, ProColumns, ProFormColumnsType, ProTable } from '@ant-design/pro-components'
|
|
import { useTranslation } from '@/i18n.ts'
|
|
import { useAtom, useAtomValue } from 'jotai'
|
|
import { Button, Form, Popconfirm } from 'antd'
|
|
import {
|
|
deleteDNSAtom,
|
|
dnsListAtom,
|
|
dnsPageAtom,
|
|
DNSTypeEnum,
|
|
DNSTypes,
|
|
saveOrUpdateDNSAtom
|
|
} from '@/store/websites/dns.ts'
|
|
import { WebSite } from '@/types'
|
|
|
|
const getKeyColumn = (type: string, t) => {
|
|
const columns: ProColumns<WebSite.IDnsAccount>[] = []
|
|
switch (type) {
|
|
case DNSTypeEnum.AliYun: {
|
|
columns.push(...[
|
|
{
|
|
title: t('website.ssl.dns.columns.accessKey', 'Access Key'),
|
|
dataIndex: 'accessKey',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
},
|
|
{
|
|
title: t('website.ssl.dns.columns.secretKey', 'Secret Key'),
|
|
dataIndex: 'secretKey',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
},
|
|
])
|
|
}
|
|
break
|
|
case DNSTypeEnum.TencentCloud: {
|
|
columns.push(...[
|
|
{
|
|
title: t('website.ssl.dns.columns.secretID', 'Secret ID'),
|
|
dataIndex: 'secretID',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
}, {
|
|
title: t('website.ssl.dns.columns.secretKey', 'Secret Key'),
|
|
dataIndex: 'secretKey',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
},
|
|
])
|
|
break
|
|
}
|
|
case DNSTypeEnum.DnsPod: {
|
|
columns.push(...[
|
|
{
|
|
title: t('website.ssl.dns.columns.apiId', 'ID'),
|
|
dataIndex: 'apiId',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
}, {
|
|
title: t('website.ssl.dns.columns.token', 'Token'),
|
|
dataIndex: 'token',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
},
|
|
])
|
|
break
|
|
}
|
|
case DNSTypeEnum.CloudFlare: {
|
|
columns.push(...[
|
|
{
|
|
title: t('website.ssl.dns.columns.email', 'Email'),
|
|
dataIndex: 'email',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
}, {
|
|
title: t('website.ssl.dns.columns.apiKey', 'API ToKen'),
|
|
dataIndex: 'apiKey',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
},
|
|
]
|
|
)
|
|
break
|
|
}
|
|
case DNSTypeEnum.Godaddy:
|
|
case DNSTypeEnum.NameCheap:
|
|
case DNSTypeEnum.NameSilo:
|
|
columns.push({
|
|
title: t('website.ssl.dns.columns.apiKey', 'API Key'),
|
|
dataIndex: 'apiKey',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
},
|
|
)
|
|
if (type === DNSTypeEnum.NameCheap) {
|
|
columns.push({
|
|
title: t('website.ssl.dns.columns.apiUser', 'API User'),
|
|
dataIndex: 'apiUser',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
})
|
|
} else if (type === DNSTypeEnum.Godaddy) {
|
|
columns.push({
|
|
title: t('website.ssl.dns.columns.apiSecret', 'API Secret'),
|
|
dataIndex: 'apiSecret',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
})
|
|
}
|
|
break
|
|
case DNSTypeEnum.NameCom: {
|
|
columns.push(
|
|
{
|
|
title: t('website.ssl.dns.columns.apiUser', 'UserName'),
|
|
dataIndex: 'apiUser',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
},
|
|
{
|
|
title: t('website.ssl.dns.columns.token', 'Token'),
|
|
dataIndex: 'token',
|
|
formItemProps: {
|
|
rules: [ { required: true, message: t('message.required') } ]
|
|
}
|
|
}
|
|
)
|
|
break
|
|
}
|
|
default:
|
|
break
|
|
|
|
}
|
|
return columns
|
|
}
|
|
|
|
const DNSList = () => {
|
|
|
|
const { t } = useTranslation()
|
|
const [ form ] = Form.useForm()
|
|
const [ page, setPage ] = useAtom(dnsPageAtom)
|
|
const { data, isLoading, isFetching, refetch } = useAtomValue(dnsListAtom)
|
|
const { mutate: saveOrUpdate, isPending: isSubmitting, isSuccess } = useAtomValue(saveOrUpdateDNSAtom)
|
|
const { mutate: deleteDNS, isPending: isDeleting } = useAtomValue(deleteDNSAtom)
|
|
const [ open, setOpen ] = useState(false)
|
|
|
|
const columns = useMemo<ProColumns<WebSite.IDnsAccount>[]>(() => {
|
|
return [
|
|
{
|
|
title: 'ID',
|
|
dataIndex: 'id',
|
|
hideInTable: true,
|
|
formItemProps: {
|
|
hidden: true,
|
|
}
|
|
},
|
|
{
|
|
title: t('website.ssl.dns.columns.name', '名称'),
|
|
dataIndex: 'name',
|
|
valueType: 'text',
|
|
formItemProps: {
|
|
rules: [
|
|
{ required: true, message: t('message.required', '请输入') }
|
|
]
|
|
}
|
|
},
|
|
|
|
{
|
|
title: t('website.ssl.dns.columns.type', '类型'),
|
|
dataIndex: 'type',
|
|
valueType: 'select',
|
|
fieldProps: {
|
|
options: DNSTypes
|
|
},
|
|
formItemProps: {
|
|
rules: [
|
|
{ required: true, message: t('message.required', '请选择') }
|
|
]
|
|
},
|
|
},
|
|
{
|
|
name: [ 'type' ],
|
|
valueType: 'dependency',
|
|
hideInSetting: true,
|
|
hideInTable: true,
|
|
columns: ({ type }) => {
|
|
return getKeyColumn(type, t)
|
|
}
|
|
},
|
|
{
|
|
title: '操作',
|
|
valueType: 'option',
|
|
render: (_, record) => {
|
|
return [
|
|
<Popconfirm
|
|
key={'del_confirm'}
|
|
disabled={isDeleting}
|
|
onConfirm={() => {
|
|
deleteDNS(record.id)
|
|
}}
|
|
title={t('message.deleteConfirm')}>
|
|
<a key="del">
|
|
{t('actions.delete', '删除')}
|
|
</a>
|
|
</Popconfirm>
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
if (isSuccess) {
|
|
setOpen(false)
|
|
}
|
|
}, [ isSuccess ])
|
|
|
|
return (
|
|
<>
|
|
<ProTable<WebSite.IDnsAccount>
|
|
cardProps={{
|
|
bodyStyle: {
|
|
padding: 0,
|
|
}
|
|
}}
|
|
rowKey="id"
|
|
headerTitle={
|
|
<Button
|
|
onClick={() => {
|
|
form.setFieldsValue({
|
|
id: 0,
|
|
type: DNSTypeEnum.DnsPod,
|
|
})
|
|
setOpen(true)
|
|
}}
|
|
type={'primary'}>{t('website.ssl.dns.add', '添加DNS帐户')}</Button>
|
|
}
|
|
loading={isLoading || isFetching}
|
|
dataSource={data?.rows ?? []}
|
|
columns={columns}
|
|
search={false}
|
|
options={{
|
|
reload: () => {
|
|
refetch()
|
|
},
|
|
}}
|
|
pagination={{
|
|
total: data?.total,
|
|
pageSize: page.pageSize,
|
|
current: page.page,
|
|
onChange: (current, pageSize) => {
|
|
setPage(prev => {
|
|
return {
|
|
...prev,
|
|
page: current,
|
|
pageSize: pageSize,
|
|
}
|
|
})
|
|
},
|
|
|
|
}}
|
|
/>
|
|
<BetaSchemaForm<WebSite.IDnsAccount>
|
|
shouldUpdate={false}
|
|
width={600}
|
|
form={form}
|
|
layout={'horizontal'}
|
|
scrollToFirstError={true}
|
|
title={t(`website.ssl.dns.title_${form.getFieldValue('id') !== 0 ? 'edit' : 'add'}`, form.getFieldValue('id') !== 0 ? 'DNS帐号编辑' : 'DNS帐号添加')}
|
|
// colProps={{ span: 24 }}
|
|
labelCol={{ span: 6 }}
|
|
wrapperCol={{ span: 14 }}
|
|
layoutType={'ModalForm'}
|
|
open={open}
|
|
modalProps={{
|
|
maskClosable: false,
|
|
}}
|
|
onOpenChange={(open) => {
|
|
setOpen(open)
|
|
}}
|
|
loading={isSubmitting}
|
|
onFinish={async (values) => {
|
|
// console.log('values', values)
|
|
saveOrUpdate(values)
|
|
}}
|
|
columns={columns as ProFormColumnsType[]}/>
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default DNSList
|