From d393f9ee9e76ef848c160ed08cfe824d697ffdb6 Mon Sep 17 00:00:00 2001 From: jialin Date: Thu, 9 Oct 2025 09:50:33 +0800 Subject: [PATCH] style: versions config --- src/components/collapse-container/index.tsx | 2 +- src/locales/en-US/backends.ts | 2 +- src/locales/en-US/menu.ts | 2 +- src/locales/ja-JP/backends.ts | 2 +- src/locales/ja-JP/menu.ts | 4 +- src/locales/ru-RU/backends.ts | 2 +- src/locales/ru-RU/menu.ts | 4 +- src/locales/zh-CN/backends.ts | 2 +- src/locales/zh-CN/menu.ts | 2 +- src/pages/backends/components/add-modal.tsx | 12 +- src/pages/backends/config/schema/create.json | 7 + .../config/schema/update-builtin.json | 7 + .../backends/config/schema/update-custom.json | 7 + src/pages/backends/forms/basic.tsx | 16 ++ src/pages/backends/forms/index.tsx | 21 +- src/pages/backends/forms/versions-config.tsx | 211 +++++++++++------- src/pages/backends/forms/versions-form.tsx | 11 + 17 files changed, 202 insertions(+), 112 deletions(-) create mode 100644 src/pages/backends/forms/versions-form.tsx diff --git a/src/components/collapse-container/index.tsx b/src/components/collapse-container/index.tsx index cb6827cd..42675fdf 100644 --- a/src/components/collapse-container/index.tsx +++ b/src/components/collapse-container/index.tsx @@ -44,7 +44,7 @@ const useStyles = createStyles(({ css, token }) => { gap: 8px; `, subtitle: css` - font-size: 12px; + font-size: 14px; color: ${token.colorTextSecondary}; `, content: css` diff --git a/src/locales/en-US/backends.ts b/src/locales/en-US/backends.ts index 2ab5048c..e4eeb76e 100644 --- a/src/locales/en-US/backends.ts +++ b/src/locales/en-US/backends.ts @@ -1,3 +1,3 @@ export default { - 'backends.title': 'Backends' + 'backends.title': 'Inference Backends' }; diff --git a/src/locales/en-US/menu.ts b/src/locales/en-US/menu.ts index 9f5e8c54..fa603a8f 100644 --- a/src/locales/en-US/menu.ts +++ b/src/locales/en-US/menu.ts @@ -32,5 +32,5 @@ export default { 'menu.clusterManagement.credentials': 'Cloud Credentials', 'menu.clusterManagement.clusterDetail': 'Cluster Detail', 'menu.clusterManagement.clusterCreate': 'Create Cluster', - 'menu.models.backendsList': 'Backends' + 'menu.models.backendsList': 'Inference Backends' }; diff --git a/src/locales/ja-JP/backends.ts b/src/locales/ja-JP/backends.ts index 2ab5048c..e4eeb76e 100644 --- a/src/locales/ja-JP/backends.ts +++ b/src/locales/ja-JP/backends.ts @@ -1,3 +1,3 @@ export default { - 'backends.title': 'Backends' + 'backends.title': 'Inference Backends' }; diff --git a/src/locales/ja-JP/menu.ts b/src/locales/ja-JP/menu.ts index cde623a8..a5510231 100644 --- a/src/locales/ja-JP/menu.ts +++ b/src/locales/ja-JP/menu.ts @@ -32,7 +32,7 @@ export default { 'menu.models.userModels': 'My Models', 'menu.clusterManagement.clusterDetail': 'Cluster Detail', 'menu.clusterManagement.clusterCreate': 'Create Cluster', - 'menu.models.backendsList': 'Backends' + 'menu.models.backendsList': 'Inference Backends' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== @@ -49,5 +49,5 @@ export default { // 11. 'menu.models.userModels': 'My Models' // 12. 'menu.clusterManagement.clusterDetail': 'Cluster Detail', // 13. 'menu.clusterManagement.clusterCreate': 'Create Cluster', -// 14. 'menu.models.backendsList': 'Backends' +// 14. 'menu.models.backendsList': 'Inference Backends' // ========== End of To-Do List ========== diff --git a/src/locales/ru-RU/backends.ts b/src/locales/ru-RU/backends.ts index 2ab5048c..e4eeb76e 100644 --- a/src/locales/ru-RU/backends.ts +++ b/src/locales/ru-RU/backends.ts @@ -1,3 +1,3 @@ export default { - 'backends.title': 'Backends' + 'backends.title': 'Inference Backends' }; diff --git a/src/locales/ru-RU/menu.ts b/src/locales/ru-RU/menu.ts index 37977bc7..47571bc0 100644 --- a/src/locales/ru-RU/menu.ts +++ b/src/locales/ru-RU/menu.ts @@ -32,9 +32,9 @@ export default { 'menu.models.userModels': 'Мои модели', 'menu.clusterManagement.clusterDetail': 'Детали кластера', 'menu.clusterManagement.clusterCreate': 'Создать кластер', - 'menu.models.backendsList': 'Backends' + 'menu.models.backendsList': 'Inference Backends' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== -// 14. 'menu.models.backendsList': 'Backends' +// 14. 'menu.models.backendsList': 'Inference Backends' // ========== End of To-Do List ========== diff --git a/src/locales/zh-CN/backends.ts b/src/locales/zh-CN/backends.ts index 14a6b7b9..a2ae7ed9 100644 --- a/src/locales/zh-CN/backends.ts +++ b/src/locales/zh-CN/backends.ts @@ -1,3 +1,3 @@ export default { - 'backends.title': '后端' + 'backends.title': '推理后端' }; diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts index 01bd9e6f..73257288 100644 --- a/src/locales/zh-CN/menu.ts +++ b/src/locales/zh-CN/menu.ts @@ -32,5 +32,5 @@ export default { 'menu.clusterManagement.credentials': '云凭证', 'menu.clusterManagement.clusterDetail': '集群详情', 'menu.clusterManagement.clusterCreate': '创建集群', - 'menu.models.backendsList': '后端' + 'menu.models.backendsList': '推理后端' }; diff --git a/src/pages/backends/components/add-modal.tsx b/src/pages/backends/components/add-modal.tsx index 5972b48b..8ebdaa98 100644 --- a/src/pages/backends/components/add-modal.tsx +++ b/src/pages/backends/components/add-modal.tsx @@ -97,8 +97,8 @@ const AddModal: React.FC = (props) => { const versionConfigs = Object.keys(values.version_configs || {}).map( (key) => ({ version_no: key, - image_name: values.version_configs[key].image_name, - run_command: values.version_configs[key].run_command, + image_name: values.version_configs?.[key]?.image_name, + run_command: values.version_configs?.[key]?.run_command, is_default: key === values.default_version }) ); @@ -107,10 +107,11 @@ const AddModal: React.FC = (props) => { values.build_in_version_configs || {} ).map((key) => ({ version_no: key, - image_name: values.build_in_version_configs[key].image_name, - run_command: values.build_in_version_configs[key].run_command, + image_name: values.build_in_version_configs?.[key]?.image_name, + run_command: values.build_in_version_configs?.[key]?.run_command, is_default: key === values.default_version, - backend_list: values.build_in_version_configs[key].backend_list || [], + backend_list: + values.build_in_version_configs?.[key]?.backend_list || [], is_built_in: true })); @@ -171,7 +172,6 @@ const AddModal: React.FC = (props) => { > setActiveKey(value as string)} options={[ { diff --git a/src/pages/backends/config/schema/create.json b/src/pages/backends/config/schema/create.json index 9743e254..2cfe9222 100644 --- a/src/pages/backends/config/schema/create.json +++ b/src/pages/backends/config/schema/create.json @@ -35,6 +35,13 @@ "run_command": { "type": ["string", "null"], "description": "start command" + }, + "backend_list": { + "type": "array", + "items": { + "type": "string" + }, + "description": "backend list" } }, "required": ["image_name", "run_command"], diff --git a/src/pages/backends/config/schema/update-builtin.json b/src/pages/backends/config/schema/update-builtin.json index 8b69b997..58d6896f 100644 --- a/src/pages/backends/config/schema/update-builtin.json +++ b/src/pages/backends/config/schema/update-builtin.json @@ -26,6 +26,13 @@ "run_command": { "type": ["string", "null"], "description": "start command" + }, + "backend_list": { + "type": "array", + "items": { + "type": "string" + }, + "description": "backend list" } }, "required": ["image_name", "run_command"], diff --git a/src/pages/backends/config/schema/update-custom.json b/src/pages/backends/config/schema/update-custom.json index 37e582c1..c8233ad4 100644 --- a/src/pages/backends/config/schema/update-custom.json +++ b/src/pages/backends/config/schema/update-custom.json @@ -30,6 +30,13 @@ "run_command": { "type": ["string", "null"], "description": "start command" + }, + "backend_list": { + "type": "array", + "items": { + "type": "string" + }, + "description": "backend list" } }, "required": ["image_name", "run_command"], diff --git a/src/pages/backends/forms/basic.tsx b/src/pages/backends/forms/basic.tsx index ebfcfdd8..2729b95a 100644 --- a/src/pages/backends/forms/basic.tsx +++ b/src/pages/backends/forms/basic.tsx @@ -1,3 +1,4 @@ +import ListInput from '@/components/list-input'; import SealInput from '@/components/seal-form/seal-input'; import { PageAction } from '@/config'; import { PageActionType } from '@/config/types'; @@ -44,8 +45,23 @@ const BasicForm: React.FC = ({ action }) => { + + name="default_backend_param" + rules={[{ required: false }]} + > + { + form.setFieldValue('default_backend_param', data); + }} + btnText={'Add Backend Parameter'} + label={'Default Backend Parameters'} + > + + name="description" rules={[{ required: false }]}> diff --git a/src/pages/backends/forms/index.tsx b/src/pages/backends/forms/index.tsx index 790f28b4..b73b596a 100644 --- a/src/pages/backends/forms/index.tsx +++ b/src/pages/backends/forms/index.tsx @@ -6,7 +6,6 @@ import React, { forwardRef, useEffect, useImperativeHandle } from 'react'; import { FormData, ListItem } from '../config/types'; import BasicForm from './basic'; import BuiltInVersionsForm from './built-in-versions'; -import ParametersForm from './parameters'; import VersionsForm from './versions-config'; type AddModalProps = { @@ -72,6 +71,7 @@ const BackendForm: React.FC = forwardRef( onFinishFailed={onFinishFailed} > + = forwardRef( children: } ] - : []), - { - key: 'version_configs', - label: 'Custom Versions', - forceRender: true, - children: ( - - ) - }, - { - key: 'parameters', - label: 'Default Parameters', - children: - } + : []) ]} > + ); } diff --git a/src/pages/backends/forms/versions-config.tsx b/src/pages/backends/forms/versions-config.tsx index 676c57f2..2a66cce8 100644 --- a/src/pages/backends/forms/versions-config.tsx +++ b/src/pages/backends/forms/versions-config.tsx @@ -1,3 +1,4 @@ +import CollapsibleContainer from '@/components/collapse-container'; import SealInput from '@/components/seal-form/seal-input'; import { PageActionType } from '@/config/types'; import { MinusOutlined, PlusOutlined } from '@ant-design/icons'; @@ -21,6 +22,14 @@ const ActionWrapper = styled.div` margin-top: 24px; `; +const Title = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + font-weight: 600; + margin-bottom: 8px; +`; + const Label = styled.div` line-height: 1; color: var(--ant-color-text-tertiary); @@ -37,6 +46,7 @@ type AddModalProps = { const VersionsForm: React.FC = ({ action, currentData }) => { const form = Form.useFormInstance(); const version_configs = Form.useWatch('version_configs', form); + const [collapseKey, setCollapseKey] = React.useState(['0']); const versionList = [ { version_no: '', @@ -76,6 +86,24 @@ const VersionsForm: React.FC = ({ action, currentData }) => { } }; + const onToggle = (open: boolean, key: string) => { + setCollapseKey(open ? [key] : []); + }; + + const handleAdd = async (add: (defaultValue?: any) => void) => { + try { + const isValid = await form.validateFields(['version_configs'], { + recursive: true + }); + console.log('isValid:', isValid); + if (isValid) { + add(); + } + } catch (error) { + console.log('Validation failed:', error); + } + }; + useEffect(() => { const versions = form.getFieldValue('version_configs') || []; console.log('versions:', versions); @@ -90,89 +118,118 @@ const VersionsForm: React.FC = ({ action, currentData }) => { return (
- + + <span>Version Configurations</span> + <Button + onClick={() => handleAdd(add)} + variant="filled" + color="default" + > + <PlusOutlined /> Add Version + </Button> + {fields.map(({ key, name, ...restField }, index) => ( - - - - - - - - - - - - - - - {!currentData?.is_build_in && ( - + {version_configs[name]?.version_no}} + subtitle={ + version_configs[name]?.image_name && ( + + {version_configs[name]?.image_name} + + ) + } + onToggle={(open) => onToggle(open, key + '')} + deleteBtn={false} + right={ +
+ e.stopPropagation()} > - - handleSetDefaultVersion(e, index) - } + {!currentData?.is_build_in && ( + + + handleSetDefaultVersion(e, index) + } + > + Default Version + + + )} + + {(fields.length > 1 || currentData?.is_build_in) && ( + - )} -
-
- -
+ + + )} +
+ } + > + + + + + + + + + + + + + {index < fields.length - 1 && ( + + )} + ))} - ); }} diff --git a/src/pages/backends/forms/versions-form.tsx b/src/pages/backends/forms/versions-form.tsx new file mode 100644 index 00000000..5e81d589 --- /dev/null +++ b/src/pages/backends/forms/versions-form.tsx @@ -0,0 +1,11 @@ +import { Form } from 'antd'; +import React from 'react'; +import VersionsField from './versions-config'; + +const VersionsForm: React.FC = () => { + return ( +
+ + + ); +};