This commit is contained in:
dengqichen 2025-01-09 17:43:31 +08:00
parent ec369012f3
commit b01a9fc08e
3 changed files with 87 additions and 6 deletions

View File

@ -1,7 +1,10 @@
import React, {useEffect} from 'react'; import React, {useEffect, useState} from 'react';
import type {Application} from '../types'; import type {Application} from '../types';
import {DevelopmentLanguageTypeEnum} from '../types'; import {DevelopmentLanguageTypeEnum} from '../types';
import {createApplication, updateApplication} from '../service'; import {createApplication, updateApplication} from '../service';
import type {ExternalSystemResponse} from '@/pages/Deploy/External/types';
import {SystemType} from '@/pages/Deploy/External/types';
import {getExternalSystems} from '@/pages/Deploy/External/service';
import { import {
Dialog, Dialog,
DialogContent, DialogContent,
@ -50,6 +53,8 @@ const ApplicationModal: React.FC<ApplicationModalProps> = ({
}) => { }) => {
const {toast} = useToast(); const {toast} = useToast();
const isEdit = !!initialValues?.id; const isEdit = !!initialValues?.id;
const [gitInstances, setGitInstances] = useState<ExternalSystemResponse[]>([]);
const [selectedGitInstance, setSelectedGitInstance] = useState<ExternalSystemResponse>();
const form = useForm<ApplicationFormValues>({ const form = useForm<ApplicationFormValues>({
resolver: zodResolver(applicationFormSchema), resolver: zodResolver(applicationFormSchema),
@ -61,9 +66,34 @@ const ApplicationModal: React.FC<ApplicationModalProps> = ({
language: undefined, language: undefined,
enabled: true, enabled: true,
sort: 0, sort: 0,
gitInstanceId: undefined,
}, },
}); });
// 加载Git实例列表
const loadGitInstances = async () => {
try {
const response = await getExternalSystems({
type: SystemType.GIT,
enabled: true,
});
if (response?.content) {
setGitInstances(response.content);
}
} catch (error) {
toast({
variant: "destructive",
title: "加载Git实例失败",
description: error instanceof Error ? error.message : undefined,
duration: 3000,
});
}
};
useEffect(() => {
loadGitInstances();
}, []);
useEffect(() => { useEffect(() => {
if (initialValues) { if (initialValues) {
form.reset({ form.reset({
@ -74,9 +104,22 @@ const ApplicationModal: React.FC<ApplicationModalProps> = ({
language: initialValues.language, language: initialValues.language,
enabled: initialValues.enabled, enabled: initialValues.enabled,
sort: initialValues.sort, sort: initialValues.sort,
gitInstanceId: initialValues.gitInstanceId,
}); });
const gitInstance = gitInstances.find(instance => instance.id === initialValues.gitInstanceId);
if (gitInstance) {
setSelectedGitInstance(gitInstance);
} }
}, [initialValues, form]); }
}, [initialValues, form, gitInstances]);
// 处理Git实例选择
const handleGitInstanceChange = (value: string) => {
const instance = gitInstances.find(item => item.id === Number(value));
setSelectedGitInstance(instance);
// 清空仓库地址
form.setValue("repoUrl", "");
};
const handleSubmit = async (values: ApplicationFormValues) => { const handleSubmit = async (values: ApplicationFormValues) => {
try { try {
@ -179,6 +222,38 @@ const ApplicationModal: React.FC<ApplicationModalProps> = ({
)} )}
/> />
<FormField
control={form.control}
name="gitInstanceId"
render={({field}) => (
<FormItem>
<FormLabel>Git实例</FormLabel>
<Select
disabled={isEdit}
onValueChange={(value) => {
field.onChange(value);
handleGitInstanceChange(value);
}}
value={field.value?.toString()}
>
<FormControl>
<SelectTrigger>
<SelectValue placeholder="请选择Git实例"/>
</SelectTrigger>
</FormControl>
<SelectContent>
{gitInstances.map(instance => (
<SelectItem key={instance.id} value={instance.id.toString()}>
{instance.name}
</SelectItem>
))}
</SelectContent>
</Select>
<FormMessage/>
</FormItem>
)}
/>
<FormField <FormField
control={form.control} control={form.control}
name="repoUrl" name="repoUrl"
@ -186,10 +261,13 @@ const ApplicationModal: React.FC<ApplicationModalProps> = ({
<FormItem> <FormItem>
<FormLabel></FormLabel> <FormLabel></FormLabel>
<FormControl> <FormControl>
<div className="flex gap-2">
<Input <Input
{...field} {...field}
placeholder="请输入仓库地址" placeholder={selectedGitInstance ? `例如: ${selectedGitInstance.url}/your-project.git` : "请先选择Git实例"}
disabled={!selectedGitInstance}
/> />
</div>
</FormControl> </FormControl>
<FormMessage/> <FormMessage/>
</FormItem> </FormItem>

View File

@ -12,6 +12,7 @@ export const applicationFormSchema = z.object({
appCode: z.string().min(1, "请输入应用编码").max(50, "应用编码不能超过50个字符"), appCode: z.string().min(1, "请输入应用编码").max(50, "应用编码不能超过50个字符"),
appName: z.string().min(1, "请输入应用名称").max(50, "应用名称不能超过50个字符"), appName: z.string().min(1, "请输入应用名称").max(50, "应用名称不能超过50个字符"),
appDesc: z.string().max(200, "应用描述不能超过200个字符").optional(), appDesc: z.string().max(200, "应用描述不能超过200个字符").optional(),
gitInstanceId: z.string().min(1, "请选择Git实例"),
repoUrl: z.string().url("请输入有效的URL地址").min(1, "请输入仓库地址"), repoUrl: z.string().url("请输入有效的URL地址").min(1, "请输入仓库地址"),
language: z.nativeEnum(DevelopmentLanguageTypeEnum, { language: z.nativeEnum(DevelopmentLanguageTypeEnum, {
required_error: "请选择开发语言", required_error: "请选择开发语言",

View File

@ -18,6 +18,7 @@ export interface Application {
enabled: boolean; enabled: boolean;
sort: number; sort: number;
projectGroup: ProjectGroup; projectGroup: ProjectGroup;
gitInstanceId?: number;
} }
export interface CreateApplicationRequest { export interface CreateApplicationRequest {
@ -29,6 +30,7 @@ export interface CreateApplicationRequest {
language: DevelopmentLanguageTypeEnum; language: DevelopmentLanguageTypeEnum;
enabled: boolean; enabled: boolean;
sort: number; sort: number;
gitInstanceId: number;
} }
export interface UpdateApplicationRequest extends CreateApplicationRequest { export interface UpdateApplicationRequest extends CreateApplicationRequest {