diff --git a/apps/casualroom/db/generated/prisma/edge.js b/apps/casualroom/db/generated/prisma/edge.js index f1b7158..106994b 100644 --- a/apps/casualroom/db/generated/prisma/edge.js +++ b/apps/casualroom/db/generated/prisma/edge.js @@ -438,7 +438,7 @@ const config = { "value": "prisma-client-js" }, "output": { - "value": "/home/leon/projects/nice/apps/casualroom/db/generated/prisma", + "value": "/home/han/project/nice/apps/casualroom/db/generated/prisma", "fromEnvVar": null }, "config": { @@ -456,7 +456,7 @@ const config = { } ], "previewFeatures": [], - "sourceFilePath": "/home/leon/projects/nice/apps/casualroom/db/prisma/schema.prisma", + "sourceFilePath": "/home/han/project/nice/apps/casualroom/db/prisma/schema.prisma", "isCustomOutput": true }, "relativeEnvPaths": { diff --git a/apps/casualroom/db/generated/prisma/index.js b/apps/casualroom/db/generated/prisma/index.js index 8a37318..78f8731 100644 --- a/apps/casualroom/db/generated/prisma/index.js +++ b/apps/casualroom/db/generated/prisma/index.js @@ -439,7 +439,7 @@ const config = { "value": "prisma-client-js" }, "output": { - "value": "/home/leon/projects/nice/apps/casualroom/db/generated/prisma", + "value": "/home/han/project/nice/apps/casualroom/db/generated/prisma", "fromEnvVar": null }, "config": { @@ -457,7 +457,7 @@ const config = { } ], "previewFeatures": [], - "sourceFilePath": "/home/leon/projects/nice/apps/casualroom/db/prisma/schema.prisma", + "sourceFilePath": "/home/han/project/nice/apps/casualroom/db/prisma/schema.prisma", "isCustomOutput": true }, "relativeEnvPaths": { diff --git a/apps/casualroom/db/generated/prisma/runtime/index-browser.d.ts b/apps/casualroom/db/generated/prisma/runtime/index-browser.d.ts old mode 100755 new mode 100644 diff --git a/apps/casualroom/db/generated/prisma/runtime/library.d.ts b/apps/casualroom/db/generated/prisma/runtime/library.d.ts old mode 100755 new mode 100644 diff --git a/apps/casualroom/db/prisma/migrations/20250728073212_init/migration.sql b/apps/casualroom/db/prisma/migrations/20250728082503_init/migration.sql similarity index 100% rename from apps/casualroom/db/prisma/migrations/20250728073212_init/migration.sql rename to apps/casualroom/db/prisma/migrations/20250728082503_init/migration.sql diff --git a/apps/casualroom/web/app/[locale]/dashboard/form/components/ApplicationForm.tsx b/apps/casualroom/web/app/[locale]/dashboard/form/components/ApplicationForm.tsx new file mode 100644 index 0000000..bfd023c --- /dev/null +++ b/apps/casualroom/web/app/[locale]/dashboard/form/components/ApplicationForm.tsx @@ -0,0 +1,202 @@ +import { Input } from "@nice/ui/components/input"; +import { Textarea } from "@nice/ui/components/textarea"; +import { Label } from "@nice/ui/components/label"; +import { Button } from "@nice/ui/components/button"; +import { useState } from "react"; +import { IconX } from '@tabler/icons-react'; + +// 可根据实际组件库调整导入 + +export type Family = { + name: string; + birth: string; + relation: string; + origin: string; + work: string; + address: string; +}; + +export type ApplicationFormData = { + applicantName: string; + applicantLevel: string; + applicantBirth: string; + applicantEntry: string; + applicantMarriage: string; + familyList: Family[]; + daysLived: string; + daysLeft: string; + daysApply: string; + contact: string; + planCheckin: string; + planCheckout: string; + reason: string; + opinions: string[]; +}; + +export interface ApplicationFormProps { + initialData?: ApplicationFormData; + onClose?: () => void; + onSubmit?: (data: ApplicationFormData) => void; +} + +export function ApplicationForm({ initialData, onClose, onSubmit }: ApplicationFormProps) { + const [form, setForm] = useState( + initialData || { + applicantName: "", + applicantLevel: "", + applicantBirth: "", + applicantEntry: "", + applicantMarriage: "", + familyList: [ + { name: "", birth: "", relation: "", origin: "", work: "", address: "" }, + ], + daysLived: "", + daysLeft: "", + daysApply: "", + contact: "", + planCheckin: "", + planCheckout: "", + reason: "", + opinions: ["", "", "", "", ""], + } + ); + + const handleChange = (field: keyof ApplicationFormData, value: any) => { + setForm(f => ({ ...f, [field]: value })); + }; + + const handleFamilyChange = (idx: number, field: keyof Family, value: string) => { + setForm(f => { + const familyList = [...f.familyList]; + familyList[idx] = { ...familyList[idx], [field]: value } as Family; + return { ...f, familyList }; + }); + }; + + const addFamily = () => { + setForm(f => ({ + ...f, + familyList: [ + ...f.familyList, + { name: "", birth: "", relation: "", origin: "", work: "", address: "" }, + ], + })); + }; + + const removeFamily = (idx: number) => { + setForm(f => ({ + ...f, + familyList: f.familyList.filter((_, i) => i !== idx), + })); + }; + + const handleOpinionChange = (idx: number, value: string) => { + setForm(f => { + const opinions = [...f.opinions]; + opinions[idx] = value; + return { ...f, opinions }; + }); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onSubmit?.(form); + onClose?.(); + }; + + return ( +
+

申请表

+ {/* 申请人信息 */} +
+
申请人信息
+
+ + handleChange('applicantName', e.target.value)} /> + + handleChange('applicantLevel', e.target.value)} /> + + handleChange('applicantBirth', e.target.value)} /> + + handleChange('applicantEntry', e.target.value)} /> + + handleChange('applicantMarriage', e.target.value)} /> +
+
+ {/* 家人信息 */} +
+
+ 家人信息 + +
+ {form.familyList.map((family, idx) => ( +
+
+ {form.familyList.length > 1 && ( + + )} +
+ + handleFamilyChange(idx, 'name', e.target.value)} /> + + handleFamilyChange(idx, 'birth', e.target.value)} /> + + handleFamilyChange(idx, 'relation', e.target.value)} /> + + handleFamilyChange(idx, 'origin', e.target.value)} /> + + handleFamilyChange(idx, 'work', e.target.value)} /> + + handleFamilyChange(idx, 'address', e.target.value)} /> +
+ ))} +
+ {/* 住宿信息 */} +
+ + handleChange('daysLived', e.target.value)} /> + + handleChange('daysLeft', e.target.value)} /> + + handleChange('daysApply', e.target.value)} /> + + handleChange('contact', e.target.value)} /> + + handleChange('planCheckin', e.target.value)} /> + + handleChange('planCheckout', e.target.value)} /> +
+ {/* 申请理由 */} +
+ +