diff --git a/.gitignore b/.gitignore
index 4133bab..34c176f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,7 @@ node_modules
.env.development.local
.env.test.local
.env.production.local
-
+.cursorignore
# Testing
coverage
diff --git a/apps/admin/app/(main)/jobs/[jobId]/page.tsx b/apps/admin/app/(main)/jobs/[jobId]/page.tsx
new file mode 100644
index 0000000..cb6e693
--- /dev/null
+++ b/apps/admin/app/(main)/jobs/[jobId]/page.tsx
@@ -0,0 +1,80 @@
+import { db, jobs, companies, applications, students } from '@workspace/db';
+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';
+
+interface JobPageProps {
+ params: { jobId: string };
+}
+
+export const dynamic = 'force-dynamic';
+
+export default async function JobDetailPage({ params }: JobPageProps) {
+ const jobId = Number(params.jobId);
+ if (isNaN(jobId)) notFound();
+
+ const jobRes = await db.select().from(jobs).where(eq(jobs.id, jobId)).limit(1);
+ if (jobRes.length === 0) notFound();
+ const job = jobRes[0];
+
+ const companyRes = await db.select().from(companies).where(eq(companies.id, job.companyId)).limit(1);
+ const company = companyRes[0];
+
+ const applicants = await db
+ .select({
+ applicationId: applications.id,
+ status: applications.status,
+ firstName: students.firstName,
+ lastName: students.lastName,
+ email: students.email,
+ })
+ .from(applications)
+ .leftJoin(students, eq(applications.studentId, students.id))
+ .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}
+
+ ))}
+
+
+
+ )}
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/admin/app/(main)/jobs/page.tsx b/apps/admin/app/(main)/jobs/page.tsx
new file mode 100644
index 0000000..964c1ff
--- /dev/null
+++ b/apps/admin/app/(main)/jobs/page.tsx
@@ -0,0 +1,73 @@
+import { db, jobs, companies } from '@workspace/db';
+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';
+
+export const dynamic = 'force-dynamic';
+
+async function getAllJobsWithCompany() {
+ const allJobs = await db.select().from(jobs);
+ const allCompanies = await db.select().from(companies);
+ return allJobs.map(job => ({
+ ...job,
+ company: allCompanies.find(c => c.id === job.companyId) || null,
+ }));
+}
+
+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?.email}
+
+
+
+
Location: {job.location}
+
Salary: {job.salary}
+
Deadline: {job.applicationDeadline.toLocaleDateString()}
+
Min CGPA: {job.minCGPA}
+
Min SSC: {job.minSSC}
+
Min HSC: {job.minHSC}
+
Allow Dead KT: {job.allowDeadKT ? 'Yes' : 'No'}
+
Allow Live KT: {job.allowLiveKT ? 'Yes' : 'No'}
+
+
Description: {job.description}
+
Created: {job.createdAt.toLocaleDateString()} | Updated: {job.updatedAt.toLocaleDateString()}
+
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/admin/app/(main)/layout.tsx b/apps/admin/app/(main)/layout.tsx
index 8a08165..acf3d42 100644
--- a/apps/admin/app/(main)/layout.tsx
+++ b/apps/admin/app/(main)/layout.tsx
@@ -9,28 +9,64 @@ import {
} from '@workspace/ui/components/navigation-menu';
import Link from 'next/link';
+const navLinks = [
+ { href: '/', label: 'Home', icon: '🏠' },
+ { href: '/students', label: 'Students', icon: '🎓' },
+ { href: '/jobs', label: 'Jobs', icon: '💼' },
+];
+
export default function MainLayout({ children }: { children: React.ReactNode }) {
+ // Helper to check active link (client-side only)
+ const isActive = (href: string) => {
+ if (typeof window === 'undefined') return false;
+ if (href === '/') return window.location.pathname === '/';
+ return window.location.pathname.startsWith(href);
+ };
+
return (
-
-
-