Spaces:
Running
"document": {
"title": "School Results Portal (Nigeria Kβ12 System)",
"version": "1.0",
"preparedFor": "Nigerian Primary & Secondary Institutions",
"platform": "Web (Mobile-first, responsive)"
},
"productOverview": {
"description": "The School Results Portal is a secure online platform designed to manage student academic records for Nigerian primary and secondary schools. It enables teachers to create and manage student profiles, upload results per term, and allows students (or parents) to access and download official result sheets.",
"purpose": "The platform modernizes the manual result-processing flow, reduces errors, and ensures easy access for parents, teachers, and administrators."
},
"goalsAndObjectives": [
"Digitize student result management for all classes (Primary 1β6, JSS1β3, SS1β3)",
"Enable teachers to efficiently create student profiles and upload results",
"Provide parents/students with secure access to termly result sheets",
"Reduce paper usage, eliminate loss of result sheets",
"Support scalability for multi-school usage (optional)"
],
"keyUsers": {
"teachers": {
"capabilities": [
"Create/edit student profiles",
"Upload/modify term results",
"Print student results",
"View summary per class"
]
},
"studentsParents": {
"capabilities": [
"Securely log in",
"View results",
"Download PDF result sheets"
]
},
"schoolAdmin": {
"capabilities": [
"Manage teachers",
"Configure academic sessions, classes, subjects",
"Monitor activity logs"
]
}
},
"coreFeatures": {
"teacherDashboard": {
"description": "A clean dashboard showing:",
"elements": [
"Number of students in each class",
"Pending result uploads",
"Recent activities",
"Quick actions (Add Student, Upload Scores, View Class List)"
]
},
"studentProfileManagement": {
"features": [
"Create student profile",
"Upload passport photo",
"Edit or deactivate profile",
"View class list",
"Promote students to the next class at session end"
],
"profileFields": {
"name": "string",
"gender": "string",
"dateOfBirth": "date",
"admissionNumber": "string (unique)",
"classAndArm": "string",
"parentContact": "string (optional)"
},
"validationRules": [
"Admission number must be unique",
"All required fields must be filled before saving"
]
},
"resultUploadModule": {
"description": "Teachers upload results for each student per term",
"dataFields": {
"academicSession": "string",
"term": "enum [1st, 2nd, 3rd]",
"class": "string",
"subjectScores": {
"ca1": "number (max: 10)",
"ca2": "number (max: 10)",
"exam": "number (max: 70)",
"total": "auto-calculated"
},
"teacherComments": "string",
"principalComments": "string (admin only)",
"attendanceAndConduct": "string (optional)"
},
"features": [
"Bulk upload using Excel/CSV",
"Auto-calculated grades (AβF based on Nigerian standard)",
"Auto-ranking per class",
"Auto GPA/average (optional)",
"Editable until results are published"
]
},
"resultPublishingWorkflow": {
"steps": [
"Teacher uploads",
"Admin reviews",
"Admin approves",
"Student can view/download"
],
"note": "Teachers cannot edit after admin approval unless 'Reopen' is granted"
},
"studentResultViewing": {
"loginMethods": [
"Admission Number + Password/Access Code"
],
"features": [
"View results per term",
"View continuous assessment & exam breakdown",
"View class position, grade interpretation",
"Download result as PDF",
"Printable layout (A4 official school format)"
],
"pdfFormat": {
"includes": [
"Student details and passport",
"Term and session",
"Scores & grades per subject",
"Attendance",
"Teacher comment",
"Principal comment",
"School logo",
"Signature placeholders",
"QR code for verification (optional)"
]
}
}
},
"additionalFeatures": [
{
"name": "Multi-school support",
"description": "Each school has separate admin + settings",
"status": "optional"
},
{
"name": "SMS/Email Notification",
"description": "Notify parents when results are published",
"status": "optional"
},
{
"name": "Role-based access control",
"roles": ["Admin", "Teacher", "Student", "Parent (optional account)"],
"status": "optional"
},
{
"name": "Data Analytics Dashboard",
"description": "Performance trends per class or student",
"status": "optional"
}
],
"systemRequirements": {
"functional": [
"Users must authenticate to access their dashboards",
"Teachers can create and edit student profiles",
"Teachers can upload results per term",
"Results must be auto-calculated and ranked",
"Students can view and download official results",
"Admin can approve or reject uploaded results",
"System must generate a standard PDF sheet",
"System must maintain a secure audit trail"
],
"nonFunctional": {
"performance": {
"studentCapacity": "1000+ students per school",
"pageLoadTime": "within 3 seconds"
},
"security": [
"Encrypted passwords (bcrypt)",
"SSL (HTTPS)",
"Student access code prevents unauthorized viewing",
"No direct file access (use secure download handler)"
],
"scalability": [
"Support multiple schools",
"Optimized database queries"
],
"reliability": {
"uptime": "99% target",
"backup": "Automated daily backup"
}
}
},
"technologyStack": {
"frontend": [
"HTML5, CSS3, JavaScript",
"Tailwind or Bootstrap",
"Vue/React (optional)"
],
"backend": [
"PHP (Laravel or Core PHP)",
"MySQL or PostgreSQL"
],
"others": [
"DomPDF or mPDF for PDF generation",
"Cloud hosting (DigitalOcean, AWS, or shared hosting)"
]
},
"informationArchitecture": {
"routes": {
"public": ["/login"],
"admin": [
"/admin/dashboard",
"/admin/teachers",
"/admin/classes",
"/admin/subjects",
"/admin/settings"
],
"teacher": [
"/teacher/dashboard",
"/teacher/students",
"/teacher/students/create",
"/teacher/students/{id}/edit",
"/teacher/results/upload",
"/teacher/results/view"
],
"student": [
"/student/login",
"/student/dashboard",
"/student/results",
"/student/results/{term}"
]
}
},
"userFlows": {
"teacherCreatingStudentProfile": [
"Login β Dashboard",
"Click 'Add Student'",
"Fill form β Upload photo β Save",
"Student added to class list"
],
"teacherUploadingResults": [
"Select class & subject",
"Enter scores or upload CSV",
"Save draft",
"Submit for approval"
],
"studentViewingDownloadingResults": [
"Login with Admission Number",
"Select Session & Term",
"View result page",
"Click 'Download PDF'"
]
},
"successMetrics": [
{
"metric": "Reduction in manual record errors",
"target": "90%"
},
{
"metric": "Reduction in time spent preparing results",
"target": "50%"
},
{
"metric": "Parent adoption rate",
"target": "90%"
},
{
"metric": "Average time to generate PDF result",
"target": "Under 1 minute"
}
]
}
- README.md +8 -5
- add-student.html +148 -0
- components/footer.js +74 -0
- components/navbar.js +83 -0
- index.html +118 -19
- script.js +65 -0
- style.css +40 -18
- teacher-dashboard.html +171 -0
- upload-results.html +251 -0
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: EduTrack Naija πβ¨
|
| 3 |
+
colorFrom: pink
|
| 4 |
+
colorTo: green
|
| 5 |
+
emoji: π³
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Add Student | EduTrack Naija</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="components/navbar.js"></script>
|
| 11 |
+
<script src="components/footer.js"></script>
|
| 12 |
+
</head>
|
| 13 |
+
<body class="bg-gray-50">
|
| 14 |
+
<custom-navbar></custom-navbar>
|
| 15 |
+
|
| 16 |
+
<main class="container mx-auto px-4 py-8">
|
| 17 |
+
<div class="flex items-center mb-8">
|
| 18 |
+
<a href="teacher-dashboard.html" class="mr-4 text-green-600 hover:text-green-800">
|
| 19 |
+
<i data-feather="arrow-left"></i>
|
| 20 |
+
</a>
|
| 21 |
+
<h1 class="text-3xl font-bold text-green-700">Add New Student</h1>
|
| 22 |
+
</div>
|
| 23 |
+
|
| 24 |
+
<div class="bg-white p-6 rounded-lg shadow-md">
|
| 25 |
+
<form id="studentForm">
|
| 26 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
|
| 27 |
+
<div>
|
| 28 |
+
<label class="block text-gray-700 mb-2" for="firstName">First Name</label>
|
| 29 |
+
<input type="text" id="firstName" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 30 |
+
</div>
|
| 31 |
+
<div>
|
| 32 |
+
<label class="block text-gray-700 mb-2" for="lastName">Last Name</label>
|
| 33 |
+
<input type="text" id="lastName" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 34 |
+
</div>
|
| 35 |
+
<div>
|
| 36 |
+
<label class="block text-gray-700 mb-2" for="gender">Gender</label>
|
| 37 |
+
<select id="gender" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 38 |
+
<option value="">Select Gender</option>
|
| 39 |
+
<option value="male">Male</option>
|
| 40 |
+
<option value="female">Female</option>
|
| 41 |
+
</select>
|
| 42 |
+
</div>
|
| 43 |
+
<div>
|
| 44 |
+
<label class="block text-gray-700 mb-2" for="dob">Date of Birth</label>
|
| 45 |
+
<input type="date" id="dob" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 46 |
+
</div>
|
| 47 |
+
<div>
|
| 48 |
+
<label class="block text-gray-700 mb-2" for="admissionNumber">Admission Number</label>
|
| 49 |
+
<input type="text" id="admissionNumber" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 50 |
+
</div>
|
| 51 |
+
<div>
|
| 52 |
+
<label class="block text-gray-700 mb-2" for="class">Class</label>
|
| 53 |
+
<select id="class" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 54 |
+
<option value="">Select Class</option>
|
| 55 |
+
<option value="primary1">Primary 1</option>
|
| 56 |
+
<option value="primary2">Primary 2</option>
|
| 57 |
+
<option value="primary3">Primary 3</option>
|
| 58 |
+
<option value="primary4">Primary 4</option>
|
| 59 |
+
<option value="primary5">Primary 5</option>
|
| 60 |
+
<option value="primary6">Primary 6</option>
|
| 61 |
+
<option value="jss1">JSS 1</option>
|
| 62 |
+
<option value="jss2">JSS 2</option>
|
| 63 |
+
<option value="jss3">JSS 3</option>
|
| 64 |
+
<option value="ss1">SS 1</option>
|
| 65 |
+
<option value="ss2">SS 2</option>
|
| 66 |
+
<option value="ss3">SS 3</option>
|
| 67 |
+
</select>
|
| 68 |
+
</div>
|
| 69 |
+
<div>
|
| 70 |
+
<label class="block text-gray-700 mb-2" for="arm">Arm (if applicable)</label>
|
| 71 |
+
<select id="arm" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500">
|
| 72 |
+
<option value="">Select Arm</option>
|
| 73 |
+
<option value="a">A</option>
|
| 74 |
+
<option value="b">B</option>
|
| 75 |
+
<option value="c">C</option>
|
| 76 |
+
<option value="science">Science</option>
|
| 77 |
+
<option value="arts">Arts</option>
|
| 78 |
+
<option value="commercial">Commercial</option>
|
| 79 |
+
</select>
|
| 80 |
+
</div>
|
| 81 |
+
<div>
|
| 82 |
+
<label class="block text-gray-700 mb-2" for="parentContact">Parent Contact</label>
|
| 83 |
+
<input type="tel" id="parentContact" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500">
|
| 84 |
+
</div>
|
| 85 |
+
</div>
|
| 86 |
+
|
| 87 |
+
<div class="mb-6">
|
| 88 |
+
<label class="block text-gray-700 mb-2">Passport Photo</label>
|
| 89 |
+
<div class="flex items-center">
|
| 90 |
+
<div class="mr-4">
|
| 91 |
+
<div class="w-24 h-24 bg-gray-200 rounded-full flex items-center justify-center overflow-hidden">
|
| 92 |
+
<img id="previewPhoto" src="http://static.photos/people/200x200" alt="Passport preview" class="w-full h-full object-cover hidden">
|
| 93 |
+
<i data-feather="user" class="text-gray-400 w-12 h-12"></i>
|
| 94 |
+
</div>
|
| 95 |
+
</div>
|
| 96 |
+
<div>
|
| 97 |
+
<input type="file" id="passportPhoto" accept="image/*" class="hidden">
|
| 98 |
+
<button type="button" onclick="document.getElementById('passportPhoto').click()" class="bg-gray-200 text-gray-700 px-4 py-2 rounded-md hover:bg-gray-300 transition duration-300">
|
| 99 |
+
<i data-feather="upload" class="mr-2"></i> Upload Photo
|
| 100 |
+
</button>
|
| 101 |
+
<p class="text-sm text-gray-500 mt-1">Max size: 2MB (JPG/PNG)</p>
|
| 102 |
+
</div>
|
| 103 |
+
</div>
|
| 104 |
+
</div>
|
| 105 |
+
|
| 106 |
+
<div class="flex justify-end">
|
| 107 |
+
<button type="button" class="bg-gray-200 text-gray-700 px-6 py-2 rounded-md mr-4 hover:bg-gray-300 transition duration-300">
|
| 108 |
+
Cancel
|
| 109 |
+
</button>
|
| 110 |
+
<button type="submit" class="bg-green-600 text-white px-6 py-2 rounded-md hover:bg-green-700 transition duration-300 flex items-center">
|
| 111 |
+
<i data-feather="save" class="mr-2"></i> Save Student
|
| 112 |
+
</button>
|
| 113 |
+
</div>
|
| 114 |
+
</form>
|
| 115 |
+
</div>
|
| 116 |
+
</main>
|
| 117 |
+
|
| 118 |
+
<custom-footer></custom-footer>
|
| 119 |
+
|
| 120 |
+
<script>
|
| 121 |
+
feather.replace();
|
| 122 |
+
|
| 123 |
+
// Preview passport photo
|
| 124 |
+
document.getElementById('passportPhoto').addEventListener('change', function(e) {
|
| 125 |
+
const file = e.target.files[0];
|
| 126 |
+
if (file) {
|
| 127 |
+
const reader = new FileReader();
|
| 128 |
+
reader.onload = function(event) {
|
| 129 |
+
const preview = document.getElementById('previewPhoto');
|
| 130 |
+
preview.src = event.target.result;
|
| 131 |
+
preview.classList.remove('hidden');
|
| 132 |
+
preview.nextElementSibling.classList.add('hidden');
|
| 133 |
+
}
|
| 134 |
+
reader.readAsDataURL(file);
|
| 135 |
+
}
|
| 136 |
+
});
|
| 137 |
+
|
| 138 |
+
// Form submission
|
| 139 |
+
document.getElementById('studentForm').addEventListener('submit', function(e) {
|
| 140 |
+
e.preventDefault();
|
| 141 |
+
// In a real app, this would submit to the server
|
| 142 |
+
alert('Student profile saved successfully!');
|
| 143 |
+
window.location.href = 'teacher-dashboard.html';
|
| 144 |
+
});
|
| 145 |
+
</script>
|
| 146 |
+
<script src="script.js"></script>
|
| 147 |
+
</body>
|
| 148 |
+
</html>
|
|
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomFooter extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.footer {
|
| 7 |
+
background-color: #2d3748;
|
| 8 |
+
color: #fff;
|
| 9 |
+
}
|
| 10 |
+
.footer-link {
|
| 11 |
+
transition: color 0.3s ease;
|
| 12 |
+
}
|
| 13 |
+
.footer-link:hover {
|
| 14 |
+
color: #38a169;
|
| 15 |
+
}
|
| 16 |
+
.social-icon {
|
| 17 |
+
transition: all 0.3s ease;
|
| 18 |
+
}
|
| 19 |
+
.social-icon:hover {
|
| 20 |
+
color: #38a169;
|
| 21 |
+
transform: translateY(-3px);
|
| 22 |
+
}
|
| 23 |
+
</style>
|
| 24 |
+
<footer class="footer py-12">
|
| 25 |
+
<div class="container mx-auto px-4">
|
| 26 |
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
|
| 27 |
+
<div>
|
| 28 |
+
<h3 class="text-xl font-bold mb-4 text-green-400">Naija Scholar Tracker</h3>
|
| 29 |
+
<p class="text-gray-400">Nigeria's premier secondary school results portal for students, parents, and educators.</p>
|
| 30 |
+
</div>
|
| 31 |
+
|
| 32 |
+
<div>
|
| 33 |
+
<h4 class="text-lg font-semibold mb-4">Quick Links</h4>
|
| 34 |
+
<ul class="space-y-2">
|
| 35 |
+
<li><a href="index.html" class="footer-link text-gray-400">Home</a></li>
|
| 36 |
+
<li><a href="results.html" class="footer-link text-gray-400">Results</a></li>
|
| 37 |
+
<li><a href="schools.html" class="footer-link text-gray-400">Schools</a></li>
|
| 38 |
+
<li><a href="about.html" class="footer-link text-gray-400">About Us</a></li>
|
| 39 |
+
</ul>
|
| 40 |
+
</div>
|
| 41 |
+
|
| 42 |
+
<div>
|
| 43 |
+
<h4 class="text-lg font-semibold mb-4">Exam Bodies</h4>
|
| 44 |
+
<ul class="space-y-2">
|
| 45 |
+
<li><a href="#" class="footer-link text-gray-400">WAEC</a></li>
|
| 46 |
+
<li><a href="#" class="footer-link text-gray-400">NECO</a></li>
|
| 47 |
+
<li><a href="#" class="footer-link text-gray-400">JAMB</a></li>
|
| 48 |
+
<li><a href="#" class="footer-link text-gray-400">BECE</a></li>
|
| 49 |
+
</ul>
|
| 50 |
+
</div>
|
| 51 |
+
|
| 52 |
+
<div>
|
| 53 |
+
<h4 class="text-lg font-semibold mb-4">Connect With Us</h4>
|
| 54 |
+
<div class="flex space-x-4 mb-4">
|
| 55 |
+
<a href="#" class="social-icon text-gray-400"><i data-feather="facebook"></i></a>
|
| 56 |
+
<a href="#" class="social-icon text-gray-400"><i data-feather="twitter"></i></a>
|
| 57 |
+
<a href="#" class="social-icon text-gray-400"><i data-feather="instagram"></i></a>
|
| 58 |
+
<a href="#" class="social-icon text-gray-400"><i data-feather="linkedin"></i></a>
|
| 59 |
+
</div>
|
| 60 |
+
<p class="text-gray-400">Email: info@naijascholar.com</p>
|
| 61 |
+
<p class="text-gray-400">Phone: +234 812 345 6789</p>
|
| 62 |
+
</div>
|
| 63 |
+
</div>
|
| 64 |
+
|
| 65 |
+
<div class="border-t border-gray-700 mt-8 pt-8 text-center text-gray-400">
|
| 66 |
+
<p>© ${new Date().getFullYear()} Naija Scholar Tracker. All rights reserved.</p>
|
| 67 |
+
</div>
|
| 68 |
+
</div>
|
| 69 |
+
</footer>
|
| 70 |
+
`;
|
| 71 |
+
}
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
customElements.define('custom-footer', CustomFooter);
|
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomNavbar extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.navbar {
|
| 7 |
+
background-color: #fff;
|
| 8 |
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
| 9 |
+
}
|
| 10 |
+
.nav-link {
|
| 11 |
+
transition: color 0.3s ease;
|
| 12 |
+
}
|
| 13 |
+
.nav-link:hover {
|
| 14 |
+
color: #38a169;
|
| 15 |
+
}
|
| 16 |
+
.mobile-menu {
|
| 17 |
+
max-height: 0;
|
| 18 |
+
overflow: hidden;
|
| 19 |
+
transition: max-height 0.3s ease-out;
|
| 20 |
+
}
|
| 21 |
+
.mobile-menu.open {
|
| 22 |
+
max-height: 500px;
|
| 23 |
+
}
|
| 24 |
+
</style>
|
| 25 |
+
<nav class="navbar">
|
| 26 |
+
<div class="container mx-auto px-4 py-4">
|
| 27 |
+
<div class="flex justify-between items-center">
|
| 28 |
+
<div class="flex items-center">
|
| 29 |
+
<a href="index.html" class="flex items-center">
|
| 30 |
+
<i data-feather="book-open" class="text-green-600 w-6 h-6 mr-2"></i>
|
| 31 |
+
<span class="text-xl font-bold text-green-700">Naija Scholar</span>
|
| 32 |
+
</a>
|
| 33 |
+
</div>
|
| 34 |
+
<div class="hidden md:flex space-x-8">
|
| 35 |
+
<a href="index.html" class="nav-link text-gray-700 font-medium">Home</a>
|
| 36 |
+
<a href="teacher-dashboard.html" class="nav-link text-gray-700 font-medium">Teacher Portal</a>
|
| 37 |
+
<a href="results.html" class="nav-link text-gray-700 font-medium">Results</a>
|
| 38 |
+
<a href="schools.html" class="nav-link text-gray-700 font-medium">Schools</a>
|
| 39 |
+
<a href="about.html" class="nav-link text-gray-700 font-medium">About</a>
|
| 40 |
+
<a href="contact.html" class="nav-link text-gray-700 font-medium">Contact</a>
|
| 41 |
+
</div>
|
| 42 |
+
<div class="hidden md:block">
|
| 43 |
+
<a href="login.html" class="bg-green-600 text-white px-4 py-2 rounded-md hover:bg-green-700 transition duration-300">Login</a>
|
| 44 |
+
</div>
|
| 45 |
+
|
| 46 |
+
<button class="md:hidden focus:outline-none" id="mobile-menu-button">
|
| 47 |
+
<i data-feather="menu" class="w-6 h-6"></i>
|
| 48 |
+
</button>
|
| 49 |
+
</div>
|
| 50 |
+
|
| 51 |
+
<div class="mobile-menu md:hidden mt-2" id="mobile-menu">
|
| 52 |
+
<div class="flex flex-col space-y-3 py-3">
|
| 53 |
+
<a href="index.html" class="nav-link text-gray-700">Home</a>
|
| 54 |
+
<a href="teacher-dashboard.html" class="nav-link text-gray-700">Teacher Portal</a>
|
| 55 |
+
<a href="results.html" class="nav-link text-gray-700">Results</a>
|
| 56 |
+
<a href="schools.html" class="nav-link text-gray-700">Schools</a>
|
| 57 |
+
<a href="about.html" class="nav-link text-gray-700">About</a>
|
| 58 |
+
<a href="contact.html" class="nav-link text-gray-700">Contact</a>
|
| 59 |
+
<a href="login.html" class="bg-green-600 text-white px-4 py-2 rounded-md text-center hover:bg-green-700 transition duration-300">Login</a>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
</div>
|
| 63 |
+
</nav>
|
| 64 |
+
`;
|
| 65 |
+
|
| 66 |
+
// Mobile menu toggle
|
| 67 |
+
const mobileMenuButton = this.shadowRoot.getElementById('mobile-menu-button');
|
| 68 |
+
const mobileMenu = this.shadowRoot.getElementById('mobile-menu');
|
| 69 |
+
|
| 70 |
+
mobileMenuButton.addEventListener('click', () => {
|
| 71 |
+
mobileMenu.classList.toggle('open');
|
| 72 |
+
const icon = mobileMenuButton.querySelector('i');
|
| 73 |
+
if (mobileMenu.classList.contains('open')) {
|
| 74 |
+
icon.setAttribute('data-feather', 'x');
|
| 75 |
+
} else {
|
| 76 |
+
icon.setAttribute('data-feather', 'menu');
|
| 77 |
+
}
|
| 78 |
+
feather.replace();
|
| 79 |
+
});
|
| 80 |
+
}
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
customElements.define('custom-navbar', CustomNavbar);
|
|
@@ -1,19 +1,118 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Naija Scholar Tracker | School Results Portal</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script src="components/navbar.js"></script>
|
| 12 |
+
<script src="components/footer.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="bg-gray-50">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<main class="container mx-auto px-4 py-8">
|
| 18 |
+
<!-- Hero Section -->
|
| 19 |
+
<section class="text-center py-12">
|
| 20 |
+
<h1 class="text-4xl font-bold text-green-700 mb-4">Welcome to Naija Scholar Tracker</h1>
|
| 21 |
+
<p class="text-xl text-gray-600 max-w-2xl mx-auto">Nigeria's premier secondary school results portal for students, parents, and educators</p>
|
| 22 |
+
</section>
|
| 23 |
+
|
| 24 |
+
<!-- Search Section -->
|
| 25 |
+
<section class="bg-white rounded-lg shadow-md p-6 mb-12 max-w-4xl mx-auto">
|
| 26 |
+
<h2 class="text-2xl font-semibold text-green-700 mb-6">Check Your Results</h2>
|
| 27 |
+
<form class="space-y-4">
|
| 28 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
| 29 |
+
<div>
|
| 30 |
+
<label class="block text-gray-700 mb-2" for="exam-type">Exam Type</label>
|
| 31 |
+
<select id="exam-type" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500">
|
| 32 |
+
<option value="">Select Exam Type</option>
|
| 33 |
+
<option value="waec">WAEC</option>
|
| 34 |
+
<option value="neco">NECO</option>
|
| 35 |
+
<option value="jamb">JAMB</option>
|
| 36 |
+
<option value="bece">BECE</option>
|
| 37 |
+
</select>
|
| 38 |
+
</div>
|
| 39 |
+
<div>
|
| 40 |
+
<label class="block text-gray-700 mb-2" for="exam-year">Exam Year</label>
|
| 41 |
+
<select id="exam-year" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500">
|
| 42 |
+
<option value="">Select Year</option>
|
| 43 |
+
<option value="2023">2023</option>
|
| 44 |
+
<option value="2022">2022</option>
|
| 45 |
+
<option value="2021">2021</option>
|
| 46 |
+
</select>
|
| 47 |
+
</div>
|
| 48 |
+
</div>
|
| 49 |
+
<div>
|
| 50 |
+
<label class="block text-gray-700 mb-2" for="exam-number">Exam Number</label>
|
| 51 |
+
<input type="text" id="exam-number" placeholder="Enter your exam number" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500">
|
| 52 |
+
</div>
|
| 53 |
+
<button type="submit" class="w-full bg-green-600 text-white py-3 px-4 rounded-md hover:bg-green-700 transition duration-300 flex items-center justify-center">
|
| 54 |
+
<i data-feather="search" class="mr-2"></i> Check Results
|
| 55 |
+
</button>
|
| 56 |
+
</form>
|
| 57 |
+
</section>
|
| 58 |
+
|
| 59 |
+
<!-- Features Section -->
|
| 60 |
+
<section class="mb-16">
|
| 61 |
+
<h2 class="text-3xl font-bold text-center text-green-700 mb-12">Our Features</h2>
|
| 62 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
|
| 63 |
+
<div class="bg-white p-6 rounded-lg shadow-md text-center">
|
| 64 |
+
<div class="bg-green-100 w-16 h-16 mx-auto rounded-full flex items-center justify-center mb-4">
|
| 65 |
+
<i data-feather="file-text" class="text-green-600 w-8 h-8"></i>
|
| 66 |
+
</div>
|
| 67 |
+
<h3 class="text-xl font-semibold mb-2">Result Verification</h3>
|
| 68 |
+
<p class="text-gray-600">Verify your exam results instantly with our secure platform</p>
|
| 69 |
+
</div>
|
| 70 |
+
<div class="bg-white p-6 rounded-lg shadow-md text-center">
|
| 71 |
+
<div class="bg-green-100 w-16 h-16 mx-auto rounded-full flex items-center justify-center mb-4">
|
| 72 |
+
<i data-feather="trending-up" class="text-green-600 w-8 h-8"></i>
|
| 73 |
+
</div>
|
| 74 |
+
<h3 class="text-xl font-semibold mb-2">Performance Analysis</h3>
|
| 75 |
+
<p class="text-gray-600">Get detailed analysis of your academic performance</p>
|
| 76 |
+
</div>
|
| 77 |
+
<div class="bg-white p-6 rounded-lg shadow-md text-center">
|
| 78 |
+
<div class="bg-green-100 w-16 h-16 mx-auto rounded-full flex items-center justify-center mb-4">
|
| 79 |
+
<i data-feather="shield" class="text-green-600 w-8 h-8"></i>
|
| 80 |
+
</div>
|
| 81 |
+
<h3 class="text-xl font-semibold mb-2">Secure Access</h3>
|
| 82 |
+
<p class="text-gray-600">Your data is protected with advanced security measures</p>
|
| 83 |
+
</div>
|
| 84 |
+
</div>
|
| 85 |
+
</section>
|
| 86 |
+
|
| 87 |
+
<!-- Stats Section -->
|
| 88 |
+
<section class="bg-green-700 text-white rounded-lg p-8 mb-12">
|
| 89 |
+
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 text-center">
|
| 90 |
+
<div>
|
| 91 |
+
<div class="text-4xl font-bold mb-2">50K+</div>
|
| 92 |
+
<div class="text-green-200">Students</div>
|
| 93 |
+
</div>
|
| 94 |
+
<div>
|
| 95 |
+
<div class="text-4xl font-bold mb-2">10K+</div>
|
| 96 |
+
<div class="text-green-200">Schools</div>
|
| 97 |
+
</div>
|
| 98 |
+
<div>
|
| 99 |
+
<div class="text-4xl font-bold mb-2">5+</div>
|
| 100 |
+
<div class="text-green-200">Exam Bodies</div>
|
| 101 |
+
</div>
|
| 102 |
+
<div>
|
| 103 |
+
<div class="text-4xl font-bold mb-2">99%</div>
|
| 104 |
+
<div class="text-green-200">Accuracy</div>
|
| 105 |
+
</div>
|
| 106 |
+
</div>
|
| 107 |
+
</section>
|
| 108 |
+
</main>
|
| 109 |
+
|
| 110 |
+
<custom-footer></custom-footer>
|
| 111 |
+
|
| 112 |
+
<script>
|
| 113 |
+
feather.replace();
|
| 114 |
+
</script>
|
| 115 |
+
<script src="script.js"></script>
|
| 116 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 117 |
+
</body>
|
| 118 |
+
</html>
|
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 2 |
+
// Form submission handler
|
| 3 |
+
const resultForm = document.querySelector('form');
|
| 4 |
+
if (resultForm) {
|
| 5 |
+
resultForm.addEventListener('submit', function(e) {
|
| 6 |
+
e.preventDefault();
|
| 7 |
+
|
| 8 |
+
const examType = document.getElementById('exam-type').value;
|
| 9 |
+
const examYear = document.getElementById('exam-year').value;
|
| 10 |
+
const examNumber = document.getElementById('exam-number').value;
|
| 11 |
+
|
| 12 |
+
if (!examType || !examYear || !examNumber) {
|
| 13 |
+
alert('Please fill in all fields');
|
| 14 |
+
return;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
// In a real app, this would make an API call
|
| 18 |
+
console.log('Searching for:', { examType, examYear, examNumber });
|
| 19 |
+
|
| 20 |
+
// Simulate loading
|
| 21 |
+
const submitBtn = resultForm.querySelector('button[type="submit"]');
|
| 22 |
+
const originalText = submitBtn.innerHTML;
|
| 23 |
+
submitBtn.innerHTML = '<i data-feather="loader" class="animate-spin mr-2"></i> Searching...';
|
| 24 |
+
submitBtn.disabled = true;
|
| 25 |
+
|
| 26 |
+
setTimeout(() => {
|
| 27 |
+
submitBtn.innerHTML = originalText;
|
| 28 |
+
submitBtn.disabled = false;
|
| 29 |
+
feather.replace();
|
| 30 |
+
|
| 31 |
+
// Redirect to results page (would be dynamic in real app)
|
| 32 |
+
window.location.href = `results.html?type=${examType}&year=${examYear}&number=${examNumber}`;
|
| 33 |
+
}, 1500);
|
| 34 |
+
});
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
// Initialize tooltips
|
| 38 |
+
const tooltipElements = document.querySelectorAll('[data-tooltip]');
|
| 39 |
+
tooltipElements.forEach(el => {
|
| 40 |
+
el.addEventListener('mouseenter', showTooltip);
|
| 41 |
+
el.addEventListener('mouseleave', hideTooltip);
|
| 42 |
+
});
|
| 43 |
+
});
|
| 44 |
+
|
| 45 |
+
function showTooltip(e) {
|
| 46 |
+
const tooltipText = this.getAttribute('data-tooltip');
|
| 47 |
+
const tooltip = document.createElement('div');
|
| 48 |
+
tooltip.className = 'tooltip absolute bg-gray-800 text-white text-xs px-2 py-1 rounded z-50';
|
| 49 |
+
tooltip.textContent = tooltipText;
|
| 50 |
+
|
| 51 |
+
document.body.appendChild(tooltip);
|
| 52 |
+
|
| 53 |
+
const rect = this.getBoundingClientRect();
|
| 54 |
+
tooltip.style.top = `${rect.top - tooltip.offsetHeight - 5}px`;
|
| 55 |
+
tooltip.style.left = `${rect.left + rect.width / 2 - tooltip.offsetWidth / 2}px`;
|
| 56 |
+
|
| 57 |
+
this.tooltip = tooltip;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
function hideTooltip() {
|
| 61 |
+
if (this.tooltip) {
|
| 62 |
+
this.tooltip.remove();
|
| 63 |
+
this.tooltip = null;
|
| 64 |
+
}
|
| 65 |
+
}
|
|
@@ -1,28 +1,50 @@
|
|
|
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
margin-top: 0;
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
margin-bottom: 10px;
|
| 15 |
-
margin-top: 5px;
|
| 16 |
}
|
| 17 |
|
| 18 |
-
.
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
padding: 16px;
|
| 22 |
-
border: 1px solid lightgray;
|
| 23 |
-
border-radius: 16px;
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
|
| 2 |
+
|
| 3 |
body {
|
| 4 |
+
font-family: 'Poppins', sans-serif;
|
| 5 |
+
}
|
| 6 |
+
|
| 7 |
+
/* Custom scrollbar */
|
| 8 |
+
::-webkit-scrollbar {
|
| 9 |
+
width: 8px;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
::-webkit-scrollbar-track {
|
| 13 |
+
background: #f1f1f1;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
::-webkit-scrollbar-thumb {
|
| 17 |
+
background: #38a169;
|
| 18 |
+
border-radius: 4px;
|
| 19 |
}
|
| 20 |
|
| 21 |
+
::-webkit-scrollbar-thumb:hover {
|
| 22 |
+
background: #2f855a;
|
|
|
|
| 23 |
}
|
| 24 |
|
| 25 |
+
/* Animation for buttons */
|
| 26 |
+
.btn-animate {
|
| 27 |
+
transition: all 0.3s ease;
|
|
|
|
|
|
|
| 28 |
}
|
| 29 |
|
| 30 |
+
.btn-animate:hover {
|
| 31 |
+
transform: translateY(-2px);
|
| 32 |
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
|
|
|
|
|
|
|
|
| 33 |
}
|
| 34 |
|
| 35 |
+
/* Pulse animation for important elements */
|
| 36 |
+
@keyframes pulse {
|
| 37 |
+
0% {
|
| 38 |
+
transform: scale(1);
|
| 39 |
+
}
|
| 40 |
+
50% {
|
| 41 |
+
transform: scale(1.05);
|
| 42 |
+
}
|
| 43 |
+
100% {
|
| 44 |
+
transform: scale(1);
|
| 45 |
+
}
|
| 46 |
}
|
| 47 |
+
|
| 48 |
+
.pulse {
|
| 49 |
+
animation: pulse 2s infinite;
|
| 50 |
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Teacher Dashboard | EduTrack Naija</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="components/navbar.js"></script>
|
| 11 |
+
<script src="components/footer.js"></script>
|
| 12 |
+
</head>
|
| 13 |
+
<body class="bg-gray-50">
|
| 14 |
+
<custom-navbar></custom-navbar>
|
| 15 |
+
|
| 16 |
+
<main class="container mx-auto px-4 py-8">
|
| 17 |
+
<h1 class="text-3xl font-bold text-green-700 mb-8">Teacher Dashboard</h1>
|
| 18 |
+
|
| 19 |
+
<!-- Stats Cards -->
|
| 20 |
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
|
| 21 |
+
<div class="bg-white p-6 rounded-lg shadow-md">
|
| 22 |
+
<div class="flex items-center">
|
| 23 |
+
<div class="bg-green-100 p-3 rounded-full mr-4">
|
| 24 |
+
<i data-feather="users" class="text-green-600"></i>
|
| 25 |
+
</div>
|
| 26 |
+
<div>
|
| 27 |
+
<p class="text-gray-500">Total Students</p>
|
| 28 |
+
<h3 class="text-2xl font-bold">245</h3>
|
| 29 |
+
</div>
|
| 30 |
+
</div>
|
| 31 |
+
</div>
|
| 32 |
+
|
| 33 |
+
<div class="bg-white p-6 rounded-lg shadow-md">
|
| 34 |
+
<div class="flex items-center">
|
| 35 |
+
<div class="bg-blue-100 p-3 rounded-full mr-4">
|
| 36 |
+
<i data-feather="file-text" class="text-blue-600"></i>
|
| 37 |
+
</div>
|
| 38 |
+
<div>
|
| 39 |
+
<p class="text-gray-500">Pending Uploads</p>
|
| 40 |
+
<h3 class="text-2xl font-bold">3</h3>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
|
| 45 |
+
<div class="bg-white p-6 rounded-lg shadow-md">
|
| 46 |
+
<div class="flex items-center">
|
| 47 |
+
<div class="bg-yellow-100 p-3 rounded-full mr-4">
|
| 48 |
+
<i data-feather="alert-circle" class="text-yellow-600"></i>
|
| 49 |
+
</div>
|
| 50 |
+
<div>
|
| 51 |
+
<p class="text-gray-500">Pending Approvals</p>
|
| 52 |
+
<h3 class="text-2xl font-bold">2</h3>
|
| 53 |
+
</div>
|
| 54 |
+
</div>
|
| 55 |
+
</div>
|
| 56 |
+
|
| 57 |
+
<div class="bg-white p-6 rounded-lg shadow-md">
|
| 58 |
+
<div class="flex items-center">
|
| 59 |
+
<div class="bg-purple-100 p-3 rounded-full mr-4">
|
| 60 |
+
<i data-feather="activity" class="text-purple-600"></i>
|
| 61 |
+
</div>
|
| 62 |
+
<div>
|
| 63 |
+
<p class="text-gray-500">Recent Activities</p>
|
| 64 |
+
<h3 class="text-2xl font-bold">15</h3>
|
| 65 |
+
</div>
|
| 66 |
+
</div>
|
| 67 |
+
</div>
|
| 68 |
+
</div>
|
| 69 |
+
|
| 70 |
+
<!-- Quick Actions -->
|
| 71 |
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-8">
|
| 72 |
+
<a href="add-student.html" class="bg-green-600 text-white p-4 rounded-lg shadow-md hover:bg-green-700 transition duration-300 flex items-center justify-center">
|
| 73 |
+
<i data-feather="user-plus" class="mr-2"></i> Add Student
|
| 74 |
+
</a>
|
| 75 |
+
<a href="upload-results.html" class="bg-blue-600 text-white p-4 rounded-lg shadow-md hover:bg-blue-700 transition duration-300 flex items-center justify-center">
|
| 76 |
+
<i data-feather="upload" class="mr-2"></i> Upload Results
|
| 77 |
+
</a>
|
| 78 |
+
<a href="class-list.html" class="bg-yellow-600 text-white p-4 rounded-lg shadow-md hover:bg-yellow-700 transition duration-300 flex items-center justify-center">
|
| 79 |
+
<i data-feather="list" class="mr-2"></i> View Class List
|
| 80 |
+
</a>
|
| 81 |
+
<a href="reports.html" class="bg-purple-600 text-white p-4 rounded-lg shadow-md hover:bg-purple-700 transition duration-300 flex items-center justify-center">
|
| 82 |
+
<i data-feather="bar-chart-2" class="mr-2"></i> Generate Reports
|
| 83 |
+
</a>
|
| 84 |
+
</div>
|
| 85 |
+
|
| 86 |
+
<!-- Recent Activities -->
|
| 87 |
+
<div class="bg-white p-6 rounded-lg shadow-md mb-8">
|
| 88 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4">Recent Activities</h2>
|
| 89 |
+
<div class="space-y-4">
|
| 90 |
+
<div class="flex items-start">
|
| 91 |
+
<div class="bg-green-100 p-2 rounded-full mr-4">
|
| 92 |
+
<i data-feather="check-circle" class="text-green-600"></i>
|
| 93 |
+
</div>
|
| 94 |
+
<div>
|
| 95 |
+
<p class="font-medium">Uploaded SS2 Science results</p>
|
| 96 |
+
<p class="text-sm text-gray-500">Today, 10:45 AM</p>
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
<div class="flex items-start">
|
| 100 |
+
<div class="bg-blue-100 p-2 rounded-full mr-4">
|
| 101 |
+
<i data-feather="user-plus" class="text-blue-600"></i>
|
| 102 |
+
</div>
|
| 103 |
+
<div>
|
| 104 |
+
<p class="font-medium">Added new student: Adeola Johnson</p>
|
| 105 |
+
<p class="text-sm text-gray-500">Yesterday, 3:20 PM</p>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
<div class="flex items-start">
|
| 109 |
+
<div class="bg-yellow-100 p-2 rounded-full mr-4">
|
| 110 |
+
<i data-feather="alert-triangle" class="text-yellow-600"></i>
|
| 111 |
+
</div>
|
| 112 |
+
<div>
|
| 113 |
+
<p class="font-medium">Results pending approval: JSS3 Mathematics</p>
|
| 114 |
+
<p class="text-sm text-gray-500">2 days ago</p>
|
| 115 |
+
</div>
|
| 116 |
+
</div>
|
| 117 |
+
</div>
|
| 118 |
+
</div>
|
| 119 |
+
|
| 120 |
+
<!-- Classes Summary -->
|
| 121 |
+
<div class="bg-white p-6 rounded-lg shadow-md">
|
| 122 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4">Classes Summary</h2>
|
| 123 |
+
<div class="overflow-x-auto">
|
| 124 |
+
<table class="min-w-full divide-y divide-gray-200">
|
| 125 |
+
<thead class="bg-gray-50">
|
| 126 |
+
<tr>
|
| 127 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Class</th>
|
| 128 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Students</th>
|
| 129 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Results Uploaded</th>
|
| 130 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
|
| 131 |
+
</tr>
|
| 132 |
+
</thead>
|
| 133 |
+
<tbody class="bg-white divide-y divide-gray-200">
|
| 134 |
+
<tr>
|
| 135 |
+
<td class="px-6 py-4 whitespace-nowrap">SS2 Science</td>
|
| 136 |
+
<td class="px-6 py-4 whitespace-nowrap">42</td>
|
| 137 |
+
<td class="px-6 py-4 whitespace-nowrap">3/5 subjects</td>
|
| 138 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 139 |
+
<a href="#" class="text-green-600 hover:text-green-800">View</a>
|
| 140 |
+
</td>
|
| 141 |
+
</tr>
|
| 142 |
+
<tr>
|
| 143 |
+
<td class="px-6 py-4 whitespace-nowrap">JSS3 Arts</td>
|
| 144 |
+
<td class="px-6 py-4 whitespace-nowrap">38</td>
|
| 145 |
+
<td class="px-6 py-4 whitespace-nowrap">2/5 subjects</td>
|
| 146 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 147 |
+
<a href="#" class="text-green-600 hover:text-green-800">View</a>
|
| 148 |
+
</td>
|
| 149 |
+
</tr>
|
| 150 |
+
<tr>
|
| 151 |
+
<td class="px-6 py-4 whitespace-nowrap">Primary 5A</td>
|
| 152 |
+
<td class="px-6 py-4 whitespace-nowrap">25</td>
|
| 153 |
+
<td class="px-6 py-4 whitespace-nowrap">4/6 subjects</td>
|
| 154 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 155 |
+
<a href="#" class="text-green-600 hover:text-green-800">View</a>
|
| 156 |
+
</td>
|
| 157 |
+
</tr>
|
| 158 |
+
</tbody>
|
| 159 |
+
</table>
|
| 160 |
+
</div>
|
| 161 |
+
</div>
|
| 162 |
+
</main>
|
| 163 |
+
|
| 164 |
+
<custom-footer></custom-footer>
|
| 165 |
+
|
| 166 |
+
<script>
|
| 167 |
+
feather.replace();
|
| 168 |
+
</script>
|
| 169 |
+
<script src="script.js"></script>
|
| 170 |
+
</body>
|
| 171 |
+
</html>
|
|
@@ -0,0 +1,251 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Upload Results | EduTrack Naija</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="components/navbar.js"></script>
|
| 11 |
+
<script src="components/footer.js"></script>
|
| 12 |
+
</head>
|
| 13 |
+
<body class="bg-gray-50">
|
| 14 |
+
<custom-navbar></custom-navbar>
|
| 15 |
+
|
| 16 |
+
<main class="container mx-auto px-4 py-8">
|
| 17 |
+
<div class="flex items-center mb-8">
|
| 18 |
+
<a href="teacher-dashboard.html" class="mr-4 text-green-600 hover:text-green-800">
|
| 19 |
+
<i data-feather="arrow-left"></i>
|
| 20 |
+
</a>
|
| 21 |
+
<h1 class="text-3xl font-bold text-green-700">Upload Results</h1>
|
| 22 |
+
</div>
|
| 23 |
+
|
| 24 |
+
<div class="bg-white p-6 rounded-lg shadow-md mb-8">
|
| 25 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
|
| 26 |
+
<div>
|
| 27 |
+
<label class="block text-gray-700 mb-2" for="academicSession">Academic Session</label>
|
| 28 |
+
<select id="academicSession" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 29 |
+
<option value="">Select Session</option>
|
| 30 |
+
<option value="2023-2024">2023/2024</option>
|
| 31 |
+
<option value="2022-2023">2022/2023</option>
|
| 32 |
+
<option value="2021-2022">2021/2022</option>
|
| 33 |
+
</select>
|
| 34 |
+
</div>
|
| 35 |
+
<div>
|
| 36 |
+
<label class="block text-gray-700 mb-2" for="term">Term</label>
|
| 37 |
+
<select id="term" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 38 |
+
<option value="">Select Term</option>
|
| 39 |
+
<option value="1">First Term</option>
|
| 40 |
+
<option value="2">Second Term</option>
|
| 41 |
+
<option value="3">Third Term</option>
|
| 42 |
+
</select>
|
| 43 |
+
</div>
|
| 44 |
+
<div>
|
| 45 |
+
<label class="block text-gray-700 mb-2" for="class">Class</label>
|
| 46 |
+
<select id="class" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 47 |
+
<option value="">Select Class</option>
|
| 48 |
+
<option value="primary1">Primary 1</option>
|
| 49 |
+
<option value="primary2">Primary 2</option>
|
| 50 |
+
<option value="primary3">Primary 3</option>
|
| 51 |
+
<option value="primary4">Primary 4</option>
|
| 52 |
+
<option value="primary5">Primary 5</option>
|
| 53 |
+
<option value="primary6">Primary 6</option>
|
| 54 |
+
<option value="jss1">JSS 1</option>
|
| 55 |
+
<option value="jss2">JSS 2</option>
|
| 56 |
+
<option value="jss3">JSS 3</option>
|
| 57 |
+
<option value="ss1">SS 1</option>
|
| 58 |
+
<option value="ss2">SS 2</option>
|
| 59 |
+
<option value="ss3">SS 3</option>
|
| 60 |
+
</select>
|
| 61 |
+
</div>
|
| 62 |
+
<div>
|
| 63 |
+
<label class="block text-gray-700 mb-2" for="subject">Subject</label>
|
| 64 |
+
<select id="subject" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 65 |
+
<option value="">Select Subject</option>
|
| 66 |
+
<option value="mathematics">Mathematics</option>
|
| 67 |
+
<option value="english">English Language</option>
|
| 68 |
+
<option value="physics">Physics</option>
|
| 69 |
+
<option value="chemistry">Chemistry</option>
|
| 70 |
+
<option value="biology">Biology</option>
|
| 71 |
+
<option value="economics">Economics</option>
|
| 72 |
+
<option value="geography">Geography</option>
|
| 73 |
+
<option value="government">Government</option>
|
| 74 |
+
<option value="literature">Literature</option>
|
| 75 |
+
<option value="yoruba">Yoruba</option>
|
| 76 |
+
<option value="hausa">Hausa</option>
|
| 77 |
+
<option value="igbo">Igbo</option>
|
| 78 |
+
<option value="french">French</option>
|
| 79 |
+
<option value="crs">CRS</option>
|
| 80 |
+
<option value="irs">IRS</option>
|
| 81 |
+
</select>
|
| 82 |
+
</div>
|
| 83 |
+
<div>
|
| 84 |
+
<label class="block text-gray-700 mb-2" for="uploadMethod">Upload Method</label>
|
| 85 |
+
<select id="uploadMethod" class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" required>
|
| 86 |
+
<option value="">Select Method</option>
|
| 87 |
+
<option value="manual">Manual Entry</option>
|
| 88 |
+
<option value="csv">CSV/Excel Upload</option>
|
| 89 |
+
</select>
|
| 90 |
+
</div>
|
| 91 |
+
<div class="flex items-end">
|
| 92 |
+
<button type="button" id="loadStudentsBtn" class="bg-green-600 text-white px-4 py-2 rounded-md hover:bg-green-700 transition duration-300 w-full">
|
| 93 |
+
Load Students
|
| 94 |
+
</button>
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
|
| 98 |
+
<div id="csvUploadSection" class="hidden mb-6">
|
| 99 |
+
<div class="border-2 border-dashed border-gray-300 rounded-lg p-6 text-center">
|
| 100 |
+
<i data-feather="upload-cloud" class="w-12 h-12 text-gray-400 mx-auto mb-4"></i>
|
| 101 |
+
<p class="text-gray-600 mb-4">Drag and drop your CSV/Excel file here, or click to browse</p>
|
| 102 |
+
<input type="file" id="csvFile" accept=".csv,.xlsx,.xls" class="hidden">
|
| 103 |
+
<button type="button" onclick="document.getElementById('csvFile').click()" class="bg-gray-200 text-gray-700 px-4 py-2 rounded-md hover:bg-gray-300 transition duration-300">
|
| 104 |
+
<i data-feather="upload" class="mr-2"></i> Select File
|
| 105 |
+
</button>
|
| 106 |
+
<p class="text-sm text-gray-500 mt-2">Download <a href="#" class="text-green-600 hover:underline">template file</a></p>
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
</div>
|
| 110 |
+
|
| 111 |
+
<div id="resultsTableSection" class="hidden">
|
| 112 |
+
<div class="bg-white p-6 rounded-lg shadow-md mb-6">
|
| 113 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4">Enter Scores for SS2 Science - Mathematics (2023/2024 - First Term)</h2>
|
| 114 |
+
|
| 115 |
+
<div class="overflow-x-auto">
|
| 116 |
+
<table class="min-w-full divide-y divide-gray-200">
|
| 117 |
+
<thead class="bg-gray-50">
|
| 118 |
+
<tr>
|
| 119 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Student Name</th>
|
| 120 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Admission No.</th>
|
| 121 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">CA 1 (10)</th>
|
| 122 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">CA 2 (10)</th>
|
| 123 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Exam (70)</th>
|
| 124 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Total (100)</th>
|
| 125 |
+
</tr>
|
| 126 |
+
</thead>
|
| 127 |
+
<tbody class="bg-white divide-y divide-gray-200">
|
| 128 |
+
<tr>
|
| 129 |
+
<td class="px-6 py-4 whitespace-nowrap">Adeola Johnson</td>
|
| 130 |
+
<td class="px-6 py-4 whitespace-nowrap">SS/2023/001</td>
|
| 131 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 132 |
+
<input type="number" min="0" max="10" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="8">
|
| 133 |
+
</td>
|
| 134 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 135 |
+
<input type="number" min="0" max="10" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="9">
|
| 136 |
+
</td>
|
| 137 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 138 |
+
<input type="number" min="0" max="70" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="65">
|
| 139 |
+
</td>
|
| 140 |
+
<td class="px-6 py-4 whitespace-nowrap font-semibold">82</td>
|
| 141 |
+
</tr>
|
| 142 |
+
<tr>
|
| 143 |
+
<td class="px-6 py-4 whitespace-nowrap">Chinedu Okoro</td>
|
| 144 |
+
<td class="px-6 py-4 whitespace-nowrap">SS/2023/002</td>
|
| 145 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 146 |
+
<input type="number" min="0" max="10" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="7">
|
| 147 |
+
</td>
|
| 148 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 149 |
+
<input type="number" min="0" max="10" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="8">
|
| 150 |
+
</td>
|
| 151 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 152 |
+
<input type="number" min="0" max="70" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="60">
|
| 153 |
+
</td>
|
| 154 |
+
<td class="px-6 py-4 whitespace-nowrap font-semibold">75</td>
|
| 155 |
+
</tr>
|
| 156 |
+
<tr>
|
| 157 |
+
<td class="px-6 py-4 whitespace-nowrap">Fatima Bello</td>
|
| 158 |
+
<td class="px-6 py-4 whitespace-nowrap">SS/2023/003</td>
|
| 159 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 160 |
+
<input type="number" min="0" max="10" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="9">
|
| 161 |
+
</td>
|
| 162 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 163 |
+
<input type="number" min="0" max="10" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="10">
|
| 164 |
+
</td>
|
| 165 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 166 |
+
<input type="number" min="0" max="70" class="w-16 px-2 py-1 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" value="68">
|
| 167 |
+
</td>
|
| 168 |
+
<td class="px-6 py-4 whitespace-nowrap font-semibold">87</td>
|
| 169 |
+
</tr>
|
| 170 |
+
</tbody>
|
| 171 |
+
</table>
|
| 172 |
+
</div>
|
| 173 |
+
</div>
|
| 174 |
+
|
| 175 |
+
<div class="bg-white p-6 rounded-lg shadow-md mb-6">
|
| 176 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4">Teacher Comments</h2>
|
| 177 |
+
<textarea class="w-full px-4 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-500" rows="4" placeholder="Enter general comments for the class..."></textarea>
|
| 178 |
+
</div>
|
| 179 |
+
|
| 180 |
+
<div class="flex justify-end">
|
| 181 |
+
<button type="button" class="bg-gray-200 text-gray-700 px-6 py-2 rounded-md mr-4 hover:bg-gray-300 transition duration-300">
|
| 182 |
+
Save Draft
|
| 183 |
+
</button>
|
| 184 |
+
<button type="button" class="bg-green-600 text-white px-6 py-2 rounded-md hover:bg-green-700 transition duration-300 flex items-center">
|
| 185 |
+
<i data-feather="send" class="mr-2"></i> Submit for Approval
|
| 186 |
+
</button>
|
| 187 |
+
</div>
|
| 188 |
+
</div>
|
| 189 |
+
</main>
|
| 190 |
+
|
| 191 |
+
<custom-footer></custom-footer>
|
| 192 |
+
|
| 193 |
+
<script>
|
| 194 |
+
feather.replace();
|
| 195 |
+
|
| 196 |
+
// Toggle between manual and CSV upload
|
| 197 |
+
document.getElementById('uploadMethod').addEventListener('change', function() {
|
| 198 |
+
const method = this.value;
|
| 199 |
+
const csvSection = document.getElementById('csvUploadSection');
|
| 200 |
+
const tableSection = document.getElementById('resultsTableSection');
|
| 201 |
+
|
| 202 |
+
if (method === 'csv') {
|
| 203 |
+
csvSection.classList.remove('hidden');
|
| 204 |
+
tableSection.classList.add('hidden');
|
| 205 |
+
} else if (method === 'manual') {
|
| 206 |
+
csvSection.classList.add('hidden');
|
| 207 |
+
tableSection.classList.add('hidden');
|
| 208 |
+
}
|
| 209 |
+
});
|
| 210 |
+
|
| 211 |
+
// Simulate loading students
|
| 212 |
+
document.getElementById('loadStudentsBtn').addEventListener('click', function() {
|
| 213 |
+
const session = document.getElementById('academicSession').value;
|
| 214 |
+
const term = document.getElementById('term').value;
|
| 215 |
+
const classVal = document.getElementById('class').value;
|
| 216 |
+
const subject = document.getElementById('subject').value;
|
| 217 |
+
|
| 218 |
+
if (!session || !term || !classVal || !subject) {
|
| 219 |
+
alert('Please fill all required fields');
|
| 220 |
+
return;
|
| 221 |
+
}
|
| 222 |
+
|
| 223 |
+
// Show loading
|
| 224 |
+
this.innerHTML = '<i data-feather="loader" class="animate-spin mr-2"></i> Loading...';
|
| 225 |
+
this.disabled = true;
|
| 226 |
+
feather.replace();
|
| 227 |
+
|
| 228 |
+
// Simulate API call
|
| 229 |
+
setTimeout(() => {
|
| 230 |
+
this.innerHTML = 'Load Students';
|
| 231 |
+
this.disabled = false;
|
| 232 |
+
document.getElementById('resultsTableSection').classList.remove('hidden');
|
| 233 |
+
feather.replace();
|
| 234 |
+
}, 1500);
|
| 235 |
+
});
|
| 236 |
+
|
| 237 |
+
// Calculate totals when scores change
|
| 238 |
+
document.querySelectorAll('input[type="number"]').forEach(input => {
|
| 239 |
+
input.addEventListener('change', function() {
|
| 240 |
+
const row = this.closest('tr');
|
| 241 |
+
const ca1 = parseFloat(row.querySelector('td:nth-child(3) input').value) || 0;
|
| 242 |
+
const ca2 = parseFloat(row.querySelector('td:nth-child(4) input').value) || 0;
|
| 243 |
+
const exam = parseFloat(row.querySelector('td:nth-child(5) input').value) || 0;
|
| 244 |
+
const total = ca1 + ca2 + exam;
|
| 245 |
+
row.querySelector('td:nth-child(6)').textContent = total;
|
| 246 |
+
});
|
| 247 |
+
});
|
| 248 |
+
</script>
|
| 249 |
+
<script src="script.js"></script>
|
| 250 |
+
</body>
|
| 251 |
+
</html>
|