From 8bfe681dd4aae9ed4b409a10a64cd620faaa98d6 Mon Sep 17 00:00:00 2001 From: Unchanted Date: Thu, 21 Aug 2025 13:55:24 +0530 Subject: [PATCH] feat(admin): fixed job listing --- .../app/(main)/jobs/new/new-job-form.tsx | 80 ++++++++++++++----- apps/admin/app/(main)/jobs/new/schema.ts | 8 +- apps/student/app/(main)/profile/page.tsx | 4 +- .../app/signup/steps/AcademicDetailsStep.tsx | 2 +- 4 files changed, 67 insertions(+), 27 deletions(-) diff --git a/apps/admin/app/(main)/jobs/new/new-job-form.tsx b/apps/admin/app/(main)/jobs/new/new-job-form.tsx index f203c88..7f69fb2 100644 --- a/apps/admin/app/(main)/jobs/new/new-job-form.tsx +++ b/apps/admin/app/(main)/jobs/new/new-job-form.tsx @@ -66,10 +66,30 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] } }, }) - async function handleSubmit(formData: FormData) { + async function handleSubmit(data: JobFormData) { setError(null) setSuccess(false) startTransition(async () => { + // Convert React Hook Form data to FormData for the server action + const formData = new FormData() + formData.append('companyId', String(data.companyId)) + formData.append('title', data.title) + formData.append('link', data.link) + formData.append('description', data.description) + formData.append('location', data.location) + formData.append('imageURL', data.imageURL || '') + formData.append('salary', data.salary) + // Convert Date to ISO string for the server + const deadline = data.applicationDeadline instanceof Date + ? data.applicationDeadline.toISOString().slice(0, 10) + : new Date(data.applicationDeadline).toISOString().slice(0, 10) + formData.append('applicationDeadline', deadline) + formData.append('minCGPA', String(data.minCGPA)) + formData.append('minSSC', String(data.minSSC)) + formData.append('minHSC', String(data.minHSC)) + formData.append('allowDeadKT', String(data.allowDeadKT)) + formData.append('allowLiveKT', String(data.allowLiveKT)) + const result = await createJob(formData) if (result?.success) { setSuccess(true) @@ -128,7 +148,7 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] }
- + {/* Success/Error Messages */} {success && ( @@ -319,25 +339,24 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] } control={form.control} name="applicationDeadline" render={({ field }) => { - const getDisplayDate = (value: string) => { + const getDisplayDate = (value: Date | string) => { if (!value) return "" try { - return format(new Date(value), "PPP") + const date = value instanceof Date ? value : new Date(value) + return format(date, "PPP") } catch { - return value + return "" } } - const selectedDate = field.value ? new Date(field.value) : undefined + const selectedDate = field.value ? (field.value instanceof Date ? field.value : new Date(field.value)) : undefined const handleSelect = (date: Date | undefined) => { - setTimeout(() => { - if (date) { - field.onChange(date.toISOString().slice(0, 10)) - } else { - field.onChange("") - } - }, 0) + if (date) { + field.onChange(date) + } else { + field.onChange(new Date()) + } } return ( @@ -354,9 +373,7 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] } )} type="button" > - {getDisplayDate(typeof field.value === "string" ? field.value : "") || ( - Pick a date - )} + {field.value ? getDisplayDate(field.value) : Pick a date} @@ -367,7 +384,6 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] } selected={selectedDate} onSelect={handleSelect} captionLayout="dropdown" - key={typeof field.value === "string" ? field.value : "empty"} /> @@ -445,7 +461,15 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] } Minimum CGPA - + field.onChange(e.target.value ? parseFloat(e.target.value) : 0)} + className="h-11" + /> @@ -459,7 +483,15 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] } Minimum SSC % - + field.onChange(e.target.value ? parseFloat(e.target.value) : 0)} + className="h-11" + /> @@ -473,7 +505,15 @@ function NewJobForm({ companies }: { companies: { id: number; name: string }[] } Minimum HSC % - + field.onChange(e.target.value ? parseFloat(e.target.value) : 0)} + className="h-11" + /> diff --git a/apps/admin/app/(main)/jobs/new/schema.ts b/apps/admin/app/(main)/jobs/new/schema.ts index 7971f23..879dd41 100644 --- a/apps/admin/app/(main)/jobs/new/schema.ts +++ b/apps/admin/app/(main)/jobs/new/schema.ts @@ -6,12 +6,12 @@ export const jobSchema = z.object({ link: z.string().url('Invalid URL'), description: z.string().min(1, 'Description is required'), location: z.string().min(1, 'Location is required'), - imageURL: z.string().url('Invalid URL'), + imageURL: z.string().url('Invalid URL').or(z.literal('')).optional(), salary: z.string().min(1, 'Salary is required'), applicationDeadline: z.date(), - minCGPA: z.number().min(0), - minSSC: z.number().min(0), - minHSC: z.number().min(0), + minCGPA: z.coerce.number().min(0, 'Minimum CGPA must be 0 or greater'), + minSSC: z.coerce.number().min(0, 'Minimum SSC must be 0 or greater'), + minHSC: z.coerce.number().min(0, 'Minimum HSC must be 0 or greater'), allowDeadKT: z.boolean(), allowLiveKT: z.boolean(), }); diff --git a/apps/student/app/(main)/profile/page.tsx b/apps/student/app/(main)/profile/page.tsx index 729d84e..e7a4ac6 100644 --- a/apps/student/app/(main)/profile/page.tsx +++ b/apps/student/app/(main)/profile/page.tsx @@ -684,7 +684,7 @@ export default function ProfilePage() { - Computer Science + Computer Engineering Information Technology Electronics & Communication Mechanical Engineering @@ -1251,4 +1251,4 @@ export default function ProfilePage() { ) -} \ No newline at end of file +} diff --git a/apps/student/app/signup/steps/AcademicDetailsStep.tsx b/apps/student/app/signup/steps/AcademicDetailsStep.tsx index 3b8ff0e..f002b81 100644 --- a/apps/student/app/signup/steps/AcademicDetailsStep.tsx +++ b/apps/student/app/signup/steps/AcademicDetailsStep.tsx @@ -22,7 +22,7 @@ export default function AcademicDetailsStep({ form }: { form: any }) { ]; const branchOptions = [ - { value: 'cse', label: 'Computer Science' }, + { value: 'cse', label: 'Computer Engineering' }, { value: 'it', label: 'Information Technology' }, { value: 'ece', label: 'Electronics & Communication' }, { value: 'mechanical', label: 'Mechanical' },