From caabeb065ae424ec1e399102e5923c2561b88339 Mon Sep 17 00:00:00 2001 From: jialin Date: Thu, 9 Oct 2025 18:27:22 +0800 Subject: [PATCH] fix: custom versin configs --- src/components/collapse-container/index.tsx | 21 +- src/pages/backends/backend-create.tsx | 249 ------------- src/pages/backends/components/add-modal.tsx | 7 +- .../backends/components/backend-card.tsx | 6 +- .../view-builtin-versions-modal.tsx | 4 +- src/pages/backends/config/index.ts | 33 +- src/pages/backends/config/schema/create.json | 9 +- .../config/schema/update-builtin.json | 9 +- .../backends/config/schema/update-custom.json | 9 +- src/pages/backends/config/types.ts | 3 +- .../backends/forms/built-in-versions.tsx | 15 +- src/pages/backends/forms/index.tsx | 36 +- src/pages/backends/forms/versions-config.tsx | 349 +++++++++++------- src/pages/backends/forms/versions-form.tsx | 11 - src/pages/backends/step-forms/basic-form.tsx | 59 --- .../backends/step-forms/module-registry.ts | 16 - .../backends/step-forms/parameters-form.tsx | 55 --- .../backends/step-forms/use-step-list.tsx | 65 ---- .../step-forms/version-config-form.tsx | 227 ------------ 19 files changed, 289 insertions(+), 894 deletions(-) delete mode 100644 src/pages/backends/backend-create.tsx delete mode 100644 src/pages/backends/forms/versions-form.tsx delete mode 100644 src/pages/backends/step-forms/basic-form.tsx delete mode 100644 src/pages/backends/step-forms/module-registry.ts delete mode 100644 src/pages/backends/step-forms/parameters-form.tsx delete mode 100644 src/pages/backends/step-forms/use-step-list.tsx delete mode 100644 src/pages/backends/step-forms/version-config-form.tsx diff --git a/src/components/collapse-container/index.tsx b/src/components/collapse-container/index.tsx index 42675fdf..67af3c51 100644 --- a/src/components/collapse-container/index.tsx +++ b/src/components/collapse-container/index.tsx @@ -18,6 +18,7 @@ const CardStyled = styled(Card)` background-color: var(--ant-color-fill-quaternary); border-bottom: none; border-radius: var(--ant-border-radius); + padding: 0 16px; &:hover { background-color: var(--ant-color-fill-secondary); .del-btn { @@ -72,6 +73,7 @@ export interface CollapsibleContainerProps { defaultOpen?: boolean; open?: boolean; collapsible?: boolean; + showExpandIcon?: boolean; onToggle?: (open: boolean) => void; disabled?: boolean; variant?: 'outlined' | 'borderless' | undefined; @@ -88,6 +90,7 @@ export default function CollapsibleContainer({ open, onToggle, disabled = false, + showExpandIcon = true, variant = 'borderless', className = '', collapsible, @@ -120,14 +123,16 @@ export default function CollapsibleContainer({
- + {showExpandIcon && ( + + )} {title &&
{title}
}
{subtitle &&
{subtitle}
} diff --git a/src/pages/backends/backend-create.tsx b/src/pages/backends/backend-create.tsx deleted file mode 100644 index a8b4ede5..00000000 --- a/src/pages/backends/backend-create.tsx +++ /dev/null @@ -1,249 +0,0 @@ -import { PageAction } from '@/config'; -import { PageActionType } from '@/config/types'; -import ClusterSteps from '@/pages/cluster-management/components/cluster-steps'; -import FooterButtons from '@/pages/cluster-management/components/footer-buttons'; -import { PageContainer } from '@ant-design/pro-components'; -import { useIntl, useNavigate, useSearchParams } from '@umijs/max'; -import _ from 'lodash'; -import React, { useMemo, useRef, useState } from 'react'; -import styled from 'styled-components'; -import { createBackend } from './apis'; -import { FormData } from './config/types'; -import { moduleMap, moduleRegistry } from './step-forms/module-registry'; -import useStepList from './step-forms/use-step-list'; - -const Container = styled.div` - width: 100%; - display: flex; - flex-direction: column; - align-items: center; -`; - -const Nav = styled.div` - display: flex; - align-items: center; - height: 72px; - font-weight: 400; - font-size: 20px; - color: var(--ant-color-text-tertiary); - .level-2 { - color: var(--ant-color-text); - font-weight: 600; - } -`; - -const Content = styled.div` - width: 600px; -`; - -const HeaderContainer = styled.div` - position: relative; - display: grid; - grid-template-columns: 1fr; - align-items: center; - padding-inline: var(--layout-content-header-inlinepadding); - .text { - margin-right: 16px; - padding-right: 16px; - border-right: 1px solid var(--ant-color-split); - font-weight: 600; - font-size: 20px; - margin-right: 32px; - } -`; - -const ClusterCreate = () => { - const intl = useIntl(); - const startStep = 0; - const steps = useStepList(); - const [searchParams] = useSearchParams(); - const action = - (searchParams.get('action') as PageActionType) || PageAction.CREATE; - const navigate = useNavigate(); - - const [currentStep, setCurrentStep] = useState(startStep); - - const [extraData, setExtraData] = useState({ - default_version: '' - } as FormData); - const [formValues, setFormValues] = useState>({}); - - const formRefs: Record = { - [moduleMap.BasicForm]: useRef(null), - [moduleMap.ParamertersForm]: useRef(null), - [moduleMap.VersionConfigForm]: useRef(null) - }; - - const handleStepChange = (newStep: number) => { - setCurrentStep(newStep); - console.log('step========', newStep); - }; - - const getFormFieldsValue = () => { - setFormValues((prev) => { - const newFormValues = _.cloneDeep(prev); - for (const [formKey, formRef] of Object.entries(formRefs)) { - const formValues = formRef?.current?.getFieldsValue?.(); - if (formValues) { - newFormValues[formKey] = formValues; - } - } - return newFormValues; - }); - }; - - const onPrevious = () => { - getFormFieldsValue(); - setCurrentStep((prev) => Math.max(prev - 1, 0)); - }; - - const validateForms = async () => { - const step = steps[currentStep]; - const formKeys = step?.showForms || []; - if (formKeys?.length > 0) { - const results = await Promise.allSettled( - formKeys.map((key) => formRefs[key].current?.validateFields()) - ); - - console.log('results========', results); - - const resultsMap = new Map(); - results.forEach((result, index) => { - if (result.status === 'rejected') { - const values = result.reason?.values || {}; - resultsMap.set(formKeys[index], values); - } else if (result.status === 'fulfilled') { - resultsMap.set(formKeys[index], result.value); - } - }); - const newValues = _.merge(formValues, Object.fromEntries(resultsMap)); - - setFormValues(newValues); - - const isValid = results.every((result) => result.status === 'fulfilled'); - if (!isValid) { - return false; - } - return Object.assign({}, ...Object.values(newValues)); - } - return true; - }; - - const onNext = async (callback?: (values: FormData) => void) => { - try { - const result = await validateForms(); - console.log('results========2', result); - if (result) { - await callback?.(result as FormData); - const step = steps[currentStep]; - step.beforeNext?.(); - setCurrentStep((prev) => Math.min(prev + 1, steps.length - 1)); - } - } catch (error) { - console.log('next error:', error); - } - }; - - const resetForm = () => { - setFormValues({}); - for (const [formKey, formRef] of Object.entries(formRefs)) { - formRefs[formKey] = React.createRef(); - } - }; - - const renderForms = () => { - const step = steps[currentStep]; - const formKeys = step?.showForms || []; - if (formKeys.length === 0) { - return null; - } - - return formKeys.map((key) => { - console.log('renderForms key========', key, formValues); - const FormComponent = moduleRegistry[key]; - return FormComponent ? ( - - ) : null; - }); - }; - - const showButtons = useMemo(() => { - const step = steps[currentStep]; - return step?.showButtons ? step?.showButtons?.() : {}; - }, [currentStep, steps]); - - const submit = async (values: FormData) => { - const data = { - ...extraData, - ...(typeof values === 'object' ? values : {}) - }; - const res = await createBackend({ data }); - - return true; - }; - - const handleSubmit = async () => { - onNext(submit); - }; - - const handleCancel = () => { - navigate(-1); - }; - - return ( - - ]} - header={{ - title: false, - style: { - paddingInline: 'var(--layout-content-header-inlinepadding)' - }, - breadcrumb: {} - }} - pageHeaderRender={() => ( - - - - - )} - > - - {renderForms()} - - - ); -}; - -export default ClusterCreate; diff --git a/src/pages/backends/components/add-modal.tsx b/src/pages/backends/components/add-modal.tsx index 8ebdaa98..8b86d2ea 100644 --- a/src/pages/backends/components/add-modal.tsx +++ b/src/pages/backends/components/add-modal.tsx @@ -53,7 +53,6 @@ const AddModal: React.FC = (props) => { const [activeKey, setActiveKey] = useState('form'); const [yamlContent, setYamlContent] = useState(''); const [formContent, setFormContent] = useState({} as FormData); - const tabsRef = useRef(null); const onOk = () => { if (activeKey === 'yaml') { @@ -73,6 +72,7 @@ const AddModal: React.FC = (props) => { (acc: Record, curr) => { if (curr.version_no) { acc[curr.version_no] = { + custom_framework: curr.custom_framework, image_name: curr.image_name, run_command: curr.run_command }; @@ -99,6 +99,7 @@ const AddModal: React.FC = (props) => { version_no: key, image_name: values.version_configs?.[key]?.image_name, run_command: values.version_configs?.[key]?.run_command, + custom_framework: values.version_configs?.[key]?.custom_framework, is_default: key === values.default_version }) ); @@ -110,8 +111,8 @@ const AddModal: React.FC = (props) => { 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 || [], + build_in_frameworks: + values.build_in_version_configs?.[key]?.build_in_frameworks || [], is_built_in: true })); diff --git a/src/pages/backends/components/backend-card.tsx b/src/pages/backends/components/backend-card.tsx index 1b14afb9..dbdd4f3b 100644 --- a/src/pages/backends/components/backend-card.tsx +++ b/src/pages/backends/components/backend-card.tsx @@ -137,7 +137,11 @@ const BackendCard: React.FC = ({ data, onSelect }) => { if (data.is_build_in) { const backendList = _.get( data, - ['build_in_version_configs', data.default_version, 'backend_list'], + [ + 'build_in_version_configs', + data.default_version, + 'build_in_frameworks' + ], [] ); diff --git a/src/pages/backends/components/view-builtin-versions-modal.tsx b/src/pages/backends/components/view-builtin-versions-modal.tsx index 3a22f0f4..b9fa5d0c 100644 --- a/src/pages/backends/components/view-builtin-versions-modal.tsx +++ b/src/pages/backends/components/view-builtin-versions-modal.tsx @@ -25,8 +25,8 @@ const ViewBuiltinVersionsModal: React.FC = ({ image_name: currentData.build_in_version_configs[key].image_name, run_command: currentData.build_in_version_configs[key].run_command, is_default: key === currentData.default_version, - backend_list: - currentData.build_in_version_configs[key].backend_list || [], + build_in_frameworks: + currentData.build_in_version_configs[key].build_in_frameworks || [], is_built_in: true })); form.setFieldsValue({ diff --git a/src/pages/backends/config/index.ts b/src/pages/backends/config/index.ts index 7d078e6b..f4cbae45 100644 --- a/src/pages/backends/config/index.ts +++ b/src/pages/backends/config/index.ts @@ -38,13 +38,6 @@ export const backendActions = [ icon: icons.EditOutlined, locale: false }, - { - label: 'View Built-in Versions', - value: 'view_versions', - key: 'view_versions', - icon: icons.Version, - locale: false - }, { label: 'Export YAML', value: 'yaml', @@ -123,6 +116,28 @@ export const backendFields = [ 'version_configs', 'default_backend_parameters' ]; +export const frameworks = [ + { + label: 'CUDA', + value: 'cuda' + }, + { + label: 'ROCm', + value: 'rocm' + }, + { + label: 'CANN', + value: 'cann' + }, + { + label: 'DTK', + value: 'dtk' + }, + { + label: 'CoreX', + value: 'corex' + } +]; export const yamlTemplate = `# backend configuration template backend_name: SGLang @@ -134,9 +149,11 @@ version_configs: v0.0.1: image_name: lm/sglang run_command: run sglang + custom_framework: cuda v0.0.2: image_name: lm/sglang - run_command: run sglang + run_command: + custom_framework: default_backend_parameters: - --host `; diff --git a/src/pages/backends/config/schema/create.json b/src/pages/backends/config/schema/create.json index 2cfe9222..16a87012 100644 --- a/src/pages/backends/config/schema/create.json +++ b/src/pages/backends/config/schema/create.json @@ -36,12 +36,9 @@ "type": ["string", "null"], "description": "start command" }, - "backend_list": { - "type": "array", - "items": { - "type": "string" - }, - "description": "backend list" + "custom_framework": { + "type": ["string", "null"], + "description": "custom framework" } }, "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 58d6896f..dfebffdb 100644 --- a/src/pages/backends/config/schema/update-builtin.json +++ b/src/pages/backends/config/schema/update-builtin.json @@ -27,12 +27,9 @@ "type": ["string", "null"], "description": "start command" }, - "backend_list": { - "type": "array", - "items": { - "type": "string" - }, - "description": "backend list" + "custom_framework": { + "type": ["string", "null"], + "description": "custom framework" } }, "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 c8233ad4..5a3d86c1 100644 --- a/src/pages/backends/config/schema/update-custom.json +++ b/src/pages/backends/config/schema/update-custom.json @@ -31,12 +31,9 @@ "type": ["string", "null"], "description": "start command" }, - "backend_list": { - "type": "array", - "items": { - "type": "string" - }, - "description": "backend list" + "custom_framework": { + "type": ["string", "null"], + "description": "custom framework" } }, "required": ["image_name", "run_command"], diff --git a/src/pages/backends/config/types.ts b/src/pages/backends/config/types.ts index 0c3501ec..4360635f 100644 --- a/src/pages/backends/config/types.ts +++ b/src/pages/backends/config/types.ts @@ -2,7 +2,8 @@ export interface VersionConfigs { image_name: string; run_command: string; is_default: boolean; - backend_list?: string[]; + build_in_frameworks?: string[]; + custom_framework: string; version_no?: string; is_built_in?: boolean; } diff --git a/src/pages/backends/forms/built-in-versions.tsx b/src/pages/backends/forms/built-in-versions.tsx index 5b6ee8c7..f04f9e80 100644 --- a/src/pages/backends/forms/built-in-versions.tsx +++ b/src/pages/backends/forms/built-in-versions.tsx @@ -8,13 +8,13 @@ const ItemWrapper = styled.div` flex-direction: column; align-items: flex-start; gap: 8px; + width: 100%; .title { width: 100%; justify-content: space-between; display: flex; align-items: center; font-weight: 600; - margin-bottom: 8px; } `; @@ -35,7 +35,8 @@ const RowWrapper = styled.div` interface VersionItemProps { data: { - backend_list: string[]; + build_in_frameworks: string[]; + custom_framework: string; version_no: string; image_name: string; run_command: string; @@ -44,20 +45,24 @@ interface VersionItemProps { }; } -const VersionItem: React.FC = ({ data }) => { +export const VersionItem: React.FC = ({ data }) => { return (
{data.version_no} {data.is_default && ( - + Default )}
- {data.backend_list?.map((item) => { + {data.build_in_frameworks?.map((item) => { return ( = forwardRef( const onFinishFailed = (errorInfo: any) => { const errorFields = errorInfo.errorFields || []; if (errorFields.length > 0) { - const hasVersionsError = errorFields.some((field: any) => + const versionError = errorFields.find((field: any) => field.name.includes('version_configs') ); - if (hasVersionsError) { - setActiveKey([...new Set([...activeKey, 'version_configs'])]); + if (versionError) { + setActiveKey([...new Set([versionError.name[1]])]); + } else { + setActiveKey([]); } } }; - const handleOnCollapseChange = (keys: string | string[]) => { - setActiveKey(Array.isArray(keys) ? keys : [keys]); - }; - useEffect(() => { if (currentData) { console.log('currentData:', currentData); @@ -71,25 +67,11 @@ const BackendForm: React.FC = forwardRef( onFinishFailed={onFinishFailed} > - - - } - ] - : []) - ]} - > - + > ); } diff --git a/src/pages/backends/forms/versions-config.tsx b/src/pages/backends/forms/versions-config.tsx index 2a66cce8..a453157f 100644 --- a/src/pages/backends/forms/versions-config.tsx +++ b/src/pages/backends/forms/versions-config.tsx @@ -1,25 +1,36 @@ +import AutoTooltip from '@/components/auto-tooltip'; import CollapsibleContainer from '@/components/collapse-container'; import SealInput from '@/components/seal-form/seal-input'; +import SealSelect from '@/components/seal-form/seal-select'; import { PageActionType } from '@/config/types'; import { MinusOutlined, PlusOutlined } from '@ant-design/icons'; import { Button, Divider, Form, Radio } from 'antd'; import _ from 'lodash'; import React, { useEffect } from 'react'; import styled from 'styled-components'; +import { frameworks } from '../config'; import { ListItem } from '../config/types'; +import { VersionItem } from './built-in-versions'; const Box = styled.div` display: grid; - grid-template-columns: 200px 1fr; + grid-template-columns: 150px 1fr; gap: 16px; align-items: center; `; -const ActionWrapper = styled.div` +const Label = styled.span` display: flex; - justify-content: space-between; align-items: center; - margin-top: 24px; + gap: 4px; + color: var(--ant-color-text-secondary); +`; + +const ImageInner = styled.div` + display: flex; + align-items: center; + gap: 8px; + margin-left: 20px; `; const Title = styled.div` @@ -30,23 +41,33 @@ const Title = styled.div` margin-bottom: 8px; `; -const Label = styled.div` - line-height: 1; - color: var(--ant-color-text-tertiary); - margin-bottom: 20px; - font-size: var(--font-size-base); +const VersionItemWrapper = styled.div` + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 8px 16px; + border-radius: var(--ant-border-radius); + background-color: var(--ant-color-fill-quaternary); + width: 100%; `; -const ItemWrapper = styled.div``; - type AddModalProps = { action: PageActionType; currentData?: ListItem; + activeKey?: number[]; }; -const VersionsForm: React.FC = ({ action, currentData }) => { +const VersionsForm: React.FC = ({ + action, + currentData, + activeKey +}) => { + const defaultCollapseKey = + action === 'edit' ? new Set() : new Set([0]); const form = Form.useFormInstance(); const version_configs = Form.useWatch('version_configs', form); - const [collapseKey, setCollapseKey] = React.useState(['0']); + const buildInVersionConfigs = Form.useWatch('build_in_version_configs', form); + const [collapseKey, setCollapseKey] = + React.useState>(defaultCollapseKey); const versionList = [ { version_no: '', @@ -86,154 +107,204 @@ const VersionsForm: React.FC = ({ action, currentData }) => { } }; - const onToggle = (open: boolean, key: string) => { - setCollapseKey(open ? [key] : []); + const onToggle = (open: boolean, key: number) => { + setCollapseKey(open ? new Set([key]) : new Set()); }; - const handleAdd = async (add: (defaultValue?: any) => void) => { + const add = () => { + const versions = form.getFieldValue('version_configs') || []; + const newVersion = { + version_no: '', + image_name: '', + run_command: '', + isBuiltin: false, + is_default: false + }; + form.setFieldValue('version_configs', [...versions, newVersion]); + }; + + const remove = (versions: any[], index: number) => { + const updatedVersions = versions.filter( + (_: any, idx: number) => idx !== index + ); + // If the removed version was the default, set the first version as default + if (versions[index].is_default && updatedVersions.length > 0) { + updatedVersions[0].is_default = true; + } + form.setFieldValue('version_configs', updatedVersions); + }; + + const handleAdd = async () => { try { const isValid = await form.validateFields(['version_configs'], { recursive: true }); - console.log('isValid:', isValid); + console.log('isValid:', isValid, version_configs); if (isValid) { add(); + setTimeout(() => { + setCollapseKey(new Set([version_configs?.length])); + }, 100); } } catch (error) { - console.log('Validation failed:', error); + const errorKey = (error as any).errorFields?.[0]?.name?.[1]; + if (typeof errorKey === 'number') { + setCollapseKey(new Set([errorKey])); + } } }; useEffect(() => { const versions = form.getFieldValue('version_configs') || []; - console.log('versions:', versions); + if (Array.isArray(versions) && versions.length === 0) { form.setFieldValue('version_configs', versionList); } }, []); + useEffect(() => { + if (activeKey && activeKey.length > 0) { + setCollapseKey(new Set(activeKey)); + } + }, [activeKey]); + return ( - - {(fields, { add, remove }) => { - return ( -
- - <span>Version Configurations</span> - <Button - onClick={() => handleAdd(add)} - variant="filled" - color="default" - > - <PlusOutlined /> Add Version - </Button> - - {fields.map(({ key, name, ...restField }, index) => ( - <> - {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()} - > - {!currentData?.is_build_in && ( - - - handleSetDefaultVersion(e, index) - } - > - Default Version - - - )} - - {(fields.length > 1 || currentData?.is_build_in) && ( - - )} -
- } - > - - - - - - - - - + + +
+ + <span>Versions Config</span> + <Button onClick={handleAdd} variant="filled" color="default"> + <PlusOutlined /> Add Version + </Button> + + {buildInVersionConfigs?.map((item: any, index: number) => ( + <> + + + + + + ))} + {version_configs?.map((item: any, index: number) => ( + <> + + Version: + {item.version_no} + + } + subtitle={ + item.image_name && ( + + Image: + + {item.image_name} + + + ) + } + onToggle={(open) => onToggle(open, index)} + deleteBtn={false} + right={ +
+ e.stopPropagation()} > - - - - {index < fields.length - 1 && ( - - )} - - ))} -
- ); - }} - + {!currentData?.is_build_in && ( + + + handleSetDefaultVersion(e, index) + } + > + Default Version + + + )} + + {(version_configs.length > 1 || currentData?.is_build_in) && ( + + )} +
+ } + > + + + + + + + + + + + + + + +
+ {index < version_configs.length - 1 && ( + + )} + + ))} +
+ ); }; diff --git a/src/pages/backends/forms/versions-form.tsx b/src/pages/backends/forms/versions-form.tsx deleted file mode 100644 index 5e81d589..00000000 --- a/src/pages/backends/forms/versions-form.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Form } from 'antd'; -import React from 'react'; -import VersionsField from './versions-config'; - -const VersionsForm: React.FC = () => { - return ( -
- - - ); -}; diff --git a/src/pages/backends/step-forms/basic-form.tsx b/src/pages/backends/step-forms/basic-form.tsx deleted file mode 100644 index 427d9b21..00000000 --- a/src/pages/backends/step-forms/basic-form.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import PageTools from '@/components/page-tools'; -import { PageActionType } from '@/config/types'; -import { useIntl } from '@umijs/max'; -import { forwardRef, useImperativeHandle, useRef } from 'react'; -import styled from 'styled-components'; -import Basic from '../forms/basic'; - -const Title = styled.span` - display: flex; - align-items: center; - justify-content: space-between; - font-weight: 700; - font-size: 16px; - .text { - font-size: 20px; - } -`; -interface BasicFormProps { - action: PageActionType; - currentData?: any; -} - -const BasicForm = forwardRef((props: BasicFormProps, ref) => { - const intl = useIntl(); - const { action, currentData } = props; - const formRef = useRef(null); - - const handleOnFinish = (values: any) => { - console.log(values); - }; - - useImperativeHandle(ref, () => ({ - validateFields: formRef.current?.validateFields, - getFieldsValue: formRef.current?.getFieldsValue, - submit: formRef.current?.submit - })); - - return ( -
- - {intl.formatMessage({ id: 'clusters.create.configBasic' })} - - } - marginTop={0} - > - -
- ); -}); - -export default BasicForm; diff --git a/src/pages/backends/step-forms/module-registry.ts b/src/pages/backends/step-forms/module-registry.ts deleted file mode 100644 index 0c2dc8c4..00000000 --- a/src/pages/backends/step-forms/module-registry.ts +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import BasicForm from './basic-form'; -import ParamertersForm from './parameters-form'; -import VersionConfigForm from './version-config-form'; - -export const moduleMap = { - BasicForm: 'BasicForm', - VersionConfigForm: 'VersionConfigForm', - ParamertersForm: 'ParamertersForm' -}; - -export const moduleRegistry: Record> = { - [moduleMap.BasicForm]: BasicForm, - [moduleMap.VersionConfigForm]: VersionConfigForm, - [moduleMap.ParamertersForm]: ParamertersForm -}; diff --git a/src/pages/backends/step-forms/parameters-form.tsx b/src/pages/backends/step-forms/parameters-form.tsx deleted file mode 100644 index 75788791..00000000 --- a/src/pages/backends/step-forms/parameters-form.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import PageTools from '@/components/page-tools'; -import { PageActionType } from '@/config/types'; -import { useIntl } from '@umijs/max'; -import { forwardRef, useImperativeHandle, useRef } from 'react'; -import styled from 'styled-components'; -import Parameters from '../forms/parameters'; - -const Title = styled.span` - display: flex; - align-items: center; - justify-content: space-between; - font-weight: 700; - font-size: 16px; - .text { - font-size: 20px; - } -`; -interface BasicFormProps { - action: PageActionType; - currentData?: any; -} - -const ParametersForm = forwardRef((props: BasicFormProps, ref) => { - const intl = useIntl(); - const { action, currentData } = props; - const formRef = useRef(null); - - const handleOnFinish = (values: any) => { - console.log(values); - }; - - useImperativeHandle(ref, () => ({ - validateFields: formRef.current?.validateFields, - getFieldsValue: formRef.current?.getFieldsValue, - submit: formRef.current?.submit - })); - - return ( -
- Parameters Configuration} - marginTop={0} - > - -
- ); -}); - -export default ParametersForm; diff --git a/src/pages/backends/step-forms/use-step-list.tsx b/src/pages/backends/step-forms/use-step-list.tsx deleted file mode 100644 index 5f21cb7b..00000000 --- a/src/pages/backends/step-forms/use-step-list.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { useIntl, useNavigate } from '@umijs/max'; -import { useMemoizedFn } from 'ahooks'; -import { useMemo } from 'react'; -import { moduleMap } from './module-registry'; - -export default function useStepList() { - const intl = useIntl(); - const navigate = useNavigate(); - - const handleBack = useMemoizedFn(() => { - navigate(-1); - }); - - return useMemo( - () => [ - { - title: 'Basic Info', - content: '', - showButtons: () => { - return { - previous: false, - next: true, - save: false, - skip: false - }; - }, - defaultShow: true, - showForms: [moduleMap.BasicForm], - showModules: [] - }, - { - title: 'Version Configuration', - content: '', - showButtons: () => { - return { - previous: true, - next: true, - save: false, - skip: false - }; - }, - defaultShow: true, - showForms: [moduleMap.VersionConfigForm], - showModules: [] - }, - { - title: 'Parameters', - content: '', - showButtons: () => { - return { - previous: true, - next: false, - save: true, - skip: false - }; - }, - defaultShow: true, - showForms: [moduleMap.ParamertersForm], - showModules: [], - beforeNext: handleBack - } - ], - [handleBack, intl] - ); -} diff --git a/src/pages/backends/step-forms/version-config-form.tsx b/src/pages/backends/step-forms/version-config-form.tsx deleted file mode 100644 index a033e6e3..00000000 --- a/src/pages/backends/step-forms/version-config-form.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import PageTools from '@/components/page-tools'; -import { PageActionType } from '@/config/types'; -import { PlusOutlined } from '@ant-design/icons'; -import { useIntl } from '@umijs/max'; -import { Button, FormInstance } from 'antd'; -import { - forwardRef, - useEffect, - useImperativeHandle, - useRef, - useState -} from 'react'; -import styled from 'styled-components'; -import { FormData } from '../config/types'; -import VersionsConfig from '../forms/versions-config'; - -const PoolContainer = styled.div` - display: flex; - align-items: flex-start; - gap: 16px; -`; - -const PoolFormWrapper = styled.div` - flex: 1; - margin-bottom: 16px; -`; - -const Title = styled.span` - display: flex; - align-items: center; - justify-content: space-between; - font-weight: 700; - font-size: 16px; - .text { - font-size: 20px; - } -`; -interface WorkerPoolsFormProps { - action: PageActionType; - currentData?: any; -} - -const WorkerPoolsForm = forwardRef((props: WorkerPoolsFormProps, ref) => { - const intl = useIntl(); - const { action, currentData } = props; - const countRef = useRef(0); - const formRefs = useRef | null>>({}); - const [activeKey, setActiveKey] = useState>(new Set([0])); - const [versionConfigs, setVersionConfigs] = useState>( - new Map([ - [ - 0, - { - version_name: '', - image_name: '', - run_command: '' - } - ] - ]) as Map - ); - - const handleOnFinish = (values: any) => {}; - - const updateCount = () => { - countRef.current += 1; - return countRef.current; - }; - - const handleAddPool = () => { - const newId = updateCount(); - setVersionConfigs((prev) => - new Map(prev).set(newId, { - name: `` - } as FormData) - ); - - requestAnimationFrame(() => { - setActiveKey((prev) => new Set([newId])); - window.scrollTo({ - top: document.body.scrollHeight, - behavior: 'smooth' - }); - }); - }; - - const handleRemovePool = (id: number) => { - if (versionConfigs.size === 1) { - return; - } - - setVersionConfigs((prev) => { - const newList = new Map(prev); - newList.delete(id); - return newList; - }); - formRefs.current[id] = null; - }; - - const gatherFormValues = (results: PromiseSettledResult[]) => { - const resultList = results.map((result: PromiseSettledResult) => { - if (result.status === 'fulfilled') { - return result.value; - } - if (result.status === 'rejected') { - return result.reason?.values || {}; - } - return {}; - }); - console.log('gatherFormValues========', resultList); - return resultList.filter((item) => item); - }; - - const validateFields = async () => { - const promises = Array.from(Object.values(formRefs.current)).map((form) => - form?.validateFields() - ); - const results = await Promise.allSettled(promises); - console.log('results========0', promises, results); - if (results.some((result) => result.status === 'rejected')) { - return Promise.reject({ - values: { - worker_pools: gatherFormValues(results) - } - }); - } - return Promise.resolve({ - worker_pools: gatherFormValues(results) - }); - }; - - const setFieldsValue = (data: any) => { - const worker_pools = data.worker_pools || []; - const newWorkerPools = worker_pools.map( - (poolData: FormData, index: number) => [index, poolData] - ); - console.log('newWorkerPools========', newWorkerPools); - setVersionConfigs(new Map(newWorkerPools)); - }; - - const getFieldsValue = () => { - const values = Object.values(formRefs.current).map((form) => - form?.getFieldsValue() - ); - console.log('getFieldsValue========', values); - return { - worker_pools: values - }; - }; - - const handleOnToggle = (open: boolean, key: number) => { - console.log('Active keys changed:', key); - if (open) { - setActiveKey((prev) => new Set([key])); - } else { - setActiveKey((prev) => { - const newSet = new Set(prev); - newSet.delete(key); - return newSet; - }); - } - }; - - useImperativeHandle(ref, () => ({ - submit: () => {}, - validateFields: validateFields, - getFieldsValue: getFieldsValue - })); - - useEffect(() => { - if (currentData) { - console.log('currentData===========1=', currentData); - setFieldsValue(currentData); - } - }, [currentData]); - - return ( -
- - Backend Versions - - } - right={ - - } - > - - {Array.from(versionConfigs.keys()).map((key, index) => ( - - - { - if (el) { - formRefs.current[key] = el; - } - }} - collapseProps={{ - collapsible: true, - open: activeKey.has(key), - defaultOpen: activeKey.has(key), - onToggle: (open: boolean) => handleOnToggle(open, key) - }} - showDelete={versionConfigs.size > 1} - onFinish={handleOnFinish} - currentData={versionConfigs.get(key)} - onDelete={() => handleRemovePool(key)} - > - - - ))} -
- ); -}); - -export default WorkerPoolsForm;