-
-
- Performance Breakdown
-
-
- {['all', ...categories.map(cat => cat.name.toLowerCase())].map(category => (
-
setSelectedCategory(category)}
- >
- {category === 'all'
- ? 'All Categories'
- : category.charAt(0).toUpperCase() + category.slice(1)}
-
- ))}
+ {/* Overall Performance Summary */}
+
+
+
Overall Performance Summary
+
+ {percentageScore}%
+ Overall Grade
+
+
+
+
+
+
+ Total Score: {totalEarnedPoints}/{totalPossiblePoints} points
+
+
- {/* Category Breakdown Table */}
-
+ {/* Category Performance Table */}
+
+
Overall Performance Summary
+
+
+
+
+ Category
+ Weightage
+ Items
+ Total Points
+ Your Score
+ Percentage
+ Performance
+
+
+
+ {categories.map(category => (
+
+ {category.name}
+ {category.weightage}%
+ {category.completedItems}
+ {category.totalMarks}
+ {category.earnedMarks}
+ {Math.round(category.percentage)}%
+
+
+
+
+ ))}
+
+
+
+
- {/* Detailed Tasks List */}
-
+ {/* Performance Insights */}
+
+
+
Performance Insights
+
+ You performed strongly in Assignments (80%) ,{' '}
+ Exams (80%) , and Participation (80%) . You may
+ improve your performance in Quizzes (60%) - consider reviewing quiz
+ preparation strategies.
+
+
+ Review Quiz Messages
+ Study Schedule Tips
+
+
+
+
+ {/* Individual Assignment & Task Results */}
+
+
Individual Assignment & Task Results
+
+
+
+
+ Assignment Name
+ Weightage
+ Your Marks
+ Percentage
+ Status
+ Feedback
+
+
+
+ {tasks.slice(0, 6).map(task => (
+
+
+
+
{task.name}
+
+ Submitted: {new Date(task.submissionDate).toLocaleDateString()}
+
+
+
+ {task.weightage || '8'}%
+
+ {task.earnedMarks}/{task.totalMarks}
+
+
+
+ {Math.round(task.percentage)}%
+
+
+
+
+ {task.status || 'On time'}
+
+
+
+
+
+ View Feedback
+
+
+
+ ))}
+
+
+
+
+
+ {/* Summary Cards */}
+
+
+
6
+
Total Assignments
+
+
+
+
+
);
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
index 766f741a80..c25fd035f9 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
@@ -1,273 +1,595 @@
/* ============================================================================
- EVALUATION RESULTS - PREMIUM CSS MODULE
- Modern, responsive design with excellent UX
+ EVALUATION RESULTS - CLEAN ACADEMIC DASHBOARD
+ Modern table-based design matching the provided mockup
============================================================================ */
-/* CSS Variables for consistent theming */
+/* CSS Variables for clean academic theme */
:root {
- --primary-color: #3b82f6;
- --success-color: #10b981;
- --warning-color: #f59e0b;
- --error-color: #ef4444;
- --info-color: #6366f1;
- --text-primary: #1f2937;
- --text-secondary: #6b7280;
- --text-light: #9ca3af;
- --bg-primary: #ffffff;
- --bg-secondary: #f9fafb;
- --bg-accent: #f3f4f6;
- --border-color: #e5e7eb;
- --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
- --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
- --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
- --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
- --border-radius: 12px;
- --border-radius-lg: 16px;
- --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ --primary-color: #007bff;
+ --success-color: #28a745;
+ --warning-color: #ffc107;
+ --danger-color: #dc3545;
+ --info-color: #17a2b8;
+ --text-dark: #333333;
+ --text-muted: #6c757d;
+ --bg-white: #ffffff;
+ --bg-light: #f8f9fa;
+ --border-color: #dee2e6;
+ --table-border: #e9ecef;
+ --box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+ --border-radius: 0.375rem;
}
/* ============================================================================
- MAIN PAGE LAYOUT
+ MAIN PAGE LAYOUT - Clean White Background
============================================================================ */
.evaluationResultsPage {
min-height: 100vh;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- background-attachment: fixed;
+ background-color: var(--bg-light);
+ padding: 0;
}
+/* ============================================================================
+ HEADER SECTION - Clean Professional Header
+ ============================================================================ */
+
.headerSection {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
+ background-color: var(--bg-white);
border-bottom: 1px solid var(--border-color);
padding: 2rem 0;
- margin-bottom: 2rem;
- box-shadow: var(--shadow-sm);
+ margin-bottom: 1.5rem;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.headerContent {
display: flex;
- justify-content: space-between;
- align-items: center;
- flex-wrap: wrap;
- gap: 1.5rem;
-}
-
-.studentInfo {
- display: flex;
- align-items: center;
- gap: 1rem;
+ justify-content: flex-start;
+ align-items: flex-start;
+ gap: 2rem;
+ position: relative;
}
-.headerIcon {
- font-size: 2.5rem;
- color: var(--primary-color);
- opacity: 0.9;
+.headerLeft {
+ flex: 1;
+ max-width: 600px;
}
.pageTitle {
- margin: 0;
font-size: 2rem;
font-weight: 700;
- color: var(--text-primary);
- background: linear-gradient(135deg, var(--primary-color), var(--info-color));
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
+ color: var(--text-dark);
+ margin: 0 0 0.75rem 0;
+ letter-spacing: -0.025em;
+ text-align: left;
}
-.studentName {
- margin: 0.25rem 0 0.125rem 0;
- font-size: 1.125rem;
- color: var(--text-secondary);
+.pageSubtitle {
+ font-size: 0.9rem;
+ color: var(--text-muted);
+ margin: 0;
+ line-height: 1.5;
+ max-width: 500px;
+ text-align: left;
+}
+
+.headerRight {
+ position: absolute;
+ right: 0;
+ top: 0;
+ display: flex;
+ align-items: center;
+ gap: 1.5rem;
+}
+
+.userWelcome {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 0.9rem;
+ color: var(--text-dark);
font-weight: 500;
+ padding: 0.5rem 1rem;
+ background-color: #f8f9fa;
+ border-radius: 1.5rem;
+ border: 1px solid var(--border-color);
}
-.lastUpdated {
- color: var(--text-light);
+.userIcon {
+ color: var(--text-muted);
font-size: 0.875rem;
}
-.overallScoreBadge {
- background: linear-gradient(135deg, var(--success-color), #059669);
+.notificationIcon {
+ font-size: 1.25rem;
+ color: var(--text-muted);
+ cursor: pointer;
+ padding: 0.5rem;
border-radius: 50%;
- padding: 4px;
- box-shadow: var(--shadow-lg);
+ transition: all 0.2s ease;
}
-.scoreCircle {
- background: white;
- border-radius: 50%;
- width: 120px;
- height: 120px;
+.notificationIcon:hover {
+ color: var(--text-dark);
+ background-color: #f8f9fa;
+}
+
+/* ============================================================================
+ MAIN CONTENT CONTAINER
+ ============================================================================ */
+
+.mainContent {
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 0 0.75rem;
+}
+
+/* ============================================================================
+ OVERALL PERFORMANCE SECTION
+ ============================================================================ */
+
+.overallSection {
+ background-color: var(--bg-white);
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius);
+ padding: 1.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.sectionHeader {
display: flex;
- flex-direction: column;
- justify-content: center;
+ justify-content: space-between;
align-items: center;
- position: relative;
+ margin-bottom: 1rem;
}
-.scoreNumber {
- font-size: 2rem;
- font-weight: 800;
- color: var(--success-color);
- line-height: 1;
+.sectionHeader h3 {
+ font-size: 1.125rem;
+ font-weight: 600;
+ color: var(--text-dark);
+ margin: 0;
+}
+
+.overallScore {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.scoreText {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--text-dark);
}
.scoreLabel {
- font-size: 0.75rem;
- color: var(--text-secondary);
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.05em;
+ font-size: 0.875rem;
+ color: var(--text-muted);
}
-.mainContent {
- padding-bottom: 4rem;
+.progressSection {
+ margin-top: 1rem;
+}
+
+.progressBar {
+ width: 100%;
+ height: 2rem;
+ background-color: #e0e0e0;
+ border-radius: 0;
+ overflow: hidden;
+ margin-bottom: 0.5rem;
+}
+
+.progressFill {
+ height: 100%;
+ background-color: #000000;
+ transition: width 0.3s ease;
+}
+
+.scoreDetails {
+ font-size: 0.875rem;
+ color: var(--text-muted);
}
/* ============================================================================
- LOADING STATES
+ SECTION TITLES
============================================================================ */
-.loadingContainer {
- min-height: 100vh;
- display: flex;
- align-items: center;
- justify-content: center;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+.sectionTitle {
+ font-size: 1.125rem;
+ font-weight: 600;
+ color: var(--text-dark);
+ margin: 0 0 1rem 0;
}
-.loadingSpinner {
- text-align: center;
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- padding: 3rem;
- border-radius: var(--border-radius-lg);
- box-shadow: var(--shadow-xl);
- max-width: 400px;
- width: 90%;
-}
+/* ============================================================================
+ CATEGORY SECTION & PERFORMANCE TABLE
+ ============================================================================ */
-.loadingIcon {
- font-size: 4rem;
- color: var(--primary-color);
+.categorySection {
+ background-color: var(--bg-white);
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius);
+ padding: 1.5rem;
margin-bottom: 1.5rem;
- animation: pulse 2s infinite;
}
-.loadingSpinner h3 {
- color: var(--text-primary);
- margin-bottom: 2rem;
+.tableContainer {
+ overflow-x: auto;
+ border-radius: var(--border-radius);
+ border: 1px solid var(--table-border);
+}
+
+.performanceTable {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.875rem;
+ background-color: var(--bg-white);
+}
+
+.performanceTable th {
+ background-color: #f8f9fa;
+ color: var(--text-dark);
font-weight: 600;
+ padding: 1rem 0.75rem;
+ text-align: left;
+ border-bottom: 2px solid var(--table-border);
+ font-size: 0.875rem;
}
-.loadingBar {
+.performanceTable td {
+ padding: 1rem 0.75rem;
+ border-bottom: 1px solid var(--table-border);
+ vertical-align: middle;
+ font-size: 0.875rem;
+}
+
+.assignmentTable {
width: 100%;
- height: 8px;
- background: var(--bg-accent);
- border-radius: 4px;
+ border-collapse: collapse;
+ font-size: 0.875rem;
+ background-color: var(--bg-white);
+ table-layout: fixed;
+}
+
+.assignmentTable th {
+ background-color: #f8f9fa;
+ color: var(--text-dark);
+ font-weight: 600;
+ padding: 1.25rem 0.75rem;
+ text-align: left;
+ border-bottom: 2px solid var(--table-border);
+ font-size: 0.875rem;
+}
+
+.assignmentTable th:nth-child(1) { width: 35%; } /* Assignment Name */
+.assignmentTable th:nth-child(2) { width: 12%; text-align: center; } /* Weightage */
+.assignmentTable th:nth-child(3) { width: 15%; text-align: center; } /* Your Marks */
+.assignmentTable th:nth-child(4) { width: 12%; text-align: center; } /* Percentage */
+.assignmentTable th:nth-child(5) { width: 15%; text-align: center; } /* Status */
+.assignmentTable th:nth-child(6) { width: 11%; text-align: center; } /* Feedback */
+
+.assignmentTable td {
+ padding: 1.25rem 0.75rem;
+ border-bottom: 1px solid var(--table-border);
+ vertical-align: middle;
+ font-size: 0.875rem;
+}
+
+.assignmentTable td:nth-child(2),
+.assignmentTable td:nth-child(3),
+.assignmentTable td:nth-child(4),
+.assignmentTable td:nth-child(5),
+.assignmentTable td:nth-child(6) {
+ text-align: center;
+}
+
+.categoryName {
+ font-weight: 500;
+ color: var(--text-dark);
+}
+
+.performanceBar {
+ width: 120px;
+ height: 0.75rem;
+ background-color: #e0e0e0;
+ border-radius: 0.375rem;
overflow: hidden;
position: relative;
}
-.loadingProgress {
+.performanceFill {
height: 100%;
- background: linear-gradient(90deg, var(--primary-color), var(--info-color));
- border-radius: 4px;
- animation: loading 2s infinite;
+ border-radius: 0.375rem;
+ transition: width 0.3s ease;
}
-@keyframes pulse {
- 0%, 100% { opacity: 1; }
- 50% { opacity: 0.5; }
+.performanceFill.excellent {
+ background-color: #28a745;
}
-@keyframes loading {
- 0% { width: 0%; }
- 50% { width: 70%; }
- 100% { width: 100%; }
+.performanceFill.good {
+ background-color: #28a745;
+}
+
+.performanceFill.fair {
+ background-color: #ffc107;
+}
+
+.performanceFill.poor {
+ background-color: #dc3545;
}
/* ============================================================================
- SECTION STYLING
+ PERFORMANCE INSIGHTS SECTION
============================================================================ */
-.sectionTitle {
- font-size: 1.5rem;
- font-weight: 700;
- color: var(--text-primary);
+.insightsSection {
margin-bottom: 1.5rem;
- display: flex;
- align-items: center;
- gap: 0.5rem;
}
-.sectionTitle svg {
- color: var(--primary-color);
+.insightsBox {
+ background-color: #e3f2fd;
+ border: 1px solid #90caf9;
+ border-radius: var(--border-radius);
+ padding: 1.5rem;
}
-.filterSection {
- background: var(--bg-primary);
- padding: 1.5rem;
- border-radius: var(--border-radius);
- box-shadow: var(--shadow-sm);
- margin-bottom: 2rem;
- border: 1px solid var(--border-color);
+.insightsBox h4 {
+ font-size: 1rem;
+ font-weight: 600;
+ color: var(--text-dark);
+ margin: 0 0 0.75rem 0;
+}
+
+.insightsBox p {
+ font-size: 0.875rem;
+ color: var(--text-dark);
+ line-height: 1.5;
+ margin: 0 0 1rem 0;
}
-.categoryFilter {
+.actionButtons {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
- margin-top: 1rem;
}
-.filterButton {
- padding: 0.75rem 1.5rem;
- border: 2px solid var(--border-color);
- background: var(--bg-primary);
- color: var(--text-secondary);
- border-radius: 50px;
- font-weight: 500;
+.actionButton {
+ background-color: var(--primary-color);
+ color: white;
+ border: none;
+ padding: 0.5rem 1rem;
+ border-radius: var(--border-radius);
font-size: 0.875rem;
cursor: pointer;
- transition: var(--transition);
- white-space: nowrap;
+ transition: background-color 0.2s ease;
+}
+
+.actionButton:hover {
+ background-color: #0056b3;
+}
+
+/* ============================================================================
+ ASSIGNMENT SECTION & TABLE
+ ============================================================================ */
+
+.assignmentSection {
+ background-color: var(--bg-white);
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius);
+ padding: 1.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.assignmentInfo {
+ display: flex;
+ flex-direction: column;
+ gap: 0.375rem;
+}
+
+.assignmentName {
+ font-weight: 500;
+ color: var(--text-dark);
+ font-size: 0.9rem;
+ line-height: 1.3;
+}
+
+.assignmentDate {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.statusBadge {
+ display: inline-block;
+ padding: 0.375rem 0.75rem;
+ border-radius: 1rem;
+ font-size: 0.75rem;
+ font-weight: 500;
+ text-align: center;
+ min-width: 80px;
+}
+
+.statusBadge.onTime {
+ background-color: #d4edda;
+ color: #155724;
+ border: 1px solid #c3e6cb;
}
-.filterButton:hover {
- border-color: #4f46e5;
- color: #000000;
- background: rgba(255, 255, 255, 0.9);
- transform: translateY(-2px);
+.statusBadge.late {
+ background-color: #f8d7da;
+ color: #721c24;
+ border: 1px solid #f5c6cb;
+}
+
+.feedbackButton {
+ background-color: #f8f9fa;
+ border: 1px solid #dee2e6;
+ color: #6c757d;
+ padding: 0.375rem 0.75rem;
+ border-radius: 1rem;
+ font-size: 0.75rem;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ gap: 0.375rem;
+ transition: all 0.2s ease;
+ min-width: 100px;
+ justify-content: center;
+}
+
+.feedbackButton:hover {
+ background-color: #e9ecef;
+ color: #495057;
+ border-color: #adb5bd;
+}
+
+.buttonIcon {
+ font-size: 0.875rem;
+}
+
+/* Performance percentage colors */
+.excellent {
+ color: var(--success-color);
font-weight: 600;
}
-.filterButton.active {
- background: linear-gradient(135deg, var(--primary-color), var(--info-color));
- border-color: transparent;
- color: white;
- box-shadow: var(--shadow-md);
+.good {
+ color: var(--warning-color);
+ font-weight: 600;
+}
+
+.fair {
+ color: #fd7e14;
+ font-weight: 600;
}
-.filterButton.active:hover {
- transform: translateY(-2px);
- box-shadow: var(--shadow-lg);
+.poor {
+ color: var(--danger-color);
+ font-weight: 600;
}
/* ============================================================================
- ALERT STYLING
+ SUMMARY CARDS
============================================================================ */
-.noDataAlert {
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(20px);
- border: 1px solid rgba(245, 158, 11, 0.3);
+.summaryCards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 1rem;
+ margin-bottom: 2rem;
+}
+
+.summaryCard {
+ background-color: var(--bg-white);
+ border: 1px solid var(--border-color);
border-radius: var(--border-radius);
- color: var(--text-primary);
- font-weight: 500;
- box-shadow: var(--shadow-md);
+ padding: 1.5rem;
+ text-align: center;
+ box-shadow: var(--box-shadow);
+}
+
+.cardNumber {
+ font-size: 2rem;
+ font-weight: 700;
+ margin-bottom: 0.5rem;
+}
+
+.cardNumber.total {
+ color: var(--text-dark);
+}
+
+.cardNumber.onTime {
+ color: #28a745;
+}
+
+.cardNumber.late {
+ color: #dc3545;
+}
+
+.cardNumber.average {
+ color: #007bff;
+}
+
+.cardLabel {
+ font-size: 0.875rem;
+ color: var(--text-muted);
+ margin: 0;
+}
+
+/* ============================================================================
+ LOADING STATES
+ ============================================================================ */
+
+.loadingContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 3rem;
+ text-align: center;
+}
+
+.loadingSpinner {
+ width: 40px;
+ height: 40px;
+ border: 4px solid var(--bg-light);
+ border-top: 4px solid var(--primary-color);
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ margin-bottom: 1rem;
+}
+
+.loadingIcon {
+ font-size: 3rem;
+ color: var(--primary-color);
+ margin-bottom: 1rem;
+ animation: pulse 2s infinite;
+}
+
+.loadingSpinner h3 {
+ color: var(--text-dark);
+ margin-bottom: 1rem;
+}
+
+.loadingBar {
+ width: 200px;
+ height: 4px;
+ background-color: var(--bg-light);
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+.loadingProgress {
+ width: 30%;
+ height: 100%;
+ background-color: var(--primary-color);
+ animation: progress 2s ease-in-out infinite;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.5; }
+}
+
+@keyframes progress {
+ 0% { transform: translateX(-100%); }
+ 50% { transform: translateX(0%); }
+ 100% { transform: translateX(100%); }
+}
+
+/* ============================================================================
+ NO DATA STATES
+ ============================================================================ */
+
+.noDataAlert {
+ text-align: center;
+ margin: 2rem 0;
}
/* ============================================================================
@@ -277,77 +599,50 @@
@media (max-width: 768px) {
.headerContent {
flex-direction: column;
- text-align: center;
+ align-items: flex-start;
+ gap: 1rem;
}
- .pageTitle {
- font-size: 1.75rem;
+ .headerRight {
+ align-self: flex-end;
}
- .scoreCircle {
- width: 100px;
- height: 100px;
+ .sectionHeader {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.75rem;
}
- .scoreNumber {
- font-size: 1.5rem;
+ .overallScore {
+ align-self: flex-end;
+ }
+
+ .actionButtons {
+ flex-direction: column;
}
- .categoryFilter {
- justify-content: center;
+ .actionButton {
+ width: 100%;
+ text-align: center;
}
- .filterButton {
- font-size: 0.8rem;
- padding: 0.625rem 1.25rem;
+ .summaryCards {
+ grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 480px) {
- .headerSection {
- padding: 1.5rem 0;
- }
-
- .pageTitle {
- font-size: 1.5rem;
+ .summaryCards {
+ grid-template-columns: 1fr;
}
- .loadingSpinner {
- padding: 2rem;
+ .mainContent {
+ padding: 0 0.5rem;
}
- .loadingIcon {
- font-size: 3rem;
- }
-}
-
-/* ============================================================================
- ACCESSIBILITY
- ============================================================================ */
-
-@media (prefers-reduced-motion: reduce) {
- * {
- animation-duration: 0.01ms !important;
- animation-iteration-count: 1 !important;
- transition-duration: 0.01ms !important;
- }
-}
-
-/* Focus styles for accessibility */
-.filterButton:focus-visible {
- outline: 2px solid var(--primary-color);
- outline-offset: 2px;
-}
-
-/* High contrast mode support */
-@media (prefers-contrast: high) {
- :root {
- --primary-color: #0066cc;
- --success-color: #008800;
- --warning-color: #cc6600;
- --error-color: #cc0000;
- --text-primary: #000000;
- --text-secondary: #333333;
- --border-color: #666666;
+ .overallSection,
+ .categorySection,
+ .assignmentSection {
+ padding: 1rem;
}
}
\ No newline at end of file
diff --git a/src/components/EductionPortal/EvaluationResults/TaskDetailsList.jsx b/src/components/EductionPortal/EvaluationResults/TaskDetailsList.jsx
index 5c1165a189..43bc8f64c2 100644
--- a/src/components/EductionPortal/EvaluationResults/TaskDetailsList.jsx
+++ b/src/components/EductionPortal/EvaluationResults/TaskDetailsList.jsx
@@ -15,7 +15,7 @@ import {
faDownload,
faEye,
} from '@fortawesome/free-solid-svg-icons';
-import { getStatusInfo } from './mockData';
+import { getStatusInfo } from './mockData_new';
import styles from './TaskDetailsList.module.css';
const TaskDetailsList = ({ tasks, selectedCategory = 'all', categories, isLoading }) => {
diff --git a/src/components/EductionPortal/EvaluationResults/mockData.js b/src/components/EductionPortal/EvaluationResults/mockData.js
deleted file mode 100644
index 72b7f2b929..0000000000
--- a/src/components/EductionPortal/EvaluationResults/mockData.js
+++ /dev/null
@@ -1,437 +0,0 @@
-// ============================================================================
-// MOCK EVALUATION DATA - Realistic Academic Performance Data
-// ============================================================================
-
-export const mockEvaluationData = {
- student: {
- id: 'STU-2024-001',
- name: 'Alex Johnson',
- email: 'alex.johnson@school.edu',
- class: 'Computer Science - Year 3',
- semester: 'Fall 2024',
- lastUpdated: '2024-09-25T10:30:00Z',
- profileImage: '/api/placeholder/60/60',
- },
-
- // Overall performance score (calculated from all categories)
- overallScore: 87.3,
-
- // Performance categories with detailed breakdown
- categories: [
- {
- id: 'assignments',
- name: 'Assignments',
- weightage: 40,
- totalItems: 12,
- completedItems: 11,
- totalMarks: 1200,
- earnedMarks: 1050,
- percentage: 87.5,
- performanceLevel: 'excellent', // excellent, good, fair, poor
- color: '#10b981',
- icon: 'faClipboardCheck',
- description: 'Programming assignments, essays, and individual homework tasks',
- dueDate: '2024-10-14T12:00:00',
- submissions: {
- onTime: 9,
- late: 2,
- missing: 1,
- },
- },
- {
- id: 'quizzes',
- name: 'Quizzes',
- weightage: 25,
- totalItems: 8,
- completedItems: 8,
- totalMarks: 800,
- earnedMarks: 720,
- percentage: 90.0,
- performanceLevel: 'excellent',
- color: '#3b82f6',
- icon: 'faQuestion',
- description: 'Short weekly quizzes and knowledge check assessments',
- dueDate: '2024-09-29T12:00:00',
- submissions: {
- onTime: 7,
- late: 1,
- missing: 0,
- },
- },
- {
- id: 'exams',
- name: 'Exams',
- weightage: 25,
- totalItems: 3,
- completedItems: 2,
- totalMarks: 300,
- earnedMarks: 245,
- percentage: 81.7,
- performanceLevel: 'good',
- color: '#f59e0b',
- icon: 'faGraduationCap',
- description: 'Comprehensive midterm and final examinations',
- dueDate: '2024-12-09T12:00:00',
- submissions: {
- onTime: 2,
- late: 0,
- missing: 1,
- },
- },
- {
- id: 'projects',
- name: 'Projects',
- weightage: 10,
- totalItems: 2,
- completedItems: 2,
- totalMarks: 200,
- earnedMarks: 185,
- percentage: 92.5,
- performanceLevel: 'excellent',
- color: '#8b5cf6',
- icon: 'faProjectDiagram',
- description: 'Collaborative group projects and individual capstone work',
- dueDate: '2024-11-19T12:00:00',
- submissions: {
- onTime: 1,
- late: 1,
- missing: 0,
- },
- },
- ],
-
- // Detailed task/assignment list
- tasks: [
- // Assignments
- {
- id: 'task-001',
- name: 'Data Structures Implementation',
- category: 'assignments',
- type: 'Programming Assignment',
- weightage: 8,
- totalMarks: 100,
- earnedMarks: 95,
- percentage: 95,
- status: 'On Time',
- statusColor: '#10b981',
- submittedDate: '2024-09-10T14:30:00Z',
- dueDate: '2024-09-29T23:59:00Z',
- teacherFeedback:
- 'Excellent implementation! Clean code structure and efficient algorithms. Minor improvement needed in edge case handling.',
- rubricScores: {
- 'Code Quality': { earned: 18, total: 20 },
- Functionality: { earned: 20, total: 20 },
- Documentation: { earned: 17, total: 20 },
- Testing: { earned: 16, total: 20 },
- Performance: { earned: 19, total: 20 },
- },
- attachments: ['solution.py', 'test_cases.py', 'documentation.pdf'],
- },
- {
- id: 'task-002',
- name: 'Algorithm Analysis Report',
- category: 'assignments',
- type: 'Research Assignment',
- weightage: 6,
- totalMarks: 100,
- earnedMarks: 88,
- percentage: 88,
- status: 'On Time',
- statusColor: '#10b981',
- submittedDate: '2024-09-20T16:45:00Z',
- dueDate: '2024-09-22T23:59:00Z',
- teacherFeedback:
- 'Good analysis of time complexity. Your comparison of different sorting algorithms was thorough. Consider adding more real-world examples.',
- rubricScores: {
- 'Research Quality': { earned: 17, total: 20 },
- 'Analysis Depth': { earned: 18, total: 20 },
- 'Writing Quality': { earned: 16, total: 20 },
- Citations: { earned: 19, total: 20 },
- Presentation: { earned: 18, total: 20 },
- },
- },
- {
- id: 'task-003',
- name: 'Database Design Assignment',
- category: 'assignments',
- type: 'Design Assignment',
- weightage: 7,
- totalMarks: 100,
- earnedMarks: 78,
- percentage: 78,
- status: 'Late',
- statusColor: '#f59e0b',
- submittedDate: '2024-09-28T10:15:00Z',
- dueDate: '2024-09-25T23:59:00Z',
- teacherFeedback:
- 'Submitted 3 days late (-10 points). Good ER diagram design, but normalization could be improved. Review 3NF principles.',
- rubricScores: {
- 'ER Diagram': { earned: 18, total: 20 },
- Normalization: { earned: 14, total: 20 },
- 'SQL Queries': { earned: 17, total: 20 },
- Documentation: { earned: 15, total: 20 },
- Timeliness: { earned: 10, total: 20 },
- },
- },
-
- // Quizzes
- {
- id: 'quiz-001',
- name: 'Arrays and Linked Lists Quiz',
- category: 'quizzes',
- type: 'Online Quiz',
- weightage: 3,
- totalMarks: 100,
- earnedMarks: 92,
- percentage: 92,
- status: 'On Time',
- statusColor: '#10b981',
- submittedDate: '2024-09-15T11:30:00Z',
- dueDate: '2024-09-15T12:00:00Z',
- teacherFeedback:
- 'Excellent understanding of data structures. Only minor mistake in time complexity analysis.',
- timeSpent: '25 minutes',
- attempts: 1,
- maxAttempts: 1,
- },
- {
- id: 'quiz-002',
- name: 'Sorting Algorithms Quiz',
- category: 'quizzes',
- type: 'Online Quiz',
- weightage: 3,
- totalMarks: 100,
- earnedMarks: 85,
- percentage: 85,
- status: 'On Time',
- statusColor: '#10b981',
- submittedDate: '2024-09-22T14:45:00Z',
- dueDate: '2024-09-22T15:00:00Z',
- teacherFeedback: 'Good performance. Review merge sort implementation details.',
- timeSpent: '28 minutes',
- attempts: 1,
- maxAttempts: 1,
- },
-
- // Exams
- {
- id: 'exam-001',
- name: 'Midterm Examination',
- category: 'exams',
- type: 'Written Exam',
- weightage: 15,
- totalMarks: 150,
- earnedMarks: 128,
- percentage: 85.3,
- status: 'On Time',
- statusColor: '#10b981',
- submittedDate: '2024-10-14T12:00:00Z',
- dueDate: '2024-10-14T12:00:00Z',
- teacherFeedback:
- 'Strong performance across all topics. Excellent problem-solving in dynamic programming section. Minor errors in graph algorithms.',
- sections: {
- 'Data Structures': { earned: 28, total: 30 },
- Algorithms: { earned: 25, total: 30 },
- 'Dynamic Programming': { earned: 30, total: 30 },
- 'Graph Theory': { earned: 22, total: 30 },
- 'Problem Solving': { earned: 23, total: 30 },
- },
- },
- {
- id: 'exam-002',
- name: 'Final Examination',
- category: 'exams',
- type: 'Comprehensive Exam',
- weightage: 10,
- totalMarks: 150,
- earnedMarks: 0,
- percentage: 0,
- status: 'Missing',
- statusColor: '#ef4444',
- submittedDate: null,
- dueDate: '2024-12-10T12:00:00Z',
- teacherFeedback: 'Exam not yet taken. Scheduled for December 10th.',
- },
-
- // Projects
- {
- id: 'project-001',
- name: 'Social Media Analytics Platform',
- category: 'projects',
- type: 'Group Project',
- weightage: 6,
- totalMarks: 100,
- earnedMarks: 94,
- percentage: 94,
- status: 'On Time',
- statusColor: '#10b981',
- submittedDate: '2024-11-01T18:30:00Z',
- dueDate: '2024-11-02T23:59:00Z',
- teacherFeedback:
- 'Outstanding project! Excellent use of modern technologies, clean architecture, and comprehensive testing. Great teamwork evident.',
- teamMembers: ['Alex Johnson', 'Sarah Chen', 'Michael Rodriguez'],
- technologies: ['React', 'Node.js', 'MongoDB', 'Python', 'Machine Learning'],
- deliverables: ['Source Code', 'Documentation', 'Presentation', 'Demo Video'],
- },
- {
- id: 'project-002',
- name: 'Algorithm Visualization Tool',
- category: 'projects',
- type: 'Individual Project',
- weightage: 4,
- totalMarks: 100,
- earnedMarks: 91,
- percentage: 91,
- status: 'Late',
- statusColor: '#f59e0b',
- submittedDate: '2024-11-22T14:20:00Z',
- dueDate: '2024-11-20T23:59:00Z',
- teacherFeedback:
- 'Great interactive visualizations! Submitted 2 days late (-5 points). Consider adding more algorithms and improving UI responsiveness.',
- technologies: ['JavaScript', 'D3.js', 'HTML5 Canvas', 'CSS3'],
- features: [
- 'Sorting Visualizations',
- 'Graph Algorithms',
- 'Interactive Controls',
- 'Step-by-step Execution',
- ],
- },
- ],
-
- // Summary statistics
- summary: {
- totalAssignments: 12,
- completedAssignments: 11,
- onTimeSubmissions: 19,
- lateSubmissions: 4,
- missingSubmissions: 2,
- averageScore: 87.3,
- highestScore: 95,
- lowestScore: 78,
- improvementTrend: '+5.2%', // compared to previous semester
- timeManagement: {
- excellent: 19,
- good: 4,
- needsImprovement: 2,
- },
- strengths: [
- 'Excellent programming skills',
- 'Strong analytical thinking',
- 'Good documentation practices',
- 'Consistent performance',
- ],
- areasForImprovement: [
- 'Time management for large assignments',
- 'Edge case handling in code',
- 'Exam preparation strategies',
- ],
- },
-
- // Teacher's general feedback
- teacherFeedback: {
- overall:
- 'Alex demonstrates exceptional understanding of computer science concepts and consistently produces high-quality work. Strong programming abilities and analytical skills are evident throughout the semester.',
- strengths: [
- 'Outstanding problem-solving capabilities',
- 'Clean and well-documented code',
- 'Excellent participation in class discussions',
- 'Strong collaboration skills in group projects',
- 'Consistent effort and improvement mindset',
- ],
- recommendations: [
- 'Focus on time management to avoid late submissions',
- 'Practice more complex algorithm implementations',
- 'Prepare more thoroughly for comprehensive exams',
- 'Consider tutoring other students to reinforce learning',
- ],
- nextSteps: [
- 'Enroll in Advanced Algorithms course',
- 'Consider internship opportunities',
- 'Join competitive programming club',
- 'Start working on senior capstone project ideas',
- ],
- overallRating: 'Excellent',
- teacherName: 'Dr. Emily Rodriguez',
- teacherTitle: 'Professor of Computer Science',
- lastUpdated: '2024-09-25T15:45:00Z',
- },
-
- // Performance trends over time
- trends: {
- monthly: [
- { month: 'August', score: 82.5, assignments: 3, rank: 15 },
- { month: 'September', score: 87.8, assignments: 5, rank: 12 },
- { month: 'October', score: 89.2, assignments: 4, rank: 8 },
- ],
- categoryTrends: {
- assignments: [85, 87, 89],
- quizzes: [88, 90, 92],
- exams: [82, 85, 0], // 0 for not yet taken
- projects: [90, 94, 91],
- },
- },
-
- // Notifications about new results
- notifications: [
- {
- id: 'notif-001',
- type: 'new_grade',
- title: 'New Grade Posted',
- message: 'Your grade for "Algorithm Visualization Tool" has been posted.',
- date: '2024-09-25T09:15:00Z',
- read: false,
- priority: 'medium',
- },
- {
- id: 'notif-002',
- type: 'feedback_available',
- title: 'Teacher Feedback Available',
- message: 'Dr. Rodriguez has provided feedback on your midterm exam.',
- date: '2024-09-24T14:30:00Z',
- read: false,
- priority: 'high',
- },
- ],
-
- // Performance analytics
- analytics: {
- classRank: 8,
- totalStudents: 45,
- percentile: 82,
- gpa: 3.8,
- creditHours: 15,
- attendanceRate: 95,
- participationScore: 92,
- },
-};
-
-// Helper functions for data processing
-export const getPerformanceLevel = percentage => {
- if (percentage >= 90) return { level: 'excellent', color: '#10b981', label: 'Excellent' };
- if (percentage >= 80) return { level: 'good', color: '#3b82f6', label: 'Good' };
- if (percentage >= 70) return { level: 'fair', color: '#f59e0b', label: 'Fair' };
- return { level: 'poor', color: '#ef4444', label: 'Needs Improvement' };
-};
-
-export const getStatusInfo = status => {
- switch (status.toLowerCase()) {
- case 'on time':
- return { color: '#10b981', icon: 'faCheckCircle', label: 'On Time' };
- case 'late':
- return { color: '#f59e0b', icon: 'faClock', label: 'Late Submission' };
- case 'missing':
- return { color: '#ef4444', icon: 'faTimesCircle', label: 'Missing' };
- default:
- return { color: '#6b7280', icon: 'faQuestion', label: 'Unknown' };
- }
-};
-
-export const calculateCategoryProgress = category => {
- const completionRate = (category.completedItems / category.totalItems) * 100;
- const scoreRate = category.percentage;
- return {
- completionRate: Math.round(completionRate),
- scoreRate: Math.round(scoreRate * 10) / 10,
- isComplete: category.completedItems === category.totalItems,
- };
-};
diff --git a/src/components/EductionPortal/EvaluationResults/mockData_new.js b/src/components/EductionPortal/EvaluationResults/mockData_new.js
new file mode 100644
index 0000000000..f97cc9ac1e
--- /dev/null
+++ b/src/components/EductionPortal/EvaluationResults/mockData_new.js
@@ -0,0 +1,252 @@
+// ============================================================================
+// MOCK EVALUATION DATA - Clean Academic Performance Data for New Design
+// ============================================================================
+
+export const mockEvaluationData = {
+ student: {
+ id: 'STU-2024-001',
+ name: 'Alex Johnson',
+ email: 'alex.johnson@school.edu',
+ class: 'Computer Science - Year 3',
+ semester: 'Fall 2024',
+ lastUpdated: '2024-09-25T10:30:00Z',
+ profileImage: '/api/placeholder/60/60',
+ },
+
+ // Overall performance score (calculated from all categories)
+ overallScore: 77.0,
+
+ // Performance categories with detailed breakdown
+ categories: [
+ {
+ id: 'assignments',
+ name: 'Assignments',
+ weightage: 40,
+ totalItems: 5,
+ completedItems: 5,
+ totalMarks: 40,
+ earnedMarks: 32,
+ percentage: 80.0,
+ performanceLevel: 'good',
+ color: '#28a745',
+ icon: 'faClipboardCheck',
+ description: 'Programming assignments, essays, and individual homework tasks',
+ dueDate: '2024-10-14T12:00:00',
+ submissions: {
+ onTime: 4,
+ late: 1,
+ missing: 0,
+ },
+ },
+ {
+ id: 'exams',
+ name: 'Exams',
+ weightage: 35,
+ totalItems: 2,
+ completedItems: 2,
+ totalMarks: 40,
+ earnedMarks: 32,
+ percentage: 80.0,
+ performanceLevel: 'good',
+ color: '#28a745',
+ icon: 'faGraduationCap',
+ description: 'Comprehensive midterm and final examinations',
+ dueDate: '2024-12-09T12:00:00',
+ submissions: {
+ onTime: 2,
+ late: 0,
+ missing: 0,
+ },
+ },
+ {
+ id: 'quizzes',
+ name: 'Quizzes',
+ weightage: 15,
+ totalItems: 8,
+ completedItems: 8,
+ totalMarks: 40,
+ earnedMarks: 24,
+ percentage: 60.0,
+ performanceLevel: 'fair',
+ color: '#ffc107',
+ icon: 'faQuestion',
+ description: 'Short weekly quizzes and knowledge check assessments',
+ dueDate: '2024-09-29T12:00:00',
+ submissions: {
+ onTime: 6,
+ late: 2,
+ missing: 0,
+ },
+ },
+ {
+ id: 'participation',
+ name: 'Participation',
+ weightage: 10,
+ totalItems: 1,
+ completedItems: 1,
+ totalMarks: 40,
+ earnedMarks: 32,
+ percentage: 80.0,
+ performanceLevel: 'good',
+ color: '#28a745',
+ icon: 'faUsers',
+ description: 'Class participation and engagement activities',
+ dueDate: '2024-11-19T12:00:00',
+ submissions: {
+ onTime: 1,
+ late: 0,
+ missing: 0,
+ },
+ },
+ ],
+
+ // Detailed task/assignment list
+ tasks: [
+ {
+ id: 'task-001',
+ name: 'Assignment 1: Essay on Climate Change',
+ category: 'assignments',
+ type: 'Essay Assignment',
+ weightage: 8,
+ totalMarks: 10,
+ earnedMarks: 8,
+ percentage: 80,
+ status: 'On time',
+ statusColor: '#28a745',
+ submissionDate: '2024-08-15T14:30:00Z',
+ dueDate: '2024-08-15T23:59:00Z',
+ teacherFeedback: 'Good analysis and structure. Consider adding more supporting evidence.',
+ },
+ {
+ id: 'task-002',
+ name: 'Mid-Term Exam',
+ category: 'exams',
+ type: 'Examination',
+ weightage: 20,
+ totalMarks: 100,
+ earnedMarks: 75,
+ percentage: 75,
+ status: 'On time',
+ statusColor: '#28a745',
+ submissionDate: '2024-09-15T14:30:00Z',
+ dueDate: '2024-09-15T16:00:00Z',
+ teacherFeedback: 'Solid performance overall. Review concepts from chapter 5.',
+ },
+ {
+ id: 'task-003',
+ name: 'Quiz 1: Basic Concepts',
+ category: 'quizzes',
+ type: 'Quiz',
+ weightage: 2,
+ totalMarks: 20,
+ earnedMarks: 15,
+ percentage: 75,
+ status: 'On time',
+ statusColor: '#28a745',
+ submissionDate: '2024-08-28T14:30:00Z',
+ dueDate: '2024-08-28T23:59:00Z',
+ teacherFeedback: 'Good understanding of basic concepts.',
+ },
+ {
+ id: 'task-004',
+ name: 'Assignment 2: Research Project',
+ category: 'assignments',
+ type: 'Research Assignment',
+ weightage: 12,
+ totalMarks: 10,
+ earnedMarks: 6,
+ percentage: 60,
+ status: 'Late for 2 days',
+ statusColor: '#dc3545',
+ submissionDate: '2024-09-20T14:30:00Z',
+ dueDate: '2024-09-18T23:59:00Z',
+ teacherFeedback: 'Late submission. Content needs more depth and analysis.',
+ },
+ {
+ id: 'task-005',
+ name: 'Quiz 2: Advanced Topics',
+ category: 'quizzes',
+ type: 'Quiz',
+ weightage: 2,
+ totalMarks: 15,
+ earnedMarks: 9,
+ percentage: 60,
+ status: 'On time',
+ statusColor: '#28a745',
+ submissionDate: '2024-09-25T14:30:00Z',
+ dueDate: '2024-09-25T23:59:00Z',
+ teacherFeedback: 'Review advanced concepts. Practice problems recommended.',
+ },
+ {
+ id: 'task-006',
+ name: 'Final Exam',
+ category: 'exams',
+ type: 'Final Examination',
+ weightage: 15,
+ totalMarks: 100,
+ earnedMarks: 82,
+ percentage: 82,
+ status: 'On time',
+ statusColor: '#28a745',
+ submissionDate: '2024-10-15T14:30:00Z',
+ dueDate: '2024-10-15T16:00:00Z',
+ teacherFeedback: 'Excellent improvement from mid-term. Well prepared.',
+ },
+ ],
+
+ // Summary statistics
+ summary: {
+ totalAssignments: 6,
+ completedAssignments: 6,
+ onTimeSubmissions: 5,
+ lateSubmissions: 1,
+ missingSubmissions: 0,
+ averageScore: 72,
+ improvementTrend: '+5%',
+ lastAssignmentDate: '2024-10-15T16:00:00Z',
+ },
+
+ // Teacher feedback (kept for compatibility)
+ teacherFeedback: {
+ teacherName: 'Dr. Emily Rodriguez',
+ teacherTitle: 'Professor of Computer Science',
+ overallRating: 'Good',
+ lastUpdated: '2024-10-25T10:30:00Z',
+ overall:
+ 'You performed strongly in Assignments (80%), Exams (80%), and Participation (80%). You may improve your performance in Quizzes (60%) - consider reviewing quiz preparation strategies.',
+ strengths: [
+ 'Strong analytical thinking and problem-solving skills',
+ 'Excellent written communication in assignments',
+ 'Consistent attendance and participation',
+ ],
+ improvements: [
+ 'Review quiz preparation strategies',
+ 'Practice time management during timed assessments',
+ 'Strengthen foundational concepts',
+ ],
+ },
+};
+
+// Helper functions for performance calculations
+export const getPerformanceLevel = score => {
+ if (score >= 90) return { level: 'excellent', label: 'Excellent', color: 'success' };
+ if (score >= 80) return { level: 'good', label: 'Good', color: 'primary' };
+ if (score >= 70) return { level: 'fair', label: 'Fair', color: 'warning' };
+ return { level: 'poor', label: 'Needs Improvement', color: 'danger' };
+};
+
+export const calculateCategoryProgress = category => {
+ const completionRate = Math.round((category.completedItems / category.totalItems) * 100);
+ const isComplete = category.completedItems === category.totalItems;
+ return { completionRate, isComplete };
+};
+
+export const getStatusInfo = status => {
+ if (status === 'On time' || status === 'completed') {
+ return { color: 'success', icon: 'check-circle' };
+ }
+ if (status?.toLowerCase().includes('late')) {
+ return { color: 'danger', icon: 'exclamation-triangle' };
+ }
+ return { color: 'secondary', icon: 'clock' };
+};
From cf3b010e4756ee6a8572d81d13d4fd62cf893a87 Mon Sep 17 00:00:00 2001
From: boppanapraveen <61085397+boppanapraveen@users.noreply.github.com>
Date: Fri, 14 Nov 2025 22:46:33 -0600
Subject: [PATCH 4/9] Fix: Implemented Feedback and Mobile responsiveness
---
.../EvaluationResults/EvaluationResults.jsx | 215 +++++-
.../EvaluationResults.module.css | 724 +++++++++++++++++-
.../EvaluationResults/mockData_new.js | 8 +-
.../PermissionsManagement.css | 72 +-
4 files changed, 1009 insertions(+), 10 deletions(-)
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
index 4e15c0a9cc..adfc68e1d7 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
@@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react';
import { connect } from 'react-redux';
-import { Container, Alert } from 'reactstrap';
+import { Container, Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import {
faUser,
@@ -8,6 +8,10 @@ import {
faEye,
faGraduationCap,
faExclamationTriangle,
+ faTimes,
+ faCalendarAlt,
+ faPercent,
+ faAward,
} from '@fortawesome/free-solid-svg-icons';
import styles from './EvaluationResults.module.css';
@@ -18,6 +22,10 @@ const EvaluationResults = ({ auth }) => {
const [evaluationData, setEvaluationData] = useState(null);
const [loading, setLoading] = useState(true);
const [selectedCategory, setSelectedCategory] = useState('all');
+ const [feedbackModal, setFeedbackModal] = useState({
+ isOpen: false,
+ task: null,
+ });
useEffect(() => {
// Load evaluation data immediately since we're using mock data
@@ -128,6 +136,15 @@ const EvaluationResults = ({ auth }) => {
return styles.poor;
};
+ // Feedback modal functions
+ const openFeedbackModal = task => {
+ setFeedbackModal({ isOpen: true, task });
+ };
+
+ const closeFeedbackModal = () => {
+ setFeedbackModal({ isOpen: false, task: null });
+ };
+
return (
{/* New Clean Header */}
@@ -276,7 +293,10 @@ const EvaluationResults = ({ auth }) => {
-
+ openFeedbackModal(task)}
+ >
View Feedback
@@ -286,6 +306,100 @@ const EvaluationResults = ({ auth }) => {
+
+ {/* Mobile Cards (shown on small screens) */}
+
+ {tasks.slice(0, 6).map(task => (
+
+
+
{task.name}
+
+ {task.status || 'On time'}
+
+
+
+
+ Weightage: {task.weightage || '8'}%
+
+
+ Score: {task.earnedMarks}/{task.totalMarks}
+
+ {' '}
+ ({Math.round(task.percentage)}%)
+
+
+
+ Submitted: {new Date(task.submissionDate).toLocaleDateString()}
+
+
+
+ openFeedbackModal(task)}>
+
+ View Feedback
+
+
+
+ ))}
+
+
+
+ {/* Teacher Feedback Section */}
+
+
+
+
+ Teacher Feedback - Structured feedback display with strengths and recommendations
+
+
+
+ {evaluationData.teacherFeedback.teacherName}
+
+
+ {evaluationData.teacherFeedback.teacherTitle}
+
+
+
+
+
+ {/* Overall Feedback */}
+
+
Overall Assessment
+
{evaluationData.teacherFeedback.overall}
+
+
+ {/* Strengths and Improvements */}
+
+
+
+
+ Strengths
+
+
+ {evaluationData.teacherFeedback.strengths.map((strength, index) => (
+
+ ✓
+ {strength}
+
+ ))}
+
+
+
+
+
+
+ Areas for Improvement
+
+
+ {evaluationData.teacherFeedback.improvements.map((improvement, index) => (
+
+ →
+ {improvement}
+
+ ))}
+
+
+
+
{/* Summary Cards */}
@@ -308,6 +422,103 @@ const EvaluationResults = ({ auth }) => {
+
+ {/* Feedback Detail Modal */}
+
+
+
+ Assignment Feedback Details
+
+
+ {feedbackModal.task && (
+
+ {/* Assignment Header */}
+
+
{feedbackModal.task.name}
+
+
+
+ {feedbackModal.task.type}
+
+
+
+ Due: {new Date(feedbackModal.task.dueDate).toLocaleDateString()}
+
+
+
+
+ {/* Performance Summary */}
+
+
+
Your Score
+
+ {feedbackModal.task.earnedMarks}/{feedbackModal.task.totalMarks}
+ ({feedbackModal.task.percentage}%)
+
+
+
+
Weightage
+
+
+ {feedbackModal.task.weightage}%
+
+
+
+
Status
+
+ {feedbackModal.task.status}
+
+
+
+
+ {/* Teacher Feedback */}
+
+
+
+ Teacher Feedback
+
+
{feedbackModal.task.teacherFeedback}
+
+
+ {/* Additional Details */}
+
+
+ Submission Date:
+
+ {new Date(feedbackModal.task.submissionDate).toLocaleDateString()} at{' '}
+ {new Date(feedbackModal.task.submissionDate).toLocaleTimeString()}
+
+
+
+ Grade Category:
+ {feedbackModal.task.category}
+
+
+
+ )}
+
+
+
+
+ Close
+
+
+
);
};
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
index c25fd035f9..2c40882fcf 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
@@ -382,6 +382,45 @@
margin-bottom: 1.5rem;
}
+/* Mobile assignment cards (hidden by default; enabled on small screens) */
+.mobileAssignments {
+ display: none;
+}
+
+.assignmentCard {
+ background-color: var(--bg-white);
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius);
+ padding: 1rem;
+ margin-bottom: 0.75rem;
+ box-shadow: var(--box-shadow);
+}
+
+.cardHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 0.75rem;
+ margin-bottom: 0.5rem;
+}
+
+.cardMeta {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 0.5rem 0.75rem;
+ margin-bottom: 0.75rem;
+}
+
+.cardMetaItem {
+ font-size: 0.85rem;
+ color: var(--text-dark);
+}
+
+.cardActions {
+ display: flex;
+ justify-content: flex-end;
+}
+
.assignmentInfo {
display: flex;
flex-direction: column;
@@ -393,6 +432,8 @@
color: var(--text-dark);
font-size: 0.9rem;
line-height: 1.3;
+ word-break: break-word;
+ overflow-wrap: anywhere;
}
.assignmentDate {
@@ -604,7 +645,19 @@
}
.headerRight {
- align-self: flex-end;
+ position: static;
+ align-self: flex-start;
+ width: 100%;
+ justify-content: space-between;
+ }
+
+ .pageTitle {
+ font-size: 1.75rem;
+ }
+
+ .pageSubtitle {
+ font-size: 0.85rem;
+ max-width: 100%;
}
.sectionHeader {
@@ -614,26 +667,146 @@
}
.overallScore {
- align-self: flex-end;
+ align-self: flex-start;
+ width: 100%;
}
.actionButtons {
flex-direction: column;
+ width: 100%;
}
.actionButton {
width: 100%;
text-align: center;
+ padding: 0.75rem 1rem;
+ margin-bottom: 0.5rem;
}
.summaryCards {
grid-template-columns: repeat(2, 1fr);
+ gap: 1rem;
+ }
+
+ /* Make tables responsive by allowing horizontal scroll */
+ .tableContainer {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ margin: 0 -1rem;
+ padding: 0 1rem;
+ }
+
+ /* Keep headers visible when scrolling horizontally */
+ .assignmentTable thead th {
+ position: sticky;
+ top: 0;
+ background: #f8f9fa;
+ z-index: 1;
+ }
+
+ .categoryTable,
+ .assignmentTable {
+ min-width: 600px;
+ font-size: 0.9rem;
+ }
+
+ .categoryTable th,
+ .categoryTable td,
+ .assignmentTable th,
+ .assignmentTable td {
+ padding: 0.75rem 0.5rem;
+ white-space: nowrap;
+ }
+
+ /* Teacher Feedback responsive */
+ .feedbackColumns {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ }
+
+ .teacherFeedbackSection {
+ padding: 1.5rem;
+ }
+
+ .teacherInfo {
+ align-items: flex-start;
+ margin-top: 1rem;
+ }
+
+ /* Modal mobile styles */
+ .feedbackModal .modal-dialog {
+ margin: 0.25rem;
+ max-width: calc(100% - 0.5rem);
+ }
+
+ .modalBody {
+ padding: 1.25rem;
+ max-height: 65vh;
+ }
+
+ .modalHeader {
+ padding: 1.25rem;
+ text-align: center;
+ }
+
+ .modalHeader h4 {
+ font-size: 1.1rem;
+ line-height: 1.3;
+ }
+
+ .modalFooter {
+ padding: 1rem;
+ flex-direction: column;
+ }
+
+ .modalFooter button {
+ width: 100%;
+ margin: 0;
+ }
+
+ .assignmentHeader,
+ .performanceSummary,
+ .teacherFeedbackDetail,
+ .additionalDetails {
+ padding: 1.25rem;
+ }
+
+ .assignmentMeta {
+ flex-direction: column;
+ gap: 0.75rem;
+ align-items: flex-start;
+ }
+
+ .performanceSummary {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 0.75rem;
+ }
+
+ .performanceItem {
+ padding: 0.75rem;
+ min-height: 70px;
+ }
+
+ .performanceValue {
+ font-size: 1.1rem;
+ }
+
+ .detailItem {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.5rem;
+ padding: 0.5rem 0;
}
}
@media (max-width: 480px) {
+ /* Hide table, show cards */
+ .assignmentSection .tableContainer { display: none; }
+ .mobileAssignments { display: block; }
+
.summaryCards {
grid-template-columns: 1fr;
+ gap: 0.75rem;
}
.mainContent {
@@ -643,6 +816,553 @@
.overallSection,
.categorySection,
.assignmentSection {
+ padding: 1rem 0.75rem;
+ margin: 0 -0.25rem 1rem;
+ }
+
+ .pageTitle {
+ font-size: 1.5rem;
+ text-align: center;
+ }
+
+ .pageSubtitle {
+ font-size: 0.8rem;
+ text-align: center;
+ }
+
+ .headerSection {
+ padding: 1.5rem 0;
+ }
+
+ .userWelcome {
+ padding: 0.4rem 0.8rem;
+ font-size: 0.8rem;
+ }
+
+ .notificationIcon {
+ font-size: 1rem;
+ }
+
+ .categoryTable,
+ .assignmentTable {
+ min-width: 500px;
+ font-size: 0.8rem;
+ }
+
+ .categoryTable th,
+ .categoryTable td,
+ .assignmentTable th,
+ .assignmentTable td {
+ padding: 0.6rem 0.4rem;
+ }
+
+ .actionButton {
+ padding: 0.6rem 1rem;
+ font-size: 0.9rem;
+ }
+
+ .insightsSection {
+ margin: 0 -0.25rem 1rem;
+ }
+
+ .insightsBox {
+ padding: 1rem;
+ }
+
+ /* Teacher Feedback mobile styles */
+ .teacherFeedbackSection {
+ padding: 1rem;
+ margin: 0 -0.25rem 1rem;
+ }
+
+ /* Improve table usability on very small screens */
+ .tableContainer {
+ margin: 0 -0.5rem;
+ padding: 0 0.5rem;
+ }
+
+ .assignmentTable {
+ min-width: 560px;
+ }
+
+ .assignmentTable th,
+ .assignmentTable td {
+ padding: 0.75rem 0.5rem;
+ }
+
+ .statusBadge {
+ min-width: auto;
+ padding: 0.25rem 0.5rem;
+ font-size: 0.7rem;
+ }
+
+ .feedbackButton {
+ width: 100%;
+ font-size: 0.85rem;
+ }
+
+ .overallFeedback,
+ .strengthsSection,
+ .improvementsSection {
+ padding: 1rem;
+ }
+
+ .feedbackSubtitle {
+ font-size: 1rem;
+ }
+
+ /* Modal responsive styles for small screens */
+ .feedbackModal .modal-dialog {
+ margin: 0.125rem;
+ max-width: calc(100% - 0.25rem);
+ height: calc(100vh - 0.25rem);
+ }
+
+ .feedbackModal .modal-content {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ border-radius: 8px;
+ }
+
+ .modalBody {
+ padding: 1rem;
+ max-height: none;
+ flex: 1;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .modalHeader {
+ padding: 1rem;
+ flex-shrink: 0;
+ }
+
+ .modalHeader h4 {
+ font-size: 1rem;
+ margin: 0;
+ }
+
+ .modalIcon {
+ font-size: 1rem;
+ margin-right: 0.5rem;
+ }
+
+ .modalFooter {
+ padding: 0.75rem;
+ flex-shrink: 0;
+ }
+
+ .feedbackModalContent {
+ gap: 1rem;
+ }
+
+ .assignmentHeader,
+ .performanceSummary,
+ .teacherFeedbackDetail,
+ .additionalDetails {
padding: 1rem;
}
+
+ .assignmentTitle {
+ font-size: 1.1rem;
+ line-height: 1.3;
+ }
+
+ .performanceSummary {
+ grid-template-columns: 1fr;
+ gap: 0.5rem;
+ }
+
+ .performanceItem {
+ padding: 0.75rem 0.5rem;
+ min-height: 60px;
+ }
+
+ .performanceValue {
+ font-size: 1rem;
+ flex-direction: column;
+ gap: 0.25rem;
+ }
+
+ .percentage {
+ font-size: 0.9rem;
+ }
+
+ .detailItem {
+ padding: 0.4rem 0;
+ }
+
+ .detailLabel,
+ .detailValue {
+ font-size: 0.9rem;
+ }
+
+ .feedbackText {
+ font-size: 0.9rem;
+ padding: 0.75rem;
+ }
+}
+
+/* ============================================================================
+ TEACHER FEEDBACK SECTION - Structured feedback display
+ ============================================================================ */
+
+.teacherFeedbackSection {
+ background: var(--bg-white);
+ border-radius: var(--border-radius);
+ box-shadow: var(--box-shadow);
+ padding: 2rem;
+ margin-bottom: 1.5rem;
+ border: 1px solid var(--border-color);
+}
+
+.teacherInfo {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 0.25rem;
+}
+
+.teacherName {
+ font-weight: 600;
+ color: var(--primary-color);
+ font-size: 1rem;
+}
+
+.teacherTitle {
+ font-size: 0.875rem;
+ color: var(--text-muted);
+}
+
+.feedbackContent {
+ margin-top: 1.5rem;
+}
+
+.overallFeedback {
+ margin-bottom: 2rem;
+ padding: 1.25rem;
+ background: var(--bg-light);
+ border-radius: var(--border-radius);
+ border-left: 4px solid var(--primary-color);
+}
+
+.feedbackSubtitle {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--text-dark);
+ margin-bottom: 0.75rem;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.feedbackIcon {
+ font-size: 1rem;
+}
+
+.feedbackText {
+ color: var(--text-dark);
+ line-height: 1.6;
+ margin: 0;
+}
+
+.feedbackColumns {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 2rem;
+ margin-top: 1.5rem;
+}
+
+.strengthsSection,
+.improvementsSection {
+ padding: 1.25rem;
+ border-radius: var(--border-radius);
+ border: 1px solid var(--border-color);
+}
+
+.strengthsSection {
+ background: linear-gradient(135deg, #f8fffe 0%, #e8f7f5 100%);
+ border-left: 4px solid var(--success-color);
+}
+
+.improvementsSection {
+ background: linear-gradient(135deg, #fffcf8 0%, #fef5e7 100%);
+ border-left: 4px solid var(--warning-color);
+}
+
+.feedbackList {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.feedbackItem {
+ display: flex;
+ align-items: flex-start;
+ gap: 0.75rem;
+ padding: 0.5rem 0;
+ color: var(--text-dark);
+ line-height: 1.5;
+}
+
+.checkmark {
+ color: var(--success-color);
+ font-weight: bold;
+ font-size: 1.1rem;
+ margin-top: 0.1rem;
+ flex-shrink: 0;
+}
+
+.arrow {
+ color: var(--warning-color);
+ font-weight: bold;
+ font-size: 1.1rem;
+ margin-top: 0.1rem;
+ flex-shrink: 0;
+}
+
+/* ============================================================================
+ FEEDBACK MODAL - Detailed assignment feedback display
+ ============================================================================ */
+
+.feedbackModal {
+ font-family: inherit;
+}
+
+.feedbackModal .modal-dialog {
+ margin: 0.5rem;
+ max-width: calc(100% - 1rem);
+}
+
+.modalHeader {
+ background: linear-gradient(135deg, var(--primary-color) 0%, #0056b3 100%);
+ color: white;
+ border-bottom: none;
+ padding: 1.5rem 2rem;
+ position: relative;
+}
+
+.modalHeader .btn-close {
+ color: white;
+ opacity: 0.8;
+ font-size: 1.2rem;
+}
+
+.modalHeader .btn-close:hover {
+ opacity: 1;
+}
+
+.modalIcon {
+ margin-right: 0.75rem;
+ font-size: 1.2rem;
+}
+
+.modalTitle {
+ font-weight: 600;
+ font-size: 1.25rem;
+}
+
+.modalBody {
+ padding: 2rem;
+ background: var(--bg-light);
+ max-height: 70vh;
+ overflow-y: auto;
+}
+
+.modalFooter {
+ border-top: 1px solid var(--border-color);
+ background: var(--bg-white);
+ padding: 1rem 2rem;
+ justify-content: center;
+}
+
+.modalFooter button {
+ min-width: 120px;
+ padding: 0.75rem 1.5rem;
+ font-weight: 500;
+}
+
+.feedbackModalContent {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+/* Assignment Header */
+.assignmentHeader {
+ background: var(--bg-white);
+ padding: 1.5rem;
+ border-radius: var(--border-radius);
+ border: 1px solid var(--border-color);
+ box-shadow: var(--box-shadow);
+}
+
+.assignmentTitle {
+ font-size: 1.4rem;
+ font-weight: 600;
+ color: var(--text-dark);
+ margin-bottom: 1rem;
+}
+
+.assignmentMeta {
+ display: flex;
+ gap: 2rem;
+ flex-wrap: wrap;
+}
+
+.assignmentType,
+.assignmentDate {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ color: var(--text-muted);
+ font-size: 0.9rem;
+}
+
+.assignmentType svg,
+.assignmentDate svg {
+ color: var(--primary-color);
+}
+
+/* Performance Summary */
+.performanceSummary {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+ gap: 1rem;
+ background: var(--bg-white);
+ padding: 1.5rem;
+ border-radius: var(--border-radius);
+ border: 1px solid var(--border-color);
+ box-shadow: var(--box-shadow);
+}
+
+.performanceItem {
+ text-align: center;
+ padding: 1rem;
+ border-radius: var(--border-radius);
+ background: var(--bg-light);
+ min-height: 80px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ transition: transform 0.2s ease;
+}
+
+.performanceItem:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+}
+
+.performanceLabel {
+ font-size: 0.875rem;
+ color: var(--text-muted);
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+}
+
+.performanceValue {
+ font-size: 1.25rem;
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+}
+
+.percentage {
+ font-size: 1rem;
+ font-weight: 400;
+}
+
+.statusValue {
+ padding: 0.25rem 0.75rem;
+ border-radius: 20px;
+ font-size: 0.875rem;
+ font-weight: 500;
+}
+
+/* Teacher Feedback Detail */
+.teacherFeedbackDetail {
+ background: var(--bg-white);
+ padding: 1.5rem;
+ border-radius: var(--border-radius);
+ border: 1px solid var(--border-color);
+ box-shadow: var(--box-shadow);
+}
+
+.feedbackTitle {
+ font-size: 1.1rem;
+ font-weight: 600;
+ color: var(--text-dark);
+ margin-bottom: 1rem;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.feedbackTitle svg {
+ color: var(--primary-color);
+}
+
+.feedbackText {
+ color: var(--text-dark);
+ line-height: 1.6;
+ padding: 1rem;
+ background: var(--bg-light);
+ border-radius: var(--border-radius);
+ border-left: 4px solid var(--primary-color);
+}
+
+/* Additional Details */
+.additionalDetails {
+ background: var(--bg-white);
+ padding: 1.5rem;
+ border-radius: var(--border-radius);
+ border: 1px solid var(--border-color);
+ box-shadow: var(--box-shadow);
+}
+
+.detailItem {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0.75rem 0;
+ border-bottom: 1px solid var(--border-color);
+}
+
+.detailItem:last-child {
+ border-bottom: none;
+}
+
+.detailLabel {
+ font-weight: 500;
+ color: var(--text-muted);
+}
+
+.detailValue {
+ color: var(--text-dark);
+ font-weight: 400;
+}
+
+/* ============================================================================
+ MODAL RESPONSIVE BREAKPOINTS
+ ============================================================================ */
+
+/* Large screens - limit modal width for better readability */
+@media (min-width: 1200px) {
+ .feedbackModal .modal-dialog {
+ max-width: 900px;
+ }
+}
+
+/* Medium screens - optimize modal layout */
+@media (min-width: 992px) and (max-width: 1199px) {
+ .feedbackModal .modal-dialog {
+ max-width: 800px;
+ }
+
+ .performanceSummary {
+ grid-template-columns: repeat(3, 1fr);
+ }
}
\ No newline at end of file
diff --git a/src/components/EductionPortal/EvaluationResults/mockData_new.js b/src/components/EductionPortal/EvaluationResults/mockData_new.js
index f97cc9ac1e..cc21d6d3fd 100644
--- a/src/components/EductionPortal/EvaluationResults/mockData_new.js
+++ b/src/components/EductionPortal/EvaluationResults/mockData_new.js
@@ -79,8 +79,8 @@ export const mockEvaluationData = {
},
},
{
- id: 'participation',
- name: 'Participation',
+ id: 'projects',
+ name: 'Projects',
weightage: 10,
totalItems: 1,
completedItems: 1,
@@ -90,7 +90,7 @@ export const mockEvaluationData = {
performanceLevel: 'good',
color: '#28a745',
icon: 'faUsers',
- description: 'Class participation and engagement activities',
+ description: 'Group projects and collaborative work assignments',
dueDate: '2024-11-19T12:00:00',
submissions: {
onTime: 1,
@@ -213,7 +213,7 @@ export const mockEvaluationData = {
overallRating: 'Good',
lastUpdated: '2024-10-25T10:30:00Z',
overall:
- 'You performed strongly in Assignments (80%), Exams (80%), and Participation (80%). You may improve your performance in Quizzes (60%) - consider reviewing quiz preparation strategies.',
+ 'You performed strongly in Assignments (80%), Exams (80%), and Projects (80%). You may improve your performance in Quizzes (60%) - consider reviewing quiz preparation strategies.',
strengths: [
'Strong analytical thinking and problem-solving skills',
'Excellent written communication in assignments',
diff --git a/src/components/PermissionsManagement/PermissionsManagement.css b/src/components/PermissionsManagement/PermissionsManagement.css
index 449d782c2b..d412fa2e22 100644
--- a/src/components/PermissionsManagement/PermissionsManagement.css
+++ b/src/components/PermissionsManagement/PermissionsManagement.css
@@ -1,7 +1,8 @@
.permissions-management {
padding: 0.5rem 1rem;
width: 40%;
- min-width: 350px;
+ min-width: 320px;
+ max-width: 95vw;
margin: 1.5rem auto;
box-shadow: 1px 1px 8px rgb(158, 158, 158);
display: flex;
@@ -83,6 +84,8 @@
display: flex;
justify-content: space-between;
flex-direction: row-reverse;
+ flex-wrap: wrap;
+ gap: 1rem;
}
.buttons-container {
@@ -96,7 +99,9 @@
flex-direction: column;
border: solid 1px lightgrey;
border-radius: 8px;
- min-width: 300px;
+ min-width: 280px;
+ width: 100%;
+ max-width: 320px;
height: 450px;
max-height: 480px;
overflow: auto;
@@ -223,6 +228,69 @@
@media only screen and (max-width: 1110px) {
.permissions-management__header {
flex-direction: column;
+ gap: 1rem;
+ }
+}
+
+@media only screen and (max-width: 768px) {
+ .permissions-management {
+ width: 95%;
+ margin: 1rem auto;
+ padding: 1rem;
+ min-width: auto;
+ }
+
+ .permissions-management--flex {
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .role-name-container {
+ max-width: 100%;
+ min-width: 100%;
+ margin-bottom: 1rem;
+ }
+
+ .buttons-container {
+ width: 100%;
+ align-items: center;
+ }
+
+ .user-role-tab__permission {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.5rem;
+ }
+
+ .permission-label {
+ max-width: 100%;
+ margin-right: 0;
+ }
+}
+
+@media only screen and (max-width: 480px) {
+ .permissions-management {
+ width: 98%;
+ padding: 0.75rem;
+ margin: 0.5rem auto;
+ }
+
+ .permissions-management__title {
+ font-size: 1.5rem;
+ text-align: center;
+ }
+
+ .user-permissions-pop-up__title {
+ font-size: 1.1rem;
+ }
+
+ .role-name-container {
+ height: 300px;
+ max-height: 350px;
+ }
+
+ .dropdown__user-perms {
+ max-height: 300px;
}
}
From 8cedb1268154d4f9ce88a610b64026d5831d9147 Mon Sep 17 00:00:00 2001
From: boppanapraveen <61085397+boppanapraveen@users.noreply.github.com>
Date: Fri, 14 Nov 2025 23:47:26 -0600
Subject: [PATCH 5/9] fix: add webpack dependency to resolve ESLint error in
config-overrides.js
---
package.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/package.json b/package.json
index a25baa1c4e..536f0f6c9c 100644
--- a/package.json
+++ b/package.json
@@ -114,7 +114,8 @@
"stream-browserify": "^3.0.0",
"tinymce": "^7.2.0",
"util": "^0.12.5",
- "uuid": "^9.0.1"
+ "uuid": "^9.0.1",
+ "webpack": "^5.102.1"
},
"resolutions": {
"react": "18.3.1",
From 7b1d2e4ed190a20b658d7ee23fafb5bafee1b67c Mon Sep 17 00:00:00 2001
From: boppanapraveen <61085397+boppanapraveen@users.noreply.github.com>
Date: Sat, 15 Nov 2025 12:51:42 -0600
Subject: [PATCH 6/9] Fix: Implemented Feedback and Mobile responsiveness-2
---
.../EvaluationResults/EvaluationResults.jsx | 4 +-
.../EvaluationResults.module.css | 327 +++++++++++-------
.../PermissionsManagement.css | 72 +---
3 files changed, 207 insertions(+), 196 deletions(-)
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
index adfc68e1d7..9dd54a67a6 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
@@ -378,7 +378,7 @@ const EvaluationResults = ({ auth }) => {
{evaluationData.teacherFeedback.strengths.map((strength, index) => (
✓
- {strength}
+ {strength}
))}
@@ -393,7 +393,7 @@ const EvaluationResults = ({ auth }) => {
{evaluationData.teacherFeedback.improvements.map((improvement, index) => (
→
- {improvement}
+ {improvement}
))}
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
index 2c40882fcf..678dbb5a82 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
@@ -638,10 +638,20 @@
============================================================================ */
@media (max-width: 768px) {
+ .evaluationResultsPage {
+ padding: 0.5rem;
+ }
+
+ .headerSection {
+ padding: 1.5rem 1rem;
+ margin-bottom: 1rem;
+ }
+
.headerContent {
flex-direction: column;
align-items: flex-start;
- gap: 1rem;
+ gap: 1.25rem;
+ max-width: 100%;
}
.headerRight {
@@ -649,38 +659,63 @@
align-self: flex-start;
width: 100%;
justify-content: space-between;
+ flex-wrap: wrap;
}
.pageTitle {
font-size: 1.75rem;
+ line-height: 1.2;
+ margin-bottom: 0.5rem;
}
.pageSubtitle {
- font-size: 0.85rem;
+ font-size: 0.9rem;
max-width: 100%;
+ line-height: 1.4;
+ }
+
+ .mainContent {
+ padding: 0 0.75rem;
+ }
+
+ .overallSection,
+ .categorySection,
+ .assignmentSection,
+ .insightsSection {
+ margin: 0 0 1.25rem 0;
+ padding: 1.25rem 1rem;
+ border-radius: 0.5rem;
}
.sectionHeader {
flex-direction: column;
align-items: flex-start;
- gap: 0.75rem;
+ gap: 1rem;
+ margin-bottom: 1rem;
}
.overallScore {
align-self: flex-start;
width: 100%;
+ font-size: 1.5rem;
+ padding: 0.75rem 1rem;
+ text-align: center;
}
.actionButtons {
flex-direction: column;
width: 100%;
+ gap: 0.75rem;
}
.actionButton {
width: 100%;
text-align: center;
- padding: 0.75rem 1rem;
- margin-bottom: 0.5rem;
+ padding: 0.875rem 1rem;
+ margin-bottom: 0;
+ font-size: 0.95rem;
+ border-radius: 0.5rem;
+ min-height: 44px; /* Better touch target */
}
.summaryCards {
@@ -718,19 +753,62 @@
white-space: nowrap;
}
- /* Teacher Feedback responsive */
+ .teacherFeedbackSection {
+ padding: 1.25rem;
+ margin: 0 0 1.25rem 0;
+ }
+
.feedbackColumns {
- grid-template-columns: 1fr;
- gap: 1.5rem;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 1rem;
+ margin-top: 1rem;
+ align-items: start;
}
- .teacherFeedbackSection {
- padding: 1.5rem;
+ .overallFeedback {
+ padding: 1.25rem;
+ margin-bottom: 1.5rem;
+ border-radius: 0.5rem;
}
.teacherInfo {
align-items: flex-start;
+ margin-bottom: 1rem;
+ padding: 1rem;
+ background: var(--bg-light);
+ border-radius: 0.5rem;
+ border: 1px solid var(--border-color);
+ }
+
+ .teacherName {
+ font-size: 1rem;
+ margin-bottom: 0.25rem;
+ }
+
+ .teacherTitle {
+ font-size: 0.875rem;
+ }
+
+ .feedbackColumns {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 1rem;
margin-top: 1rem;
+ align-items: stretch; /* Make cards same height */
+ }
+
+ .strengthsSection,
+ .improvementsSection {
+ padding: 1rem;
+ border-radius: 0.5rem;
+ margin-bottom: 0;
+ min-width: 0;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ height: fit-content;
+ display: flex;
+ flex-direction: column;
}
/* Modal mobile styles */
@@ -800,13 +878,17 @@
}
@media (max-width: 480px) {
+ .evaluationResultsPage {
+ padding: 0.25rem;
+ }
+
/* Hide table, show cards */
.assignmentSection .tableContainer { display: none; }
.mobileAssignments { display: block; }
.summaryCards {
grid-template-columns: 1fr;
- gap: 0.75rem;
+ gap: 0.875rem;
}
.mainContent {
@@ -815,32 +897,43 @@
.overallSection,
.categorySection,
- .assignmentSection {
- padding: 1rem 0.75rem;
- margin: 0 -0.25rem 1rem;
+ .assignmentSection,
+ .insightsSection {
+ padding: 1rem;
+ margin: 0 0 1rem 0;
+ border-radius: 0.5rem;
}
.pageTitle {
font-size: 1.5rem;
- text-align: center;
+ text-align: left;
+ line-height: 1.2;
+ margin-bottom: 0.75rem;
}
.pageSubtitle {
- font-size: 0.8rem;
- text-align: center;
+ font-size: 0.85rem;
+ text-align: left;
+ line-height: 1.4;
}
.headerSection {
- padding: 1.5rem 0;
+ padding: 1.25rem 0.75rem;
}
.userWelcome {
- padding: 0.4rem 0.8rem;
- font-size: 0.8rem;
+ padding: 0.5rem 0.75rem;
+ font-size: 0.85rem;
+ border-radius: 1.25rem;
}
.notificationIcon {
font-size: 1rem;
+ min-height: 44px;
+ min-width: 44px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
.categoryTable,
@@ -857,150 +950,121 @@
}
.actionButton {
- padding: 0.6rem 1rem;
+ padding: 0.875rem 1rem;
font-size: 0.9rem;
+ min-height: 48px;
+ border-radius: 0.5rem;
+ font-weight: 500;
}
- .insightsSection {
- margin: 0 -0.25rem 1rem;
- }
-
- .insightsBox {
- padding: 1rem;
+ .feedbackButton {
+ width: 100%;
+ font-size: 0.875rem;
+ min-height: 44px;
+ padding: 0.75rem 1rem;
+ border-radius: 0.375rem;
}
- /* Teacher Feedback mobile styles */
- .teacherFeedbackSection {
- padding: 1rem;
- margin: 0 -0.25rem 1rem;
- }
-
- /* Improve table usability on very small screens */
- .tableContainer {
- margin: 0 -0.5rem;
- padding: 0 0.5rem;
- }
-
- .assignmentTable {
- min-width: 560px;
- }
-
- .assignmentTable th,
- .assignmentTable td {
- padding: 0.75rem 0.5rem;
- }
-
.statusBadge {
min-width: auto;
- padding: 0.25rem 0.5rem;
- font-size: 0.7rem;
+ padding: 0.375rem 0.75rem;
+ font-size: 0.75rem;
+ border-radius: 0.375rem;
+ font-weight: 500;
}
-
- .feedbackButton {
- width: 100%;
+
+ .categoryTable,
+ .assignmentTable {
+ min-width: 500px;
font-size: 0.85rem;
}
- .overallFeedback,
- .strengthsSection,
- .improvementsSection {
+ .categoryTable th,
+ .categoryTable td,
+ /* Teacher Feedback mobile styles */
+ .teacherFeedbackSection {
padding: 1rem;
+ margin: 0 0 1rem 0;
+ border-radius: 0.5rem;
+ width: 100%;
+ box-sizing: border-box;
}
- .feedbackSubtitle {
- font-size: 1rem;
- }
-
- /* Modal responsive styles for small screens */
- .feedbackModal .modal-dialog {
- margin: 0.125rem;
- max-width: calc(100% - 0.25rem);
- height: calc(100vh - 0.25rem);
- }
-
- .feedbackModal .modal-content {
- height: 100%;
- display: flex;
- flex-direction: column;
- border-radius: 8px;
- }
-
- .modalBody {
- padding: 1rem;
- max-height: none;
- flex: 1;
- overflow-y: auto;
- -webkit-overflow-scrolling: touch;
+ .feedbackColumns {
+ grid-template-columns: 1fr;
+ gap: 1rem;
+ margin-top: 1rem;
}
- .modalHeader {
- padding: 1rem;
- flex-shrink: 0;
+ .teacherInfo {
+ padding: 0.875rem;
+ margin-bottom: 1rem;
+ background: var(--bg-light);
+ border-radius: 0.5rem;
+ align-items: flex-start;
}
- .modalHeader h4 {
+ .teacherName {
font-size: 1rem;
- margin: 0;
+ margin-bottom: 0.25rem;
}
- .modalIcon {
- font-size: 1rem;
- margin-right: 0.5rem;
+ .teacherTitle {
+ font-size: 0.875rem;
}
- .modalFooter {
- padding: 0.75rem;
- flex-shrink: 0;
+ .overallFeedback {
+ padding: 1rem;
+ margin-bottom: 1.25rem;
+ border-radius: 0.5rem;
}
- .feedbackModalContent {
+ .feedbackColumns {
+ display: grid;
+ grid-template-columns: 1fr;
gap: 1rem;
+ margin-top: 1rem;
+ align-items: stretch;
}
- .assignmentHeader,
- .performanceSummary,
- .teacherFeedbackDetail,
- .additionalDetails {
+ .strengthsSection,
+ .improvementsSection {
padding: 1rem;
+ margin: 0;
+ border-radius: 0.5rem;
+ min-width: 0;
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ box-sizing: border-box;
}
- .assignmentTitle {
- font-size: 1.1rem;
+ .feedbackSubtitle {
+ font-size: 0.95rem;
+ margin-bottom: 0.75rem;
line-height: 1.3;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+ flex-wrap: wrap;
}
- .performanceSummary {
- grid-template-columns: 1fr;
- gap: 0.5rem;
- }
-
- .performanceItem {
- padding: 0.75rem 0.5rem;
- min-height: 60px;
- }
-
- .performanceValue {
- font-size: 1rem;
- flex-direction: column;
- gap: 0.25rem;
- }
-
- .percentage {
+ .feedbackText {
font-size: 0.9rem;
+ line-height: 1.5;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
}
- .detailItem {
- padding: 0.4rem 0;
- }
-
- .detailLabel,
- .detailValue {
+ .feedbackIcon {
font-size: 0.9rem;
+ flex-shrink: 0;
}
-
- .feedbackText {
- font-size: 0.9rem;
+ .overallScore {
+ font-size: 1.375rem;
padding: 0.75rem;
+ text-align: center;
}
}
@@ -1055,6 +1119,10 @@
display: flex;
align-items: center;
gap: 0.5rem;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+ line-height: 1.3;
+ flex-wrap: wrap;
}
.feedbackIcon {
@@ -1072,6 +1140,7 @@
grid-template-columns: 1fr 1fr;
gap: 2rem;
margin-top: 1.5rem;
+ align-items: start;
}
.strengthsSection,
@@ -1104,6 +1173,8 @@
padding: 0.5rem 0;
color: var(--text-dark);
line-height: 1.5;
+ width: 100%;
+ flex-wrap: wrap;
}
.checkmark {
@@ -1122,6 +1193,14 @@
flex-shrink: 0;
}
+/* Ensure list text wraps within card and doesn't overflow */
+.feedbackTextItem {
+ flex: 1 1 auto;
+ min-width: 0;
+ overflow-wrap: break-word;
+ word-break: break-word;
+}
+
/* ============================================================================
FEEDBACK MODAL - Detailed assignment feedback display
============================================================================ */
diff --git a/src/components/PermissionsManagement/PermissionsManagement.css b/src/components/PermissionsManagement/PermissionsManagement.css
index d412fa2e22..449d782c2b 100644
--- a/src/components/PermissionsManagement/PermissionsManagement.css
+++ b/src/components/PermissionsManagement/PermissionsManagement.css
@@ -1,8 +1,7 @@
.permissions-management {
padding: 0.5rem 1rem;
width: 40%;
- min-width: 320px;
- max-width: 95vw;
+ min-width: 350px;
margin: 1.5rem auto;
box-shadow: 1px 1px 8px rgb(158, 158, 158);
display: flex;
@@ -84,8 +83,6 @@
display: flex;
justify-content: space-between;
flex-direction: row-reverse;
- flex-wrap: wrap;
- gap: 1rem;
}
.buttons-container {
@@ -99,9 +96,7 @@
flex-direction: column;
border: solid 1px lightgrey;
border-radius: 8px;
- min-width: 280px;
- width: 100%;
- max-width: 320px;
+ min-width: 300px;
height: 450px;
max-height: 480px;
overflow: auto;
@@ -228,69 +223,6 @@
@media only screen and (max-width: 1110px) {
.permissions-management__header {
flex-direction: column;
- gap: 1rem;
- }
-}
-
-@media only screen and (max-width: 768px) {
- .permissions-management {
- width: 95%;
- margin: 1rem auto;
- padding: 1rem;
- min-width: auto;
- }
-
- .permissions-management--flex {
- flex-direction: column;
- align-items: center;
- }
-
- .role-name-container {
- max-width: 100%;
- min-width: 100%;
- margin-bottom: 1rem;
- }
-
- .buttons-container {
- width: 100%;
- align-items: center;
- }
-
- .user-role-tab__permission {
- flex-direction: column;
- align-items: flex-start;
- gap: 0.5rem;
- }
-
- .permission-label {
- max-width: 100%;
- margin-right: 0;
- }
-}
-
-@media only screen and (max-width: 480px) {
- .permissions-management {
- width: 98%;
- padding: 0.75rem;
- margin: 0.5rem auto;
- }
-
- .permissions-management__title {
- font-size: 1.5rem;
- text-align: center;
- }
-
- .user-permissions-pop-up__title {
- font-size: 1.1rem;
- }
-
- .role-name-container {
- height: 300px;
- max-height: 350px;
- }
-
- .dropdown__user-perms {
- max-height: 300px;
}
}
From f5bb9c9600d1ee438fc79e087b7294a8297e68a6 Mon Sep 17 00:00:00 2001
From: boppanapraveen <61085397+boppanapraveen@users.noreply.github.com>
Date: Fri, 21 Nov 2025 18:38:44 -0600
Subject: [PATCH 7/9] Fix: Implemented Feedback and Mobile responsiveness-3
---
.../EducationPortalSideNav.jsx | 90 +++
.../EducationPortalSideNav.module.css | 447 ++++++++++++
.../EvaluationResults/EvaluationResults.jsx | 676 +++++++++---------
.../EvaluationResults.module.css | 295 +++++++-
.../EvaluationResultsWrapper.jsx | 13 +
.../EductionPortal/SideBar/SideBar.jsx | 90 +++
.../EductionPortal/SideBar/SideBar.module.css | 447 ++++++++++++
.../EductionPortal/SidebarContext.jsx | 21 +
src/components/Header/HeaderRenderer.jsx | 8 +-
src/routes.jsx | 4 +-
10 files changed, 1744 insertions(+), 347 deletions(-)
create mode 100644 src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.jsx
create mode 100644 src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.module.css
create mode 100644 src/components/EductionPortal/EvaluationResultsWrapper.jsx
create mode 100644 src/components/EductionPortal/SideBar/SideBar.jsx
create mode 100644 src/components/EductionPortal/SideBar/SideBar.module.css
create mode 100644 src/components/EductionPortal/SidebarContext.jsx
diff --git a/src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.jsx b/src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.jsx
new file mode 100644
index 0000000000..2352e5969c
--- /dev/null
+++ b/src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.jsx
@@ -0,0 +1,90 @@
+import React from 'react';
+import { NavLink, useLocation } from 'react-router-dom';
+import { useSelector } from 'react-redux';
+import { useSidebar } from '../SidebarContext';
+import styles from './EducationPortalSideNav.module.css';
+
+const EducationPortalSideNav = () => {
+ const location = useLocation();
+ const authUser = useSelector(state => state.auth?.user);
+ const { isMinimized, setIsMinimized } = useSidebar();
+
+ const menuItems = [
+ { icon: '🏠', label: 'Homepage', path: '/educationportal' },
+ { icon: '📊', label: 'Knowledge Evaluation', path: '#' },
+ { icon: '📋', label: 'Past Lesson Plans', path: '#' },
+ { icon: '⭐', label: 'My Saved Interests', path: '#' },
+ { icon: '📈', label: 'Evaluation results', path: '/educationportal/evaluation-results' },
+ { icon: '🏗️', label: 'Build Lesson Plan', path: '#' },
+ ];
+
+ const isActive = path => path !== '#' && location.pathname === path;
+
+ return (
+
+ {/* User Welcome Section */}
+
+
👋
+ {!isMinimized && (
+ <>
+
+
Welcome
+
{authUser?.firstName || 'Student'}
+
+
🔔
+ >
+ )}
+ {isMinimized && (
+
setIsMinimized(!isMinimized)}
+ title="Expand sidebar"
+ aria-label="Expand sidebar"
+ >
+ ➜
+
+ )}
+
+
+ {/* Toggle Button - Only show when expanded */}
+ {!isMinimized && (
+
+ setIsMinimized(!isMinimized)}
+ title="Minimize sidebar"
+ aria-label="Minimize sidebar"
+ >
+ ⬅️
+
+
+ )}
+
+ {/* Navigation Menu */}
+
+
+
+
+ );
+};
+
+export default EducationPortalSideNav;
diff --git a/src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.module.css b/src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.module.css
new file mode 100644
index 0000000000..5ae4c501b8
--- /dev/null
+++ b/src/components/EductionPortal/EducationPortalSideNav/EducationPortalSideNav.module.css
@@ -0,0 +1,447 @@
+/* ===== SIDEBAR CONTAINER ===== */
+.sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 200px;
+ height: 100vh;
+ background-color: #f5f5f5;
+ border-right: 1px solid #ddd;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+ z-index: 1000;
+ transition: width 0.3s ease;
+}
+
+.sidebar.minimized {
+ width: 70px;
+}
+
+.sidebar.minimized .label,
+.sidebar.minimized .welcomeText,
+.sidebar.minimized .toggleButtonContainer {
+ display: none;
+}
+
+/* ===== USER SECTION ===== */
+.userSection {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 12px;
+ border-bottom: 1px solid #ddd;
+ background-color: #fff;
+}
+
+.welcomeIcon {
+ font-size: 20px;
+ flex-shrink: 0;
+}
+
+.welcomeText {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ min-width: 0;
+}
+
+.welcomeLabel {
+ font-size: 11px;
+ color: #999;
+ font-weight: 500;
+ text-transform: uppercase;
+}
+
+.userName {
+ font-size: 12px;
+ font-weight: 600;
+ color: #333;
+ word-break: break-word;
+}
+
+.notifyIcon {
+ font-size: 16px;
+ flex-shrink: 0;
+ cursor: pointer;
+}
+
+/* ===== NAVIGATION ===== */
+.nav {
+ flex: 1;
+ overflow-y: auto;
+ padding: 8px 0;
+}
+
+.menuList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.menuItem {
+ margin: 0;
+ padding: 0;
+}
+
+.menuLink {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 10px 12px;
+ color: #333;
+ text-decoration: none;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ width: 100%;
+ text-align: left;
+ font-size: 13px;
+ font-weight: 500;
+ transition: background-color 0.2s ease;
+ min-height: 44px;
+}
+
+.menuLink:hover {
+ background-color: #efefef;
+}
+
+.menuLink.active {
+ background-color: #e0e7ff;
+ color: #4f46e5;
+}
+
+.icon {
+ font-size: 14px;
+ flex-shrink: 0;
+ width: 18px;
+ text-align: center;
+}
+
+.label {
+ flex: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+/* ===== TOGGLE BUTTONS ===== */
+.toggleButtonContainer {
+ display: flex;
+ justify-content: center;
+ padding: 8px;
+ border-top: 1px solid #ddd;
+ background-color: #fff;
+}
+
+.minimizeBtn {
+ background: none;
+ border: 1px solid #ddd;
+ padding: 8px 12px;
+ cursor: pointer;
+ border-radius: 4px;
+ font-size: 14px;
+ transition: all 0.2s ease;
+ width: 100%;
+}
+
+.minimizeBtn:hover {
+ background-color: #f0f0f0;
+ border-color: #999;
+}
+
+.toggleButton {
+ background: none;
+ border: none;
+ padding: 8px;
+ cursor: pointer;
+ font-size: 18px;
+ transition: all 0.2s ease;
+ width: 100%;
+ height: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 4px;
+}
+
+.toggleButton:hover {
+ background-color: #efefef;
+}
+
+/* ===== RESPONSIVE - DESKTOP (≥992px) ===== */
+@media (min-width: 992px) {
+ /* Desktop: sidebar visible by default */
+}
+
+/* ===== RESPONSIVE - TABLET (768px - 991px) ===== */
+@media (max-width: 991px) {
+ .sidebar {
+ width: 180px;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .userSection {
+ padding: 10px;
+ gap: 6px;
+ }
+
+ .welcomeIcon {
+ font-size: 16px;
+ }
+
+ .welcomeLabel {
+ font-size: 10px;
+ }
+
+ .userName {
+ font-size: 11px;
+ }
+
+ .notifyIcon {
+ font-size: 14px;
+ }
+
+ .menuLink {
+ padding: 8px 10px;
+ font-size: 12px;
+ gap: 6px;
+ }
+
+ .icon {
+ font-size: 12px;
+ width: 16px;
+ }
+}
+
+/* ===== RESPONSIVE - MOBILE (≤767px) ===== */
+@media (max-width: 767px) {
+ .sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 240px;
+ height: 100vh;
+ background-color: #f5f5f5;
+ border-right: 1px solid #ddd;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+ z-index: 1000;
+ transition: width 0.3s ease;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .sidebar.minimized .label,
+ .sidebar.minimized .welcomeText,
+ .sidebar.minimized .toggleButtonContainer {
+ display: none;
+ }
+
+ .userSection {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 14px 12px;
+ border-bottom: 1px solid #ddd;
+ background-color: #fff;
+ }
+
+ .welcomeIcon {
+ font-size: 18px;
+ flex-shrink: 0;
+ }
+
+ .welcomeText {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ min-width: 0;
+ }
+
+ .welcomeLabel {
+ font-size: 10px;
+ color: #999;
+ font-weight: 500;
+ text-transform: uppercase;
+ }
+
+ .userName {
+ font-size: 12px;
+ font-weight: 600;
+ color: #333;
+ word-break: break-word;
+ }
+
+ .notifyIcon {
+ font-size: 16px;
+ flex-shrink: 0;
+ cursor: pointer;
+ padding: 6px;
+ border-radius: 4px;
+ transition: background-color 0.2s ease;
+ }
+
+ .notifyIcon:active {
+ background-color: #e0e0e0;
+ }
+
+ .nav {
+ flex: 1;
+ overflow-y: auto;
+ padding: 8px 0;
+ }
+
+ .menuList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ .menuItem {
+ margin: 0;
+ padding: 0;
+ }
+
+ .menuLink {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px 14px;
+ color: #333;
+ text-decoration: none;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ width: 100%;
+ text-align: left;
+ font-size: 13px;
+ font-weight: 500;
+ transition: all 0.2s ease;
+ min-height: 48px;
+ }
+
+ .menuLink:active {
+ background-color: #f0f0f0;
+ }
+
+ .menuLink:hover {
+ background-color: #efefef;
+ }
+
+ .menuLink.active {
+ background-color: #e0e7ff;
+ color: #4f46e5;
+ border-left: 3px solid #4f46e5;
+ padding-left: 11px;
+ }
+
+ .icon {
+ font-size: 16px;
+ flex-shrink: 0;
+ width: 20px;
+ text-align: center;
+ }
+
+ .label {
+ flex: 1;
+ white-space: normal;
+ overflow: visible;
+ text-overflow: clip;
+ word-wrap: break-word;
+ }
+}
+
+/* ===== RESPONSIVE - SMALL PHONES (≤480px) ===== */
+@media (max-width: 480px) {
+ .sidebar {
+ width: 220px;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .sidebar.minimized .label,
+ .sidebar.minimized .welcomeText,
+ .sidebar.minimized .toggleButtonContainer {
+ display: none;
+ }
+
+ .userSection {
+ padding: 12px 10px;
+ }
+
+ .welcomeIcon {
+ font-size: 16px;
+ }
+
+ .userName {
+ font-size: 11px;
+ }
+
+ .menuLink {
+ padding: 11px 12px;
+ font-size: 12px;
+ gap: 8px;
+ }
+
+ .icon {
+ font-size: 14px;
+ width: 18px;
+ }
+}
+
+/* ===== RESPONSIVE - EXTRA SMALL (≤360px) ===== */
+@media (max-width: 359px) {
+ .sidebar {
+ width: 200px;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .sidebar.minimized .label,
+ .sidebar.minimized .welcomeText,
+ .sidebar.minimized .toggleButtonContainer {
+ display: none;
+ }
+
+ .userSection {
+ padding: 10px 8px;
+ gap: 6px;
+ }
+
+ .welcomeIcon {
+ font-size: 14px;
+ }
+
+ .welcomeLabel {
+ font-size: 9px;
+ }
+
+ .userName {
+ font-size: 10px;
+ }
+
+ .menuLink {
+ padding: 10px 10px;
+ font-size: 11px;
+ gap: 6px;
+ min-height: 44px;
+ }
+
+ .icon {
+ font-size: 12px;
+ width: 16px;
+ }
+}
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
index 9dd54a67a6..b7f4d8ef77 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
@@ -15,10 +15,13 @@ import {
} from '@fortawesome/free-solid-svg-icons';
import styles from './EvaluationResults.module.css';
+import SideBar from '../SideBar/SideBar';
+import { useSidebar } from '../SidebarContext';
import EvaluationNotificationService from './evaluationNotificationService';
import { mockEvaluationData } from './mockData_new';
const EvaluationResults = ({ auth }) => {
+ const { isMinimized } = useSidebar();
const [evaluationData, setEvaluationData] = useState(null);
const [loading, setLoading] = useState(true);
const [selectedCategory, setSelectedCategory] = useState('all');
@@ -146,380 +149,389 @@ const EvaluationResults = ({ auth }) => {
};
return (
-
- {/* New Clean Header */}
-
-
-
-
-
Evaluation Results
-
- Comprehensive overview of your grades, performance on assignments, and detailed
- feedback from teachers
-
-
-
-
-
-
Welcome, {auth?.user?.firstName || 'Student Name'}
+ <>
+
+
+ {/* New Clean Header */}
+
+
+
+
+
Evaluation Results
+
+ Comprehensive overview of your grades, performance on assignments, and detailed
+ feedback from teachers
+
+
+
+
+
+ Welcome, {auth?.user?.firstName || 'Student Name'}
+
+
-
-
-
-
+
+
-
- {/* Overall Performance Summary */}
-
-
-
Overall Performance Summary
-
- {percentageScore}%
- Overall Grade
-
-
-
-
-
+
+ {/* Overall Performance Summary */}
+
+
+
Overall Performance Summary
+
+ {percentageScore}%
+ Overall Grade
+
-
-
- Total Score: {totalEarnedPoints}/{totalPossiblePoints} points
-
+
+
+
+
+ Total Score: {totalEarnedPoints}/{totalPossiblePoints} points
+
+
-
- {/* Category Performance Table */}
-
-
Overall Performance Summary
-
-
-
-
- Category
- Weightage
- Items
- Total Points
- Your Score
- Percentage
- Performance
-
-
-
- {categories.map(category => (
-
- {category.name}
- {category.weightage}%
- {category.completedItems}
- {category.totalMarks}
- {category.earnedMarks}
- {Math.round(category.percentage)}%
-
-
-
+ {/* Category Performance Table */}
+
+
Overall Performance Summary
+
+
+
+
+ Category
+ Weightage
+ Items
+ Total Points
+ Your Score
+ Percentage
+ Performance
- ))}
-
-
+
+
+ {categories.map(category => (
+
+ {category.name}
+ {category.weightage}%
+ {category.completedItems}
+ {category.totalMarks}
+ {category.earnedMarks}
+ {Math.round(category.percentage)}%
+
+
+
+
+ ))}
+
+
+
-
- {/* Performance Insights */}
-
-
-
Performance Insights
-
- You performed strongly in Assignments (80%) ,{' '}
- Exams (80%) , and Participation (80%) . You may
- improve your performance in Quizzes (60%) - consider reviewing quiz
- preparation strategies.
-
-
-
Review Quiz Messages
-
Study Schedule Tips
+ {/* Performance Insights */}
+
+
+
Performance Insights
+
+ You performed strongly in Assignments (80%) ,{' '}
+ Exams (80%) , and Participation (80%) . You may
+ improve your performance in Quizzes (60%) - consider reviewing quiz
+ preparation strategies.
+
+
+ Review Quiz Messages
+ Study Schedule Tips
+
-
- {/* Individual Assignment & Task Results */}
-
-
Individual Assignment & Task Results
-
-
-
-
- Assignment Name
- Weightage
- Your Marks
- Percentage
- Status
- Feedback
-
-
-
- {tasks.slice(0, 6).map(task => (
-
-
-
-
{task.name}
-
- Submitted: {new Date(task.submissionDate).toLocaleDateString()}
-
-
-
- {task.weightage || '8'}%
-
- {task.earnedMarks}/{task.totalMarks}
-
-
-
- {Math.round(task.percentage)}%
-
-
-
-
- {task.status || 'On time'}
-
-
-
- openFeedbackModal(task)}
- >
-
- View Feedback
-
-
+ {/* Individual Assignment & Task Results */}
+
+
Individual Assignment & Task Results
+
+
+
+
+ Assignment Name
+ Weightage
+ Your Marks
+ Percentage
+ Status
+ Feedback
- ))}
-
-
-
+
+
+ {tasks.slice(0, 6).map(task => (
+
+
+
+
{task.name}
+
+ Submitted: {new Date(task.submissionDate).toLocaleDateString()}
+
+
+
+ {task.weightage || '8'}%
+
+ {task.earnedMarks}/{task.totalMarks}
+
+
+
+ {Math.round(task.percentage)}%
+
+
+
+
+ {task.status || 'On time'}
+
+
+
+ openFeedbackModal(task)}
+ >
+
+ View Feedback
+
+
+
+ ))}
+
+
+
- {/* Mobile Cards (shown on small screens) */}
-
- {tasks.slice(0, 6).map(task => (
-
-
-
{task.name}
-
- {task.status || 'On time'}
-
-
-
-
- Weightage: {task.weightage || '8'}%
-
-
-
Score: {task.earnedMarks}/{task.totalMarks}
-
- {' '}
- ({Math.round(task.percentage)}%)
+ {/* Mobile Cards (shown on small screens) */}
+
+ {tasks.slice(0, 6).map(task => (
+
+
+
{task.name}
+
+ {task.status || 'On time'}
-
-
Submitted: {new Date(task.submissionDate).toLocaleDateString()}
+
+
+ Weightage: {task.weightage || '8'}%
+
+
+ Score: {task.earnedMarks}/{task.totalMarks}
+
+ {' '}
+ ({Math.round(task.percentage)}%)
+
+
+
+ Submitted: {' '}
+ {new Date(task.submissionDate).toLocaleDateString()}
+
+
+
+ openFeedbackModal(task)}
+ >
+
+ View Feedback
+
-
- openFeedbackModal(task)}>
-
- View Feedback
-
-
-
- ))}
-
-
-
- {/* Teacher Feedback Section */}
-
-
-
-
- Teacher Feedback - Structured feedback display with strengths and recommendations
-
-
-
- {evaluationData.teacherFeedback.teacherName}
-
-
- {evaluationData.teacherFeedback.teacherTitle}
-
+ ))}
-
- {/* Overall Feedback */}
-
-
Overall Assessment
-
{evaluationData.teacherFeedback.overall}
+ {/* Teacher Feedback Section */}
+
+
+
+
+ Teacher Feedback - Structured feedback display with strengths and recommendations
+
+
+
+ {evaluationData.teacherFeedback.teacherName}
+
+
+ {evaluationData.teacherFeedback.teacherTitle}
+
+
- {/* Strengths and Improvements */}
-
-
-
-
- Strengths
-
-
- {evaluationData.teacherFeedback.strengths.map((strength, index) => (
-
- ✓
- {strength}
-
- ))}
-
+
+ {/* Overall Feedback */}
+
+
Overall Assessment
+
{evaluationData.teacherFeedback.overall}
-
-
-
- Areas for Improvement
-
-
- {evaluationData.teacherFeedback.improvements.map((improvement, index) => (
-
- →
- {improvement}
-
- ))}
-
+ {/* Strengths and Improvements */}
+
+
+
+
+ Strengths
+
+
+ {evaluationData.teacherFeedback.strengths.map((strength, index) => (
+
+ ✓
+ {strength}
+
+ ))}
+
+
+
+
+
+
+ Areas for Improvement
+
+
+ {evaluationData.teacherFeedback.improvements.map((improvement, index) => (
+
+ →
+ {improvement}
+
+ ))}
+
+
-
- {/* Summary Cards */}
-
-
-
6
-
Total Assignments
-
-
-
-
-
72%
-
Avg Score
+ {/* Summary Cards */}
+
+
+
6
+
Total Assignments
+
+
+
+
-
-
+
- {/* Feedback Detail Modal */}
-
-
-
- Assignment Feedback Details
-
-
- {feedbackModal.task && (
-
- {/* Assignment Header */}
-
-
{feedbackModal.task.name}
-
-
-
- {feedbackModal.task.type}
-
-
-
- Due: {new Date(feedbackModal.task.dueDate).toLocaleDateString()}
-
+ {/* Feedback Detail Modal */}
+
+
+
+ Assignment Feedback Details
+
+
+ {feedbackModal.task && (
+
+ {/* Assignment Header */}
+
+
{feedbackModal.task.name}
+
+
+
+ {feedbackModal.task.type}
+
+
+
+ Due: {new Date(feedbackModal.task.dueDate).toLocaleDateString()}
+
+
-
- {/* Performance Summary */}
-
-
-
Your Score
-
- {feedbackModal.task.earnedMarks}/{feedbackModal.task.totalMarks}
-
({feedbackModal.task.percentage}%)
+ {/* Performance Summary */}
+
+
+
Your Score
+
+ {feedbackModal.task.earnedMarks}/{feedbackModal.task.totalMarks}
+ ({feedbackModal.task.percentage}%)
+
-
-
-
Weightage
-
-
- {feedbackModal.task.weightage}%
+
+
Weightage
+
+
+ {feedbackModal.task.weightage}%
+
-
-
-
Status
-
- {feedbackModal.task.status}
+
+
Status
+
+ {feedbackModal.task.status}
+
-
- {/* Teacher Feedback */}
-
-
-
- Teacher Feedback
-
-
{feedbackModal.task.teacherFeedback}
-
-
- {/* Additional Details */}
-
-
-
Submission Date:
-
- {new Date(feedbackModal.task.submissionDate).toLocaleDateString()} at{' '}
- {new Date(feedbackModal.task.submissionDate).toLocaleTimeString()}
-
+ {/* Teacher Feedback */}
+
+
+
+ Teacher Feedback
+
+
{feedbackModal.task.teacherFeedback}
-
-
Grade Category:
-
{feedbackModal.task.category}
+
+ {/* Additional Details */}
+
+
+ Submission Date:
+
+ {new Date(feedbackModal.task.submissionDate).toLocaleDateString()} at{' '}
+ {new Date(feedbackModal.task.submissionDate).toLocaleTimeString()}
+
+
+
+ Grade Category:
+ {feedbackModal.task.category}
+
-
- )}
-
-
-
-
- Close
-
-
-
-
+ )}
+
+
+
+
+ Close
+
+
+
+
+ >
);
};
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
index 678dbb5a82..529758454d 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.module.css
@@ -28,6 +28,53 @@
min-height: 100vh;
background-color: var(--bg-light);
padding: 0;
+ margin-left: 200px;
+ transition: margin-left 0.3s ease;
+}
+
+/* When sidebar is minimized, expand the content */
+.evaluationResultsPage[data-sidebar-minimized='true'] {
+ margin-left: 70px;
+}
+
+@media (max-width: 991px) {
+ .evaluationResultsPage {
+ margin-left: 180px;
+ }
+
+ .evaluationResultsPage[data-sidebar-minimized='true'] {
+ margin-left: 70px;
+ }
+}
+
+@media (max-width: 767px) {
+ .evaluationResultsPage {
+ margin-left: 240px;
+ }
+
+ .evaluationResultsPage[data-sidebar-minimized='true'] {
+ margin-left: 70px;
+ }
+}
+
+@media (max-width: 480px) {
+ .evaluationResultsPage {
+ margin-left: 220px;
+ }
+
+ .evaluationResultsPage[data-sidebar-minimized='true'] {
+ margin-left: 70px;
+ }
+}
+
+@media (max-width: 359px) {
+ .evaluationResultsPage {
+ margin-left: 200px;
+ }
+
+ .evaluationResultsPage[data-sidebar-minimized='true'] {
+ margin-left: 70px;
+ }
}
/* ============================================================================
@@ -1425,23 +1472,247 @@
}
/* ============================================================================
- MODAL RESPONSIVE BREAKPOINTS
+ MOBILE RESPONSIVE BREAKPOINTS
============================================================================ */
-/* Large screens - limit modal width for better readability */
-@media (min-width: 1200px) {
- .feedbackModal .modal-dialog {
- max-width: 900px;
+/* Tablets (768px and below) */
+@media (max-width: 991px) and (min-width: 768px) {
+ .evaluationResultsPage {
+ margin-left: 180px;
}
}
-/* Medium screens - optimize modal layout */
-@media (min-width: 992px) and (max-width: 1199px) {
- .feedbackModal .modal-dialog {
- max-width: 800px;
+/* Mobile phones (767px and below) */
+@media (max-width: 767px) {
+ .evaluationResultsPage {
+ margin-left: 240px;
}
-
- .performanceSummary {
- grid-template-columns: repeat(3, 1fr);
+
+ .headerSection {
+ padding: 1.5rem 0;
+ margin-bottom: 1rem;
+ }
+
+ .headerContent {
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .headerRight {
+ position: relative;
+ right: auto;
+ top: auto;
+ margin-top: 1rem;
+ }
+
+ .pageTitle {
+ font-size: 1.5rem;
+ }
+
+ .pageSubtitle {
+ font-size: 0.85rem;
+ }
+
+ .mainContent {
+ padding: 0 1rem;
+ }
+
+ .overallSection {
+ padding: 1rem;
+ margin-bottom: 1rem;
+ }
+
+ .sectionHeader {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.75rem;
+ }
+
+ .overallScore {
+ width: 100%;
+ }
+
+ .categorySection,
+ .assignmentSection,
+ .insightsSection,
+ .teacherFeedbackSection {
+ margin-bottom: 1rem;
+ }
+
+ .tableContainer {
+ overflow-x: auto;
+ border-radius: 0;
+ }
+
+ .performanceTable {
+ font-size: 0.75rem;
+ }
+
+ .performanceTable th,
+ .performanceTable td {
+ padding: 0.5rem;
+ }
+
+ .mobileAssignments {
+ display: block;
+ }
+
+ .assignmentTable {
+ display: none;
+ }
+
+ .assignmentCard {
+ margin-bottom: 1rem;
+ padding: 1rem;
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius);
+ }
+
+ .feedbackColumns {
+ flex-direction: column;
+ gap: 1rem;
+ }
+
+ .summaryCards {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 0.75rem;
+ }
+
+ .summaryCard {
+ padding: 0.75rem;
+ }
+
+ .cardNumber {
+ font-size: 1.5rem;
+ }
+
+ .cardLabel {
+ font-size: 0.75rem;
+ }
+}
+
+/* Mobile phones (480px and below) */
+@media (max-width: 480px) {
+ .evaluationResultsPage {
+ margin-left: 220px;
+ }
+
+ .headerSection {
+ padding: 1rem 0;
+ margin-bottom: 0.75rem;
+ }
+
+ .pageTitle {
+ font-size: 1.25rem;
+ margin-bottom: 0.5rem;
+ }
+
+ .pageSubtitle {
+ font-size: 0.8rem;
+ }
+
+ .mainContent {
+ padding: 0 0.75rem;
+ }
+
+ .overallSection {
+ padding: 0.75rem;
+ }
+
+ .userWelcome {
+ flex-wrap: wrap;
+ font-size: 0.75rem;
+ padding: 0.35rem 0.75rem;
+ }
+
+ .performanceTable {
+ font-size: 0.65rem;
+ }
+
+ .performanceTable th,
+ .performanceTable td {
+ padding: 0.35rem;
+ }
+
+ .sectionTitle {
+ font-size: 1rem;
+ }
+
+ .feedbackColumns {
+ gap: 0.75rem;
+ }
+
+ .strengthsSection,
+ .improvementsSection {
+ padding: 0.75rem;
+ }
+
+ .feedbackList {
+ padding-left: 1rem;
+ }
+
+ .feedbackItem {
+ padding: 0.5rem 0;
+ font-size: 0.8rem;
+ }
+
+ .summaryCards {
+ grid-template-columns: 1fr;
+ gap: 0.5rem;
+ }
+
+ .summaryCard {
+ padding: 0.5rem;
+ }
+
+ .cardNumber {
+ font-size: 1.25rem;
+ }
+
+ .cardLabel {
+ font-size: 0.7rem;
+ }
+
+ .actionButtons {
+ flex-direction: column;
+ }
+
+ .actionButton {
+ width: 100%;
+ padding: 0.5rem;
+ font-size: 0.75rem;
+ }
+
+ .feedbackButton {
+ padding: 0.5rem 1rem;
+ font-size: 0.75rem;
+ }
+}
+
+/* Small phones (below 360px) */
+@media (max-width: 359px) {
+ .evaluationResultsPage {
+ margin-left: 200px;
+ }
+
+ .pageTitle {
+ font-size: 1rem;
+ }
+
+ .mainContent {
+ padding: 0 0.5rem;
+ }
+
+ .overallScore .scoreText {
+ font-size: 1.5rem;
+ }
+
+ .performanceTable {
+ font-size: 0.6rem;
+ }
+
+ .performanceTable th,
+ .performanceTable td {
+ padding: 0.25rem;
}
}
\ No newline at end of file
diff --git a/src/components/EductionPortal/EvaluationResultsWrapper.jsx b/src/components/EductionPortal/EvaluationResultsWrapper.jsx
new file mode 100644
index 0000000000..db7046e553
--- /dev/null
+++ b/src/components/EductionPortal/EvaluationResultsWrapper.jsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import { SidebarProvider } from './SidebarContext';
+import EvaluationResults from './EvaluationResults/EvaluationResults';
+
+const EvaluationResultsWithSidebar = props => {
+ return (
+
+
+
+ );
+};
+
+export default EvaluationResultsWithSidebar;
diff --git a/src/components/EductionPortal/SideBar/SideBar.jsx b/src/components/EductionPortal/SideBar/SideBar.jsx
new file mode 100644
index 0000000000..309e8f951a
--- /dev/null
+++ b/src/components/EductionPortal/SideBar/SideBar.jsx
@@ -0,0 +1,90 @@
+import React from 'react';
+import { NavLink, useLocation } from 'react-router-dom';
+import { useSelector } from 'react-redux';
+import { useSidebar } from '../SidebarContext';
+import styles from './SideBar.module.css';
+
+const SideBar = () => {
+ const location = useLocation();
+ const authUser = useSelector(state => state.auth?.user);
+ const { isMinimized, setIsMinimized } = useSidebar();
+
+ const menuItems = [
+ { icon: '🏠', label: 'Homepage', path: '/educationportal' },
+ { icon: '📊', label: 'Knowledge Evaluation', path: '#' },
+ { icon: '📋', label: 'Past Lesson Plans', path: '#' },
+ { icon: '⭐', label: 'My Saved Interests', path: '#' },
+ { icon: '📈', label: 'Evaluation results', path: '/educationportal/evaluation-results' },
+ { icon: '🏗️', label: 'Build Lesson Plan', path: '#' },
+ ];
+
+ const isActive = path => path !== '#' && location.pathname === path;
+
+ return (
+
+ {/* User Welcome Section */}
+
+
👋
+ {!isMinimized && (
+ <>
+
+
Welcome
+
{authUser?.firstName || 'Student'}
+
+
🔔
+ >
+ )}
+ {isMinimized && (
+
setIsMinimized(!isMinimized)}
+ title="Expand sidebar"
+ aria-label="Expand sidebar"
+ >
+ ➜
+
+ )}
+
+
+ {/* Toggle Button - Only show when expanded */}
+ {!isMinimized && (
+
+ setIsMinimized(!isMinimized)}
+ title="Minimize sidebar"
+ aria-label="Minimize sidebar"
+ >
+ ⬅️
+
+
+ )}
+
+ {/* Navigation Menu */}
+
+
+
+
+ );
+};
+
+export default SideBar;
diff --git a/src/components/EductionPortal/SideBar/SideBar.module.css b/src/components/EductionPortal/SideBar/SideBar.module.css
new file mode 100644
index 0000000000..5ae4c501b8
--- /dev/null
+++ b/src/components/EductionPortal/SideBar/SideBar.module.css
@@ -0,0 +1,447 @@
+/* ===== SIDEBAR CONTAINER ===== */
+.sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 200px;
+ height: 100vh;
+ background-color: #f5f5f5;
+ border-right: 1px solid #ddd;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+ z-index: 1000;
+ transition: width 0.3s ease;
+}
+
+.sidebar.minimized {
+ width: 70px;
+}
+
+.sidebar.minimized .label,
+.sidebar.minimized .welcomeText,
+.sidebar.minimized .toggleButtonContainer {
+ display: none;
+}
+
+/* ===== USER SECTION ===== */
+.userSection {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 12px;
+ border-bottom: 1px solid #ddd;
+ background-color: #fff;
+}
+
+.welcomeIcon {
+ font-size: 20px;
+ flex-shrink: 0;
+}
+
+.welcomeText {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ min-width: 0;
+}
+
+.welcomeLabel {
+ font-size: 11px;
+ color: #999;
+ font-weight: 500;
+ text-transform: uppercase;
+}
+
+.userName {
+ font-size: 12px;
+ font-weight: 600;
+ color: #333;
+ word-break: break-word;
+}
+
+.notifyIcon {
+ font-size: 16px;
+ flex-shrink: 0;
+ cursor: pointer;
+}
+
+/* ===== NAVIGATION ===== */
+.nav {
+ flex: 1;
+ overflow-y: auto;
+ padding: 8px 0;
+}
+
+.menuList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.menuItem {
+ margin: 0;
+ padding: 0;
+}
+
+.menuLink {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 10px 12px;
+ color: #333;
+ text-decoration: none;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ width: 100%;
+ text-align: left;
+ font-size: 13px;
+ font-weight: 500;
+ transition: background-color 0.2s ease;
+ min-height: 44px;
+}
+
+.menuLink:hover {
+ background-color: #efefef;
+}
+
+.menuLink.active {
+ background-color: #e0e7ff;
+ color: #4f46e5;
+}
+
+.icon {
+ font-size: 14px;
+ flex-shrink: 0;
+ width: 18px;
+ text-align: center;
+}
+
+.label {
+ flex: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+/* ===== TOGGLE BUTTONS ===== */
+.toggleButtonContainer {
+ display: flex;
+ justify-content: center;
+ padding: 8px;
+ border-top: 1px solid #ddd;
+ background-color: #fff;
+}
+
+.minimizeBtn {
+ background: none;
+ border: 1px solid #ddd;
+ padding: 8px 12px;
+ cursor: pointer;
+ border-radius: 4px;
+ font-size: 14px;
+ transition: all 0.2s ease;
+ width: 100%;
+}
+
+.minimizeBtn:hover {
+ background-color: #f0f0f0;
+ border-color: #999;
+}
+
+.toggleButton {
+ background: none;
+ border: none;
+ padding: 8px;
+ cursor: pointer;
+ font-size: 18px;
+ transition: all 0.2s ease;
+ width: 100%;
+ height: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 4px;
+}
+
+.toggleButton:hover {
+ background-color: #efefef;
+}
+
+/* ===== RESPONSIVE - DESKTOP (≥992px) ===== */
+@media (min-width: 992px) {
+ /* Desktop: sidebar visible by default */
+}
+
+/* ===== RESPONSIVE - TABLET (768px - 991px) ===== */
+@media (max-width: 991px) {
+ .sidebar {
+ width: 180px;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .userSection {
+ padding: 10px;
+ gap: 6px;
+ }
+
+ .welcomeIcon {
+ font-size: 16px;
+ }
+
+ .welcomeLabel {
+ font-size: 10px;
+ }
+
+ .userName {
+ font-size: 11px;
+ }
+
+ .notifyIcon {
+ font-size: 14px;
+ }
+
+ .menuLink {
+ padding: 8px 10px;
+ font-size: 12px;
+ gap: 6px;
+ }
+
+ .icon {
+ font-size: 12px;
+ width: 16px;
+ }
+}
+
+/* ===== RESPONSIVE - MOBILE (≤767px) ===== */
+@media (max-width: 767px) {
+ .sidebar {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 240px;
+ height: 100vh;
+ background-color: #f5f5f5;
+ border-right: 1px solid #ddd;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+ z-index: 1000;
+ transition: width 0.3s ease;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .sidebar.minimized .label,
+ .sidebar.minimized .welcomeText,
+ .sidebar.minimized .toggleButtonContainer {
+ display: none;
+ }
+
+ .userSection {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 14px 12px;
+ border-bottom: 1px solid #ddd;
+ background-color: #fff;
+ }
+
+ .welcomeIcon {
+ font-size: 18px;
+ flex-shrink: 0;
+ }
+
+ .welcomeText {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ min-width: 0;
+ }
+
+ .welcomeLabel {
+ font-size: 10px;
+ color: #999;
+ font-weight: 500;
+ text-transform: uppercase;
+ }
+
+ .userName {
+ font-size: 12px;
+ font-weight: 600;
+ color: #333;
+ word-break: break-word;
+ }
+
+ .notifyIcon {
+ font-size: 16px;
+ flex-shrink: 0;
+ cursor: pointer;
+ padding: 6px;
+ border-radius: 4px;
+ transition: background-color 0.2s ease;
+ }
+
+ .notifyIcon:active {
+ background-color: #e0e0e0;
+ }
+
+ .nav {
+ flex: 1;
+ overflow-y: auto;
+ padding: 8px 0;
+ }
+
+ .menuList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ .menuItem {
+ margin: 0;
+ padding: 0;
+ }
+
+ .menuLink {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px 14px;
+ color: #333;
+ text-decoration: none;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ width: 100%;
+ text-align: left;
+ font-size: 13px;
+ font-weight: 500;
+ transition: all 0.2s ease;
+ min-height: 48px;
+ }
+
+ .menuLink:active {
+ background-color: #f0f0f0;
+ }
+
+ .menuLink:hover {
+ background-color: #efefef;
+ }
+
+ .menuLink.active {
+ background-color: #e0e7ff;
+ color: #4f46e5;
+ border-left: 3px solid #4f46e5;
+ padding-left: 11px;
+ }
+
+ .icon {
+ font-size: 16px;
+ flex-shrink: 0;
+ width: 20px;
+ text-align: center;
+ }
+
+ .label {
+ flex: 1;
+ white-space: normal;
+ overflow: visible;
+ text-overflow: clip;
+ word-wrap: break-word;
+ }
+}
+
+/* ===== RESPONSIVE - SMALL PHONES (≤480px) ===== */
+@media (max-width: 480px) {
+ .sidebar {
+ width: 220px;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .sidebar.minimized .label,
+ .sidebar.minimized .welcomeText,
+ .sidebar.minimized .toggleButtonContainer {
+ display: none;
+ }
+
+ .userSection {
+ padding: 12px 10px;
+ }
+
+ .welcomeIcon {
+ font-size: 16px;
+ }
+
+ .userName {
+ font-size: 11px;
+ }
+
+ .menuLink {
+ padding: 11px 12px;
+ font-size: 12px;
+ gap: 8px;
+ }
+
+ .icon {
+ font-size: 14px;
+ width: 18px;
+ }
+}
+
+/* ===== RESPONSIVE - EXTRA SMALL (≤360px) ===== */
+@media (max-width: 359px) {
+ .sidebar {
+ width: 200px;
+ }
+
+ .sidebar.minimized {
+ width: 70px;
+ }
+
+ .sidebar.minimized .label,
+ .sidebar.minimized .welcomeText,
+ .sidebar.minimized .toggleButtonContainer {
+ display: none;
+ }
+
+ .userSection {
+ padding: 10px 8px;
+ gap: 6px;
+ }
+
+ .welcomeIcon {
+ font-size: 14px;
+ }
+
+ .welcomeLabel {
+ font-size: 9px;
+ }
+
+ .userName {
+ font-size: 10px;
+ }
+
+ .menuLink {
+ padding: 10px 10px;
+ font-size: 11px;
+ gap: 6px;
+ min-height: 44px;
+ }
+
+ .icon {
+ font-size: 12px;
+ width: 16px;
+ }
+}
diff --git a/src/components/EductionPortal/SidebarContext.jsx b/src/components/EductionPortal/SidebarContext.jsx
new file mode 100644
index 0000000000..51664b0fd1
--- /dev/null
+++ b/src/components/EductionPortal/SidebarContext.jsx
@@ -0,0 +1,21 @@
+import React, { createContext, useState } from 'react';
+
+export const SidebarContext = createContext();
+
+export const SidebarProvider = ({ children }) => {
+ const [isMinimized, setIsMinimized] = useState(false);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useSidebar = () => {
+ const context = React.useContext(SidebarContext);
+ if (!context) {
+ throw new Error('useSidebar must be used within a SidebarProvider');
+ }
+ return context;
+};
diff --git a/src/components/Header/HeaderRenderer.jsx b/src/components/Header/HeaderRenderer.jsx
index ed70df12b2..6df0a5c63d 100644
--- a/src/components/Header/HeaderRenderer.jsx
+++ b/src/components/Header/HeaderRenderer.jsx
@@ -10,7 +10,13 @@ import hasPermission from '../../utils/permissions';
export function HeaderRenderer(props) {
const location = useLocation();
const isCommunityPortal = location.pathname.startsWith('/communityportal');
-
+ const isEducationEvaluation = location.pathname.startsWith('/educationportal/evaluation-results');
+
+ // Hide header for education portal evaluation results page
+ if (isEducationEvaluation) {
+ return null;
+ }
+
// eslint-disable-next-line react/jsx-props-no-spreading
return isCommunityPortal ?
:
;
}
diff --git a/src/routes.jsx b/src/routes.jsx
index 5b0ae0da3c..a123734caa 100644
--- a/src/routes.jsx
+++ b/src/routes.jsx
@@ -138,7 +138,7 @@ import CommunityCalendar from './components/CommunityPortal/Calendar/CommunityCa
import EPProtectedRoute from './components/common/EPDashboard/EPProtectedRoute';
import EPLogin from './components/EductionPortal/Login';
import EPDashboard from './components/EductionPortal';
-import EvaluationResults from './components/EductionPortal/EvaluationResults/EvaluationResults';
+import EvaluationResultsWrapper from './components/EductionPortal/EvaluationResultsWrapper';
import MostSusceptibleTools from './components/MostSusceptible/toolBreakdownChart';
@@ -685,7 +685,7 @@ export default (
From 3e274d0f7e23b00162f7d11deae3176d0aaee76c Mon Sep 17 00:00:00 2001
From: boppanapraveen <61085397+boppanapraveen@users.noreply.github.com>
Date: Fri, 5 Dec 2025 11:42:19 -0600
Subject: [PATCH 8/9] fix: Suggestions through
---
.../EvaluationResults/EvaluationResults.jsx | 62 ++++++++++++++++---
1 file changed, 52 insertions(+), 10 deletions(-)
diff --git a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
index b7f4d8ef77..92a2b52e29 100644
--- a/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
+++ b/src/components/EductionPortal/EvaluationResults/EvaluationResults.jsx
@@ -139,7 +139,45 @@ const EvaluationResults = ({ auth }) => {
return styles.poor;
};
- // Feedback modal functions
+ // Generate dynamic performance insights based on actual data
+ const getPerformanceInsights = () => {
+ const strongAreas = categories.filter(cat => cat.percentage >= 80);
+ const improvementAreas = categories.filter(cat => cat.percentage < 70);
+
+ const strongText =
+ strongAreas.length > 0
+ ? strongAreas
+ .slice(0, 3)
+ .map(cat => `${cat.name} (${Math.round(cat.percentage)}%)`)
+ .join(', ')
+ : 'various areas';
+
+ const improvementText =
+ improvementAreas.length > 0 && improvementAreas[0]
+ ? `${improvementAreas[0].name} (${Math.round(improvementAreas[0].percentage)}%)`
+ : 'certain areas';
+
+ return { strongText, improvementText, hasImprovementAreas: improvementAreas.length > 0 };
+ };
+
+ const { strongText, improvementText, hasImprovementAreas } = getPerformanceInsights();
+
+ // Calculate summary statistics dynamically
+ const calculateSummaryStats = () => {
+ const totalAssignments = tasks.length;
+ const onTimeCount = tasks.filter(
+ task => task.status === 'On time' || task.status === 'completed',
+ ).length;
+ const lateCount = tasks.filter(task => task.status?.toLowerCase().includes('late')).length;
+ const averageScore = Math.round(
+ tasks.reduce((sum, task) => sum + task.percentage, 0) / tasks.length,
+ );
+
+ return { totalAssignments, onTimeCount, lateCount, averageScore };
+ };
+
+ const { totalAssignments, onTimeCount, lateCount, averageScore } = calculateSummaryStats();
+
const openFeedbackModal = task => {
setFeedbackModal({ isOpen: true, task });
};
@@ -243,13 +281,17 @@ const EvaluationResults = ({ auth }) => {
Performance Insights
- You performed strongly in Assignments (80%) ,{' '}
- Exams (80%) , and Participation (80%) . You may
- improve your performance in Quizzes (60%) - consider reviewing quiz
- preparation strategies.
+ You performed strongly in {strongText} .
+ {hasImprovementAreas && (
+ <>
+ {' '}
+ You may improve your performance in {improvementText} -
+ consider reviewing preparation strategies.
+ >
+ )}
- Review Quiz Messages
+ Review Assignment Messages
Study Schedule Tips
@@ -416,19 +458,19 @@ const EvaluationResults = ({ auth }) => {
{/* Summary Cards */}
-
6
+
{totalAssignments}
Total Assignments
-
5
+
{onTimeCount}
On Time
-
1
+
{lateCount}
Late Submissions
-
72%
+
{averageScore}%
Avg Score
From d1f141f1187c5de2798484390fdf835fcf3a2eed Mon Sep 17 00:00:00 2001
From: boppanapraveen <61085397+boppanapraveen@users.noreply.github.com>
Date: Sun, 14 Dec 2025 17:39:54 -0600
Subject: [PATCH 9/9] fix:Merge Conflicts
---
src/routes.jsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/routes.jsx b/src/routes.jsx
index da1ffc5d99..4c571574ed 100644
--- a/src/routes.jsx
+++ b/src/routes.jsx
@@ -166,6 +166,7 @@ import EPProtectedRoute from './components/common/EPDashboard/EPProtectedRoute';
import EPLogin from './components/EductionPortal/Login';
import EPDashboard from './components/EductionPortal';
import GroupList from './components/EductionPortal/GroupList/GroupList';
+import EvaluationResultsWrapper from './components/EductionPortal/EvaluationResultsWrapper';
import PRReviewTeamAnalytics from './components/HGNPRDashboard/PRReviewTeamAnalytics';
import PRDashboardOverview from './components/HGNPRDashboard/PRDashboardOverview';