From 3ef215b729719c01dec5e3303ab80b9c98426eca Mon Sep 17 00:00:00 2001 From: Adil2009700 Date: Sun, 5 Jul 2026 23:24:32 +0530 Subject: [PATCH 1/5] feat: Student rework view - show exactly what failed during QA review (#410) - Add questSubmissions include to getAssignments API to fetch latest submission data - Create ReworkFeedbackPanel component to display criteria results, quality score, and reviewer notes - Show feedback panel when assignment status is 'needs_rework' - Handle graceful fallback when no feedback data is available --- app/dashboard/quests/[id]/page.tsx | 90 ++++++++++++++++++++++++++++++ lib/services/assignment-service.ts | 18 ++++++ 2 files changed, 108 insertions(+) diff --git a/app/dashboard/quests/[id]/page.tsx b/app/dashboard/quests/[id]/page.tsx index e420329..6c13efc 100644 --- a/app/dashboard/quests/[id]/page.tsx +++ b/app/dashboard/quests/[id]/page.tsx @@ -25,6 +25,80 @@ import remarkGfm from 'remark-gfm'; import rehypeHighlight from 'rehype-highlight'; import 'highlight.js/styles/github.css'; +interface Submission { + id: string; + status: string; + submissionContent: string; + submissionNotes: string; + reviewNotes: unknown; + criteriaResults: unknown; + qualityScore: number | null; + reviewedAt: string | null; + reviewerId: string | null; +} + +// Rework feedback panel component +function ReworkFeedbackPanel({ submission }: { submission: Submission }) { + const criteriaResults = submission.criteriaResults as Array<{ criterion: string; met: boolean; note?: string }> | null; + const reviewNotes = submission.reviewNotes as string[] | null; + const qualityScore = submission.qualityScore; + + // If no feedback data, show fallback message + if (!criteriaResults && !reviewNotes && !qualityScore) { + return ( +
+

Rework Required

+

Your submission needs revision. Please review the reviewer notes and resubmit.

+
+ ); + } + + return ( +
+
+ +

Rework Required

+
+ + {/* Criteria Results */} + {criteriaResults && criteriaResults.length > 0 && ( +
+

Criteria that need fixing:

+
    + {criteriaResults.map((item, index) => ( +
  • + {item.met ? '✓' : '✗'} {item.criterion} + {item.note && ( +

    {item.note}

    + )} +
  • + ))} +
+
+ )} + + {/* Quality Score */} + {qualityScore !== null && ( +
+ Quality Score: {qualityScore}/10 +
+ )} + + {/* General Review Notes */} + {reviewNotes && reviewNotes.length > 0 && ( +
+

Reviewer Note:

+

{Array.isArray(reviewNotes) ? reviewNotes.join(' ') : reviewNotes}

+
+ )} + +

+ Resubmit when you've addressed the feedback above. +

+
+ ); +} + interface Quest { id: string; title: string; @@ -62,6 +136,18 @@ interface Assignment { progress?: number; completedTasks?: string[]; lastUpdateAt?: string; + // Added for rework feedback display + questSubmissions?: Array<{ + id: string; + status: string; + submissionContent: string; + submissionNotes: string; + reviewNotes: unknown; + criteriaResults: unknown; + qualityScore: number | null; + reviewedAt: string | null; + reviewerId: string | null; + }>; } function assignmentStatusClass(status: string) { @@ -505,6 +591,10 @@ export default function QuestDetailPage() { ? 'Quest claimed! Start working to unlock the submission form.' : 'Quest in progress. Submit your work using the form below.'} + {/* Rework Feedback Panel */} + {assignment.status === 'needs_rework' && assignment.questSubmissions && assignment.questSubmissions.length > 0 && ( + + )} {canStart && (