diff --git a/apps/admin/app/(main)/jobs/[jobId]/page.tsx b/apps/admin/app/(main)/jobs/[jobId]/page.tsx index f77a7e2..efd02cc 100644 --- a/apps/admin/app/(main)/jobs/[jobId]/page.tsx +++ b/apps/admin/app/(main)/jobs/[jobId]/page.tsx @@ -3,6 +3,21 @@ import { eq } from '@workspace/db/drizzle'; import { notFound } from 'next/navigation'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@workspace/ui/components/card'; import { Table, TableBody, TableHead, TableHeader, TableRow, TableCell } from '@workspace/ui/components/table'; +import { Badge } from '@workspace/ui/components/badge'; +import { Button } from '@workspace/ui/components/button'; +import { + ArrowLeft, + MapPin, + DollarSign, + Calendar, + GraduationCap, + Building2, + ExternalLink, + Users, + FileText, + Clock +} from 'lucide-react'; +import Link from 'next/link'; interface JobPageProps { params: { jobId: string }; @@ -34,47 +49,301 @@ export default async function JobDetailPage({ params }: JobPageProps) { .where(eq(applications.jobId, jobId)); return ( -
- - - {job.title} - Company: {company?.name ?? 'Unknown'} - - -

Location: {job.location}

-

Salary: {job.salary}

-

Deadline: {job.applicationDeadline.toLocaleDateString()}

-

{job.description}

-
-
- -
-

Students Applied

- {applicants.length === 0 ? ( -

No applications yet.

- ) : ( -
- - - - Name - Email - Status - - - - {applicants.map((a) => ( - - {`${a.firstName ?? ''} ${a.lastName ?? ''}`.trim()} - {a.email} - {a.status} - - ))} - -
+
+ {/* Header */} +
+
+
+ + + +
+
+

Job Details

+

View and manage job information

+
- )} -
+
+ + +
+
+ {/* Main Job Information */} +
+ {/* Job Header Card */} + + +
+
+
+ {company?.imageURL ? ( + {company.name} + ) : ( + + )} +
+
+ + {job.title} + + + {company?.name ?? 'Unknown Company'} + +
+
+ + {job.active ? 'Active' : 'Inactive'} + +
+
+ + {/* Key Details Grid */} +
+
+ +
+

Location

+

{job.location}

+
+
+
+ +
+

Salary

+

{job.salary}

+
+
+
+ +
+

Application Deadline

+

{job.applicationDeadline.toLocaleDateString()}

+
+
+
+ +
+

Applications

+

{applicants.length} students

+
+
+
+ + {/* Job Link */} + +
+
+ + {/* Job Description */} + + + + + Job Description + + + +
+

+ {job.description} +

+
+
+
+ + {/* Academic Requirements */} + + + + + Academic Requirements + + + +
+
+

{job.minCGPA}

+

Minimum CGPA

+
+
+

{job.minSSC}%

+

Minimum SSC

+
+
+

{job.minHSC}%

+

Minimum HSC

+
+
+
+
+
+ + Dead KT: {job.allowDeadKT ? 'Allowed' : 'Not Allowed'} + +
+
+
+ + Live KT: {job.allowLiveKT ? 'Allowed' : 'Not Allowed'} + +
+
+ + +
+ + {/* Sidebar */} +
+ {/* Company Information */} + + + + + Company Details + + + +
+
+ {company?.imageURL ? ( + {company.name} + ) : ( + + )} +
+
+

{company?.name}

+

{company?.email}

