refactor: add instance modal

This commit is contained in:
jialin
2026-05-11 19:49:21 +08:00
committed by jialin
parent 7ea7f6666d
commit e9152e8725
4 changed files with 84 additions and 38 deletions
@@ -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<AddModalProps> = ({
};
return (
<FormDrawer
<GSDrawer
title={title}
open={open}
onCancel={handleCancel}
onSubmit={handleSubmit}
width={600}
push={{ distance: 24 }}
footer={
<ModalFooter
onOk={handleSubmit}
onCancel={handleCancel}
style={{
padding: '16px 24px 8px',
display: 'flex',
justifyContent: 'flex-end'
}}
/>
}
onClose={handleCancel}
destroyOnHidden={true}
closeIcon={false}
mask={{
closable: false
}}
keyboard={false}
styles={{
wrapper: { width: 'calc(100vw - 220px)' },
body: { overflowY: 'hidden' }
}}
footer={false}
>
<GPUServiceInstanceForm
ref={form}
action={action}
currentData={data}
onFinish={onFinish}
open={open}
/>
</FormDrawer>
<Container>
<ColWrapper>
<ColumnWrapper styles={{ container: { paddingBlock: 0 } }}>
<InstanceTypeList />
</ColumnWrapper>
<Separator></Separator>
</ColWrapper>
<ColWrapper>
<ColumnWrapper styles={{ container: { paddingBlock: 0 } }}>
<TemplateSelector></TemplateSelector>
</ColumnWrapper>
<Separator></Separator>
</ColWrapper>
<FormWrapper>
<ColumnWrapper
styles={{ container: { paddingBlock: 0 } }}
footer={
<ModalFooter
onOk={handleSubmit}
onCancel={handleCancel}
style={{
padding: '16px 24px 8px',
display: 'flex',
justifyContent: 'flex-end'
}}
/>
}
>
<GPUServiceInstanceForm
ref={form}
action={action}
currentData={data}
onFinish={onFinish}
open={open}
/>
</ColumnWrapper>
</FormWrapper>
</Container>
</GSDrawer>
);
};
@@ -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<InstanceFormProps> = forwardRef(
key: TABKeysMap.TEMPLATE,
label: '实例模板',
forceRender: true,
children: <TemplateFormItem />
children: <TemplateBasicForm />
},
{
key: TABKeysMap.STORAGE,
@@ -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<InstanceTypePickerProps> = ({
<AutoTooltip ghost minWidth={20}>
{selected?.name || '请选择实例类型'}
</AutoTooltip>
<Tag
{/* <Tag
style={{
fontWeight: 400,
color: 'var(--ant-color-text-tertiary)'
}}
>
库存 {selected?.gpu_count}
</Tag>
</Tag> */}
</Flex>
{/* {selected && (
<Tag color="success" style={{ margin: 0 }}>
可用
</Tag>
)} */}
</SummaryTitle>
<SummaryMeta>
<span> {selected?.vram ?? '-'} GiB</span>
@@ -91,7 +86,7 @@ const InstanceTypePicker: React.FC<InstanceTypePickerProps> = ({
</Flex>
</SummaryMeta>
</div>
<Button onClick={() => setOpen(true)}></Button>
{/* <Button onClick={() => setOpen(true)}>更换</Button> */}
</SelectedCard>
<InstanceTypeOverlay
open={open}
@@ -65,7 +65,7 @@ interface TemplateOverlayProps {
onCreate?: () => void;
}
const TemplateSelector: React.FC<TemplateSelectorProps> = ({
export const TemplateSelector: React.FC<TemplateSelectorProps> = ({
value,
onChange,
dataList = mockTemplateData