diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index c5fcc97..e2eb212 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -1,7 +1,7 @@
# ─── DATABASE CONNECTION CONFIGURATION ───
spring.datasource.url=jdbc:postgresql://localhost:5432/rit_freshers_hub?sslmode=disable
spring.datasource.username=postgres
-spring.datasource.password=${DB_PASSWORD:murugan06}
+spring.datasource.password=${DB_PASSWORD:Anbukathir@2006}
# ─── JPA / HIBERNATE SETTINGS ───
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
diff --git a/package-lock.json b/package-lock.json
index 202707c..9bbdf1f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -102,6 +102,7 @@
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.29.7",
"@babel/generator": "^7.29.7",
@@ -1614,21 +1615,21 @@
}
},
"node_modules/@emnapi/core": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz",
- "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==",
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz",
+ "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/wasi-threads": "1.2.2",
+ "@emnapi/wasi-threads": "1.2.3",
"tslib": "^2.4.0"
}
},
- "node_modules/@emnapi/runtime": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz",
- "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",
+ "node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz",
+ "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -4421,6 +4422,7 @@
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.3.tgz",
"integrity": "sha512-ZjgcRwmQUSCythDPj6pE2NKFi9bpQegxIBxgt3hPytXI1ElFHNaa3A7aWW8vFaLCIRjPv467rbREYHbxcdgQbg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@tanstack/query-core": "5.101.3"
},
@@ -4506,6 +4508,7 @@
"integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"undici-types": "~7.18.0"
}
@@ -4516,6 +4519,7 @@
"integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
"devOptional": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -4526,6 +4530,7 @@
"integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
"devOptional": true,
"license": "MIT",
+ "peer": true,
"peerDependencies": {
"@types/react": "^19.2.0"
}
@@ -4601,6 +4606,7 @@
"integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -4859,6 +4865,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.10.42",
"caniuse-lite": "^1.0.30001803",
@@ -6534,7 +6541,8 @@
"version": "1.9.4",
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
"integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
- "license": "BSD-2-Clause"
+ "license": "BSD-2-Clause",
+ "peer": true
},
"node_modules/leven": {
"version": "3.1.0",
@@ -7162,6 +7170,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.16",
"picocolors": "^1.1.1",
@@ -7205,6 +7214,7 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
"integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -7214,6 +7224,7 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
"integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -7226,6 +7237,7 @@
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.82.0.tgz",
"integrity": "sha512-Zw/uFZ2dO+02GHlBn7JFGn8kZJ7LdM33B/0BXOovzFay+CMhf94JMw5BVu+F1tVkUKjNvBuaE3fz5BJhga10Tg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=18.0.0"
},
@@ -7532,6 +7544,7 @@
"integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/estree": "1.0.9"
},
@@ -8077,6 +8090,7 @@
"integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==",
"dev": true,
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.15.0",
@@ -8402,6 +8416,7 @@
"integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.5",
diff --git a/src/constants/index.ts b/src/constants/index.ts
index bb2835f..6edc132 100644
--- a/src/constants/index.ts
+++ b/src/constants/index.ts
@@ -3757,6 +3757,7 @@ export const TOOLKIT_ITEMS: ToolkitItem[] = [
{ id: '4', title: 'AI tools', description: 'Configure machine learning frameworks, deep learning libraries, Jupyter environments, dataset download scripts, and pre-trained model APIs.', type: 'link', url: '#', icon: 'Brain', category: 'Engineering' },
{ id: '5', title: 'Electrical and Electronic tools', description: 'Access circuit design simulators, MATLAB packages, microcontroller IDE setups, hardware debugging guides, and lab calculation spreadsheets.', type: 'link', url: '#', icon: 'Cpu', category: 'Engineering' },
{ id: '6', title: 'Biotech tools', description: 'Find biology lab guidelines, chemical structure tools, bioinformatics databases tutorials, genetic sequence analysis resources, and safety manuals.', type: 'link', url: '#', icon: 'FlaskConical', category: 'Engineering' },
+ { id: '7', title: 'GPA and internal calculator', description: 'Access GPA, CGPA, and internal marks calculator utilities.', type: 'link', url: '#', icon: 'Calculator', category: 'Engineering' },
];
// ─── Campus Locations ────────────────────────────────────────────────────────
@@ -3785,18 +3786,13 @@ export const AI_SUGGESTED_PROMPTS = [
// ─── Departments ─────────────────────────────────────────────────────────────
export const DEPARTMENTS = [
'All Departments',
- 'Computer Science & Engineering',
- 'Computer Science & Business Systems',
- 'Artificial Intelligence & Machine Learning',
- 'Electronics & Communication Engineering',
- 'Mechanical Engineering',
- 'Civil Engineering',
'Artificial Intelligence & Data Science',
- 'Electrical & Electronics Engineering',
+ 'Artificial Intelligence & Machine Learning',
+ 'Biotechnology',
'Communication and Computer Engineering',
+ 'Computer Science & Business Systems',
+ 'Computer Science & Engineering',
+ 'Electronics & Communication Engineering',
'Electronics Engineering VLSI (Design and Technology)',
- 'Humanities & Sciences',
- 'M.Tech (Data Science)',
- 'Mathematics',
- 'M.E. (VLSI Design)',
+ 'Mechanical Engineering',
];
diff --git a/src/pages/Toolkit/Toolkit.tsx b/src/pages/Toolkit/Toolkit.tsx
index 6046858..0a18a93 100644
--- a/src/pages/Toolkit/Toolkit.tsx
+++ b/src/pages/Toolkit/Toolkit.tsx
@@ -7,11 +7,12 @@ import {
TrendingUp, UserCheck, ClipboardList, ShoppingCart, Cpu, Activity, LayoutGrid,
Layers, Zap, Settings, Gauge, Radio, Wifi, Bot, Sun, Wrench, Binary, BatteryCharging,
CircuitBoard, ShieldCheck, BrainCircuit, FlaskConical, Lock, Terminal, Dna, Microscope,
- Sparkles, Smartphone, Monitor, Server, CheckCircle2, Database, Briefcase, AlertTriangle, RefreshCw
+ Sparkles, Smartphone, Monitor, Server, CheckCircle2, Database, Briefcase, AlertTriangle, RefreshCw, Calculator,
+ Building2, GraduationCap, Plus, Trash2
} from 'lucide-react';
import SectionTitle from '@/components/SectionTitle/SectionTitle';
import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer';
-import { TOOLKIT_ITEMS } from '@/constants';
+import { TOOLKIT_ITEMS, DEPARTMENTS } from '@/constants';
const TOOLKIT_ICONS: Record; bg: string; color: string }> = {
'CS tools': { icon: Code, bg: '#EFF6FF', color: '#3B82F6' },
@@ -20,6 +21,7 @@ const TOOLKIT_ICONS: Record = [
+ { code: 'AD23V11', name: 'Agriculture Data Analytics', credits: 3 },
+ { code: 'AD23V12', name: 'Big Data Analytics', credits: 3 },
+ { code: 'AD23V13', name: 'Data warehousing and Data Mining', credits: 3 },
+ { code: 'AD23V14', name: 'Health Care Analytics', credits: 3 },
+ { code: 'AD23V15', name: 'Image and Video Analytics', credits: 3 },
+ { code: 'AD23V16', name: 'Web and Social Media Analytics', credits: 3 },
+ { code: 'AD23V17', name: 'Predictive Analytics', credits: 3 },
+ { code: 'AD23V18', name: 'Sentiment Analysis', credits: 3 },
+ { code: 'AD23V21', name: 'AI in IoT', credits: 3 },
+ { code: 'AD23V22', name: 'Applied Machine Learning', credits: 3 },
+ { code: 'AD23V23', name: 'Cognitive Computing', credits: 3 },
+ { code: 'AD23V24', name: 'Computer Vision', credits: 3 },
+ { code: 'AD23V25', name: 'Ethics For AI', credits: 3 },
+ { code: 'AD23V26', name: 'Game Theory', credits: 3 },
+ { code: 'AD23V27', name: 'Quantum Computing Techniques', credits: 3 },
+ { code: 'AD23V28', name: 'Responsive AI', credits: 3 },
];
+const AIDS_CURRICULUM: Record> = {
+ 1: [
+ { code: 'HS23111', name: 'Communicative English', credits: 3 },
+ { code: 'MA23111', name: 'Matrices and Calculus', credits: 4 },
+ { code: 'PH23111', name: 'Physics for Information Science', credits: 3 },
+ { code: 'GE23111', name: 'Problem Solving and C Programming', credits: 3 },
+ { code: 'GE23113', name: 'Basic Electrical and Electronics Engineering', credits: 3 },
+ { code: 'GE23112', name: 'Heritage of Tamils', credits: 0 },
+ { code: 'PH23121', name: 'Physics Laboratory', credits: 1 },
+ { code: 'GE23121', name: 'Problem Solving and C Programming Laboratory', credits: 1 },
+ { code: 'GE23122', name: 'Engineering Practices Laboratory', credits: 1 },
+ ],
+ 2: [
+ { code: 'HS23211', name: 'Professional English', credits: 2 },
+ { code: 'CY23211', name: 'Engineering Chemistry', credits: 3 },
+ { code: 'MA23211', name: 'Statistics and Numerical Methods', credits: 4 },
+ { code: 'AD23211', name: 'Python for Data Science', credits: 3 },
+ { code: 'GE23213', name: 'Tamils and Technology', credits: 0 },
+ { code: 'GE23231', name: 'Engineering Graphics', credits: 4 },
+ { code: 'AD23231', name: 'Data Structures Design', credits: 4 },
+ { code: 'CY23221', name: 'Chemistry Laboratory', credits: 1 },
+ { code: 'AD23221', name: 'Python for Data Science Laboratory', credits: 1 },
+ { code: 'GE23221', name: 'Communication Laboratory / Foreign Language', credits: 1 },
+ ],
+ 3: [
+ { code: 'MA23311', name: 'Discrete Mathematics', credits: 4 },
+ { code: 'AL23311', name: 'Artificial Intelligence', credits: 3 },
+ { code: 'CS23312', name: 'Object Oriented Programming', credits: 3 },
+ { code: 'CS23411', name: 'Database Management Systems', credits: 3 },
+ { code: 'EC23331', name: 'Digital Principles and Computer Organization', credits: 4 },
+ { code: 'AL23321', name: 'Artificial Intelligence Laboratory', credits: 1 },
+ { code: 'CS23421', name: 'Database Management Systems Laboratory', credits: 1 },
+ { code: 'CS23322', name: 'Object Oriented Programming Laboratory', credits: 1 },
+ { code: 'AD23IC1', name: 'Data Wrangling', credits: 1 },
+ ],
+ 4: [
+ { code: 'GE23411', name: 'Environmental Science and Sustainability', credits: 2 },
+ { code: 'MA23411', name: 'Probability and Statistics', credits: 4 },
+ { code: 'AD23411', name: 'Data Analytics', credits: 3 },
+ { code: 'AL23411', name: 'Machine Learning', credits: 3 },
+ { code: 'CS23412', name: 'Operating Systems', credits: 3 },
+ { code: 'CS23431', name: 'Design and Analysis of Algorithms', credits: 4 },
+ { code: 'AD23421', name: 'Data Analytics Laboratory', credits: 1 },
+ { code: 'AL23421', name: 'Machine Learning Laboratory', credits: 1 },
+ { code: 'CS23422', name: 'Operating Systems Laboratory', credits: 1 },
+ { code: 'AD23IC2', name: 'Introduction to AZURE Machine Learning', credits: 1 },
+ ],
+ 5: [
+ { code: 'AD23511', name: 'Deep Learning', credits: 3 },
+ { code: 'CS23511', name: 'Computer Networks', credits: 3 },
+ { code: 'PEC01', name: 'Professional Elective I', credits: 3, isElective: true, electiveSlot: 1 },
+ { code: 'PEC02', name: 'Professional Elective II', credits: 3, isElective: true, electiveSlot: 2 },
+ { code: 'CB23531', name: 'Business Analytics', credits: 4 },
+ { code: 'AD23532', name: 'Data Exploration and Visualization', credits: 4 },
+ { code: 'AD23521', name: 'Deep Learning Laboratory', credits: 1 },
+ { code: 'CS23521', name: 'Computer Networks Laboratory', credits: 1 },
+ { code: 'AD23IC3', name: 'Tableau - Data Visualization', credits: 1 },
+ ],
+ 6: [
+ { code: 'PEC03', name: 'Professional Elective III', credits: 3, isElective: true, electiveSlot: 3 },
+ { code: 'PEC04', name: 'Professional Elective IV', credits: 3, isElective: true, electiveSlot: 4 },
+ { code: 'OEC01', name: 'Open Elective I', credits: 3 },
+ { code: 'OEC02', name: 'Open Elective II', credits: 3 },
+ { code: 'EC23631', name: 'Embedded Systems and IoT', credits: 4 },
+ { code: 'CS23631', name: 'Object Oriented Software Engineering', credits: 4 },
+ { code: 'AD23621', name: 'Mini Project', credits: 2 },
+ ],
+ 7: [
+ { code: 'GE23711', name: 'Human Values and Ethics', credits: 2 },
+ { code: 'MGT01', name: 'Elective - Management', credits: 3 },
+ { code: 'CB23511', name: 'Data and Information Security', credits: 3 },
+ { code: 'PEC05', name: 'Professional Elective V', credits: 3, isElective: true, electiveSlot: 5 },
+ { code: 'PEC06', name: 'Professional Elective VI', credits: 3, isElective: true, electiveSlot: 6 },
+ { code: 'AD23721', name: 'Internship / Certification Course', credits: 2 },
+ ],
+ 8: [
+ { code: 'OEC03', name: 'Open Elective III', credits: 3 },
+ { code: 'AD23821', name: 'Project Work', credits: 10 },
+ ],
+};
+
export default function Toolkit() {
const [searchParams, setSearchParams] = useSearchParams();
const selectedToolkit = searchParams.get('toolkit');
const [selectedCategory, setSelectedCategory] = useState(null);
const [selectedLanguage, setSelectedLanguage] = useState(null);
const [selectedTool, setSelectedTool] = useState<{ name: string; desc: string; url: string; category: string; bg: string; color: string } | null>(null);
+ const [gpaDepartment, setGpaDepartment] = useState('');
+ const [gpaSemester, setGpaSemester] = useState('');
+ const [calculationType, setCalculationType] = useState<'gpa' | 'internal' | null>(null);
+ const [gpaStep, setGpaStep] = useState<1 | 2>(1);
+ const [calculatedScore, setCalculatedScore] = useState(null);
+ const [subjects, setSubjects] = useState([
+ { name: 'Subject 1', credits: 4, grade: 'O', cat1: '45', cat2: '48', assignment: '10', attendance: '95' },
+ { name: 'Subject 2', credits: 3, grade: 'A+', cat1: '42', cat2: '44', assignment: '9', attendance: '92' },
+ { name: 'Subject 3', credits: 3, grade: 'A', cat1: '38', cat2: '40', assignment: '8', attendance: '88' },
+ { name: 'Subject 4', credits: 4, grade: 'O', cat1: '46', cat2: '47', assignment: '10', attendance: '96' },
+ { name: 'Subject 5', credits: 2, grade: 'A+', cat1: '44', cat2: '45', assignment: '9', attendance: '94' },
+ ]);
+
+ const handleProceedToStep2 = (type: 'gpa' | 'internal') => {
+ if (!gpaDepartment || !gpaSemester) return;
+ setCalculationType(type);
+
+ const semNum = parseInt(gpaSemester.replace(/\D/g, ''), 10) || 1;
+ const isAIDS = gpaDepartment.toLowerCase().includes('artificial intelligence') || gpaDepartment.toLowerCase().includes('data science');
+
+ if (isAIDS && AIDS_CURRICULUM[semNum]) {
+ const loaded = AIDS_CURRICULUM[semNum]
+ .filter((s) => type === 'internal' || s.credits > 0)
+ .map((s) => {
+ if (s.isElective) {
+ const defaultCode = s.code === 'PEC01' ? 'AD23V11' : s.code === 'PEC02' ? 'AD23V12' : s.code === 'PEC03' ? 'AD23V13' : s.code === 'PEC04' ? 'AD23V14' : s.code === 'PEC05' ? 'AD23V15' : 'AD23V16';
+ const defaultObj = PROFESSIONAL_ELECTIVES_LIST.find((e) => e.code === defaultCode);
+ return {
+ name: defaultObj ? `${defaultObj.code} - ${defaultObj.name}` : `${s.code} - ${s.name}`,
+ credits: s.credits,
+ grade: 'O',
+ cat1: '45',
+ cat2: '45',
+ assignment: '9',
+ attendance: '95',
+ isElective: true,
+ electiveSlot: s.electiveSlot,
+ electiveCode: defaultCode,
+ };
+ }
+ return {
+ name: `${s.code} - ${s.name}`,
+ credits: s.credits,
+ grade: 'O',
+ cat1: '45',
+ cat2: '45',
+ assignment: '9',
+ attendance: '95',
+ isElective: false,
+ };
+ });
+ setSubjects(loaded);
+ } else {
+ setSubjects([
+ { name: 'Subject 1', credits: 4, grade: 'O', cat1: '45', cat2: '48', assignment: '10', attendance: '95' },
+ { name: 'Subject 2', credits: 3, grade: 'A+', cat1: '42', cat2: '44', assignment: '9', attendance: '92' },
+ { name: 'Subject 3', credits: 3, grade: 'A', cat1: '38', cat2: '40', assignment: '8', attendance: '88' },
+ { name: 'Subject 4', credits: 4, grade: 'O', cat1: '46', cat2: '47', assignment: '10', attendance: '96' },
+ { name: 'Subject 5', credits: 2, grade: 'A+', cat1: '44', cat2: '45', assignment: '9', attendance: '94' },
+ ]);
+ }
+
+ setGpaStep(2);
+ setCalculatedScore(null);
+ };
const setSelectedToolkit = (value: string | null) => {
if (value) {
@@ -666,11 +830,21 @@ export default function Toolkit() {
setSelectedCategory(null);
setSelectedLanguage(null);
setSelectedTool(null);
+ setGpaDepartment('');
+ setGpaSemester('');
+ setCalculationType(null);
+ setGpaStep(1);
+ setCalculatedScore(null);
} else {
setSearchParams({});
setSelectedCategory(null);
setSelectedLanguage(null);
setSelectedTool(null);
+ setGpaDepartment('');
+ setGpaSemester('');
+ setCalculationType(null);
+ setGpaStep(1);
+ setCalculatedScore(null);
}
};
@@ -712,6 +886,7 @@ export default function Toolkit() {
cybersecurity: { categories: CYBERSECURITY_TOOLS_CATEGORIES, label: 'Cybersecurity' },
ai: { categories: AI_TOOLS_CATEGORIES, label: 'Artificial Intelligence' },
biotech: { categories: BIOTECH_TOOLS_CATEGORIES, label: 'Biotechnology' },
+ gpa: { categories: [], label: 'GPA and Internal Calculator' },
};
const current = TOOLKIT_MAP[selectedToolkit];
if (!current) return null;
@@ -759,12 +934,395 @@ export default function Toolkit() {
? `Complete beginner guide, core concepts, use cases, and resources for ${PROGRAMMING_LANGUAGES_GUIDES[selectedLanguage].name}.`
: selectedCategory !== null
? `Browse essential ${categories[selectedCategory].title} software, guides, and developer resources.`
+ : selectedToolkit === 'gpa'
+ ? 'Select your department and semester for GPA and internal score calculations.'
: `Explore all categories and tools curated for ${label} students.`}
{/* Main Content Area */}
- {selectedLanguage !== null ? (
+ {selectedToolkit === 'gpa' ? (
+
+ {gpaStep === 1 ? (
+ /* ── STEP 1: Department and Semester Selection ── */
+
+
+
+
+
+
+
+
+
+ GPA & Internal Calculator
+
+
+ Step 1 of 2: Select your department and semester to begin.
+
+
+
+
+
+ {/* Department Input */}
+
+
+
+
+
+ {/* Semester Input */}
+
+
+
+
+
+ {/* Two Action Buttons to proceed to Step 2 */}
+
+
+
+
+
+
+
+ ) : (
+ /* ── STEP 2: Subject Input and Marks Section ── */
+
+
+
+
+
+
+ {calculationType === 'gpa' ? 'GPA Calculation' : 'Internal Marks Calculation'}
+
+
+ {gpaDepartment} — {gpaSemester}
+
+
+
+ {calculationType === 'gpa' ? : }
+
+
+
+ {calculationType === 'gpa' ? (
+ /* ── Clean 2-Column GPA Layout (Fixed Credits, Grade Input Only) ── */
+
+
+ Subject & Credits
+ Grade Achieved
+
+
+ {(() => {
+ const selectedElectiveCodes = new Set(subjects.filter((s) => s.isElective && s.electiveCode).map((s) => s.electiveCode));
+
+ return subjects.filter(s => s.credits > 0).map((sub, idx) => (
+
+
+ {sub.isElective ? (
+
+
+ Professional Elective {sub.electiveSlot}
+
+
+
+ ) : (
+
+ {sub.name}
+
+ )}
+
+ {sub.credits} {sub.credits === 1 ? 'Credit' : 'Credits'}
+
+
+
+
+
+
+ ));
+ })()}
+
+ ) : (
+ /* ── Internal Marks Layout ── */
+
+
+ Subject Details
+ {subjects.length} Subjects
+
+
+ {subjects.map((sub, idx) => (
+
+
+ {
+ const updated = [...subjects];
+ updated[idx].name = e.target.value;
+ setSubjects(updated);
+ setCalculatedScore(null);
+ }}
+ placeholder={`Subject ${idx + 1} Name`}
+ className="flex-1 px-3 py-2 rounded-xl bg-white border border-[#CBD5E1] text-xs font-bold text-[#1E293B] focus:border-[#FF6B00] outline-none"
+ />
+ {subjects.length > 1 && (
+
+ )}
+
+
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Submit Button for Step 2 */}
+
+
+ {/* Calculated Result Card */}
+ {calculatedScore !== null && (
+
+
+
+ {calculationType === 'gpa' ? 'Calculated SGPA' : 'Average Internal Score'}
+
+
+ {gpaSemester}
+
+
+
+
+
+
{gpaDepartment}
+
+ {calculatedScore} {calculationType === 'gpa' ? '/ 10.00' : '/ 40.0'}
+
+
+
+ {calculationType === 'gpa'
+ ? (Number(calculatedScore) >= 9.0 ? 'First Class with Distinction (O)' : Number(calculatedScore) >= 8.5 ? 'First Class with Distinction' : Number(calculatedScore) >= 7.0 ? 'First Class' : Number(calculatedScore) >= 5.0 ? 'Second Class' : 'UA / Reappear')
+ : (Number(calculatedScore) >= 35 ? 'Excellent' : 'Good')}
+
+
+
+ )}
+
+
+ )}
+
+ ) : selectedLanguage !== null ? (
/* ── Detailed Programming Language Guide View ── */
(() => {
const guide = PROGRAMMING_LANGUAGES_GUIDES[selectedLanguage];
@@ -942,6 +1500,8 @@ export default function Toolkit() {
setSelectedToolkit('ai');
} else if (item.title === 'Biotech tools') {
setSelectedToolkit('biotech');
+ } else if (item.title === 'GPA and internal calculator') {
+ setSelectedToolkit('gpa');
} else if (item.url && item.url !== '#') {
window.open(item.url, '_blank');
}