Skip to content

Commit f4264cd

Browse files
committed
dashboard backend connected
1 parent 768d5a2 commit f4264cd

File tree

4 files changed

+134
-68
lines changed

4 files changed

+134
-68
lines changed

src/components/SideBar/Roles/admin.tsx

+36
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,42 @@ const AdminDashboard = () => {
293293
{/* <SessionDropDown AllSeasons={AllSeasons} /> */}
294294
</div>
295295
</Link>
296+
<Link href={"/admin/dashboard"}>
297+
<div className="hover:bg-gray-900 rounded-md my-[1vh] py-[1vh] px-[1vw]">
298+
<div className="flex justify-start gap-[1vw]">
299+
<div className="w-[2vw]">
300+
<svg
301+
width="20"
302+
height="20"
303+
viewBox="0 0 15 15"
304+
fill="none"
305+
xmlns="http://www.w3.org/2000/svg"
306+
>
307+
<path
308+
d="M4.2 1H4.17741H4.1774C3.86936 0.999988 3.60368 0.999978 3.38609 1.02067C3.15576 1.04257 2.92825 1.09113 2.71625 1.22104C2.51442 1.34472 2.34473 1.51442 2.22104 1.71625C2.09113 1.92825 2.04257 2.15576 2.02067 2.38609C1.99998 2.60367 1.99999 2.86935 2 3.17738V3.1774V3.2V11.8V11.8226V11.8226C1.99999 12.1307 1.99998 12.3963 2.02067 12.6139C2.04257 12.8442 2.09113 13.0717 2.22104 13.2837C2.34473 13.4856 2.51442 13.6553 2.71625 13.779C2.92825 13.9089 3.15576 13.9574 3.38609 13.9793C3.60368 14 3.86937 14 4.17741 14H4.2H10.8H10.8226C11.1306 14 11.3963 14 11.6139 13.9793C11.8442 13.9574 12.0717 13.9089 12.2837 13.779C12.4856 13.6553 12.6553 13.4856 12.779 13.2837C12.9089 13.0717 12.9574 12.8442 12.9793 12.6139C13 12.3963 13 12.1306 13 11.8226V11.8V3.2V3.17741C13 2.86936 13 2.60368 12.9793 2.38609C12.9574 2.15576 12.9089 1.92825 12.779 1.71625C12.6553 1.51442 12.4856 1.34472 12.2837 1.22104C12.0717 1.09113 11.8442 1.04257 11.6139 1.02067C11.3963 0.999978 11.1306 0.999988 10.8226 1H10.8H4.2ZM3.23875 2.07368C3.26722 2.05623 3.32362 2.03112 3.48075 2.01618C3.64532 2.00053 3.86298 2 4.2 2H10.8C11.137 2 11.3547 2.00053 11.5193 2.01618C11.6764 2.03112 11.7328 2.05623 11.7613 2.07368C11.8285 2.11491 11.8851 2.17147 11.9263 2.23875C11.9438 2.26722 11.9689 2.32362 11.9838 2.48075C11.9995 2.64532 12 2.86298 12 3.2V11.8C12 12.137 11.9995 12.3547 11.9838 12.5193C11.9689 12.6764 11.9438 12.7328 11.9263 12.7613C11.8851 12.8285 11.8285 12.8851 11.7613 12.9263C11.7328 12.9438 11.6764 12.9689 11.5193 12.9838C11.3547 12.9995 11.137 13 10.8 13H4.2C3.86298 13 3.64532 12.9995 3.48075 12.9838C3.32362 12.9689 3.26722 12.9438 3.23875 12.9263C3.17147 12.8851 3.11491 12.8285 3.07368 12.7613C3.05624 12.7328 3.03112 12.6764 3.01618 12.5193C3.00053 12.3547 3 12.137 3 11.8V3.2C3 2.86298 3.00053 2.64532 3.01618 2.48075C3.03112 2.32362 3.05624 2.26722 3.07368 2.23875C3.11491 2.17147 3.17147 2.11491 3.23875 2.07368ZM5 10C4.72386 10 4.5 10.2239 4.5 10.5C4.5 10.7761 4.72386 11 5 11H8C8.27614 11 8.5 10.7761 8.5 10.5C8.5 10.2239 8.27614 10 8 10H5ZM4.5 7.5C4.5 7.22386 4.72386 7 5 7H10C10.2761 7 10.5 7.22386 10.5 7.5C10.5 7.77614 10.2761 8 10 8H5C4.72386 8 4.5 7.77614 4.5 7.5ZM5 4C4.72386 4 4.5 4.22386 4.5 4.5C4.5 4.77614 4.72386 5 5 5H10C10.2761 5 10.5 4.77614 10.5 4.5C10.5 4.22386 10.2761 4 10 4H5Z"
309+
fill="currentColor"
310+
fillRule="evenodd"
311+
clipRule="evenodd"
312+
></path>
313+
</svg>
314+
</div>
315+
<motion.div
316+
initial={{ opacity: 1 }}
317+
animate={context.isOpen ? "open" : "closed"}
318+
transition={{ duration: 0.1 }}
319+
variants={{
320+
closed: { opacity: 0 },
321+
open: { opacity: 1 },
322+
}}
323+
className="w-[13vw]"
324+
>
325+
Dashboard
326+
</motion.div>
327+
</div>
328+
329+
{/* <JobDropDown userRole={userRole} /> */}
330+
</div>
331+
</Link>
296332
</div>
297333
</>
298334
);
+46-37
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { useState, useEffect } from "react";
2-
import { useState, useEffect } from "react";
32
import { Header } from "./header";
43
import { Sidebar } from "./sidebar";
54
import { DataRibbon } from "./data-ribbon";
65
import { ChartSection } from "./chart-section";
7-
import { DataRibbonStatsFC, ChartDataFC } from "@/helpers/analytics-dashboard/types";
8-
import { getRibbonStats } from "@/helpers/analytics-dashboard/api";
6+
import { SeasonDataFC } from "@/helpers/analytics-dashboard/types";
7+
import { getSeasonStats } from "@/helpers/analytics-dashboard/api";
98
import Loading from "../common/loading";
109
import axios from "axios";
1110

