diff --git a/frontend/scripts/generate-page.ts b/frontend/scripts/generate-page.ts index 6e0fc818..b8a28f3e 100644 --- a/frontend/scripts/generate-page.ts +++ b/frontend/scripts/generate-page.ts @@ -116,8 +116,8 @@ function generateModal(options: GenerateOptions): string { const typeName = name.charAt(0).toUpperCase() + name.slice(1); return `import React, { useEffect } from 'react'; -import type { ${typeName}Response } from '@/pages/${name}/List/types'; -import { create${typeName}, update${typeName} } from '@/pages/${name}/List/service'; +import type { ${typeName}Response } from '../types'; +import { create${typeName}, update${typeName} } from '../service'; import { Dialog, DialogContent, @@ -139,7 +139,7 @@ import { Switch } from "@/components/ui/switch"; import { useToast } from "@/components/ui/use-toast"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; -import { ${typeName.toLowerCase()}FormSchema, type ${typeName}FormValues } from "@/pages/${name}/List/schema"; +import { ${typeName.toLowerCase()}FormSchema, type ${typeName}FormValues } from '../schema'; import { Textarea } from "@/components/ui/textarea"; interface ${typeName}ModalProps { @@ -347,11 +347,11 @@ import { } from "@/components/ui/alert-dialog"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; -import { searchFormSchema, type SearchFormValues } from "@/pages/${name}/List/schema"; +import { searchFormSchema, type SearchFormValues } from './schema'; import { DataTablePagination } from "@/components/ui/pagination"; -import type { ${typeName}Response, ${typeName}Query } from '@/pages/${name}/List/types'; -import { get${typeName}Page, delete${typeName} } from '@/pages/${name}/List/service'; -import ${typeName}Modal from '@/pages/${name}/List/components/${typeName}Modal'; +import type { ${typeName}Response, ${typeName}Query } from './types'; +import { get${typeName}Page, delete${typeName} } from './service'; +import ${typeName}Modal from './components/${typeName}Modal'; interface Column { accessorKey?: keyof ${typeName}Response; diff --git a/frontend/src/pages/Deploy/JenkinsManager/List/components/JenkinsManagerModal.tsx b/frontend/src/pages/Deploy/JenkinsManager/List/components/JenkinsManagerModal.tsx new file mode 100644 index 00000000..562b9f21 --- /dev/null +++ b/frontend/src/pages/Deploy/JenkinsManager/List/components/JenkinsManagerModal.tsx @@ -0,0 +1,183 @@ +import React, { useEffect } from 'react'; +import type { JenkinsManagerResponse } from '../types'; +import { createJenkinsManager, updateJenkinsManager } from '../service'; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Switch } from "@/components/ui/switch"; +import { useToast } from "@/components/ui/use-toast"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { jenkinsmanagerFormSchema, type JenkinsManagerFormValues } from "../schema"; +import { Textarea } from "@/components/ui/textarea"; + +interface JenkinsManagerModalProps { + open: boolean; + onCancel: () => void; + onSuccess: () => void; + initialValues?: JenkinsManagerResponse; +} + +const JenkinsManagerModal: React.FC = ({ + open, + onCancel, + onSuccess, + initialValues, +}) => { + const { toast } = useToast(); + const isEdit = !!initialValues?.id; + + const form = useForm({ + resolver: zodResolver(jenkinsmanagerFormSchema), + defaultValues: { + name: "", + description: "", + enabled: true, + sort: 0, + }, + }); + + useEffect(() => { + if (initialValues) { + form.reset({ + name: initialValues.name, + description: initialValues.description || "", + enabled: initialValues.enabled, + sort: initialValues.sort, + }); + } + }, [initialValues, form]); + + const handleSubmit = async (values: JenkinsManagerFormValues) => { + try { + if (isEdit) { + await updateJenkinsManager(initialValues.id, values); + } else { + await createJenkinsManager(values); + } + toast({ + title: `${isEdit ? '更新' : '创建'}成功`, + duration: 3000, + }); + form.reset(); + onSuccess(); + } catch (error) { + toast({ + variant: "destructive", + title: `${isEdit ? '更新' : '创建'}失败`, + description: error instanceof Error ? error.message : undefined, + duration: 3000, + }); + } + }; + + return ( + !open && onCancel()}> + + + {isEdit ? '编辑' : '新建'} + +
+ + ( + + 名称 + + + + + + )} + /> + + ( + + 描述 + +