mirror of
https://github.com/usual2970/certimate.git
synced 2025-06-08 21:49:52 +00:00
feat(ui): different provider range of accesses in AccessList
This commit is contained in:
parent
4ab6b72e6f
commit
a72737fdd5
@ -292,6 +292,7 @@ const AccessForm = forwardRef<AccessFormInstance, AccessFormProps>(({ className,
|
|||||||
}}
|
}}
|
||||||
disabled={scene !== "add"}
|
disabled={scene !== "add"}
|
||||||
placeholder={providerPlaceholder}
|
placeholder={providerPlaceholder}
|
||||||
|
showOptionTags={range == null || range === "both-dns-hosting"}
|
||||||
showSearch={!disabled}
|
showSearch={!disabled}
|
||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
@ -40,7 +40,7 @@ const AccessProviderSelect = ({ filter, showOptionTags, ...props }: AccessProvid
|
|||||||
{t(provider?.name ?? "")}
|
{t(provider?.name ?? "")}
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</Space>
|
</Space>
|
||||||
{!showOptionTags && (
|
{showOptionTags && (
|
||||||
<div>
|
<div>
|
||||||
{provider?.usages?.includes(ACCESS_USAGES.DNS) && <Tag color="peru">{t("access.props.provider.usage.dns")}</Tag>}
|
{provider?.usages?.includes(ACCESS_USAGES.DNS) && <Tag color="peru">{t("access.props.provider.usage.dns")}</Tag>}
|
||||||
{provider?.usages?.includes(ACCESS_USAGES.HOSTING) && <Tag color="royalblue">{t("access.props.provider.usage.hosting")}</Tag>}
|
{provider?.usages?.includes(ACCESS_USAGES.HOSTING) && <Tag color="royalblue">{t("access.props.provider.usage.hosting")}</Tag>}
|
||||||
|
@ -17,8 +17,9 @@
|
|||||||
"access.props.provider.usage.hosting": "Hosting provider",
|
"access.props.provider.usage.hosting": "Hosting provider",
|
||||||
"access.props.provider.usage.ca": "Certificate authority",
|
"access.props.provider.usage.ca": "Certificate authority",
|
||||||
"access.props.provider.usage.notification": "Notification channel",
|
"access.props.provider.usage.notification": "Notification channel",
|
||||||
"access.props.ca": "Certificate authority",
|
"access.props.range.both_dns_hosting": "Provider",
|
||||||
"access.props.channel": "Notification channel",
|
"access.props.range.ca_only": "Certificate authority",
|
||||||
|
"access.props.range.notify_only": "Notification channel",
|
||||||
"access.props.created_at": "Created at",
|
"access.props.created_at": "Created at",
|
||||||
"access.props.updated_at": "Updated at",
|
"access.props.updated_at": "Updated at",
|
||||||
|
|
||||||
|
@ -17,8 +17,9 @@
|
|||||||
"access.props.provider.usage.hosting": "主机提供商",
|
"access.props.provider.usage.hosting": "主机提供商",
|
||||||
"access.props.provider.usage.ca": "证书颁发机构",
|
"access.props.provider.usage.ca": "证书颁发机构",
|
||||||
"access.props.provider.usage.notification": "通知渠道",
|
"access.props.provider.usage.notification": "通知渠道",
|
||||||
"access.props.ca": "证书颁发机构",
|
"access.props.range.both_dns_hosting": "提供商",
|
||||||
"access.props.channel": "通知渠道",
|
"access.props.range.ca_only": "证书颁发机构",
|
||||||
|
"access.props.range.notify_only": "通知渠道",
|
||||||
"access.props.created_at": "创建时间",
|
"access.props.created_at": "创建时间",
|
||||||
"access.props.updated_at": "更新时间",
|
"access.props.updated_at": "更新时间",
|
||||||
|
|
||||||
|
@ -14,13 +14,15 @@ import { Avatar, Button, Card, Empty, Flex, Input, Modal, Space, Table, type Tab
|
|||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { ClientResponseError } from "pocketbase";
|
import { ClientResponseError } from "pocketbase";
|
||||||
|
|
||||||
import AccessEditModal from "@/components/access/AccessEditModal";
|
import AccessEditModal, { type AccessEditModalProps } from "@/components/access/AccessEditModal";
|
||||||
import { type AccessModel } from "@/domain/access";
|
import { type AccessModel } from "@/domain/access";
|
||||||
import { accessProvidersMap } from "@/domain/provider";
|
import { ACCESS_USAGES, accessProvidersMap } from "@/domain/provider";
|
||||||
import { useZustandShallowSelector } from "@/hooks";
|
import { useZustandShallowSelector } from "@/hooks";
|
||||||
import { useAccessesStore } from "@/stores/access";
|
import { useAccessesStore } from "@/stores/access";
|
||||||
import { getErrMsg } from "@/utils/error";
|
import { getErrMsg } from "@/utils/error";
|
||||||
|
|
||||||
|
type AccessRanges = AccessEditModalProps["range"];
|
||||||
|
|
||||||
const AccessList = () => {
|
const AccessList = () => {
|
||||||
const [searchParams] = useSearchParams();
|
const [searchParams] = useSearchParams();
|
||||||
|
|
||||||
@ -85,6 +87,7 @@ const AccessList = () => {
|
|||||||
<Space.Compact>
|
<Space.Compact>
|
||||||
<AccessEditModal
|
<AccessEditModal
|
||||||
data={record}
|
data={record}
|
||||||
|
range={filters["range"] as AccessRanges}
|
||||||
scene="edit"
|
scene="edit"
|
||||||
trigger={
|
trigger={
|
||||||
<Tooltip title={t("access.action.edit")}>
|
<Tooltip title={t("access.action.edit")}>
|
||||||
@ -95,6 +98,7 @@ const AccessList = () => {
|
|||||||
|
|
||||||
<AccessEditModal
|
<AccessEditModal
|
||||||
data={{ ...record, id: undefined, name: `${record.name}-copy` }}
|
data={{ ...record, id: undefined, name: `${record.name}-copy` }}
|
||||||
|
range={filters["range"] as AccessRanges}
|
||||||
scene="add"
|
scene="add"
|
||||||
trigger={
|
trigger={
|
||||||
<Tooltip title={t("access.action.duplicate")}>
|
<Tooltip title={t("access.action.duplicate")}>
|
||||||
@ -122,6 +126,7 @@ const AccessList = () => {
|
|||||||
|
|
||||||
const [filters, setFilters] = useState<Record<string, unknown>>(() => {
|
const [filters, setFilters] = useState<Record<string, unknown>>(() => {
|
||||||
return {
|
return {
|
||||||
|
range: "both-dns-hosting" satisfies AccessRanges,
|
||||||
keyword: searchParams.get("keyword"),
|
keyword: searchParams.get("keyword"),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@ -144,14 +149,26 @@ const AccessList = () => {
|
|||||||
() => {
|
() => {
|
||||||
const startIndex = (page - 1) * pageSize;
|
const startIndex = (page - 1) * pageSize;
|
||||||
const endIndex = startIndex + pageSize;
|
const endIndex = startIndex + pageSize;
|
||||||
const list = accesses.filter((e) => {
|
const list = accesses
|
||||||
const keyword = (filters["keyword"] as string | undefined)?.trim();
|
.filter((e) => {
|
||||||
if (keyword) {
|
const keyword = (filters["keyword"] as string | undefined)?.trim();
|
||||||
return e.name.includes(keyword);
|
if (keyword) {
|
||||||
}
|
return e.name.includes(keyword);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
})
|
||||||
|
.filter((e) => {
|
||||||
|
const provider = accessProvidersMap.get(e.provider);
|
||||||
|
switch (filters["range"] as AccessRanges) {
|
||||||
|
case "both-dns-hosting":
|
||||||
|
return provider?.usages?.includes(ACCESS_USAGES.DNS) || provider?.usages?.includes(ACCESS_USAGES.HOSTING);
|
||||||
|
case "ca-only":
|
||||||
|
return provider?.usages?.includes(ACCESS_USAGES.CA);
|
||||||
|
case "notify-only":
|
||||||
|
return provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION);
|
||||||
|
}
|
||||||
|
});
|
||||||
return Promise.resolve({
|
return Promise.resolve({
|
||||||
items: list.slice(startIndex, endIndex),
|
items: list.slice(startIndex, endIndex),
|
||||||
totalItems: list.length,
|
totalItems: list.length,
|
||||||
@ -166,6 +183,10 @@ const AccessList = () => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const handleTabChange = (key: string) => {
|
||||||
|
setFilters((prev) => ({ ...prev, range: key }));
|
||||||
|
};
|
||||||
|
|
||||||
const handleSearch = (value: string) => {
|
const handleSearch = (value: string) => {
|
||||||
setFilters((prev) => ({ ...prev, keyword: value }));
|
setFilters((prev) => ({ ...prev, keyword: value }));
|
||||||
};
|
};
|
||||||
@ -203,6 +224,7 @@ const AccessList = () => {
|
|||||||
extra={[
|
extra={[
|
||||||
<AccessEditModal
|
<AccessEditModal
|
||||||
key="create"
|
key="create"
|
||||||
|
range={filters["range"] as AccessRanges}
|
||||||
scene="add"
|
scene="add"
|
||||||
trigger={
|
trigger={
|
||||||
<Button type="primary" icon={<PlusOutlinedIcon />}>
|
<Button type="primary" icon={<PlusOutlinedIcon />}>
|
||||||
@ -213,7 +235,32 @@ const AccessList = () => {
|
|||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Card size="small">
|
<Card
|
||||||
|
className="rounded-b-none"
|
||||||
|
styles={{
|
||||||
|
body: {
|
||||||
|
padding: 0,
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
tabList={[
|
||||||
|
{
|
||||||
|
key: "both-dns-hosting",
|
||||||
|
label: t("access.props.range.both_dns_hosting"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "ca-only",
|
||||||
|
label: t("access.props.range.ca_only"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "notify-only",
|
||||||
|
label: t("access.props.range.notify_only"),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
activeTabKey={filters["range"] as string}
|
||||||
|
onTabChange={(key) => handleTabChange(key)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Card className="rounded-t-none " size="small">
|
||||||
<div className="mb-4">
|
<div className="mb-4">
|
||||||
<Flex gap="small">
|
<Flex gap="small">
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user