From 07664b5f224adbb376175e9c996b299fb495c625 Mon Sep 17 00:00:00 2001 From: jialin Date: Wed, 11 Feb 2026 22:49:07 +0800 Subject: [PATCH] chore: quick create route --- src/atoms/routes.ts | 6 ++ src/components/seal-form/seal-textarea.tsx | 2 - src/locales/en-US/clusters.ts | 4 +- src/locales/en-US/provider.ts | 3 +- src/locales/ja-JP/clusters.ts | 8 +- src/locales/ja-JP/provider.ts | 3 +- src/locales/ru-RU/clusters.ts | 4 +- src/locales/ru-RU/provider.ts | 3 +- src/locales/zh-CN/clusters.ts | 4 +- src/locales/zh-CN/provider.ts | 3 +- src/pages/maas-provider/config/index.ts | 5 ++ .../maas-provider/forms/supported-models.tsx | 4 +- .../hooks/use-provider-columns.tsx | 14 +++- .../maas-provider/hooks/use-register-route.ts | 36 +++++++++ src/pages/maas-provider/index.tsx | 12 +-- .../components/add-route-modal.tsx | 4 + src/pages/model-routes/config/form-context.ts | 1 + src/pages/model-routes/forms/index.tsx | 73 +++++++++++++++---- src/pages/model-routes/forms/targets.tsx | 7 ++ .../model-routes/hooks/use-create-route.ts | 18 +++++ src/pages/model-routes/index.tsx | 35 ++++++++- 21 files changed, 202 insertions(+), 47 deletions(-) create mode 100644 src/atoms/routes.ts create mode 100644 src/pages/maas-provider/hooks/use-register-route.ts diff --git a/src/atoms/routes.ts b/src/atoms/routes.ts new file mode 100644 index 00000000..35d524b1 --- /dev/null +++ b/src/atoms/routes.ts @@ -0,0 +1,6 @@ +import { atom } from 'jotai'; + +export const registerRouteConfigAtom = atom>({ + initialValues: null, + create: false +}); diff --git a/src/components/seal-form/seal-textarea.tsx b/src/components/seal-form/seal-textarea.tsx index bfe3ea46..c0e9f357 100644 --- a/src/components/seal-form/seal-textarea.tsx +++ b/src/components/seal-form/seal-textarea.tsx @@ -96,8 +96,6 @@ const SealTextArea: React.FC = ( onInput?.(e); }; - console.log('style=========', style, rest); - return ( /opt/hyhal or /opt/dtk does not exist, create symbolic links pointing to the corresponding Hygon installation paths, for example: ln -s /path/to/hyhal /opt/hyhal ln -s /path/to/dtk /opt/dtk.`, - 'clusters.addworker.corexNotes': `If the /lib/modules directory does not exist, create a symbolic link to the Iluvatar installation path: + 'clusters.addworker.corexNotes': `If the /lib/modules directory does not exist, create a symbolic link to the Iluvatar SDK installation path: ln -s /path/to/corex /lib/modules. Same applies to the /usr/local/corex directory.`, - 'clusters.addworker.metaxNotes': `If the /opt/mxdriver directory does not exist, create a symbolic link to the MetaX installation path: + 'clusters.addworker.metaxNotes': `If the /opt/mxdriver directory does not exist, create a symbolic link to the MetaX driver and SDK installation path: ln -s /path/to/metax /opt/mxdriver. Same applies to the /opt/maca directory.`, 'clusters.addworker.cambriconNotes': `If the /usr/local/neuware directory does not exist, create a symbolic link to the Cambricon installation path: ln -s /path/to/neuware /usr/local/neuware.`, diff --git a/src/locales/en-US/provider.ts b/src/locales/en-US/provider.ts index 4270f4b4..7354a73c 100644 --- a/src/locales/en-US/provider.ts +++ b/src/locales/en-US/provider.ts @@ -22,5 +22,6 @@ export default { 'providers.form.rules.models': 'Please select at least one model', 'providers.form.rules.tokens': 'Please enter a valid API Key', 'providers.form.rules.model': 'Please select a model', - 'providers.form.model.duplicate': 'Duplicate model exists' + 'providers.form.model.duplicate': 'Duplicate model exists', + 'providers.table.registerRoute': 'Register Route' }; diff --git a/src/locales/ja-JP/clusters.ts b/src/locales/ja-JP/clusters.ts index 05c6c032..d5bf7be7 100644 --- a/src/locales/ja-JP/clusters.ts +++ b/src/locales/ja-JP/clusters.ts @@ -52,9 +52,9 @@ export default { 'clusters.addworker.nvidiaNotes-02': 'If a model directory already exists on the worker, you can specify the path to mount it.', 'clusters.addworker.hygonNotes': `If /opt/hyhal or /opt/dtk does not exist, create symbolic links pointing to the corresponding Hygon installation paths, for example: ln -s /path/to/hyhal /opt/hyhal ln -s /path/to/dtk /opt/dtk.`, - 'clusters.addworker.corexNotes': `If the /lib/modules directory does not exist, create a symbolic link to the Iluvatar installation path: + 'clusters.addworker.corexNotes': `If the /lib/modules directory does not exist, create a symbolic link to the Iluvatar SDK installation path: ln -s /path/to/corex /lib/modules. Same applies to the /usr/local/corex directory.`, - 'clusters.addworker.metaxNotes': `If the /opt/mxdriver directory does not exist, create a symbolic link to the MetaX installation path: + 'clusters.addworker.metaxNotes': `If the /opt/mxdriver directory does not exist, create a symbolic link to the MetaX driver and SDK installation path: ln -s /path/to/metax /opt/mxdriver. Same applies to the /opt/maca directory.`, 'clusters.addworker.cambriconNotes': `If the /usr/local/neuware directory does not exist, create a symbolic link to the Cambricon installation path: ln -s /path/to/neuware /usr/local/neuware.`, @@ -179,8 +179,8 @@ export default { // 44. 'clusters.addworker.nvidiaNotes-01': 'If multiple outbound IPs exist, specify the one you want the worker to use. Please double-check with hostname -I | xargs -n1.', // 45. 'clusters.addworker.nvidiaNotes-02': 'If a model directory already exists on the worker, you can specify the path to mount it.', // 46. 'clusters.addworker.hygonNotes': `If /opt/hyhal or /opt/dtk does not exist, create symbolic links pointing to the corresponding Hygon installation paths, for example: ln -s /path/to/hyhal /opt/hyhal ln -s /path/to/dtk /opt/dtk.`, -// 47. 'clusters.addworker.corexNotes': 'If the /lib/modules directory does not exist, create a symbolic link to the Iluvatar installation path: ln -s /path/to/corex /lib/modules. Same applies to the /usr/local/corex directory.', -// 48. 'clusters.addworker.metaxNotes': 'If the /opt/mxdriver directory does not exist, create a symbolic link to the MetaX installation path: ln -s /path/to/metax /opt/mxdriver. Same applies to the /opt/maca directory.', +// 47. 'clusters.addworker.corexNotes': 'If the /lib/modules directory does not exist, create a symbolic link to the Iluvatar SDK installation path: ln -s /path/to/corex /lib/modules. Same applies to the /usr/local/corex directory.', +// 48. 'clusters.addworker.metaxNotes': 'If the /opt/mxdriver directory does not exist, create a symbolic link to the MetaX driver and SDK installation path: ln -s /path/to/metax /opt/mxdriver. Same applies to the /opt/maca directory.', // 49. 'clusters.addworker.cambriconNotes': 'If the /usr/local/neuware directory does not exist, create a symbolic link to the Cambricon installation path: ln -s /path/to/neuware /usr/local/neuware.' // 50. 'clusters.addworker.hygonNotes-02': 'If device detection fails, try removing --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib.', // 51. 'clusters.addworker.selectCluster': 'Select Cluster', diff --git a/src/locales/ja-JP/provider.ts b/src/locales/ja-JP/provider.ts index 4270f4b4..7354a73c 100644 --- a/src/locales/ja-JP/provider.ts +++ b/src/locales/ja-JP/provider.ts @@ -22,5 +22,6 @@ export default { 'providers.form.rules.models': 'Please select at least one model', 'providers.form.rules.tokens': 'Please enter a valid API Key', 'providers.form.rules.model': 'Please select a model', - 'providers.form.model.duplicate': 'Duplicate model exists' + 'providers.form.model.duplicate': 'Duplicate model exists', + 'providers.table.registerRoute': 'Register Route' }; diff --git a/src/locales/ru-RU/clusters.ts b/src/locales/ru-RU/clusters.ts index ca9da0ca..1f14a389 100644 --- a/src/locales/ru-RU/clusters.ts +++ b/src/locales/ru-RU/clusters.ts @@ -53,9 +53,9 @@ export default { 'Если директория с моделями уже существует на воркере, вы можете указать путь для её монтирования.', 'clusters.addworker.hygonNotes': `If /opt/hyhal or /opt/dtk does not exist, create symbolic links pointing to the corresponding Hygon installation paths, for example: ln -s /path/to/hyhal /opt/hyhal ln -s /path/to/dtk /opt/dtk.`, 'clusters.addworker.corexNotes': - 'Если директория /lib/modules не существует, создайте символическую ссылку на путь установки Iluvatar: ln -s /path/to/corex /lib/modules. Аналогично для директории /usr/local/corex.', + 'Если директория /lib/modules не существует, создайте символическую ссылку на путь установки Iluvatar SDK: ln -s /path/to/corex /lib/modules. Аналогично для директории /usr/local/corex.', 'clusters.addworker.metaxNotes': - 'Если директория /opt/mxdriver не существует, создайте символическую ссылку на путь установки MetaX: ln -s /path/to/metax /opt/mxdriver. Аналогично для директории /opt/maca.', + 'Если директория /opt/mxdriver не существует, создайте символическую ссылку на путь установки MetaX SDK: ln -s /path/to/metax /opt/mxdriver. Аналогично для директории /opt/maca.', 'clusters.addworker.cambriconNotes': 'Если директория /usr/local/neuware не существует, создайте символическую ссылку на путь установки Cambricon: ln -s /path/to/neuware /usr/local/neuware.', 'clusters.addworker.hygonNotes-02': diff --git a/src/locales/ru-RU/provider.ts b/src/locales/ru-RU/provider.ts index 4270f4b4..7354a73c 100644 --- a/src/locales/ru-RU/provider.ts +++ b/src/locales/ru-RU/provider.ts @@ -22,5 +22,6 @@ export default { 'providers.form.rules.models': 'Please select at least one model', 'providers.form.rules.tokens': 'Please enter a valid API Key', 'providers.form.rules.model': 'Please select a model', - 'providers.form.model.duplicate': 'Duplicate model exists' + 'providers.form.model.duplicate': 'Duplicate model exists', + 'providers.table.registerRoute': 'Register Route' }; diff --git a/src/locales/zh-CN/clusters.ts b/src/locales/zh-CN/clusters.ts index 70f5032e..208618c6 100644 --- a/src/locales/zh-CN/clusters.ts +++ b/src/locales/zh-CN/clusters.ts @@ -53,9 +53,9 @@ export default { ln -s /path/to/hyhal /opt/hyhal ln -s /path/to/dtk /opt/dtk`, 'clusters.addworker.corexNotes': - '如果 /lib/modules 目录不存在,请创建指向天数智芯安装路径的符号链接:ln -s /path/to/corex /lib/modules。与 /usr/local/corex 目录相同。', + '如果 /lib/modules 目录不存在,请创建指向天数智芯 SDK 安装路径的符号链接:ln -s /path/to/corex /lib/modules。与 /usr/local/corex 目录相同。', 'clusters.addworker.metaxNotes': - '如果 /opt/mxdriver 目录不存在,请创建指向沐曦安装路径的符号链接:ln -s /path/to/metax /opt/mxdriver。与 /opt/maca 目录相同。', + '如果 /opt/mxdriver 目录不存在,请创建指向沐曦驱动和 SDK 安装路径的符号链接:ln -s /path/to/metax /opt/mxdriver。与 /opt/maca 目录相同。', 'clusters.addworker.cambriconNotes': '如果 /usr/local/neuware 目录不存在,请创建指向寒武纪安装路径的符号链接:ln -s /path/to/neuware /usr/local/neuware。', 'clusters.addworker.hygonNotes-02': diff --git a/src/locales/zh-CN/provider.ts b/src/locales/zh-CN/provider.ts index 6b624ecc..bb188522 100644 --- a/src/locales/zh-CN/provider.ts +++ b/src/locales/zh-CN/provider.ts @@ -22,5 +22,6 @@ export default { 'providers.form.rules.models': '请选择至少一个模型', 'providers.form.rules.tokens': '请输入有效的 API Key', 'providers.form.rules.model': '请选择模型', - 'providers.form.model.duplicate': '存在相同的模型' + 'providers.form.model.duplicate': '存在相同的模型', + 'providers.table.registerRoute': '注册路由' }; diff --git a/src/pages/maas-provider/config/index.ts b/src/pages/maas-provider/config/index.ts index 53773269..92341658 100644 --- a/src/pages/maas-provider/config/index.ts +++ b/src/pages/maas-provider/config/index.ts @@ -30,6 +30,11 @@ export const rowActionList = [ label: 'common.button.edit', icon: icons.EditOutlined }, + { + key: 'registerRoute', + label: 'providers.table.registerRoute', + icon: icons.CaptivePortal + }, { key: 'copy', label: 'common.button.clone', diff --git a/src/pages/maas-provider/forms/supported-models.tsx b/src/pages/maas-provider/forms/supported-models.tsx index 895f2af4..20a6828c 100644 --- a/src/pages/maas-provider/forms/supported-models.tsx +++ b/src/pages/maas-provider/forms/supported-models.tsx @@ -98,7 +98,7 @@ const SupportedModels = () => { if (!value || value.length === 0) { return Promise.reject( new Error( - getRuleMessage('input', 'providers.form.rules.models') + intl.formatMessage({ id: 'providers.form.rules.models' }) ) ); } @@ -106,7 +106,7 @@ const SupportedModels = () => { if (value.some((item: ProviderModel) => !item.name)) { return Promise.reject( new Error( - getRuleMessage('select', 'providers.form.rules.model') + intl.formatMessage({ id: 'providers.form.rules.model' }) ) ); } diff --git a/src/pages/maas-provider/hooks/use-provider-columns.tsx b/src/pages/maas-provider/hooks/use-provider-columns.tsx index 88d55803..f3ccfd60 100644 --- a/src/pages/maas-provider/hooks/use-provider-columns.tsx +++ b/src/pages/maas-provider/hooks/use-provider-columns.tsx @@ -1,10 +1,10 @@ // columns.ts import AutoTooltip from '@/components/auto-tooltip'; import DropdownButtons from '@/components/drop-down-buttons'; -import { SealColumnProps } from '@/components/seal-table/types'; import { tableSorter } from '@/config/settings'; import { useIntl } from '@umijs/max'; import { Tag } from 'antd'; +import { ColumnsType } from 'antd/lib/table'; import dayjs from 'dayjs'; import { useMemo } from 'react'; import ProviderLogo from '../components/provider-logo'; @@ -16,10 +16,18 @@ import { MaasProviderItem, ProviderModel } from '../config/types'; const useProviderColumns = ( handleSelect: (val: string, record: MaasProviderItem) => void, onCellClick?: (record: MaasProviderItem, dataIndex: string) => void -): SealColumnProps[] => { +): ColumnsType => { const intl = useIntl(); return useMemo(() => { + const setActionList = (record: MaasProviderItem) => { + return rowActionList.filter((action) => { + if (action.key === 'registerRoute') { + return record.models && record.models.length > 0; + } + return true; + }); + }; return [ { title: intl.formatMessage({ id: 'common.table.name' }), @@ -84,7 +92,7 @@ const useProviderColumns = ( minWidth: 120, render: (value: string, record: MaasProviderItem) => ( handleSelect(val, record)} > ) diff --git a/src/pages/maas-provider/hooks/use-register-route.ts b/src/pages/maas-provider/hooks/use-register-route.ts new file mode 100644 index 00000000..794b15cb --- /dev/null +++ b/src/pages/maas-provider/hooks/use-register-route.ts @@ -0,0 +1,36 @@ +import { registerRouteConfigAtom } from '@/atoms/routes'; +import { modelCategoriesMap } from '@/pages/llmodels/config'; +import { useNavigate } from '@umijs/max'; +import { useAtom } from 'jotai'; + +const useRegisterRoute = () => { + const navigate = useNavigate(); + const [, setRegisterRouteConfig] = useAtom(registerRouteConfigAtom); + + const handleRegisterRoute = (record: any) => { + const model = record.models?.[0] || {}; + const initialValues = { + name: model.name || '', + categories: [model.category || modelCategoriesMap.llm], + routeTargets: [ + { + weight: 100, + provider_model_name: model.name, + provider_id: record.id, + parentId: record.id + } + ] + }; + setRegisterRouteConfig({ + initialValues, + create: true + }); + navigate('/models/routes'); + }; + + return { + handleRegisterRoute + }; +}; + +export default useRegisterRoute; diff --git a/src/pages/maas-provider/index.tsx b/src/pages/maas-provider/index.tsx index 934a7763..de8f418e 100644 --- a/src/pages/maas-provider/index.tsx +++ b/src/pages/maas-provider/index.tsx @@ -1,15 +1,12 @@ -import { expandKeysAtom } from '@/atoms/clusters'; import DeleteModal from '@/components/delete-modal'; import IconFont from '@/components/icon-font'; import { FilterBar } from '@/components/page-tools'; import { PageAction } from '@/config'; import { TABLE_SORT_DIRECTIONS } from '@/config/settings'; -import useExpandedRowKeys from '@/hooks/use-expanded-row-keys'; import useTableFetch from '@/hooks/use-table-fetch'; import { useIntl } from '@umijs/max'; import { useMemoizedFn } from 'ahooks'; import { ConfigProvider, message, Table } from 'antd'; -import { useAtom } from 'jotai'; import _ from 'lodash'; import NoResult from '../_components/no-result'; import PageBox from '../_components/page-box'; @@ -24,6 +21,7 @@ import AddMaasProvider from './components/add-provider-modal'; import { FormData, MaasProviderItem as ListItem } from './config/types'; import useCreateProvider from './hooks/use-create-provider'; import useProviderColumns from './hooks/use-provider-columns'; +import useRegisterRoute from './hooks/use-register-route'; const MaasProvider: React.FC = () => { const { @@ -45,10 +43,8 @@ const MaasProvider: React.FC = () => { API: MAAS_PROVIDERS_API, contentForDelete: 'menu.models.providers' }); - const [expandAtom] = useAtom(expandKeysAtom); - const { handleExpandChange, handleExpandAll, expandedRowKeys } = - useExpandedRowKeys(expandAtom); const intl = useIntl(); + const { handleRegisterRoute } = useRegisterRoute(); const { openProviderModalStatus, openProviderModal, closeProviderModal } = useCreateProvider({ refresh: handleSearch @@ -117,6 +113,10 @@ const MaasProvider: React.FC = () => { } ); } + + if (val === 'registerRoute') { + handleRegisterRoute(row); + } }); const renderEmpty = (type?: string) => { diff --git a/src/pages/model-routes/components/add-route-modal.tsx b/src/pages/model-routes/components/add-route-modal.tsx index 19ad9242..c82b13c9 100644 --- a/src/pages/model-routes/components/add-route-modal.tsx +++ b/src/pages/model-routes/components/add-route-modal.tsx @@ -10,6 +10,7 @@ import ModelRouteForm from '../forms'; type AddModalProps = { title: string; action: PageActionType; + realAction?: string; open: boolean; currentData?: ListItem; // Used when action is EDIT onOk: (values: FormData) => void; @@ -18,6 +19,7 @@ type AddModalProps = { const AddProvider: React.FC = ({ title, action, + realAction, open, currentData, onOk, @@ -75,8 +77,10 @@ const AddProvider: React.FC = ({ { setIsChanged(changed); }} diff --git a/src/pages/model-routes/config/form-context.ts b/src/pages/model-routes/config/form-context.ts index 8e5738fa..01f7950b 100644 --- a/src/pages/model-routes/config/form-context.ts +++ b/src/pages/model-routes/config/form-context.ts @@ -4,6 +4,7 @@ import { createContext, useContext } from 'react'; interface FormContextProps { onFallbackChange?: (changed: boolean) => void; action?: PageActionType; + realAction?: string; currentData?: any; } diff --git a/src/pages/model-routes/forms/index.tsx b/src/pages/model-routes/forms/index.tsx index a23f306c..d464fe75 100644 --- a/src/pages/model-routes/forms/index.tsx +++ b/src/pages/model-routes/forms/index.tsx @@ -4,6 +4,7 @@ import { PageActionType } from '@/config/types'; import CollapsePanel from '@/pages/_components/collapse-panel'; import { useWrapperContext } from '@/pages/_components/column-wrapper/use-wrapper-context'; import ScrollSpyTabs from '@/pages/_components/scroll-spy-tabs'; +import { modelCategoriesMap } from '@/pages/llmodels/config'; import { useIntl } from '@umijs/max'; import { Form } from 'antd'; import _ from 'lodash'; @@ -22,8 +23,17 @@ import Targets from './targets'; interface ProviderFormProps { ref?: any; + open: boolean; action: PageActionType; - currentData?: ListItem; // Used when action is EDIT + realAction?: string; + currentData?: ListItem & { + routeTargets?: { + weight?: number; + model_id?: number; + provider_id?: number; + provider_model_name?: string; + }[]; + }; // Used when action is EDIT onFinish: (values: FormData) => Promise; onFallbackChange?: (changed: boolean) => void; } @@ -36,14 +46,16 @@ const TABKeysMap = { }; const AccessForm: React.FC = forwardRef((props, ref) => { - const { action, currentData, onFinish, onFallbackChange } = props; const intl = useIntl(); + const { action, realAction, currentData, open, onFinish, onFallbackChange } = + props; const { getScrollElementScrollableHeight } = useWrapperContext(); const [activeKey, setActiveKey] = useState([TABKeysMap.BASIC]); const [form] = Form.useForm(); const scrollTabsRef = useRef(null); const targetsRef = useRef(null); const { generateTargetData, fetchTargets } = useEditTargets(); + const segmentOptions = [ { value: TABKeysMap.BASIC, @@ -117,7 +129,32 @@ const AccessForm: React.FC = forwardRef((props, ref) => { setActiveKey(Array.isArray(keys) ? keys : [keys]); }; + // init form values useEffect(() => { + if (!open) { + form.resetFields(); + return; + } + + const initDataList = async ( + targets: { + weight?: number; + model_id?: number; + provider_id?: number; + provider_model_name?: string; + }[] + ) => { + // init targets form list + targetsRef.current?.initDataList( + targets?.map((ep) => ({ + weight: ep.weight, + value: ep.model_id + ? ['deployments', ep.model_id] + : [ep.provider_id, ep.provider_model_name] + })) || [] + ); + }; + const initEditionForm = async () => { const targetList = await fetchTargets(currentData!.id); const { targets, fallbackTarget } = generateTargetData(targetList); @@ -129,15 +166,7 @@ const AccessForm: React.FC = forwardRef((props, ref) => { fallback_target: fallbackTarget }); - // init targets form list - targetsRef.current?.initDataList( - targets?.map((ep) => ({ - weight: ep.weight, - value: ep.model_id - ? ['deployments', ep.model_id] - : [ep.provider_id, ep.provider_model_name] - })) || [] - ); + initDataList(targets); // init fallback value if (fallbackTarget) { @@ -148,12 +177,22 @@ const AccessForm: React.FC = forwardRef((props, ref) => { }); } }; + + const initRegisterForm = () => { + form.setFieldsValue({ + ...currentData, + targets: currentData?.routeTargets || [] + }); + initDataList(currentData?.routeTargets || []); + }; + + // --- register from provider page --- if (action === PageAction.EDIT && currentData) { initEditionForm(); - } else { - form.resetFields(); + } else if (realAction === 'register' && currentData) { + initRegisterForm(); } - }, [action, currentData, form]); + }, [action, currentData, form, open, realAction]); useImperativeHandle(ref, () => ({ submit: () => { @@ -177,12 +216,14 @@ const AccessForm: React.FC = forwardRef((props, ref) => { }} getScrollElementScrollableHeight={getScrollElementScrollableHeight} > - +
diff --git a/src/pages/model-routes/forms/targets.tsx b/src/pages/model-routes/forms/targets.tsx index 0600593a..08d8d9fc 100644 --- a/src/pages/model-routes/forms/targets.tsx +++ b/src/pages/model-routes/forms/targets.tsx @@ -102,6 +102,7 @@ const TargetsForm = forwardRef((props, ref) => { value: [] } ]; + form.setFieldValue('targets', newTargets); }; @@ -239,6 +240,12 @@ const TargetsForm = forwardRef((props, ref) => { fetchSourceModels(); }, []); + useEffect(() => { + if (action === PageAction.CREATE) { + handleOnAdd(); + } + }, [action]); + return ( <> void }) => { action: PageActionType; currentData?: ListItem; title: string; + realAction?: string; }>({ open: false, action: PageAction.CREATE, currentData: undefined, + realAction: undefined, title: '' }); @@ -32,6 +34,21 @@ const useCreateRoute = (options?: { refresh: () => void }) => { saveScrollHeight(); }; + const registerRoute = ( + action: PageActionType, + title: string, + currentData?: ListItem + ) => { + setOpenModalStatus({ + open: true, + action, + realAction: 'register', + currentData, + title: title + }); + saveScrollHeight(); + }; + const closeModal = () => { setOpenModalStatus({ open: false, @@ -46,6 +63,7 @@ const useCreateRoute = (options?: { refresh: () => void }) => { openRouteModalStatus: openModalStatus, setOpenRouteModalStatus: setOpenModalStatus, openRouteModal: openModal, + registerRouteModal: registerRoute, closeRouteModal: closeModal }; }; diff --git a/src/pages/model-routes/index.tsx b/src/pages/model-routes/index.tsx index 324ddf36..c3e7c67c 100644 --- a/src/pages/model-routes/index.tsx +++ b/src/pages/model-routes/index.tsx @@ -1,4 +1,5 @@ import { expandKeysAtom } from '@/atoms/clusters'; +import { registerRouteConfigAtom } from '@/atoms/routes'; import DeleteModal from '@/components/delete-modal'; import IconFont from '@/components/icon-font'; import { FilterBar } from '@/components/page-tools'; @@ -73,8 +74,12 @@ const ModelRoutes: React.FC = () => { expandedRowKeys } = useExpandedRowKeys(expandAtom); const intl = useIntl(); - const { openRouteModalStatus, openRouteModal, closeRouteModal } = - useCreateRoute(); + const { + openRouteModalStatus, + openRouteModal, + registerRouteModal, + closeRouteModal + } = useCreateRoute(); const { openAccessControlModal, closeAccessControlModal, @@ -83,6 +88,9 @@ const ModelRoutes: React.FC = () => { const { sourceModels, fetchSourceModels } = useTargetSourceModels(); const { handleOpenPlayGround } = useOpenPlayground(); const { apiAccessInfo, openViewAPIInfo, closeViewAPIInfo } = useViewApIInfo(); + const [registerRouteConfig, setRegisterRouteConfig] = useAtom( + registerRouteConfigAtom + ); const [modelList, setModelsList] = useState[]>([]); useEffect(() => { @@ -102,6 +110,14 @@ const ModelRoutes: React.FC = () => { fetchModels(); }, []); + const handleCloseRouteModal = () => { + closeRouteModal(); + setRegisterRouteConfig({ + initialValues: null, + create: false + }); + }; + const handleClickDropdown = () => { openRouteModal( PageAction.CREATE, @@ -131,14 +147,14 @@ const ModelRoutes: React.FC = () => { updateExpandedRowKeys([data.id, ...expandedRowKeys]); } fetchData(); - closeRouteModal(); + handleCloseRouteModal(); message.success(intl.formatMessage({ id: 'common.message.success' })); } catch (error) {} }; const handleModalCancel = () => { console.log('handleModalCancel'); - closeRouteModal(); + handleCloseRouteModal(); }; const handleEditProvider = (row: ListItem) => { @@ -247,6 +263,16 @@ const ModelRoutes: React.FC = () => { fetchSourceModels(); }, []); + useEffect(() => { + if (registerRouteConfig.create && dataSource.loadend) { + registerRouteModal( + PageAction.CREATE, + intl.formatMessage({ id: 'routes.button.add' }), + registerRouteConfig.initialValues + ); + } + }, [registerRouteConfig, dataSource.loadend]); + const columns = useRoutesColumns(handleSelect); return ( @@ -318,6 +344,7 @@ const ModelRoutes: React.FC = () => {