@@ -15,51 +14,62 @@ export default function Dashboard() {
1514
const [currentView, setCurrentView] = useState<"reports" | "trends">("reports");
1615
const [season, setSeason] = useState<string>("");
1716
const [yearRange, setYearRange] = useState<[number, number]>([new Date().getFullYear() - 5, new Date().getFullYear()]);
18-
const [ribbonStats, setRibbonStats] = useState<DataRibbonStatsFC | null>(null)
19-
const [chartData, setChartData] = useState<ChartDataFC | null>(null)
20-
const [isLoading, setIsLoading] = useState(false)
17+
const [seasonData, setSeasonData] = useState<SeasonDataFC | null>(null)
18+
const [isLoading, setIsLoading] = useState(true)
2119
const [error, setError] = useState<string | null>(null)
2220

2321
const [optionsx, setOptionsx] = useState([]);
2422
let options: any = [];
2523
useEffect(() => {
2624
axios.get(`${baseUrl}/api/v1/jaf`).then((res) => {
27-
res.data.seasons.map((season: any) => {
28-
const seasonString = `${season.type} ${season.year}`
29-
options.push({ value: season.id, label: seasonString });
25+
const newOptions = res.data.seasons.map((season: any) => {
26+
const seasonString = `${season.type} ${season.year}`;
27+
return { value: season.id, label: seasonString, type: season.type, year: season.year };
3028
});
31-
setOptionsx(options);
32-
if(options.length > 0){
33-
setSeason(options[0].value);
34-
}
29+
30+
// Sort the options
31+
newOptions.sort((a: any, b: any) => {
32+
if (a.year !== b.year) {
33+
return b.year - a.year;
34+
}
35+
if (a.type === b.type) {
36+
return 0;
37+
}
38+
return a.type === "Placement" ? -1 : 1;
39+
});
40+
41+
setOptionsx(newOptions);
42+
if (newOptions.length > 0) {
43+
setSeason(newOptions[0].value);
44+
}
45+
setIsLoading(false);
3546
})
3647
.catch((err) => {
3748
console.log(err);
38-
}
39-
);
49+
});
4050
}, []);
4151

42-
// useEffect(() => {
43-
// async function fetchSeasonData() {
44-
// setIsLoading(true)
45-
// try {
46-
// const { ribbonStats, chartData } = await getRibbonStats({
47-
// year: seasonYear,
48-
// type: seasonType
49-
// })
50-
51-
// setRibbonStats(ribbonStats)
52-
// setError(null)
53-
// } catch (err) {
54-
// setError('Failed to load season data')
55-
// console.error(err)
56-
// } finally {
57-
// setIsLoading(false)
58-
// }
59-
// }
52+
useEffect(() => {
53+
async function fetchSeasonData() {
54+
setIsLoading(true)
55+
try {
56+
let data = await getSeasonStats(season);
57+
setSeasonData(data);
58+
console.log(seasonData);
59+
setError(null);
60+
} catch (err) {
61+
setError('Failed to load season data')
62+
console.error(err)
63+
} finally {
64+
setIsLoading(false)
65+
}
66+
}
67+
if(season !== "") {
68+
fetchSeasonData();
69+
}
70+
}, [season])
6071

61-
// fetchSeasonData()
62-
// }, [seasonYear, seasonType])
72+
6373

6474
if (isLoading) {
6575
return Loading();
@@ -74,7 +84,7 @@ export default function Dashboard() {
7484
<Header currentView={currentView} onViewChange={setCurrentView} />
7585
<div className="flex h-screen overflow-y-auto bg-background">
7686
<main className="flex-1 overflow-y-auto p-6 no-scrollbar">
77-
{/* <DataRibbon stats={ribbonStats} /> */}
87+
{/* <DataRibbon stats={seasonData} /> */}
7888
<ChartSection />
7989
</main>
8090
<Sidebar
@@ -88,5 +98,4 @@ export default function Dashboard() {
8898
</div>
8999
</div>
90100
)
91-
)
92101
}
+4-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { apiCall } from "../api";
2-
import { DataRibbonStatsFC, ChartDataFC } from "./types";
2+
import { SeasonDataFC } from "./types";
33
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
44

5-
export async function getRibbonStats(data: {
6-
7-
}) {
8-
9-
}
5+
export const getSeasonStats = async (id: string) => {
6+
return apiCall(`/analytics-dashboard/getSeasonStats/${id}`);
7+
};
+48-25
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,48 @@
1-
export interface PlacementSeasonFC {
2-
year: number
3-
type: 'placement' | 'internship'
4-
}
5-
6-
export interface DataRibbonStatsFC {
7-
totalRegisteredStudentsCount: number;
8-
placedStudentsCount: number;
9-
placementPercentage: number;
10-
unplacedPercentage: number;
11-
totalOffers: number;
12-
totalCompaniesOffering: number;
13-
highestPackage: number;
14-
lowestPackage: number;
15-
meanPackage: number;
16-
medianPackage: number;
17-
modePackage: number;
18-
}
19-
20-
export interface ChartDataFC {
21-
[key: string]: {
22-
chart: any[]
23-
total: number
24-
}
25-
}
1+
interface StatsFC {
2+
totalRegisteredStudentsCount: number;
3+
placedStudentsCount: number;
4+
placementPercentage: number;
5+
unplacedPercentage: number;
6+
totalOffers: number;
7+
totalCompaniesOffering: number;
8+
highestPackage: number;
9+
lowestPackage: number;
10+
meanPackage: number;
11+
medianPackage: number;
12+
modePackage: number;
13+
}
14+
15+
interface DepartmentWiseStatsFC {
16+
[key: string]: StatsFC;
17+
}
18+
19+
interface CategoryWiseStatsFC {
20+
GENERAL: StatsFC;
21+
OBC: StatsFC;
22+
SC: StatsFC;
23+
ST: StatsFC;
24+
PWD: StatsFC;
25+
}
26+
27+
interface GenderWiseStatsFC {
28+
MALE: StatsFC;
29+
FEMALE: StatsFC;
30+
OTHER: StatsFC;
31+
}
32+
33+
interface CourseWiseStatsFC {
34+
PhD: StatsFC;
35+
MTech: StatsFC;
36+
BTech: StatsFC;
37+
MSc: StatsFC;
38+
MS_Research: StatsFC;
39+
BTech_MTech: StatsFC;
40+
}
41+
42+
export interface SeasonDataFC {
43+
overallStats: StatsFC;
44+
departmentWiseStats: DepartmentWiseStatsFC;
45+
categoryWiseStats: CategoryWiseStatsFC;
46+
genderWiseStats: GenderWiseStatsFC;
47+
courseWiseStats: CourseWiseStatsFC;
48+
}

0 commit comments

Comments
 (0)