Files
gpustack-ui/src/pages/maas-provider/forms/basic.tsx
T

133 lines
3.6 KiB
TypeScript

import PluginExtraFields from '@/components/plugin-extra-fields';
import { PageAction } from '@/config';
import {
Input as CInput,
Password,
Select as SealSelect,
useAppUtils
} from '@gpustack/core-ui';
import { useIntl } from '@umijs/max';
import { Form } from 'antd';
import ProviderLogo from '../components/provider-logo';
import { useFormContext } from '../config/form-context';
import { maasProviderOptions } from '../config/providers';
import { FormData } from '../config/types';
import providerTypeStyles from '../styles/provider-type.less';
import ProviderConfigs from './provider-configs';
const Basic: React.FC<{
onAPIKeyBlur?: (e: any) => void;
}> = ({ onAPIKeyBlur }) => {
const intl = useIntl();
const form = Form.useFormInstance<FormData>();
const { action } = useFormContext();
const providerType = Form.useWatch(['config', 'type'], form);
const { getRuleMessage } = useAppUtils();
const optionRender = (option: any) => {
return (
<div style={{ display: 'flex', alignItems: 'center' }}>
<ProviderLogo provider={option.value} />
<span style={{ marginLeft: 8 }}>{option.label}</span>
</div>
);
};
const filterOption = (input: string, option?: any) => {
return (
option?.label?.toLowerCase().includes(input.toLowerCase()) ||
option?.value?.toLowerCase().includes(input.toLowerCase())
);
};
const renderLogoPrefix = () => {
const hasProvider = maasProviderOptions.some(
(option) => option.value === providerType
);
if (hasProvider) {
return (
<div style={{ display: 'flex', alignItems: 'end', height: '100%' }}>
<ProviderLogo provider={providerType as string} />
</div>
);
}
return null;
};
return (
<>
<Form.Item<FormData>
name="name"
data-field="name"
required
rules={[
{
required: true,
message: getRuleMessage('input', 'common.table.name')
}
]}
>
<CInput.Input
required
label={intl.formatMessage({
id: 'common.table.name'
})}
/>
</Form.Item>
<PluginExtraFields name="CreateOrgScopeField" context={{ action }} />
<Form.Item<FormData>
name={['config', 'type']}
rules={[
{
required: true,
message: getRuleMessage('select', 'common.table.type')
}
]}
>
<SealSelect
showSearch={{
filterOption: filterOption
}}
required
className={providerTypeStyles.providerType}
prefix={renderLogoPrefix()}
options={maasProviderOptions}
optionRender={optionRender}
label={intl.formatMessage({
id: 'common.table.type'
})}
/>
</Form.Item>
<ProviderConfigs />
<Form.Item<FormData>
name="api_key"
rules={[
{
required: true,
message: getRuleMessage('input', 'providers.form.tokens.title')
}
]}
>
<Password
required
visibilityToggle={action !== PageAction.EDIT}
onBlur={onAPIKeyBlur}
label={intl.formatMessage({
id: 'providers.form.tokens.title'
})}
/>
</Form.Item>
<Form.Item<FormData> name="description">
<CInput.TextArea
scaleSize={true}
label={intl.formatMessage({
id: 'common.table.description'
})}
></CInput.TextArea>
</Form.Item>
</>
);
};
export default Basic;