From 97a59ee71548cf1d400ad7a889d62cf5d37ef094 Mon Sep 17 00:00:00 2001 From: Anbu-dev-creator Date: Sun, 16 Aug 2026 21:53:41 +0530 Subject: [PATCH] Some changes in toolkit section --- .../src/main/resources/application.properties | 2 +- package-lock.json | 33 +- src/constants/index.ts | 18 +- src/pages/Toolkit/Toolkit.tsx | 568 +++++++++++++++++- 4 files changed, 596 insertions(+), 25 deletions(-) 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 && ( + + )} +
+ +
+
+ + { + const updated = [...subjects]; + updated[idx].cat1 = e.target.value; + setSubjects(updated); + setCalculatedScore(null); + }} + className="w-full px-2.5 py-1.5 rounded-xl bg-white border border-[#CBD5E1] text-xs font-medium text-[#1E293B] outline-none" + /> +
+
+ + { + const updated = [...subjects]; + updated[idx].cat2 = e.target.value; + setSubjects(updated); + setCalculatedScore(null); + }} + className="w-full px-2.5 py-1.5 rounded-xl bg-white border border-[#CBD5E1] text-xs font-medium text-[#1E293B] outline-none" + /> +
+
+ + { + const updated = [...subjects]; + updated[idx].assignment = e.target.value; + setSubjects(updated); + setCalculatedScore(null); + }} + className="w-full px-2.5 py-1.5 rounded-xl bg-white border border-[#CBD5E1] text-xs font-medium text-[#1E293B] outline-none" + /> +
+
+ + { + const updated = [...subjects]; + updated[idx].attendance = e.target.value; + setSubjects(updated); + setCalculatedScore(null); + }} + className="w-full px-2.5 py-1.5 rounded-xl bg-white border border-[#CBD5E1] text-xs font-medium text-[#1E293B] outline-none" + /> +
+
+
+ ))} + + +
+ )} + + {/* 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'); }