From 7936c34472f15167bc8065ce35775f291626d18c Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 12 May 2025 20:17:36 +0800 Subject: [PATCH 01/13] fix #672 --- .../deployer/providers/gcore-cdn/gcore_cdn.go | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go b/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go index 2f36c35a..66e56796 100644 --- a/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go +++ b/internal/pkg/core/deployer/providers/gcore-cdn/gcore_cdn.go @@ -7,8 +7,9 @@ import ( "log/slog" "strconv" + "github.com/G-Core/gcorelabscdn-go/gcore" gprovider "github.com/G-Core/gcorelabscdn-go/gcore/provider" - gresources "github.com/G-Core/gcorelabscdn-go/resources" + "github.com/G-Core/gcorelabscdn-go/resources" "github.com/usual2970/certimate/internal/pkg/core/deployer" "github.com/usual2970/certimate/internal/pkg/core/uploader" @@ -26,7 +27,7 @@ type DeployerConfig struct { type DeployerProvider struct { config *DeployerConfig logger *slog.Logger - sdkClient *gresources.Service + sdkClient *resources.Service sslUploader uploader.Uploader } @@ -91,7 +92,7 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE // 更新 CDN 资源详情 // REF: https://api.gcore.com/docs/cdn#tag/CDN-resources/operation/change_cdn_resource updateResourceCertId, _ := strconv.ParseInt(upres.CertId, 10, 64) - updateResourceReq := &gresources.UpdateRequest{ + updateResourceReq := &resources.UpdateRequest{ Description: getResourceResp.Description, Active: getResourceResp.Active, OriginGroup: int(getResourceResp.OriginGroup), @@ -100,6 +101,7 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE SSlEnabled: true, SSLData: int(updateResourceCertId), ProxySSLEnabled: getResourceResp.ProxySSLEnabled, + Options: &gcore.Options{}, } if getResourceResp.ProxySSLCA != 0 { updateResourceReq.ProxySSLCA = &getResourceResp.ProxySSLCA @@ -107,9 +109,6 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE if getResourceResp.ProxySSLData != 0 { updateResourceReq.ProxySSLData = &getResourceResp.ProxySSLData } - if getResourceResp.Options != nil { - updateResourceReq.Options = getResourceResp.Options - } updateResourceResp, err := d.sdkClient.Update(context.TODO(), d.config.ResourceId, updateResourceReq) d.logger.Debug("sdk request 'resources.Update'", slog.Int64("resourceId", d.config.ResourceId), slog.Any("request", updateResourceReq), slog.Any("response", updateResourceResp)) if err != nil { @@ -119,7 +118,7 @@ func (d *DeployerProvider) Deploy(ctx context.Context, certPEM string, privkeyPE return &deployer.DeployResult{}, nil } -func createSdkClient(apiToken string) (*gresources.Service, error) { +func createSdkClient(apiToken string) (*resources.Service, error) { if apiToken == "" { return nil, errors.New("invalid gcore api token") } @@ -128,6 +127,6 @@ func createSdkClient(apiToken string) (*gresources.Service, error) { gcoresdk.BASE_URL, gprovider.WithSigner(gcoresdk.NewAuthRequestSigner(apiToken)), ) - service := gresources.NewService(requester) + service := resources.NewService(requester) return service, nil } From fdee69bdafb1ec73d538fb6027336f07e24e656b Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 12 May 2025 21:34:00 +0800 Subject: [PATCH 02/13] feat(ui): move settings page entry from topbar to sider-menu --- ui/src/i18n/locales/en/nls.common.json | 1 - ui/src/i18n/locales/zh/nls.common.json | 1 - ui/src/pages/ConsoleLayout.tsx | 9 ++------- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json index 0c3cd5df..32241963 100644 --- a/ui/src/i18n/locales/en/nls.common.json +++ b/ui/src/i18n/locales/en/nls.common.json @@ -20,7 +20,6 @@ "common.menu.theme": "Change theme", "common.menu.locale": "Change language", - "common.menu.settings": "Settings", "common.menu.logout": "Log-out", "common.menu.document": "Document", diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json index fe3a9e06..8458c5b5 100644 --- a/ui/src/i18n/locales/zh/nls.common.json +++ b/ui/src/i18n/locales/zh/nls.common.json @@ -20,7 +20,6 @@ "common.menu.theme": "切换主题", "common.menu.locale": "切换语言", - "common.menu.settings": "系统设置", "common.menu.logout": "退出登录", "common.menu.document": "文档", diff --git a/ui/src/pages/ConsoleLayout.tsx b/ui/src/pages/ConsoleLayout.tsx index 4fbaf492..ed9d635f 100644 --- a/ui/src/pages/ConsoleLayout.tsx +++ b/ui/src/pages/ConsoleLayout.tsx @@ -31,10 +31,6 @@ const ConsoleLayout = () => { navigate("/login"); }; - const handleSettingsClick = () => { - navigate("/settings/account"); - }; - const auth = getAuthStore(); if (!auth.isValid || !auth.isSuperuser) { return ; @@ -66,9 +62,6 @@ const ConsoleLayout = () => { - - diff --git a/ui/src/components/access/AccessEditModal.tsx b/ui/src/components/access/AccessEditModal.tsx index 9cfb5b0f..79edb113 100644 --- a/ui/src/components/access/AccessEditModal.tsx +++ b/ui/src/components/access/AccessEditModal.tsx @@ -95,7 +95,7 @@ const AccessEditModal = ({ data, loading, trigger, scene, usage, afterSubmit, .. cancelButtonProps={{ disabled: formPending }} closable confirmLoading={formPending} - destroyOnClose + destroyOnHidden loading={loading} okText={scene === "edit" ? t("common.button.save") : t("common.button.submit")} open={open} diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index 5f82ad67..02a71854 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -1,12 +1,14 @@ -import { forwardRef, useImperativeHandle, useMemo } from "react"; +import { forwardRef, useImperativeHandle, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { Form, type FormInstance, Input } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; +import AccessProviderPicker from "@/components/provider/AccessProviderPicker"; import AccessProviderSelect from "@/components/provider/AccessProviderSelect"; +import Show from "@/components/Show"; import { type AccessModel } from "@/domain/access"; -import { ACCESS_PROVIDERS, ACCESS_USAGES } from "@/domain/provider"; +import { ACCESS_PROVIDERS, ACCESS_USAGES, type AccessProvider } from "@/domain/provider"; import { useAntdForm, useAntdFormName } from "@/hooks"; import AccessForm1PanelConfig from "./AccessForm1PanelConfig"; @@ -107,9 +109,22 @@ const AccessForm = forwardRef(({ className, }); const formRule = createSchemaFieldRule(formSchema); const { form: formInst, formProps } = useAntdForm({ + name: "accessForm", initialValues: initialValues, }); + const providerFilter = useMemo(() => { + switch (usage) { + case "both-dns-hosting": + return (record: AccessProvider) => record.usages.includes(ACCESS_USAGES.DNS) || record.usages.includes(ACCESS_USAGES.HOSTING); + case "ca-only": + return (record: AccessProvider) => record.usages.includes(ACCESS_USAGES.CA); + case "notification-only": + return (record: AccessProvider) => record.usages.includes(ACCESS_USAGES.NOTIFICATION); + } + + return undefined; + }, [usage]); const providerLabel = useMemo(() => { switch (usage) { case "ca-only": @@ -139,10 +154,11 @@ const AccessForm = forwardRef(({ className, return undefined; }, [usage]); - const fieldProvider = Form.useWatch("provider", formInst); + const fieldProvider = Form.useWatch["provider"]>("provider", formInst); + const [fieldProviderPicked, setFieldProviderPicked] = useState(initialValues?.provider); // bugfix: Form.useWatch 在条件渲染下不生效,这里用单独的变量存放 Picker 组件选择的值 const [nestedFormInst] = Form.useForm(); - const nestedFormName = useAntdFormName({ form: nestedFormInst, name: "accessEditFormConfigForm" }); + const nestedFormName = useAntdFormName({ form: nestedFormInst, name: "accessConfigForm" }); const nestedFormEl = useMemo(() => { const nestedFormProps = { form: nestedFormInst, @@ -272,7 +288,13 @@ const AccessForm = forwardRef(({ className, case ACCESS_PROVIDERS.ZEROSSL: return ; } - }, [disabled, initialValues?.config, fieldProvider, nestedFormInst, nestedFormName]); + }, [usage, disabled, initialValues?.config, fieldProvider, nestedFormInst, nestedFormName]); + + const handleProviderPick = (value: string) => { + setFieldProviderPicked(value); + formInst.setFieldValue("provider", value); + onValuesChange?.(formInst.getFieldsValue(true)); + }; const handleFormProviderChange = (name: string) => { if (name === nestedFormName) { @@ -312,30 +334,32 @@ const AccessForm = forwardRef(({ className,
- - - + + } + > + + + - - { - if (usage == null) return true; - - 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 "notification-only": - return record.usages.includes(ACCESS_USAGES.NOTIFICATION); - } - }} - disabled={scene !== "add"} - placeholder={providerPlaceholder} - showOptionTags={usage == null || (usage === "both-dns-hosting" ? { [ACCESS_USAGES.DNS]: true, [ACCESS_USAGES.HOSTING]: true } : false)} - showSearch={!disabled} - /> - + + + +
{nestedFormEl} diff --git a/ui/src/components/access/AccessFormWebhookConfig.tsx b/ui/src/components/access/AccessFormWebhookConfig.tsx index 4bbc6754..0108d7b3 100644 --- a/ui/src/components/access/AccessFormWebhookConfig.tsx +++ b/ui/src/components/access/AccessFormWebhookConfig.tsx @@ -283,7 +283,7 @@ const AccessFormWebhookConfig = ({ form: formInst, formName, disabled, initialVa - +