From e9152e87252fe8578c7373f37874b6ae03ab600a Mon Sep 17 00:00:00 2001 From: jialin Date: Wed, 6 May 2026 09:28:53 +0800 Subject: [PATCH] refactor: add instance modal --- .../instances/components/add-modal.tsx | 103 +++++++++++++----- .../gpu-service/instances/forms/index.tsx | 4 +- .../instances/forms/instance-type.tsx | 13 +-- .../instances/forms/template-overlay.tsx | 2 +- 4 files changed, 84 insertions(+), 38 deletions(-) diff --git a/src/pages/gpu-service/instances/components/add-modal.tsx b/src/pages/gpu-service/instances/components/add-modal.tsx index 07d7cdaa..f04842f6 100644 --- a/src/pages/gpu-service/instances/components/add-modal.tsx +++ b/src/pages/gpu-service/instances/components/add-modal.tsx @@ -1,9 +1,32 @@ import { PageActionType } from '@/config/types'; -import { ModalFooter } from '@gpustack/core-ui'; +import Separator from '@/pages/llmodels/components/separator'; +import { ColumnWrapper, GSDrawer, ModalFooter } from '@gpustack/core-ui'; import { useRef } from 'react'; -import FormDrawer from '../../../_components/form-drawer'; +import styled from 'styled-components'; import { FormData, ListItem } from '../config/types'; import GPUServiceInstanceForm from '../forms'; +import { TemplateSelector } from '../forms/template-overlay'; +import InstanceTypeList from './instance-type-list'; + +const Container = styled.div` + display: flex; + height: 100%; + min-height: 0; +`; + +const ColWrapper = styled.div` + display: flex; + flex: 1; + max-width: 33.33%; + min-height: 0; +`; + +const FormWrapper = styled.div` + display: flex; + flex: 1; + max-width: 33.33%; + min-height: 0; +`; type AddModalProps = { title: string; @@ -40,33 +63,61 @@ const AddModal: React.FC = ({ }; return ( - - } + onClose={handleCancel} + destroyOnHidden={true} + closeIcon={false} + mask={{ + closable: false + }} + keyboard={false} + styles={{ + wrapper: { width: 'calc(100vw - 220px)' }, + body: { overflowY: 'hidden' } + }} + footer={false} > - - + + + + + + + + + + + + + + + + } + > + + + + + ); }; diff --git a/src/pages/gpu-service/instances/forms/index.tsx b/src/pages/gpu-service/instances/forms/index.tsx index 81b57a0c..9a7fe5df 100644 --- a/src/pages/gpu-service/instances/forms/index.tsx +++ b/src/pages/gpu-service/instances/forms/index.tsx @@ -12,12 +12,12 @@ import { Form } from 'antd'; import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react'; import { mockStorageData } from '../../storage/config/mock-data'; import { mockTemplateData } from '../../templates/config/mock-data'; +import TemplateBasicForm from '../../templates/forms/basic'; import { instanceTypeOptions, StorageModeValueMap } from '../config'; import { FormData, ListItem } from '../config/types'; import Basic from './basic'; import InstanceTypeFormItem from './instance-type'; import StorageVolume from './storage-volume'; -import TemplateFormItem from './template'; interface InstanceFormProps { ref?: any; @@ -196,7 +196,7 @@ const GPUServiceInstanceForm: React.FC = forwardRef( key: TABKeysMap.TEMPLATE, label: '实例模板', forceRender: true, - children: + children: }, { key: TABKeysMap.STORAGE, diff --git a/src/pages/gpu-service/instances/forms/instance-type.tsx b/src/pages/gpu-service/instances/forms/instance-type.tsx index 717837a7..52bda0a4 100644 --- a/src/pages/gpu-service/instances/forms/instance-type.tsx +++ b/src/pages/gpu-service/instances/forms/instance-type.tsx @@ -3,7 +3,7 @@ import { Input as CInput, InputNumber as CInputNumber } from '@gpustack/core-ui'; -import { Button, Flex, Form, Tag } from 'antd'; +import { Flex, Form } from 'antd'; import { useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; import { instanceTypeOptions, InstanceTypeStatusValueMap } from '../config'; @@ -68,20 +68,15 @@ const InstanceTypePicker: React.FC = ({ {selected?.name || '请选择实例类型'} - 库存 {selected?.gpu_count} - + */} - {/* {selected && ( - - 可用 - - )} */} 显存 {selected?.vram ?? '-'} GiB @@ -91,7 +86,7 @@ const InstanceTypePicker: React.FC = ({ - + {/* */} void; } -const TemplateSelector: React.FC = ({ +export const TemplateSelector: React.FC = ({ value, onChange, dataList = mockTemplateData