From e533f9407f74dde66d373743ab511734363eb6c6 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Sun, 27 Apr 2025 11:41:09 +0800 Subject: [PATCH] feat: reserve accesses for ca or notification --- internal/deployer/providers.go | 2 +- internal/domain/access.go | 13 +-- internal/notify/providers.go | 2 +- .../deployer/providers/webhook/webhook.go | 6 +- .../notifier/providers/webhook/webhook.go | 6 +- internal/repository/access.go | 1 + migrations/1745726400_upgrade.go | 88 +++++++++++++++++++ ui/src/components/access/AccessEditDrawer.tsx | 6 +- ui/src/components/access/AccessEditModal.tsx | 6 +- ui/src/components/access/AccessForm.tsx | 36 ++++---- .../workflow/node/ApplyNodeConfigForm.tsx | 11 +-- .../workflow/node/DeployNodeConfigForm.tsx | 7 +- .../workflow/node/NotifyNodeConfigForm.tsx | 4 +- ui/src/domain/access.ts | 5 +- ui/src/i18n/locales/en/nls.access.json | 6 +- ui/src/i18n/locales/zh/nls.access.json | 6 +- ui/src/pages/accesses/AccessList.tsx | 32 +++---- 17 files changed, 166 insertions(+), 71 deletions(-) create mode 100644 migrations/1745726400_upgrade.go diff --git a/internal/deployer/providers.go b/internal/deployer/providers.go index ca47b18c..2e7bcbcf 100644 --- a/internal/deployer/providers.go +++ b/internal/deployer/providers.go @@ -1098,7 +1098,7 @@ func createDeployerProvider(options *deployerProviderOptions) (deployer.Deployer deployer, err := pWebhook.NewDeployer(&pWebhook.DeployerConfig{ WebhookUrl: access.Url, - WebhookData: maputil.GetOrDefaultString(options.ProviderExtendedConfig, "webhookData", access.TemplateDataForDeployment), + WebhookData: maputil.GetOrDefaultString(options.ProviderExtendedConfig, "webhookData", access.DefaultDataForDeployment), Method: access.Method, Headers: mergedHeaders, AllowInsecureConnections: access.AllowInsecureConnections, diff --git a/internal/domain/access.go b/internal/domain/access.go index b9f4de6b..a9079cf7 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -11,6 +11,7 @@ type Access struct { Name string `json:"name" db:"name"` Provider string `json:"provider" db:"provider"` Config map[string]any `json:"config" db:"config"` + Reserve string `json:"reserve,omitempty" db:"reserve"` DeletedAt *time.Time `json:"deleted" db:"deleted"` } @@ -261,12 +262,12 @@ type AccessConfigForWangsu struct { } type AccessConfigForWebhook struct { - Url string `json:"url"` - Method string `json:"method,omitempty"` - HeadersString string `json:"headers,omitempty"` - AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"` - TemplateDataForDeployment string `json:"templateDataForDeployment,omitempty"` // TODO: - TemplateDataForNotification string `json:"templateDataForNotification,omitempty"` // TODO: + Url string `json:"url"` + Method string `json:"method,omitempty"` + HeadersString string `json:"headers,omitempty"` + AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"` + DefaultDataForDeployment string `json:"defaultDataForDeployment,omitempty"` + DefaultDataForNotification string `json:"defaultDataForNotification,omitempty"` } type AccessConfigForWestcn struct { diff --git a/internal/notify/providers.go b/internal/notify/providers.go index da22b12a..40b069fe 100644 --- a/internal/notify/providers.go +++ b/internal/notify/providers.go @@ -101,7 +101,7 @@ func createNotifierProvider(options *notifierProviderOptions) (notifier.Notifier return pWebhook.NewNotifier(&pWebhook.NotifierConfig{ WebhookUrl: access.Url, - WebhookData: maputil.GetOrDefaultString(options.ProviderExtendedConfig, "webhookData", access.TemplateDataForNotification), + WebhookData: maputil.GetOrDefaultString(options.ProviderExtendedConfig, "webhookData", access.DefaultDataForNotification), Method: access.Method, Headers: mergedHeaders, AllowInsecureConnections: access.AllowInsecureConnections, diff --git a/internal/pkg/core/deployer/providers/webhook/webhook.go b/internal/pkg/core/deployer/providers/webhook/webhook.go index 3464e411..07b2eaaa 100644 --- a/internal/pkg/core/deployer/providers/webhook/webhook.go +++ b/internal/pkg/core/deployer/providers/webhook/webhook.go @@ -80,7 +80,7 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE if err != nil { return nil, fmt.Errorf("failed to parse webhook url: %w", err) } else if webhookUrl.Scheme != "http" && webhookUrl.Scheme != "https" { - return nil, fmt.Errorf("unsupported webhook url scheme: %s", webhookUrl.Scheme) + return nil, fmt.Errorf("unsupported webhook url scheme '%s'", webhookUrl.Scheme) } else { webhookUrl.Path = strings.ReplaceAll(webhookUrl.Path, "${DOMAIN}", url.PathEscape(certX509.Subject.CommonName)) } @@ -94,7 +94,7 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE webhookMethod != http.MethodPut && webhookMethod != http.MethodPatch && webhookMethod != http.MethodDelete { - return nil, fmt.Errorf("unsupported webhook request method: %s", webhookMethod) + return nil, fmt.Errorf("unsupported webhook request method '%s'", webhookMethod) } // 处理 Webhook 请求标头 @@ -114,7 +114,7 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE } else if strings.HasPrefix(webhookContentType, CONTENT_TYPE_JSON) && strings.HasPrefix(webhookContentType, CONTENT_TYPE_FORM) && strings.HasPrefix(webhookContentType, CONTENT_TYPE_MULTIPART) { - return nil, fmt.Errorf("unsupported webhook content type: %s", webhookContentType) + return nil, fmt.Errorf("unsupported webhook content type '%s'", webhookContentType) } // 处理 Webhook 请求数据 diff --git a/internal/pkg/core/notifier/providers/webhook/webhook.go b/internal/pkg/core/notifier/providers/webhook/webhook.go index 669dea2f..0e7caaa5 100644 --- a/internal/pkg/core/notifier/providers/webhook/webhook.go +++ b/internal/pkg/core/notifier/providers/webhook/webhook.go @@ -73,7 +73,7 @@ func (n *NotifierProvider) Notify(ctx context.Context, subject string, message s if err != nil { return nil, fmt.Errorf("failed to parse webhook url: %w", err) } else if webhookUrl.Scheme != "http" && webhookUrl.Scheme != "https" { - return nil, fmt.Errorf("unsupported webhook url scheme: %s", webhookUrl.Scheme) + return nil, fmt.Errorf("unsupported webhook url scheme '%s'", webhookUrl.Scheme) } // 处理 Webhook 请求谓词 @@ -85,7 +85,7 @@ func (n *NotifierProvider) Notify(ctx context.Context, subject string, message s webhookMethod != http.MethodPut && webhookMethod != http.MethodPatch && webhookMethod != http.MethodDelete { - return nil, fmt.Errorf("unsupported webhook request method: %s", webhookMethod) + return nil, fmt.Errorf("unsupported webhook request method '%s'", webhookMethod) } // 处理 Webhook 请求标头 @@ -105,7 +105,7 @@ func (n *NotifierProvider) Notify(ctx context.Context, subject string, message s } else if strings.HasPrefix(webhookContentType, CONTENT_TYPE_JSON) && strings.HasPrefix(webhookContentType, CONTENT_TYPE_FORM) && strings.HasPrefix(webhookContentType, CONTENT_TYPE_MULTIPART) { - return nil, fmt.Errorf("unsupported webhook content type: %s", webhookContentType) + return nil, fmt.Errorf("unsupported webhook content type '%s'", webhookContentType) } // 处理 Webhook 请求数据 diff --git a/internal/repository/access.go b/internal/repository/access.go index d25a6366..16cc7378 100644 --- a/internal/repository/access.go +++ b/internal/repository/access.go @@ -53,6 +53,7 @@ func (r *AccessRepository) castRecordToModel(record *core.Record) (*domain.Acces Name: record.GetString("name"), Provider: record.GetString("provider"), Config: config, + Reserve: record.GetString("reserve"), } return access, nil } diff --git a/migrations/1745726400_upgrade.go b/migrations/1745726400_upgrade.go new file mode 100644 index 00000000..e4449f36 --- /dev/null +++ b/migrations/1745726400_upgrade.go @@ -0,0 +1,88 @@ +package migrations + +import ( + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + // update collection `access` + { + collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") + if err != nil { + return err + } + + if err := collection.Fields.AddMarshaledJSONAt(4, []byte(`{ + "autogeneratePattern": "", + "hidden": false, + "id": "text2859962647", + "max": 0, + "min": 0, + "name": "reserve", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }`)); err != nil { + return err + } + + if err := app.Save(collection); err != nil { + return err + } + } + + // migrate data + { + accesses, err := app.FindAllRecords("access") + if err != nil { + return err + } + + for _, access := range accesses { + changed := false + + if access.GetString("provider") == "buypass" { + access.Set("reserve", "ca") + changed = true + } else if access.GetString("provider") == "googletrustservices" { + access.Set("reserve", "ca") + changed = true + } else if access.GetString("provider") == "sslcom" { + access.Set("reserve", "ca") + changed = true + } else if access.GetString("provider") == "zerossl" { + access.Set("reserve", "ca") + changed = true + } + + if access.GetString("provider") == "webhook" { + config := make(map[string]any) + if err := access.UnmarshalJSONField("config", &config); err != nil { + return err + } + + config["method"] = "POST" + config["headers"] = "Content-Type: application/json" + access.Set("config", config) + changed = true + } + + if changed { + err = app.Save(access) + if err != nil { + return err + } + } + } + } + + return nil + }, func(app core.App) error { + return nil + }) +} diff --git a/ui/src/components/access/AccessEditDrawer.tsx b/ui/src/components/access/AccessEditDrawer.tsx index 48002af7..7fa2f5d8 100644 --- a/ui/src/components/access/AccessEditDrawer.tsx +++ b/ui/src/components/access/AccessEditDrawer.tsx @@ -14,14 +14,14 @@ export type AccessEditDrawerProps = { data?: AccessFormProps["initialValues"]; loading?: boolean; open?: boolean; - range?: AccessFormProps["range"]; scene: AccessFormProps["scene"]; trigger?: React.ReactNode; + usage?: AccessFormProps["usage"]; onOpenChange?: (open: boolean) => void; afterSubmit?: (record: AccessModel) => void; }; -const AccessEditDrawer = ({ data, loading, trigger, scene, range, afterSubmit, ...props }: AccessEditDrawerProps) => { +const AccessEditDrawer = ({ data, loading, trigger, scene, usage, afterSubmit, ...props }: AccessEditDrawerProps) => { const { t } = useTranslation(); const [notificationApi, NotificationContextHolder] = notification.useNotification(); @@ -109,7 +109,7 @@ const AccessEditDrawer = ({ data, loading, trigger, scene, range, afterSubmit, . width={720} onClose={() => setOpen(false)} > - + ); diff --git a/ui/src/components/access/AccessEditModal.tsx b/ui/src/components/access/AccessEditModal.tsx index 0d181877..9cfb5b0f 100644 --- a/ui/src/components/access/AccessEditModal.tsx +++ b/ui/src/components/access/AccessEditModal.tsx @@ -14,14 +14,14 @@ export type AccessEditModalProps = { data?: AccessFormProps["initialValues"]; loading?: boolean; open?: boolean; - range?: AccessFormProps["range"]; + usage?: AccessFormProps["usage"]; scene: AccessFormProps["scene"]; trigger?: React.ReactNode; onOpenChange?: (open: boolean) => void; afterSubmit?: (record: AccessModel) => void; }; -const AccessEditModal = ({ data, loading, trigger, scene, range, afterSubmit, ...props }: AccessEditModalProps) => { +const AccessEditModal = ({ data, loading, trigger, scene, usage, afterSubmit, ...props }: AccessEditModalProps) => { const { t } = useTranslation(); const [notificationApi, NotificationContextHolder] = notification.useNotification(); @@ -105,7 +105,7 @@ const AccessEditModal = ({ data, loading, trigger, scene, range, afterSubmit, .. onCancel={handleCancelClick} >
- +
diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index 566c06e1..c88e5bef 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -61,16 +61,16 @@ import AccessFormWestcnConfig from "./AccessFormWestcnConfig"; import AccessFormZeroSSLConfig from "./AccessFormZeroSSLConfig"; type AccessFormFieldValues = Partial>; -type AccessFormRanges = "both-dns-hosting" | "ca-only" | "notify-only"; type AccessFormScenes = "add" | "edit"; +type AccessFormUsages = "both-dns-hosting" | "ca-only" | "notification-only"; export type AccessFormProps = { className?: string; style?: React.CSSProperties; disabled?: boolean; initialValues?: AccessFormFieldValues; - range?: AccessFormRanges; scene: AccessFormScenes; + usage?: AccessFormUsages; onValuesChange?: (values: AccessFormFieldValues) => void; }; @@ -80,7 +80,7 @@ export type AccessFormInstance = { validateFields: FormInstance["validateFields"]; }; -const AccessForm = forwardRef(({ className, style, disabled, initialValues, range, scene, onValuesChange }, ref) => { +const AccessForm = forwardRef(({ className, style, disabled, initialValues, usage, scene, onValuesChange }, ref) => { const { t } = useTranslation(); const formSchema = z.object({ @@ -91,13 +91,14 @@ const AccessForm = forwardRef(({ className, .trim(), provider: z.nativeEnum(ACCESS_PROVIDERS, { message: - range === "ca-only" + usage === "ca-only" ? t("access.form.certificate_authority.placeholder") - : range === "notify-only" + : usage === "notification-only" ? t("access.form.notification_channel.placeholder") : t("access.form.provider.placeholder"), }), config: z.any(), + reserve: z.string().nullish(), }); const formRule = createSchemaFieldRule(formSchema); const { form: formInst, formProps } = useAntdForm({ @@ -105,33 +106,33 @@ const AccessForm = forwardRef(({ className, }); const providerLabel = useMemo(() => { - switch (range) { + switch (usage) { case "ca-only": return t("access.form.certificate_authority.label"); - case "notify-only": + case "notification-only": return t("access.form.notification_channel.label"); } return t("access.form.provider.label"); - }, [range]); + }, [usage]); const providerPlaceholder = useMemo(() => { - switch (range) { + switch (usage) { case "ca-only": return t("access.form.certificate_authority.placeholder"); - case "notify-only": + case "notification-only": return t("access.form.notification_channel.placeholder"); } return t("access.form.provider.placeholder"); - }, [range]); + }, [usage]); const providerTooltip = useMemo(() => { - switch (range) { + switch (usage) { case "both-dns-hosting": return ; } return undefined; - }, [range]); + }, [usage]); const fieldProvider = Form.useWatch("provider", formInst); @@ -269,6 +270,7 @@ const AccessForm = forwardRef(({ className, getFieldsValue: () => { const values = formInst.getFieldsValue(true); values.config = nestedFormInst.getFieldsValue(); + values.reserve = usage === "ca-only" ? "ca" : usage === "notification-only" ? "notification" : undefined; return values; }, resetFields: (fields) => { @@ -297,20 +299,20 @@ const AccessForm = forwardRef(({ className, { - if (range == null) return true; + if (usage == null) return true; - switch (range) { + switch (usage) { case "both-dns-hosting": return record.usages.includes(ACCESS_USAGES.DNS) || record.usages.includes(ACCESS_USAGES.HOSTING); case "ca-only": return record.usages.includes(ACCESS_USAGES.CA); - case "notify-only": + case "notification-only": return record.usages.includes(ACCESS_USAGES.NOTIFICATION); } }} disabled={scene !== "add"} placeholder={providerPlaceholder} - showOptionTags={range == null || (range === "both-dns-hosting" ? { [ACCESS_USAGES.DNS]: true, [ACCESS_USAGES.HOSTING]: true } : false)} + showOptionTags={usage == null || (usage === "both-dns-hosting" ? { [ACCESS_USAGES.DNS]: true, [ACCESS_USAGES.HOSTING]: true } : false)} showSearch={!disabled} /> diff --git a/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx b/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx index fc76f302..bc506d2e 100644 --- a/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx +++ b/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx @@ -352,7 +352,6 @@ const ApplyNodeConfigForm = forwardRef
@@ -360,6 +359,7 @@ const ApplyNodeConfigForm = forwardRef } + usage="both-dns-hosting" afterSubmit={(record) => { const provider = accessProvidersMap.get(record.provider); if (provider?.usages?.includes(ACCESS_USAGES.DNS)) { @@ -374,6 +374,8 @@ const ApplyNodeConfigForm = forwardRef { + if (record.reserve) return false; + const provider = accessProvidersMap.get(record.provider); return !!provider?.usages?.includes(ACCESS_USAGES.DNS); }} @@ -429,7 +431,6 @@ const ApplyNodeConfigForm = forwardRef @@ -437,6 +438,7 @@ const ApplyNodeConfigForm = forwardRef } + usage="ca-only" afterSubmit={(record) => { const provider = accessProvidersMap.get(record.provider); if (provider?.usages?.includes(ACCESS_USAGES.CA)) { @@ -450,9 +452,8 @@ const ApplyNodeConfigForm = forwardRef { - if (fieldCAProvider) { - return caProvidersMap.get(fieldCAProvider)?.provider === record.provider; - } + if (!!record.reserve && record.reserve !== "ca") return false; + if (fieldCAProvider) return caProvidersMap.get(fieldCAProvider)?.provider === record.provider; const provider = accessProvidersMap.get(record.provider); return !!provider?.usages?.includes(ACCESS_USAGES.CA); diff --git a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx index 54f855c5..6a3a944e 100644 --- a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx +++ b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx @@ -409,7 +409,6 @@ const DeployNodeConfigForm = forwardRef @@ -417,6 +416,7 @@ const DeployNodeConfigForm = forwardRef } + usage="both-dns-hosting" afterSubmit={(record) => { const provider = accessProvidersMap.get(record.provider); if (provider?.usages?.includes(ACCESS_USAGES.HOSTING)) { @@ -430,9 +430,8 @@ const DeployNodeConfigForm = forwardRef { - if (fieldProvider) { - return deploymentProvidersMap.get(fieldProvider)?.provider === record.provider; - } + if (record.reserve) return false; + if (fieldProvider) return deploymentProvidersMap.get(fieldProvider)?.provider === record.provider; const provider = accessProvidersMap.get(record.provider); return !!provider?.usages?.includes(ACCESS_USAGES.HOSTING); diff --git a/ui/src/components/workflow/node/NotifyNodeConfigForm.tsx b/ui/src/components/workflow/node/NotifyNodeConfigForm.tsx index 6e308fad..71110e32 100644 --- a/ui/src/components/workflow/node/NotifyNodeConfigForm.tsx +++ b/ui/src/components/workflow/node/NotifyNodeConfigForm.tsx @@ -228,7 +228,6 @@ const NotifyNodeConfigForm = forwardRef
@@ -236,6 +235,7 @@ const NotifyNodeConfigForm = forwardRef } + usage="notification-only" afterSubmit={(record) => { const provider = accessProvidersMap.get(record.provider); if (provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION)) { @@ -250,6 +250,8 @@ const NotifyNodeConfigForm = forwardRef { + if (!!record.reserve && record.reserve !== "notification") return false; + const provider = accessProvidersMap.get(record.provider); return !!provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION); }} diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts index 02264a95..9396e892 100644 --- a/ui/src/domain/access.ts +++ b/ui/src/domain/access.ts @@ -56,6 +56,7 @@ export interface AccessModel extends BaseModel { | AccessConfigForWestcn | AccessConfigForZeroSSL ); + reserve?: "ca" | "notification"; } // #region AccessConfig @@ -310,8 +311,8 @@ export type AccessConfigForWebhook = { method: string; headers?: string; allowInsecureConnections?: boolean; - templateDataForDeployment?: string; - templateDataForNotification?: string; + defaultDataForDeployment?: string; + defaultDataForNotification?: string; }; export type AccessConfigForWestcn = { diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index 932a76a5..20144481 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -18,9 +18,9 @@ "access.props.provider.usage.ca": "Certificate authority", "access.props.provider.usage.notification": "Notification channel", "access.props.provider.builtin": "Built-in", - "access.props.range.both_dns_hosting": "Provider", - "access.props.range.ca_only": "Certificate authority", - "access.props.range.notify_only": "Notification channel", + "access.props.usage.both_dns_hosting": "Provider", + "access.props.usage.ca_only": "Certificate authority", + "access.props.usage.notification_only": "Notification channel", "access.props.created_at": "Created at", "access.props.updated_at": "Updated at", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index 6ac1a80d..9de079d1 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -18,9 +18,9 @@ "access.props.provider.usage.ca": "证书颁发机构", "access.props.provider.usage.notification": "通知渠道", "access.props.provider.builtin": "内置", - "access.props.range.both_dns_hosting": "提供商", - "access.props.range.ca_only": "证书颁发机构", - "access.props.range.notify_only": "通知渠道", + "access.props.usage.both_dns_hosting": "提供商", + "access.props.usage.ca_only": "证书颁发机构", + "access.props.usage.notification_only": "通知渠道", "access.props.created_at": "创建时间", "access.props.updated_at": "更新时间", diff --git a/ui/src/pages/accesses/AccessList.tsx b/ui/src/pages/accesses/AccessList.tsx index 7b5da2c3..f815812e 100644 --- a/ui/src/pages/accesses/AccessList.tsx +++ b/ui/src/pages/accesses/AccessList.tsx @@ -21,7 +21,7 @@ import { useZustandShallowSelector } from "@/hooks"; import { useAccessesStore } from "@/stores/access"; import { getErrMsg } from "@/utils/error"; -type AccessRanges = AccessEditDrawerProps["range"]; +type AccessUsageProp = AccessEditDrawerProps["usage"]; const AccessList = () => { const [searchParams] = useSearchParams(); @@ -87,7 +87,7 @@ const AccessList = () => { @@ -98,7 +98,7 @@ const AccessList = () => { @@ -126,7 +126,7 @@ const AccessList = () => { const [filters, setFilters] = useState>(() => { return { - range: "both-dns-hosting" satisfies AccessRanges, + usage: "both-dns-hosting" satisfies AccessUsageProp, keyword: searchParams.get("keyword"), }; }); @@ -160,13 +160,13 @@ const AccessList = () => { }) .filter((e) => { const provider = accessProvidersMap.get(e.provider); - switch (filters["range"] as AccessRanges) { + switch (filters["usage"] as AccessUsageProp) { case "both-dns-hosting": - return provider?.usages?.includes(ACCESS_USAGES.DNS) || provider?.usages?.includes(ACCESS_USAGES.HOSTING); + return !e.reserve && (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 e.reserve === "ca" && provider?.usages?.includes(ACCESS_USAGES.CA); + case "notification-only": + return e.reserve === "notification" && provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION); } }); return Promise.resolve({ @@ -184,7 +184,7 @@ const AccessList = () => { ); const handleTabChange = (key: string) => { - setFilters((prev) => ({ ...prev, range: key })); + setFilters((prev) => ({ ...prev, usage: key })); setPage(1); }; @@ -226,7 +226,7 @@ const AccessList = () => { extra={[ }> @@ -247,18 +247,18 @@ const AccessList = () => { tabList={[ { key: "both-dns-hosting", - label: t("access.props.range.both_dns_hosting"), + label: t("access.props.usage.both_dns_hosting"), }, { key: "ca-only", - label: t("access.props.range.ca_only"), + label: t("access.props.usage.ca_only"), }, { - key: "notify-only", - label: t("access.props.range.notify_only"), + key: "notification-only", + label: t("access.props.usage.notification_only"), }, ]} - activeTabKey={filters["range"] as string} + activeTabKey={filters["usage"] as string} onTabChange={(key) => handleTabChange(key)} />