+
+
+ {company?.description && ( +

{company.description}

+ )} +
+
+ + {/* Job Timeline */} + + + + + Timeline + + + +
+ Created + {job.createdAt.toLocaleDateString()} +
+
+ Last Updated + {job.updatedAt.toLocaleDateString()} +
+
+ Application Deadline + {job.applicationDeadline.toLocaleDateString()} +
+
+
+
+
+ + {/* Applications Section */} +
+ + + + + Student Applications ({applicants.length}) + + + View all students who have applied for this position + + + + {applicants.length === 0 ? ( +
+ +

No applications yet

+

Students will appear here once they apply for this job.

+
+ ) : ( +
+ + + + Name + Email + Status + + + + {applicants.map((applicant) => ( + + + {`${applicant.firstName ?? ''} ${applicant.lastName ?? ''}`.trim() || 'Unknown'} + + {applicant.email} + + + {applicant.status.charAt(0).toUpperCase() + applicant.status.slice(1)} + + + + ))} + +
+
+ )} +
+
+
+
); } \ No newline at end of file diff --git a/apps/admin/app/(main)/jobs/page.tsx b/apps/admin/app/(main)/jobs/page.tsx index dfca32f..cf6fe0f 100644 --- a/apps/admin/app/(main)/jobs/page.tsx +++ b/apps/admin/app/(main)/jobs/page.tsx @@ -3,6 +3,20 @@ import { eq } from '@workspace/db/drizzle'; import Link from 'next/link'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@workspace/ui/components/card'; import { Button } from '@workspace/ui/components/button'; +import { Input } from '@workspace/ui/components/input'; +import { Badge } from '@workspace/ui/components/badge'; +import { + Search, + MapPin, + DollarSign, + Calendar, + GraduationCap, + Building2, + ExternalLink, + Plus, + Filter, + Briefcase +} from 'lucide-react'; export const dynamic = 'force-dynamic'; @@ -16,54 +30,198 @@ export default async function JobsListPage() { const jobsWithCompany = await getAllJobsWithCompany(); return ( -
-

All Jobs

-
- {jobsWithCompany.length === 0 && ( -

No jobs found.

- )} - {jobsWithCompany.map((job) => ( - - - - {job.title} - - {job.active ? 'Active' : 'Inactive'} - - - - Company: {job.company?.name ?? 'Unknown'} - - - -
- {job.company?.name} -
-
{job.company?.name}
-
{job.company?.email}
-
-
-
-
Location: {job.location}
-
Salary: {job.salary}
-
Deadline: {job.applicationDeadline.toLocaleDateString()}
-
Min CGPA: {job.minCGPA}
-
Min SSC: {job.minSSC}
-
Min HSC: {job.minHSC}
-
Dead KT: {job.allowDeadKT ? 'Yes' : 'No'}
-
Live KT: {job.allowLiveKT ? 'Yes' : 'No'}
-
-
Job Link: {job.link}
-
Description: {job.description}
-
Created: {job.createdAt.toLocaleDateString()} | Updated: {job.updatedAt.toLocaleDateString()}
-
-
- - - +
+ {/* Header Section */} +
+
+
+
+

Job Listings

+

Manage and monitor all job opportunities

- - ))} + + + +
+
+
+ + {/* Search and Filters Section */} +
+
+
+
+ + +
+
+ + + {jobsWithCompany.length} Jobs + +
+
+
+
+ + {/* Jobs Grid */} +
+ {jobsWithCompany.length === 0 ? ( +
+
+ +
+

No jobs found

+

Get started by creating your first job listing

+ + + +
+ ) : ( +
+ {jobsWithCompany.map((job) => ( + + {/* Card Header */} + +
+
+
+ {job.company?.imageURL ? ( + {job.company.name} + ) : ( + + )} +
+
+ + {job.title} + + + {job.company?.name ?? 'Unknown Company'} + +
+
+ + {job.active ? 'Active' : 'Inactive'} + +
+
+ + {/* Card Content */} + + {/* Key Details */} +
+
+ + {job.location} +
+
+ + {job.salary} +
+
+ + Deadline: {job.applicationDeadline.toLocaleDateString()} +
+
+ + {/* Academic Requirements */} +
+
+ + Requirements +
+
+
CGPA: {job.minCGPA}
+
SSC: {job.minSSC}%
+
HSC: {job.minHSC}%
+
+ + Dead KT: {job.allowDeadKT ? 'Allowed' : 'Not Allowed'} + + + Live KT: {job.allowLiveKT ? 'Allowed' : 'Not Allowed'} + +
+
+
+ + {/* Job Link */} + + + {/* Description Preview */} + {job.description && ( +
+

+ {job.description} +

+
+ )} + + {/* Timestamps */} +
+
+ Created: {job.createdAt.toLocaleDateString()} + Updated: {job.updatedAt.toLocaleDateString()} +
+
+
+ + {/* Card Footer */} +
+ + + +
+
+ ))} +
+ )}
);