这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
137 commits
Select commit Hold shift + click to select a range
d88adb3
test: backend for step1 sign-up complete, but i havent lifted the for…
rosuqt Apr 7, 2025
591600f
test: step 1 and step 2 backend complete, back button not working yet
rosuqt Apr 9, 2025
2cb10f1
fix: email validation when clicking back
rosuqt Apr 10, 2025
180b9ad
fix: fully functional step 2
rosuqt Apr 10, 2025
8188300
fix: auto select when creating new company
rosuqt Apr 10, 2025
7dd9946
test: im gonna try to change the dropdown
rosuqt Apr 11, 2025
53cc6a2
feat:
rosuqt Apr 11, 2025
7f4a6d0
feat: ULTIMATE WORKING VERSION NG STEP 2 signup.
rosuqt Apr 14, 2025
0500e23
test: deleted empty files for deployment
rosuqt Apr 14, 2025
0d8da8b
feat: finished sign-up step 1-3 but step 2 doesnt have form error msgs
rosuqt Apr 14, 2025
434e383
feat: full sign up done. sign up 2 has error msgs alr
rosuqt Apr 14, 2025
8ab25a9
needs fix assigned to adrian
rosuqt Apr 15, 2025
9e82291
test: test add since im adding bcrypt might mess up this is safe copy
rosuqt Apr 15, 2025
ab5117b
feat: added bcryptjs and swal loading needs fix
rosuqt Apr 15, 2025
0eaa185
feat: working sign-in | sign-in page.tsx needs 1 fix(mark/adrian)
rosuqt Apr 15, 2025
edd817e
feat: remade the sidebar
rosuqt Apr 15, 2025
2110f3e
test: safe working copy of dashboard scrolling
rosuqt Apr 16, 2025
61a3eff
feat: added db.sql
rosuqt Apr 16, 2025
53c528f
Fixed message without accidental mention
rosuqt Apr 16, 2025
3ad4c36
test: latest safe copy before migrating to supabase
rosuqt Apr 16, 2025
0b488d4
test: supabase connection
rosuqt Apr 16, 2025
d0b7f0a
test: removed unused form data for deployment testing
rosuqt Apr 16, 2025
ac7a7aa
test: .env update
rosuqt Apr 16, 2025
c644fd7
test: .env update2
rosuqt Apr 16, 2025
fc59aff
test: .env update3
rosuqt Apr 16, 2025
f7212ba
test: .env update4
rosuqt Apr 16, 2025
21c9677
feat: finished post-a-job UI will
rosuqt Apr 18, 2025
5563181
feat: fully functional post-a-job page.
rosuqt Apr 19, 2025
2830a36
test: fix import for vercel
rosuqt Apr 19, 2025
cccf9dc
Remove .env from repo
rosuqt Apr 19, 2025
d1b2e53
feat: new dashboard design
rosuqt Apr 21, 2025
6dbafd2
feat: added drafts moddal and job-listing-live
rosuqt Apr 22, 2025
ae611e9
feat: fixed validation, used session storage, design tweak
rosuqt Apr 29, 2025
54d707c
feat: fix for deployment
rosuqt Apr 29, 2025
d936543
test: fix for deploy pt3.
rosuqt Apr 29, 2025
4856a3d
test: vercel
rosuqt Apr 30, 2025
72e2610
feat: fixed renz's test cases for signup
rosuqt May 2, 2025
4b60c29
feat: fixed infinite rendering, added loaders, fixed fetching and val…
rosuqt May 4, 2025
e0876c8
feat: finished the whole UI for student module
rosuqt May 13, 2025
128e360
feat: microsoft login wont work for school email
rosuqt May 20, 2025
83968ab
feat: polished microsoft and signin roles
rosuqt May 20, 2025
f9ee8e1
Exploratory Testing | Commit Ver 01
rosuqt May 26, 2025
4c7464f
Exploratory Testing | Commit Ver 02
rosuqt May 26, 2025
ac2d0a2
Exploratory Testing | Commit Ver 03
rosuqt May 26, 2025
ab6e2c0
Exploratory Testing | Commit Ver 04
rosuqt May 30, 2025
0493fe2
Exploratory Testing | Commit Ver 05
rosuqt May 30, 2025
69d7119
Exploratory Testing | Commit Ver 06
rosuqt May 30, 2025
532c594
Exploratory Testing | Safe Commit
rosuqt Jun 1, 2025
fb1e009
Deployment | v1 - Initial release
rosuqt Jun 1, 2025
f265f4f
Exploratory Testing | Safe Commit.02
rosuqt Jun 2, 2025
56bab1b
Deployment | v2 - Initial release
rosuqt Jun 2, 2025
d7b7e00
Deployment | Test - env DELETE AFTER
rosuqt Jun 2, 2025
4a3e5e4
Deployment | Test v2
rosuqt Jun 2, 2025
02c19c2
Deployment | Test v4
rosuqt Jun 2, 2025
4599f50
Deployment | Test v5
rosuqt Jun 2, 2025
1747a35
Deployment | Test v6
rosuqt Jun 2, 2025
8a90eaa
Deployment | Test v7
rosuqt Jun 2, 2025
84968bc
Deployment | Test v8
rosuqt Jun 3, 2025
ad3a899
Deployment | Test v9
rosuqt Jun 3, 2025
dae9202
Deployment | Test v10
rosuqt Jun 5, 2025
abe9007
Deployment | Test v10.1
rosuqt Jun 5, 2025
23a2405
Deployment | Test v10.2
rosuqt Jun 5, 2025
cac904c
Deployment | Test v10.3
rosuqt Jun 6, 2025
4d6670a
Deployment | Test Employer Profile v1
rosuqt Jun 9, 2025
e5b9085
Deployment | Test Company Profile v1
rosuqt Jun 10, 2025
d3966ac
Deployment | Test Company Profile v2 (fixed signup)
rosuqt Jun 10, 2025
c2ccc1d
Deployment | Test Company Profile v3 (fixed company endless loop)
rosuqt Jun 10, 2025
ca3b750
Deployment | Test Company Profile v4 (fully implemented)
rosuqt Jun 10, 2025
25b356d
Deployment | Student Job Listing
rosuqt Jun 19, 2025
414cd3b
Deployment | Student Job Listing v2
rosuqt Jun 19, 2025
5d823c7
Deployment | Applications (before cron job attempt)
rosuqt Jun 20, 2025
1816415
Deployment | Applications cron job v1
rosuqt Jun 20, 2025
1025891
Deployment | Applications cron job v2
rosuqt Jun 20, 2025
3989ffe
Deployment | Applications cron job v3
rosuqt Jun 20, 2025
b5a35b8
Deployment | Applications cron job v4
rosuqt Jun 20, 2025
5195ba8
Deployment | Applications cron job v5
rosuqt Jun 20, 2025
eacb989
Deployment | Applications cron job v6
rosuqt Jun 20, 2025
68f84a3
Deployment | Applications cron job v7
rosuqt Jun 20, 2025
5eecdda
Deployment | Applications cron job v8
rosuqt Jun 20, 2025
946776f
Deployment | Applications cron job v9
rosuqt Jun 20, 2025
357eb04
Deployment | Applications cron job v0.1
rosuqt Jun 20, 2025
3819b00
Deployment | Applications Employers
rosuqt Jun 23, 2025
467c5f2
Deployment | Applications Students and added Middleware for 403 page
rosuqt Jun 25, 2025
1e9e187
Deployment | Fixed callback n Student Settings
rosuqt Jun 25, 2025
9de4c38
Sign in test console logs
rosuqt Jun 25, 2025
25a23a4
Sign in test console logs v2
rosuqt Jun 25, 2025
081def8
Sign in test console logs v3
rosuqt Jun 25, 2025
e007596
Sign in test console logs v4
rosuqt Jun 25, 2025
8243f7a
Sign in test console logs v5
rosuqt Jun 25, 2025
5fbdcc2
Sign in test console logs v6
rosuqt Jun 25, 2025
c57cce0
Sign in test console logs v7
rosuqt Jun 25, 2025
ff5bc42
Sign in test console logs v8
rosuqt Jun 25, 2025
a2cc0b5
Sign in test console logs v9
rosuqt Jun 25, 2025
c2dd199
middleware rip
rosuqt Jun 25, 2025
fe2b2a2
middleware | manually added decoding for vercel jwt >:(
rosuqt Jun 26, 2025
1da6e89
Superadmin | Account Management
rosuqt Jun 28, 2025
5babb01
Test all pages lol
rosuqt Jun 30, 2025
dc87bd2
Employer Verfication Page v.0
rosuqt Jul 3, 2025
18c4635
Employer Verfication Page v.0
rosuqt Jul 3, 2025
09b6093
Employer Verfication Page v.1
rosuqt Jul 3, 2025
0b4751d
Bro
rosuqt Jul 3, 2025
8bcaa57
DONT CLONE or DONT TEST: added smart writer, and skills generation
rosuqt Aug 14, 2025
bd16343
DONT CLONE or DONT TEST: interview practice whole module hard release
rosuqt Aug 21, 2025
22b4c91
DONT CLONE or DONT TEST: fixed build issues
rosuqt Aug 21, 2025
9b37b5b
DONT CLONE or DONT TEST: fixed build issues atmp2
rosuqt Aug 24, 2025
e4cede1
rough push
rosuqt Sep 17, 2025
7f196ee
fully finished employers job listings page READY FOR TESTING
rosuqt Oct 14, 2025
86e75fc
fully finished employers job listings page READY FOR TESTING v2
rosuqt Oct 14, 2025
536ca8a
fully finished employers job listings page READY FOR TESTING v3
rosuqt Oct 14, 2025
38aa551
added functional job metrics (refer to job_metrics table for metrics …
rosuqt Oct 17, 2025
e65e8ad
READY to TEST job metrics hired, total applicants and interviews. pls…
rosuqt Oct 21, 2025
e939153
READY to TEST job metrics hired, total applicants and interviews. pls…
rosuqt Oct 21, 2025
c992d87
READY to TEST job employers job listings details (overview tab and ap…
rosuqt Oct 23, 2025
c63464d
READY to TEST pls test metrics history (employers - job listings - an…
rosuqt Oct 23, 2025
8e3cf4d
READY to TEST pls test metrics history (employers - job listings - an…
rosuqt Oct 23, 2025
66dac1f
READY to TEST analytics tab
rosuqt Oct 23, 2025
6bd2bcb
READY to TEST archived jobs if buttons are disabled
rosuqt Oct 24, 2025
5c77dce
READY to TEST archive function sa job cards, overviewtab and settings…
rosuqt Oct 24, 2025
f449c56
READY to TEST archived jobs if buttons are disabled v2
rosuqt Oct 24, 2025
1cc38fc
READY to TEST delete functions for job cards ALL THREE OF THEM
rosuqt Oct 26, 2025
4bb63b0
READY to TEST delete functions for job cards ALL THREE OF THEM v2
rosuqt Oct 26, 2025
59a748b
READY to TEST delete functions for job cards ALL THREE OF THEM v3 (fi…
rosuqt Oct 26, 2025
2aa9e7b
applying cron for updating waitlisted
rosuqt Oct 27, 2025
3649245
applying cron for updating waitlisted v2
rosuqt Oct 27, 2025
d3237e9
send offer modal
rosuqt Oct 30, 2025
3b2a848
application tracker ready to test
rosuqt Nov 3, 2025
d9a3d27
application tracker ready to test
rosuqt Nov 3, 2025
d1b1b56
application details ready to test
rosuqt Nov 3, 2025
4a949d3
READY to TEST : Resume parser - ai-resume - Suggestions based on resume
rosuqt Nov 10, 2025
ae7c2fc
READY to TEST : Resume parser - ai-resume - Suggestions based on resu…
rosuqt Nov 10, 2025
29adad8
READY to TEST : Resume parser - ai-resume - Suggestions based on resu…
rosuqt Nov 10, 2025
be17d86
READY to TEST : Resume parser - ai-resume - Suggestions based on resu…
rosuqt Nov 11, 2025
b03ee51
READY to TEST : AI matches for students + student dashboard
rosuqt Nov 13, 2025
4812498
READY to TEST : AI matches for students + student dashboard v2
rosuqt Nov 13, 2025
9d63218
READY to TEST : AI matches for students + student dashboard v3
rosuqt Nov 13, 2025
2550875
READY to TEST : AI matches for students + student dashboard v4
rosuqt Nov 13, 2025
0d17f5b
READY to TEST : AI matches for students + student dashboard v5
rosuqt Nov 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 14 additions & 0 deletions .github/workflows/supabase-waitlisted-cron.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: Supabase Waitlisted Cron

on:
schedule:
- cron: '0 * * * *' # every hour

jobs:
call-edge-function:
runs-on: ubuntu-latest
steps:
- name: Call update-waitlisted Edge Function
run: |
curl -X POST "https://dbuyxpovejdakzveiprx.supabase.co/functions/v1/update-waitlisted" \
-H "Authorization: Bearer ${{ secrets.SUPABASE_ANON_KEY }}"
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*
.env
.env.*

# vercel
.vercel
Expand Down
5 changes: 5 additions & 0 deletions app/(app)/[username]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
//import AboutPage from "./students/students-profile";

export default function Page() {
//return <AboutPage />;
}
Empty file.
Empty file.
Empty file.
355 changes: 355 additions & 0 deletions app/(app)/admin/coordinators/dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,355 @@
"use client"

import { useState } from "react"
import {
BarChart3,
Users,
FileText,
TrendingUp,
ArrowUpRight,
ArrowDownRight,
Calendar,
ChevronDown,
GraduationCap,
} from "lucide-react"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import MuiPopover from "@mui/material/Popover"
import MuiButton from "@mui/material/Button"
import { motion } from "framer-motion"

const statsCards = [
{
title: "Total Students",
value: "245",
change: "+5%",
trend: "up",
icon: GraduationCap,
color: "from-blue-500 to-cyan-500",
bgColor: "from-blue-50 to-cyan-50",
sub: "from last month",
},
{
title: "Hired Students",
value: "87",
change: "+12%",
trend: "up",
icon: Users,
color: "from-emerald-500 to-teal-500",
bgColor: "from-emerald-50 to-teal-50",
sub: "from last month",
},
{
title: "In Progress",
value: "124",
change: "-3%",
trend: "down",
icon: FileText,
color: "from-orange-500 to-red-500",
bgColor: "from-orange-50 to-red-50",
sub: "from last month",
},
{
title: "Pending Reports",
value: "12",
change: "+2%",
trend: "up",
icon: BarChart3,
color: "from-purple-500 to-pink-500",
bgColor: "from-purple-50 to-pink-50",
sub: "from last month",
},
]

export default function AdminDashboard() {
const [dateRange, setDateRange] = useState("This Month")
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)
const handlePopoverOpen = (event: React.MouseEvent<HTMLElement>) => setAnchorEl(event.currentTarget)
const handlePopoverClose = () => setAnchorEl(null)
const open = Boolean(anchorEl)

return (
<div className="space-y-8">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
className="flex flex-col lg:flex-row lg:items-center lg:justify-between gap-6"
>
<div>
<h2 className="text-4xl font-bold text-gray-900 mb-2">Dashboard</h2>
<p className="text-lg text-gray-600">IT Department Admin Dashboard</p>
</div>
<div className="mt-4 md:mt-0 flex items-center gap-2">
<MuiButton
variant="outlined"
className="flex items-center gap-2"
onClick={handlePopoverOpen}
sx={{
textTransform: "none",
borderRadius: "0.75rem",
borderColor: "hsl(var(--border))",
fontWeight: 500,
fontSize: "1rem",
background: "white",
boxShadow: "0 2px 8px 0 rgba(99,102,241,0.08)",
}}
startIcon={<Calendar className="h-4 w-4" />}
endIcon={<ChevronDown className="h-4 w-4" />}
>
{dateRange}
</MuiButton>
<MuiPopover
open={open}
anchorEl={anchorEl}
onClose={handlePopoverClose}
anchorOrigin={{
vertical: "bottom",
horizontal: "left",
}}
transformOrigin={{
vertical: "top",
horizontal: "left",
}}
PaperProps={{
sx: { p: 1, minWidth: 160, borderRadius: 2 }
}}
>
<div className="p-2">
<div className="grid gap-1">
{["Today", "Yesterday", "This Week", "This Month", "This Year", "All Time"].map((range) => (
<MuiButton
key={range}
variant="text"
sx={{
justifyContent: "flex-start",
fontWeight: 400,
color: "inherit",
borderRadius: 1,
textTransform: "none",
width: "100%",
"&:hover": { backgroundColor: "rgba(0,0,0,0.04)" }
}}
onClick={() => {
setDateRange(range)
handlePopoverClose()
}}
>
{range}
</MuiButton>
))}
</div>
</div>
</MuiPopover>
</div>
</motion.div>

<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-4">
{statsCards.map((stat, index) => (
<motion.div
key={stat.title}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.1 }}
whileHover={{ y: -5 }}
className="group"
>
<Card className="relative overflow-hidden border-0 shadow-lg hover:shadow-xl transition-all duration-300 bg-white">
<div className={`absolute inset-0 bg-gradient-to-br opacity-5 ${stat.bgColor}`} />
<CardHeader className="flex flex-row items-center justify-between pb-3">
<CardTitle className="text-sm font-semibold text-gray-600 uppercase tracking-wide">
{stat.title}
</CardTitle>
<div className={`w-12 h-12 rounded-2xl bg-gradient-to-br flex items-center justify-center ${stat.color}`}>
<stat.icon className="w-6 h-6 text-white" />
</div>
</CardHeader>
<CardContent>
<div className="text-3xl font-bold text-gray-900 mb-2">{stat.value}</div>
<div
className={
stat.trend === "up"
? "flex items-center text-sm font-semibold text-emerald-600"
: "flex items-center text-sm font-semibold text-red-600"
}
>
{stat.trend === "up" ? (
<ArrowUpRight className="w-4 h-4 mr-1" />
) : (
<ArrowDownRight className="w-4 h-4 mr-1" />
)}
<span>{stat.change} {stat.sub}</span>
</div>
</CardContent>
</Card>
</motion.div>
))}
</div>

<Tabs defaultValue="overview" className="space-y-8">
<TabsList className="grid w-full grid-cols-3 lg:w-auto lg:grid-cols-none lg:flex rounded-2xl bg-gray-100 p-1.5 h-auto">
<TabsTrigger
value="overview"
className="rounded-xl data-[state=active]:bg-white data-[state=active]:shadow-sm py-3 px-6 font-semibold"
>
Overview
</TabsTrigger>
<TabsTrigger
value="students"
className="rounded-xl data-[state=active]:bg-white data-[state=active]:shadow-sm py-3 px-6 font-semibold"
>
Students
</TabsTrigger>
<TabsTrigger
value="reports"
className="rounded-xl data-[state=active]:bg-white data-[state=active]:shadow-sm py-3 px-6 font-semibold"
>
Reports
</TabsTrigger>
</TabsList>
<TabsContent value="overview" className="space-y-8">
<div className="grid gap-8 lg:grid-cols-3">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.3 }}
className="lg:col-span-2"
>
<Card className="border-0 shadow-lg bg-white">
<CardHeader>
<CardTitle className="text-xl font-bold text-gray-900">Student Placement Trends</CardTitle>
<CardDescription className="text-gray-600">
Monthly student placements over the past year
</CardDescription>
</CardHeader>
<CardContent>
<div className="h-[300px] flex items-center justify-center bg-gradient-to-br from-gray-50 to-gray-100 rounded-2xl border-2 border-dashed border-gray-200">
<p className="text-gray-500 font-medium text-lg">Chart: Monthly student placements</p>
</div>
</CardContent>
</Card>
</motion.div>
<motion.div initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.4 }}>
<Card className="border-0 shadow-lg bg-white h-full">
<CardHeader>
<CardTitle className="text-xl font-bold text-gray-900">Student Status</CardTitle>
<CardDescription className="text-gray-600">Breakdown by placement status</CardDescription>
</CardHeader>
<CardContent>
<div className="h-[300px] flex items-center justify-center bg-gradient-to-br from-gray-50 to-gray-100 rounded-2xl border-2 border-dashed border-gray-200">
<p className="text-gray-500 font-medium text-lg">Chart: Student status distribution</p>
</div>
</CardContent>
</Card>
</motion.div>
</div>
<div className="grid gap-8 lg:grid-cols-2">
<motion.div initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.5 }}>
<Card className="border-0 shadow-lg bg-white">
<CardHeader>
<CardTitle className="text-xl font-bold text-gray-900">Recent Activities</CardTitle>
<CardDescription className="text-gray-600">Latest department activities</CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-4">
{[1, 2, 3, 4, 5].map((i) => (
<motion.div
key={i}
initial={{ opacity: 0, x: -20 }}
animate={{ opacity: 1, x: 0 }}
transition={{ delay: 0.5 + i * 0.1 }}
className="flex items-start gap-4 p-4 rounded-2xl hover:bg-gray-50 transition-colors cursor-pointer group"
>
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-blue-500 to-cyan-500 flex items-center justify-center">
<Users className="h-5 w-5 text-white" />
</div>
<div className="flex-1 min-w-0">
<p className="text-sm font-semibold text-gray-900 group-hover:text-indigo-600 transition-colors">
Student placement updated
</p>
<p className="text-xs text-gray-600 mt-1 line-clamp-2">2 hours ago</p>
</div>
</motion.div>
))}
</div>
</CardContent>
</Card>
</motion.div>
<motion.div initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.6 }}>
<Card className="border-0 shadow-lg bg-white">
<CardHeader>
<CardTitle className="text-xl font-bold text-gray-900">Top Companies</CardTitle>
<CardDescription className="text-gray-600">Companies hiring the most IT students</CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-4">
{[1, 2, 3, 4, 5].map((i) => (
<motion.div
key={i}
initial={{ opacity: 0, x: -20 }}
animate={{ opacity: 1, x: 0 }}
transition={{ delay: 0.7 + i * 0.1 }}
className="flex items-center justify-between p-4 rounded-2xl hover:bg-gray-50 transition-colors group"
>
<div className="flex items-center gap-2">
<div className="h-8 w-8 rounded-full bg-gradient-to-br from-blue-100 to-purple-100 flex items-center justify-center"></div>
<div>
<p className="font-semibold text-gray-900 group-hover:text-indigo-600 transition-colors">
Tech Company {i}
</p>
<p className="text-xs text-gray-600">{15 - i * 2} students hired</p>
</div>
</div>
<TrendingUp className="h-5 w-5 text-emerald-500" />
</motion.div>
))}
</div>
</CardContent>
</Card>
</motion.div>
</div>
</TabsContent>
<TabsContent value="students">
<motion.div initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }}>
<Card className="border-0 shadow-lg bg-white">
<CardHeader className="flex flex-row items-center gap-3">
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-blue-500 to-cyan-500 flex items-center justify-center">
<GraduationCap className="w-5 h-5 text-white" />
</div>
<div>
<CardTitle className="text-xl font-bold text-gray-900">Student Analytics</CardTitle>
<CardDescription className="text-gray-600">Detailed student performance and placement metrics</CardDescription>
</div>
</CardHeader>
<CardContent>
<div className="h-[400px] flex items-center justify-center bg-gradient-to-br from-gray-50 to-gray-100 rounded-2xl border-2 border-dashed border-gray-200">
<p className="text-gray-500 font-medium text-lg">Student analytics content</p>
</div>
</CardContent>
</Card>
</motion.div>
</TabsContent>
<TabsContent value="reports">
<motion.div initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }}>
<Card className="border-0 shadow-lg bg-white">
<CardHeader className="flex flex-row items-center gap-3">
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-purple-500 to-pink-500 flex items-center justify-center">
<FileText className="w-5 h-5 text-white" />
</div>
<div>
<CardTitle className="text-xl font-bold text-gray-900">Department Reports</CardTitle>
<CardDescription className="text-gray-600">Generated reports and statistics for IT department</CardDescription>
</div>
</CardHeader>
<CardContent>
<div className="h-[400px] flex items-center justify-center bg-gradient-to-br from-gray-50 to-gray-100 rounded-2xl border-2 border-dashed border-gray-200">
<p className="text-gray-500 font-medium text-lg">Reports content</p>
</div>
</CardContent>
</Card>
</motion.div>
</TabsContent>
</Tabs>
</div>
)
}

Loading