From 2712f9a3f4979bf8668ccd0bce53fd7d7c95835b Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 18 Dec 2024 16:10:47 +0800 Subject: [PATCH] feat(ui): new AccessSelect component using antd --- .../access/AccessEditFormSSHConfig.tsx | 3 +- ui/src/components/access/AccessSelect.tsx | 75 +++++++++++++++++++ ui/src/components/access/AccessTypeSelect.tsx | 5 +- ui/src/i18n/locales/zh/nls.access.json | 2 +- ui/src/i18n/locales/zh/nls.domain.json | 8 +- 5 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 ui/src/components/access/AccessSelect.tsx diff --git a/ui/src/components/access/AccessEditFormSSHConfig.tsx b/ui/src/components/access/AccessEditFormSSHConfig.tsx index 4d9c8d9b..4c6d2dd1 100644 --- a/ui/src/components/access/AccessEditFormSSHConfig.tsx +++ b/ui/src/components/access/AccessEditFormSSHConfig.tsx @@ -66,7 +66,8 @@ const AccessEditFormSSHConfig = ({ form, disabled, loading, model, onModelChange .string() .min(0, "access.form.ssh_key_passphrase.placeholder") .max(20480, t("common.errmsg.string_max", { max: 20480 })) - .nullish(), + .nullish() + .refine((v) => !v || form.getFieldValue("key"), { message: t("access.form.ssh_key.placeholder") }), }); const formRule = createSchemaFieldRule(formSchema); diff --git a/ui/src/components/access/AccessSelect.tsx b/ui/src/components/access/AccessSelect.tsx new file mode 100644 index 00000000..3b0272cf --- /dev/null +++ b/ui/src/components/access/AccessSelect.tsx @@ -0,0 +1,75 @@ +import { useEffect, useState } from "react"; +import { Avatar, Select, Space, Typography, type SelectProps } from "antd"; + +import { accessProvidersMap, type AccessModel } from "@/domain/access"; +import { useAccessStore } from "@/stores/access"; + +export type AccessTypeSelectProps = Omit< + SelectProps, + "filterOption" | "filterSort" | "labelRender" | "options" | "optionFilterProp" | "optionLabelProp" | "optionRender" +> & { + filter?: (record: AccessModel) => boolean; +}; + +const AccessSelect = ({ filter, ...props }: AccessTypeSelectProps) => { + const { accesses, fetchAccesses } = useAccessStore(); + useEffect(() => { + fetchAccesses(); + }, [fetchAccesses]); + + const [options, setOptions] = useState>([]); + useEffect(() => { + const items = filter != null ? accesses.filter(filter) : accesses; + setOptions( + items.map((item) => ({ + key: item.id, + value: item.id, + label: item.name, + data: item, + })) + ); + }, [accesses, filter]); + + const renderOption = (key: string) => { + const access = accesses.find((e) => e.id === key); + if (!access) { + return ( + + + + {key} + + + ); + } + + const provider = accessProvidersMap.get(access.configType); + return ( + + + + {access.name} + + + ); + }; + + return ( +