<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pnkulka2</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pnkulka2"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Pnkulka2"/>
	<updated>2026-06-06T18:01:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164952</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164952"/>
		<updated>2025-04-23T01:25:55Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* Screenshots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File:UI-1.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:UI-2.png|900px|center]]&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The revamped &amp;quot;View Submissions&amp;quot; table serves as a central hub for instructors to access and evaluate team performance efficiently. It is designed to be responsive, informative, and action-oriented, and is fully integrated with backend APIs to ensure data is always current.&lt;br /&gt;
&lt;br /&gt;
'''Key Features:'''&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:''' Adapts to mobile, tablet, and desktop screens. Columns collapse intelligently to ensure readability.&lt;br /&gt;
&lt;br /&gt;
'''Team Overview:''' Each row lists the team name, associated members, and their submission topic, all fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
'''Direct Action Links:''' Provides context-aware links such as &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot; within the table.&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:''' Highlights missing or incomplete submissions, allowing instructors to take quick action.&lt;br /&gt;
&lt;br /&gt;
'''Integrated Accessibility:''' Table supports screen readers and keyboard navigation out of the box.&lt;br /&gt;
&lt;br /&gt;
'''Performance Optimized:''' Efficient rendering through virtual scrolling and memoization for large datasets.&lt;br /&gt;
&lt;br /&gt;
'''Backend Integration:''' Data is retrieved via RESTful API endpoints, enabling real-time synchronization with the Expertiza database.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. View Submissions Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective ===&lt;br /&gt;
The View Submissions page in Expertiza provides instructors and TAs with a streamlined, responsive interface to evaluate team submissions. This modernized interface includes full backend integration, dynamic UI rendering, accessibility support, and robust error handling.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Fully Integrated with Backend:''' All team data is fetched dynamically using RESTful API, developed required backend for the task.&lt;br /&gt;
* '''Responsive UI:''' Layout adapts seamlessly across mobile, tablet, and desktop.&lt;br /&gt;
* '''Actionable Buttons:''' Each row includes direct links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot;.&lt;br /&gt;
* '''Accessibility Features:''' ARIA tags, keyboard navigation, and screen reader support.&lt;br /&gt;
* '''Optimized Performance:''' Virtual scrolling and memoization ensure smooth rendering.&lt;br /&gt;
* '''Real-Time Synchronization:''' Live data synced with Expertiza backend.&lt;br /&gt;
&lt;br /&gt;
=== Data Structure ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=\&amp;quot;typescript\&amp;quot;&amp;gt;&lt;br /&gt;
interface ITeamSubmission {&lt;br /&gt;
  id: number;&lt;br /&gt;
  teamName: string;&lt;br /&gt;
  teamMembers: { name: string; id: number }[];&lt;br /&gt;
  historyLink: string;&lt;br /&gt;
  topic?: string;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import React, { useMemo } from 'react';&lt;br /&gt;
import { createColumnHelper } from &amp;quot;@tanstack/react-table&amp;quot;;&lt;br /&gt;
import Table from &amp;quot;components/Table/Table&amp;quot;;&lt;br /&gt;
import { useLoaderData } from 'react-router-dom';&lt;br /&gt;
import { ITeamRow, TeamSubmission } from './AssignmentUtil';&lt;br /&gt;
&lt;br /&gt;
// Column helper to define typed table columns&lt;br /&gt;
const columnHelper = createColumnHelper&amp;lt;ITeamRow&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
const ViewSubmissions: React.FC = () =&amp;gt; {&lt;br /&gt;
  // Fetch data loaded from route loader (assignment teams)&lt;br /&gt;
  const assignment = useLoaderData() as TeamSubmission[];&lt;br /&gt;
&lt;br /&gt;
  // Transform the backend response to a table-friendly structure&lt;br /&gt;
  const submissions = useMemo&amp;lt;ITeamRow[]&amp;gt;(() =&amp;gt;&lt;br /&gt;
    assignment.map((team) =&amp;gt; ({&lt;br /&gt;
      id: team.id,&lt;br /&gt;
      teamName: team.name,&lt;br /&gt;
      teamMembers: team.members,&lt;br /&gt;
      historyLink: `/history/${team.team_id}`,&lt;br /&gt;
    }))&lt;br /&gt;
  , [assignment]);&lt;br /&gt;
&lt;br /&gt;
  // Define the columns used in the table&lt;br /&gt;
  const columns = useMemo(() =&amp;gt; [&lt;br /&gt;
    columnHelper.accessor('teamName', {&lt;br /&gt;
      header: 'Team Name',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ color: 'brown', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
          {info.getValue()}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.accessor('teamMembers', {&lt;br /&gt;
      header: 'Team Member(s)',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          {info.getValue().map((member) =&amp;gt; (&lt;br /&gt;
            &amp;lt;div key={member.id}&amp;gt;&lt;br /&gt;
              &amp;lt;a href={`/students/${member.id}`} style={{ color: '#b44' }}&amp;gt;&lt;br /&gt;
                {member.name}&lt;br /&gt;
              &amp;lt;/a&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.display({&lt;br /&gt;
      id: 'links',&lt;br /&gt;
      header: 'Links',&lt;br /&gt;
      cell: ({ row }) =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ display: 'flex', flexDirection: 'column' }}&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={`/assign_grade/${row.original.id}`}&lt;br /&gt;
            style={{ color: '#b44', marginBottom: '4px' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            Assign Grade&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={row.original.historyLink}&lt;br /&gt;
            style={{ color: '#b44' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            History&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
  ], []);&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div className=&amp;quot;mt-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 className=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
        View Submissions - {assignment[0]?.topic || 'Assignment'}&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Render dynamic table of submissions */}&lt;br /&gt;
      &amp;lt;Table&lt;br /&gt;
        data={submissions}&lt;br /&gt;
        columns={columns}&lt;br /&gt;
        columnVisibility={{&lt;br /&gt;
          id: false, // Hide the 'id' column from UI&lt;br /&gt;
        }}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default ViewSubmissions;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Fetches data with &amp;lt;code&amp;gt;loadAssignmentTeams()&amp;lt;/code&amp;gt; via the route's loader&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
// Middleware to fetch teams for assignment &lt;br /&gt;
export async function loadAssignmentTeams({ params }: {id:string}) {&lt;br /&gt;
  let teamsData = [];&lt;br /&gt;
&lt;br /&gt;
  if (params.id) {&lt;br /&gt;
    const response = await axiosClient.get(`/assignments/${params.id}/teams`);&lt;br /&gt;
    teamsData = response.data;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return teamsData;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;@tanstack/react-table&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;createColumnHelper&amp;lt;/code&amp;gt; for table config&lt;br /&gt;
* Displays columns: Team Name, Members, Assign Grade, and History&lt;br /&gt;
* Bootstrap-styled; includes keyboard and screen reader accessibility&lt;br /&gt;
&lt;br /&gt;
=== Backend Controller Code ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def teams&lt;br /&gt;
  assignment = Assignment.find_by(id: params[:assignment_id])&lt;br /&gt;
&lt;br /&gt;
  if assignment.nil?&lt;br /&gt;
    render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  submissions = if assignment.has_teams?&lt;br /&gt;
    assignment.teams.includes(:teams_users =&amp;gt; :user).map do |team|&lt;br /&gt;
      signed_up_team = team.signed_up_teams.first&lt;br /&gt;
      topic = signed_up_team&amp;amp;.sign_up_topic&amp;amp;.topic_name&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        name: team.name,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        topic: topic,&lt;br /&gt;
        members: team.teams_users.map { |tu| { id: tu.user.id, name: tu.user.name } }&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    assignment.participants.includes(:user).map do |participant|&lt;br /&gt;
      {&lt;br /&gt;
        id: participant.id,&lt;br /&gt;
        name: participant.user.name,&lt;br /&gt;
        team_id: nil,&lt;br /&gt;
        topic: nil,&lt;br /&gt;
        members: [{ id: participant.user.id, name: participant.user.name }]&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  render json: submissions, status: :ok&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Documentation ===&lt;br /&gt;
* '''Endpoint:''' &amp;lt;code&amp;gt;GET /api/v1/assignments/:assignment_id/teams&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Returns:''' Array of team info, members, and topic&lt;br /&gt;
* '''Swagger Docs:''' [http://152.7.177.242:3002/api-docs/index.html Swagger UI]&lt;br /&gt;
&lt;br /&gt;
=== Sample JSON Response ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Texas penguins&amp;quot;,&lt;br /&gt;
    &amp;quot;team_id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;topic&amp;quot;: &amp;quot;Progressive fresh-thinking middleware&amp;quot;,&lt;br /&gt;
    &amp;quot;members&amp;quot;: [&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 20, &amp;quot;name&amp;quot;: &amp;quot;erlinda.grimes&amp;quot; },&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 21, &amp;quot;name&amp;quot;: &amp;quot;lawanda.wilkinson&amp;quot; }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seeding Changes ===&lt;br /&gt;
&lt;br /&gt;
To test the View Submissions feature thoroughly, we updated `db/seeds.rb` to include realistic assignments, topics, teams, and student-user mappings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
# SignUpTopics&lt;br /&gt;
signup_topics = assignments.flat_map do |assignment|&lt;br /&gt;
  5.times.map do&lt;br /&gt;
    SignUpTopic.create!(&lt;br /&gt;
      topic_name: Faker::Company.catch_phrase,&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      max_choosers: 2,&lt;br /&gt;
      category: &amp;quot;Default&amp;quot;,&lt;br /&gt;
      topic_identifier: Faker::Alphanumeric.alpha(number: 8).upcase,&lt;br /&gt;
      description: Faker::Lorem.sentence&lt;br /&gt;
    )&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# SignedUpTeams&lt;br /&gt;
teams.each_with_index do |team, idx|&lt;br /&gt;
  SignedUpTeam.create!(&lt;br /&gt;
    sign_up_topic_id: signup_topics[idx % signup_topics.length].id,&lt;br /&gt;
    team_id: team.id,&lt;br /&gt;
    is_waitlisted: false,&lt;br /&gt;
    preference_priority_number: 1&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Participants&lt;br /&gt;
students.each_with_index do |student, idx|&lt;br /&gt;
  Participant.create!(&lt;br /&gt;
    user_id: student.id,&lt;br /&gt;
    assignment_id: assignments[idx % assignments.length].id,&lt;br /&gt;
    team_id: teams[idx % teams.length].id&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ensures every team has students, a valid assignment, and a topic&lt;br /&gt;
* Prepares data for consistent API response&lt;br /&gt;
* Essential for local testing and API verification&lt;br /&gt;
&lt;br /&gt;
This implementation was inspired by prior work in the Expertiza backend [https://github.com/expertiza/reimplementation-back-end/pull/173 (PR #173)], and extended in our custom implementation documented here: [https://github.com/expertiza/reimplementation-back-end/pull/190 (PR #190)].&lt;br /&gt;
&lt;br /&gt;
=== UI Previews ===&lt;br /&gt;
Visual confirmation of the working interface with accessible design, action buttons, and responsive layout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== View Assignments Page ====&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-1-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-1-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-1-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== View Submissions Page ===&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-2-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-2-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-2-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Assign Grade Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective ===&lt;br /&gt;
The Assign Grade page enables instructors and TAs to efficiently assess a team’s performance by reviewing peer feedback, submission details, and finalizing grades. It offers clarity, validation, and visual cues to streamline the grading workflow and ensure completeness of required inputs.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
'''Team &amp;amp; Submission Summary:'''&lt;br /&gt;
Displays assignment title, selected team name, associated topic, and team members with profile links. A button placeholder allows viewing the submitted work.&lt;br /&gt;
&lt;br /&gt;
'''Peer Feedback Tables (HeatGrid):'''&lt;br /&gt;
Utilizes a reusable ReviewTable component to render two structured tables:&lt;br /&gt;
&lt;br /&gt;
Author Feedback Reviews&lt;br /&gt;
&lt;br /&gt;
Teammate Reviews&lt;br /&gt;
&lt;br /&gt;
Each review entry includes:&lt;br /&gt;
&lt;br /&gt;
Reviewer ID&lt;br /&gt;
&lt;br /&gt;
Comments&lt;br /&gt;
&lt;br /&gt;
Score (out of 5)&lt;br /&gt;
&lt;br /&gt;
Date of review&lt;br /&gt;
Tables are dynamically populated via convertReviewDataToHeatMap() from the loaded data.&lt;br /&gt;
&lt;br /&gt;
'''Grade Submission Form:'''&lt;br /&gt;
A form capturing:&lt;br /&gt;
&lt;br /&gt;
Grade (text input)&lt;br /&gt;
&lt;br /&gt;
Comment (textarea)&lt;br /&gt;
&lt;br /&gt;
Late Penalty (text input)&lt;br /&gt;
The form includes validation: grade and comment are mandatory. Alerts provide visual feedback on successful save or missing inputs.&lt;br /&gt;
&lt;br /&gt;
'''Form Submission Handling:'''&lt;br /&gt;
Upon submission:&lt;br /&gt;
&lt;br /&gt;
Inputs are validated&lt;br /&gt;
&lt;br /&gt;
State is updated to show success/error&lt;br /&gt;
&lt;br /&gt;
Data is logged to console (pending backend connection)&lt;br /&gt;
&lt;br /&gt;
'''Backend Integration (Planned):'''&lt;br /&gt;
All dynamic data (assignment, reviews) is currently fetched via route loader. Integration steps include:&lt;br /&gt;
&lt;br /&gt;
Fetching Data: Populate author and teammate reviews using API endpoints&lt;br /&gt;
&lt;br /&gt;
Saving Grades: Send POST/PUT requests to submit final grades, comments, and penalties&lt;br /&gt;
&lt;br /&gt;
Missing Reviews: Highlight when peer review data is unavailable&lt;br /&gt;
&lt;br /&gt;
=== UI Structure ===&lt;br /&gt;
&lt;br /&gt;
'''1. Page Header'''&lt;br /&gt;
&lt;br /&gt;
Assignment title&lt;br /&gt;
&lt;br /&gt;
Team name and topic&lt;br /&gt;
&lt;br /&gt;
Team members with links to profiles&lt;br /&gt;
&lt;br /&gt;
'''2. Review Section'''&lt;br /&gt;
&lt;br /&gt;
Rendered via reusable &amp;lt;ReviewTable /&amp;gt; component&lt;br /&gt;
&lt;br /&gt;
Empty state notices for missing reviews&lt;br /&gt;
&lt;br /&gt;
'''3. Grade Form'''&lt;br /&gt;
&lt;br /&gt;
Inputs: Grade, Comment, Late Penalty&lt;br /&gt;
&lt;br /&gt;
Success/error message feedback&lt;br /&gt;
&lt;br /&gt;
Validation on submit&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;AssignGrade.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import { useLocation, useLoaderData } from 'react-router-dom';&lt;br /&gt;
import { useState } from 'react';&lt;br /&gt;
import ReviewTable from '../../components/HeatGrid/ReviewTable'; // HeatGrid component for displaying reviews in tabular format&lt;br /&gt;
import { convertReviewDataToHeatMap, LoaderOutput } from './AssignmentUtil';&lt;br /&gt;
&lt;br /&gt;
const AssignGrade = () =&amp;gt; {&lt;br /&gt;
  // Accessing navigation state passed from the previous route (team name, topic, team members)&lt;br /&gt;
  const location = useLocation();&lt;br /&gt;
  console.log(&amp;quot;Location state:&amp;quot;, location.state);&lt;br /&gt;
&lt;br /&gt;
  // Getting the assignment and review data from the route loader&lt;br /&gt;
  const { assignment, reviews } = useLoaderData() as LoaderOutput;&lt;br /&gt;
&lt;br /&gt;
  // State variables to manage form data and UI state&lt;br /&gt;
  const [grade, setGrade] = useState('');&lt;br /&gt;
  const [comment, setComment] = useState('');&lt;br /&gt;
  const [latePenalty, setLatePenalty] = useState('');&lt;br /&gt;
  const [showSuccess, setShowSuccess] = useState(false);&lt;br /&gt;
  const [error, setError] = useState('');&lt;br /&gt;
&lt;br /&gt;
  // Converting raw review data into a format suitable for HeatGrid (peer reviews)&lt;br /&gt;
  const authorReviewes = convertReviewDataToHeatMap(reviews.author_feedback_reviews);&lt;br /&gt;
  // Converting teammate reviews similarly&lt;br /&gt;
  const teamReviews = convertReviewDataToHeatMap(reviews.teammate_reviews);&lt;br /&gt;
&lt;br /&gt;
  // Handle submission of grade and comment&lt;br /&gt;
  const handleSubmit = (e: React.FormEvent) =&amp;gt; {&lt;br /&gt;
    e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
    // Validate required fields&lt;br /&gt;
    if (!grade.trim() || !comment.trim()) {&lt;br /&gt;
      setError('Both grade and comment are required');&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Reset error and show success message&lt;br /&gt;
    setError('');&lt;br /&gt;
    setShowSuccess(true);&lt;br /&gt;
&lt;br /&gt;
    // Logging submitted data (in production this would be replaced with an API call)&lt;br /&gt;
    console.log('Grade submitted:', grade, 'Comment:', comment, 'Late Penalty:', latePenalty);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div style={{&lt;br /&gt;
      maxWidth: '1000px',&lt;br /&gt;
      margin: '2rem auto',&lt;br /&gt;
      padding: '2rem',&lt;br /&gt;
      backgroundColor: '#fff',&lt;br /&gt;
      borderRadius: '10px',&lt;br /&gt;
      boxShadow: '0 4px 10px rgba(0,0,0,0.1)'&lt;br /&gt;
    }}&amp;gt;&lt;br /&gt;
      {/* Success message after grade is submitted */}&lt;br /&gt;
      {showSuccess &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;div style={{ backgroundColor: '#d1fae5', padding: '1rem', marginBottom: '1rem', border: '1px solid #10b981', color: '#065f46' }}&amp;gt;&lt;br /&gt;
          Grade and comment saved!&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {/* Assignment title */}&lt;br /&gt;
      &amp;lt;h1 style={{ fontSize: '1.8rem', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
        Summary Report for Assignment: {assignment.name}&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Team and topic details from navigation state */}&lt;br /&gt;
      &amp;lt;div style={{ margin: '1rem 0' }}&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Team:&amp;lt;/strong&amp;gt; {location.state?.teamName || 'Unknown Team'}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style={{ margin: '1rem 0' }}&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Topic:&amp;lt;/strong&amp;gt; {location.state?.topicName || 'Unknown Topic'}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Placeholder button for viewing the submission */}&lt;br /&gt;
      &amp;lt;button style={{ padding: '0.5rem 1rem', backgroundColor: '#eee', border: '1px solid #ccc', marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
        Show Submission&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Peer review section */}&lt;br /&gt;
      &amp;lt;h3 style={{ margin: '1rem 0', textAlign: 'left' }}&amp;gt;&lt;br /&gt;
        Peer Review&lt;br /&gt;
      &amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {authorReviewes.length !== 0 ? (&lt;br /&gt;
        &amp;lt;ReviewTable reviews={authorReviewes} /&amp;gt;&lt;br /&gt;
      ) : (&lt;br /&gt;
        &amp;lt;div style={{ backgroundColor: '#fffbcc', padding: '1rem', marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
          &amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; No data provided for peer reviews table.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {/* Displaying list of teammates with profile links */}&lt;br /&gt;
      &amp;lt;div style={{ margin: '1rem 0', paddingLeft: '1rem' }}&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Teammates:  &amp;lt;/strong&amp;gt;&lt;br /&gt;
        &amp;lt;span style={{ marginTop: '0.5rem', fontSize: '1rem' }}&amp;gt;&lt;br /&gt;
          {location.state?.teamMembers?.map((member: { id: number; name: string }, index: number) =&amp;gt; (&lt;br /&gt;
            &amp;lt;span key={member.id} style={{ marginRight: '0.5rem' }}&amp;gt;&lt;br /&gt;
              &amp;lt;a href={`/students/${member.id}`} style={{ color: '#a67c52', textDecoration: 'none' }}&amp;gt;&lt;br /&gt;
                {member.name}&lt;br /&gt;
              &amp;lt;/a&amp;gt;&lt;br /&gt;
              {index &amp;lt; location.state.teamMembers.length - 1 ? ',' : ''}&lt;br /&gt;
            &amp;lt;/span&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
        &amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Teammate review section */}&lt;br /&gt;
      {teamReviews.length !== 0 &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;h3 style={{ margin: '1rem 0', textAlign: 'left' }}&amp;gt;&lt;br /&gt;
          Teammate Review&lt;br /&gt;
        &amp;lt;/h3&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {teamReviews.length !== 0 ? (&lt;br /&gt;
        &amp;lt;ReviewTable reviews={teamReviews} /&amp;gt;&lt;br /&gt;
      ) : (&lt;br /&gt;
        &amp;lt;div style={{ backgroundColor: '#fffbcc', padding: '1rem', marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
          &amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; No data provided for teammate reviews table.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {/* Grade and comment input form */}&lt;br /&gt;
      &amp;lt;h3&amp;gt;Grade and Comment for Submission&amp;lt;/h3&amp;gt;&lt;br /&gt;
      {error &amp;amp;&amp;amp; &amp;lt;div style={{ color: 'red', marginBottom: '1rem' }}&amp;gt;{error}&amp;lt;/div&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;form onSubmit={handleSubmit}&amp;gt;&lt;br /&gt;
        {/* Grade input */}&lt;br /&gt;
        &amp;lt;label&amp;gt;Grade:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input&lt;br /&gt;
          type=&amp;quot;text&amp;quot;&lt;br /&gt;
          value={grade}&lt;br /&gt;
          onChange={e =&amp;gt; setGrade(e.target.value)}&lt;br /&gt;
          style={{ width: '100%', padding: '0.5rem', marginBottom: '1rem' }}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        {/* Comment textarea */}&lt;br /&gt;
        &amp;lt;label&amp;gt;Comment:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;textarea&lt;br /&gt;
          value={comment}&lt;br /&gt;
          onChange={e =&amp;gt; setComment(e.target.value)}&lt;br /&gt;
          rows={4}&lt;br /&gt;
          style={{ width: '100%', padding: '0.5rem' }}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        {/* Late penalty input */}&lt;br /&gt;
        &amp;lt;label&amp;gt;Late Penalty:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input&lt;br /&gt;
          type=&amp;quot;text&amp;quot;&lt;br /&gt;
          value={latePenalty}&lt;br /&gt;
          onChange={e =&amp;gt; setLatePenalty(e.target.value)}&lt;br /&gt;
          style={{ width: '100%', padding: '0.5rem', marginBottom: '1rem' }}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot; style={{ marginTop: '1rem', padding: '0.5rem 1rem' }}&amp;gt;&lt;br /&gt;
          Save&lt;br /&gt;
        &amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default AssignGrade;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Tech Stack:'''&lt;br /&gt;
React (TypeScript), React Router, HeatGrid-based ReviewTable, Inline CSS&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:'''&lt;br /&gt;
&lt;br /&gt;
Light green alert for successful submission&lt;br /&gt;
&lt;br /&gt;
Yellow info boxes for missing peer review data&lt;br /&gt;
&lt;br /&gt;
Red error text for form validation&lt;br /&gt;
&lt;br /&gt;
=== Screenshots ===&lt;br /&gt;
&lt;br /&gt;
'''AssignGrade View:'''&lt;br /&gt;
[[File:AssignGrades1.png|800px|center]]&lt;br /&gt;
[[File:AssignGrades2.png|800px|center]]&lt;br /&gt;
[[File:AssignGrades3.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Validation Alert:'''&lt;br /&gt;
[[File:AssignGrade3.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''Success Message:'''&lt;br /&gt;
[[File:AssignGrade4.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
* Actor: Student&lt;br /&gt;
** The student initiates the interaction with the system by clicking on **Grades View** from the main page.&lt;br /&gt;
* System Boundary&lt;br /&gt;
** Once inside the grading/feedback system, the student can:&lt;br /&gt;
*** View Grades for a Given Assignment&lt;br /&gt;
**** Allows the student to see the overall grading details for a specific assignment.&lt;br /&gt;
**** Redirects to the Stats page.&lt;br /&gt;
*** Show Submission&lt;br /&gt;
**** Displays the submitted work details for the student’s assignment.&lt;br /&gt;
**** Redirects to the Submissions page.&lt;br /&gt;
*** Show Reviews&lt;br /&gt;
**** Displays the peer or instructor reviews received.&lt;br /&gt;
**** Redirects to the Reviews page.&lt;br /&gt;
*** Show Author Feedback&lt;br /&gt;
**** Shows feedback provided by the author (instructor or peer).&lt;br /&gt;
**** Redirects to the Author Feedback page.&lt;br /&gt;
*** Teammate Review&lt;br /&gt;
**** Allows viewing or giving feedback on teammates’ work.&lt;br /&gt;
*** Average / Range&lt;br /&gt;
**** For each category (assignment, reviews, feedback), the system can display average scores or range of scores.&lt;br /&gt;
*** Back&lt;br /&gt;
**** Provides an option to navigate back to the main page or the previous screen.&lt;br /&gt;
* Redirect to Main Page&lt;br /&gt;
** After the student finishes viewing grades, submissions, reviews, or feedback, they can return to the main page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Test Environment ===&lt;br /&gt;
The tests use the following libraries and tools:&lt;br /&gt;
&lt;br /&gt;
* '''Jest:''' JavaScript testing framework&lt;br /&gt;
* '''React Testing Library:''' Testing utilities for React components&lt;br /&gt;
* '''Jest DOM:''' Custom Jest matchers for asserting on DOM elements&lt;br /&gt;
* All tests pass successfully, indicating that the ViewSubmissions and AssignGrade components are functioning as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:testcases.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrades3.png&amp;diff=164951</id>
		<title>File:AssignGrades3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrades3.png&amp;diff=164951"/>
		<updated>2025-04-23T01:25:43Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrades2.png&amp;diff=164950</id>
		<title>File:AssignGrades2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrades2.png&amp;diff=164950"/>
		<updated>2025-04-23T01:25:29Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrades1.png&amp;diff=164948</id>
		<title>File:AssignGrades1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrades1.png&amp;diff=164948"/>
		<updated>2025-04-23T01:23:34Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164947</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164947"/>
		<updated>2025-04-23T01:22:57Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* 2. Assign Grade Page */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File:UI-1.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:UI-2.png|900px|center]]&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The revamped &amp;quot;View Submissions&amp;quot; table serves as a central hub for instructors to access and evaluate team performance efficiently. It is designed to be responsive, informative, and action-oriented, and is fully integrated with backend APIs to ensure data is always current.&lt;br /&gt;
&lt;br /&gt;
'''Key Features:'''&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:''' Adapts to mobile, tablet, and desktop screens. Columns collapse intelligently to ensure readability.&lt;br /&gt;
&lt;br /&gt;
'''Team Overview:''' Each row lists the team name, associated members, and their submission topic, all fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
'''Direct Action Links:''' Provides context-aware links such as &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot; within the table.&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:''' Highlights missing or incomplete submissions, allowing instructors to take quick action.&lt;br /&gt;
&lt;br /&gt;
'''Integrated Accessibility:''' Table supports screen readers and keyboard navigation out of the box.&lt;br /&gt;
&lt;br /&gt;
'''Performance Optimized:''' Efficient rendering through virtual scrolling and memoization for large datasets.&lt;br /&gt;
&lt;br /&gt;
'''Backend Integration:''' Data is retrieved via RESTful API endpoints, enabling real-time synchronization with the Expertiza database.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. View Submissions Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective ===&lt;br /&gt;
The View Submissions page in Expertiza provides instructors and TAs with a streamlined, responsive interface to evaluate team submissions. This modernized interface includes full backend integration, dynamic UI rendering, accessibility support, and robust error handling.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Fully Integrated with Backend:''' All team data is fetched dynamically using RESTful API, developed required backend for the task.&lt;br /&gt;
* '''Responsive UI:''' Layout adapts seamlessly across mobile, tablet, and desktop.&lt;br /&gt;
* '''Actionable Buttons:''' Each row includes direct links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot;.&lt;br /&gt;
* '''Accessibility Features:''' ARIA tags, keyboard navigation, and screen reader support.&lt;br /&gt;
* '''Optimized Performance:''' Virtual scrolling and memoization ensure smooth rendering.&lt;br /&gt;
* '''Real-Time Synchronization:''' Live data synced with Expertiza backend.&lt;br /&gt;
&lt;br /&gt;
=== Data Structure ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=\&amp;quot;typescript\&amp;quot;&amp;gt;&lt;br /&gt;
interface ITeamSubmission {&lt;br /&gt;
  id: number;&lt;br /&gt;
  teamName: string;&lt;br /&gt;
  teamMembers: { name: string; id: number }[];&lt;br /&gt;
  historyLink: string;&lt;br /&gt;
  topic?: string;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import React, { useMemo } from 'react';&lt;br /&gt;
import { createColumnHelper } from &amp;quot;@tanstack/react-table&amp;quot;;&lt;br /&gt;
import Table from &amp;quot;components/Table/Table&amp;quot;;&lt;br /&gt;
import { useLoaderData } from 'react-router-dom';&lt;br /&gt;
import { ITeamRow, TeamSubmission } from './AssignmentUtil';&lt;br /&gt;
&lt;br /&gt;
// Column helper to define typed table columns&lt;br /&gt;
const columnHelper = createColumnHelper&amp;lt;ITeamRow&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
const ViewSubmissions: React.FC = () =&amp;gt; {&lt;br /&gt;
  // Fetch data loaded from route loader (assignment teams)&lt;br /&gt;
  const assignment = useLoaderData() as TeamSubmission[];&lt;br /&gt;
&lt;br /&gt;
  // Transform the backend response to a table-friendly structure&lt;br /&gt;
  const submissions = useMemo&amp;lt;ITeamRow[]&amp;gt;(() =&amp;gt;&lt;br /&gt;
    assignment.map((team) =&amp;gt; ({&lt;br /&gt;
      id: team.id,&lt;br /&gt;
      teamName: team.name,&lt;br /&gt;
      teamMembers: team.members,&lt;br /&gt;
      historyLink: `/history/${team.team_id}`,&lt;br /&gt;
    }))&lt;br /&gt;
  , [assignment]);&lt;br /&gt;
&lt;br /&gt;
  // Define the columns used in the table&lt;br /&gt;
  const columns = useMemo(() =&amp;gt; [&lt;br /&gt;
    columnHelper.accessor('teamName', {&lt;br /&gt;
      header: 'Team Name',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ color: 'brown', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
          {info.getValue()}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.accessor('teamMembers', {&lt;br /&gt;
      header: 'Team Member(s)',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          {info.getValue().map((member) =&amp;gt; (&lt;br /&gt;
            &amp;lt;div key={member.id}&amp;gt;&lt;br /&gt;
              &amp;lt;a href={`/students/${member.id}`} style={{ color: '#b44' }}&amp;gt;&lt;br /&gt;
                {member.name}&lt;br /&gt;
              &amp;lt;/a&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.display({&lt;br /&gt;
      id: 'links',&lt;br /&gt;
      header: 'Links',&lt;br /&gt;
      cell: ({ row }) =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ display: 'flex', flexDirection: 'column' }}&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={`/assign_grade/${row.original.id}`}&lt;br /&gt;
            style={{ color: '#b44', marginBottom: '4px' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            Assign Grade&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={row.original.historyLink}&lt;br /&gt;
            style={{ color: '#b44' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            History&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
  ], []);&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div className=&amp;quot;mt-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 className=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
        View Submissions - {assignment[0]?.topic || 'Assignment'}&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Render dynamic table of submissions */}&lt;br /&gt;
      &amp;lt;Table&lt;br /&gt;
        data={submissions}&lt;br /&gt;
        columns={columns}&lt;br /&gt;
        columnVisibility={{&lt;br /&gt;
          id: false, // Hide the 'id' column from UI&lt;br /&gt;
        }}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default ViewSubmissions;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Fetches data with &amp;lt;code&amp;gt;loadAssignmentTeams()&amp;lt;/code&amp;gt; via the route's loader&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
// Middleware to fetch teams for assignment &lt;br /&gt;
export async function loadAssignmentTeams({ params }: {id:string}) {&lt;br /&gt;
  let teamsData = [];&lt;br /&gt;
&lt;br /&gt;
  if (params.id) {&lt;br /&gt;
    const response = await axiosClient.get(`/assignments/${params.id}/teams`);&lt;br /&gt;
    teamsData = response.data;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return teamsData;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;@tanstack/react-table&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;createColumnHelper&amp;lt;/code&amp;gt; for table config&lt;br /&gt;
* Displays columns: Team Name, Members, Assign Grade, and History&lt;br /&gt;
* Bootstrap-styled; includes keyboard and screen reader accessibility&lt;br /&gt;
&lt;br /&gt;
=== Backend Controller Code ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def teams&lt;br /&gt;
  assignment = Assignment.find_by(id: params[:assignment_id])&lt;br /&gt;
&lt;br /&gt;
  if assignment.nil?&lt;br /&gt;
    render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  submissions = if assignment.has_teams?&lt;br /&gt;
    assignment.teams.includes(:teams_users =&amp;gt; :user).map do |team|&lt;br /&gt;
      signed_up_team = team.signed_up_teams.first&lt;br /&gt;
      topic = signed_up_team&amp;amp;.sign_up_topic&amp;amp;.topic_name&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        name: team.name,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        topic: topic,&lt;br /&gt;
        members: team.teams_users.map { |tu| { id: tu.user.id, name: tu.user.name } }&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    assignment.participants.includes(:user).map do |participant|&lt;br /&gt;
      {&lt;br /&gt;
        id: participant.id,&lt;br /&gt;
        name: participant.user.name,&lt;br /&gt;
        team_id: nil,&lt;br /&gt;
        topic: nil,&lt;br /&gt;
        members: [{ id: participant.user.id, name: participant.user.name }]&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  render json: submissions, status: :ok&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Documentation ===&lt;br /&gt;
* '''Endpoint:''' &amp;lt;code&amp;gt;GET /api/v1/assignments/:assignment_id/teams&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Returns:''' Array of team info, members, and topic&lt;br /&gt;
* '''Swagger Docs:''' [http://152.7.177.242:3002/api-docs/index.html Swagger UI]&lt;br /&gt;
&lt;br /&gt;
=== Sample JSON Response ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Texas penguins&amp;quot;,&lt;br /&gt;
    &amp;quot;team_id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;topic&amp;quot;: &amp;quot;Progressive fresh-thinking middleware&amp;quot;,&lt;br /&gt;
    &amp;quot;members&amp;quot;: [&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 20, &amp;quot;name&amp;quot;: &amp;quot;erlinda.grimes&amp;quot; },&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 21, &amp;quot;name&amp;quot;: &amp;quot;lawanda.wilkinson&amp;quot; }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seeding Changes ===&lt;br /&gt;
&lt;br /&gt;
To test the View Submissions feature thoroughly, we updated `db/seeds.rb` to include realistic assignments, topics, teams, and student-user mappings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
# SignUpTopics&lt;br /&gt;
signup_topics = assignments.flat_map do |assignment|&lt;br /&gt;
  5.times.map do&lt;br /&gt;
    SignUpTopic.create!(&lt;br /&gt;
      topic_name: Faker::Company.catch_phrase,&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      max_choosers: 2,&lt;br /&gt;
      category: &amp;quot;Default&amp;quot;,&lt;br /&gt;
      topic_identifier: Faker::Alphanumeric.alpha(number: 8).upcase,&lt;br /&gt;
      description: Faker::Lorem.sentence&lt;br /&gt;
    )&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# SignedUpTeams&lt;br /&gt;
teams.each_with_index do |team, idx|&lt;br /&gt;
  SignedUpTeam.create!(&lt;br /&gt;
    sign_up_topic_id: signup_topics[idx % signup_topics.length].id,&lt;br /&gt;
    team_id: team.id,&lt;br /&gt;
    is_waitlisted: false,&lt;br /&gt;
    preference_priority_number: 1&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Participants&lt;br /&gt;
students.each_with_index do |student, idx|&lt;br /&gt;
  Participant.create!(&lt;br /&gt;
    user_id: student.id,&lt;br /&gt;
    assignment_id: assignments[idx % assignments.length].id,&lt;br /&gt;
    team_id: teams[idx % teams.length].id&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ensures every team has students, a valid assignment, and a topic&lt;br /&gt;
* Prepares data for consistent API response&lt;br /&gt;
* Essential for local testing and API verification&lt;br /&gt;
&lt;br /&gt;
This implementation was inspired by prior work in the Expertiza backend [https://github.com/expertiza/reimplementation-back-end/pull/173 (PR #173)], and extended in our custom implementation documented here: [https://github.com/expertiza/reimplementation-back-end/pull/190 (PR #190)].&lt;br /&gt;
&lt;br /&gt;
=== UI Previews ===&lt;br /&gt;
Visual confirmation of the working interface with accessible design, action buttons, and responsive layout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== View Assignments Page ====&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-1-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-1-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-1-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== View Submissions Page ===&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-2-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-2-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-2-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Assign Grade Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective ===&lt;br /&gt;
The Assign Grade page enables instructors and TAs to efficiently assess a team’s performance by reviewing peer feedback, submission details, and finalizing grades. It offers clarity, validation, and visual cues to streamline the grading workflow and ensure completeness of required inputs.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
'''Team &amp;amp; Submission Summary:'''&lt;br /&gt;
Displays assignment title, selected team name, associated topic, and team members with profile links. A button placeholder allows viewing the submitted work.&lt;br /&gt;
&lt;br /&gt;
'''Peer Feedback Tables (HeatGrid):'''&lt;br /&gt;
Utilizes a reusable ReviewTable component to render two structured tables:&lt;br /&gt;
&lt;br /&gt;
Author Feedback Reviews&lt;br /&gt;
&lt;br /&gt;
Teammate Reviews&lt;br /&gt;
&lt;br /&gt;
Each review entry includes:&lt;br /&gt;
&lt;br /&gt;
Reviewer ID&lt;br /&gt;
&lt;br /&gt;
Comments&lt;br /&gt;
&lt;br /&gt;
Score (out of 5)&lt;br /&gt;
&lt;br /&gt;
Date of review&lt;br /&gt;
Tables are dynamically populated via convertReviewDataToHeatMap() from the loaded data.&lt;br /&gt;
&lt;br /&gt;
'''Grade Submission Form:'''&lt;br /&gt;
A form capturing:&lt;br /&gt;
&lt;br /&gt;
Grade (text input)&lt;br /&gt;
&lt;br /&gt;
Comment (textarea)&lt;br /&gt;
&lt;br /&gt;
Late Penalty (text input)&lt;br /&gt;
The form includes validation: grade and comment are mandatory. Alerts provide visual feedback on successful save or missing inputs.&lt;br /&gt;
&lt;br /&gt;
'''Form Submission Handling:'''&lt;br /&gt;
Upon submission:&lt;br /&gt;
&lt;br /&gt;
Inputs are validated&lt;br /&gt;
&lt;br /&gt;
State is updated to show success/error&lt;br /&gt;
&lt;br /&gt;
Data is logged to console (pending backend connection)&lt;br /&gt;
&lt;br /&gt;
'''Backend Integration (Planned):'''&lt;br /&gt;
All dynamic data (assignment, reviews) is currently fetched via route loader. Integration steps include:&lt;br /&gt;
&lt;br /&gt;
Fetching Data: Populate author and teammate reviews using API endpoints&lt;br /&gt;
&lt;br /&gt;
Saving Grades: Send POST/PUT requests to submit final grades, comments, and penalties&lt;br /&gt;
&lt;br /&gt;
Missing Reviews: Highlight when peer review data is unavailable&lt;br /&gt;
&lt;br /&gt;
=== UI Structure ===&lt;br /&gt;
&lt;br /&gt;
'''1. Page Header'''&lt;br /&gt;
&lt;br /&gt;
Assignment title&lt;br /&gt;
&lt;br /&gt;
Team name and topic&lt;br /&gt;
&lt;br /&gt;
Team members with links to profiles&lt;br /&gt;
&lt;br /&gt;
'''2. Review Section'''&lt;br /&gt;
&lt;br /&gt;
Rendered via reusable &amp;lt;ReviewTable /&amp;gt; component&lt;br /&gt;
&lt;br /&gt;
Empty state notices for missing reviews&lt;br /&gt;
&lt;br /&gt;
'''3. Grade Form'''&lt;br /&gt;
&lt;br /&gt;
Inputs: Grade, Comment, Late Penalty&lt;br /&gt;
&lt;br /&gt;
Success/error message feedback&lt;br /&gt;
&lt;br /&gt;
Validation on submit&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;AssignGrade.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import { useLocation, useLoaderData } from 'react-router-dom';&lt;br /&gt;
import { useState } from 'react';&lt;br /&gt;
import ReviewTable from '../../components/HeatGrid/ReviewTable'; // HeatGrid component for displaying reviews in tabular format&lt;br /&gt;
import { convertReviewDataToHeatMap, LoaderOutput } from './AssignmentUtil';&lt;br /&gt;
&lt;br /&gt;
const AssignGrade = () =&amp;gt; {&lt;br /&gt;
  // Accessing navigation state passed from the previous route (team name, topic, team members)&lt;br /&gt;
  const location = useLocation();&lt;br /&gt;
  console.log(&amp;quot;Location state:&amp;quot;, location.state);&lt;br /&gt;
&lt;br /&gt;
  // Getting the assignment and review data from the route loader&lt;br /&gt;
  const { assignment, reviews } = useLoaderData() as LoaderOutput;&lt;br /&gt;
&lt;br /&gt;
  // State variables to manage form data and UI state&lt;br /&gt;
  const [grade, setGrade] = useState('');&lt;br /&gt;
  const [comment, setComment] = useState('');&lt;br /&gt;
  const [latePenalty, setLatePenalty] = useState('');&lt;br /&gt;
  const [showSuccess, setShowSuccess] = useState(false);&lt;br /&gt;
  const [error, setError] = useState('');&lt;br /&gt;
&lt;br /&gt;
  // Converting raw review data into a format suitable for HeatGrid (peer reviews)&lt;br /&gt;
  const authorReviewes = convertReviewDataToHeatMap(reviews.author_feedback_reviews);&lt;br /&gt;
  // Converting teammate reviews similarly&lt;br /&gt;
  const teamReviews = convertReviewDataToHeatMap(reviews.teammate_reviews);&lt;br /&gt;
&lt;br /&gt;
  // Handle submission of grade and comment&lt;br /&gt;
  const handleSubmit = (e: React.FormEvent) =&amp;gt; {&lt;br /&gt;
    e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
    // Validate required fields&lt;br /&gt;
    if (!grade.trim() || !comment.trim()) {&lt;br /&gt;
      setError('Both grade and comment are required');&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Reset error and show success message&lt;br /&gt;
    setError('');&lt;br /&gt;
    setShowSuccess(true);&lt;br /&gt;
&lt;br /&gt;
    // Logging submitted data (in production this would be replaced with an API call)&lt;br /&gt;
    console.log('Grade submitted:', grade, 'Comment:', comment, 'Late Penalty:', latePenalty);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div style={{&lt;br /&gt;
      maxWidth: '1000px',&lt;br /&gt;
      margin: '2rem auto',&lt;br /&gt;
      padding: '2rem',&lt;br /&gt;
      backgroundColor: '#fff',&lt;br /&gt;
      borderRadius: '10px',&lt;br /&gt;
      boxShadow: '0 4px 10px rgba(0,0,0,0.1)'&lt;br /&gt;
    }}&amp;gt;&lt;br /&gt;
      {/* Success message after grade is submitted */}&lt;br /&gt;
      {showSuccess &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;div style={{ backgroundColor: '#d1fae5', padding: '1rem', marginBottom: '1rem', border: '1px solid #10b981', color: '#065f46' }}&amp;gt;&lt;br /&gt;
          Grade and comment saved!&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {/* Assignment title */}&lt;br /&gt;
      &amp;lt;h1 style={{ fontSize: '1.8rem', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
        Summary Report for Assignment: {assignment.name}&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Team and topic details from navigation state */}&lt;br /&gt;
      &amp;lt;div style={{ margin: '1rem 0' }}&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Team:&amp;lt;/strong&amp;gt; {location.state?.teamName || 'Unknown Team'}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div style={{ margin: '1rem 0' }}&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Topic:&amp;lt;/strong&amp;gt; {location.state?.topicName || 'Unknown Topic'}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Placeholder button for viewing the submission */}&lt;br /&gt;
      &amp;lt;button style={{ padding: '0.5rem 1rem', backgroundColor: '#eee', border: '1px solid #ccc', marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
        Show Submission&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Peer review section */}&lt;br /&gt;
      &amp;lt;h3 style={{ margin: '1rem 0', textAlign: 'left' }}&amp;gt;&lt;br /&gt;
        Peer Review&lt;br /&gt;
      &amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {authorReviewes.length !== 0 ? (&lt;br /&gt;
        &amp;lt;ReviewTable reviews={authorReviewes} /&amp;gt;&lt;br /&gt;
      ) : (&lt;br /&gt;
        &amp;lt;div style={{ backgroundColor: '#fffbcc', padding: '1rem', marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
          &amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; No data provided for peer reviews table.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {/* Displaying list of teammates with profile links */}&lt;br /&gt;
      &amp;lt;div style={{ margin: '1rem 0', paddingLeft: '1rem' }}&amp;gt;&lt;br /&gt;
        &amp;lt;strong&amp;gt;Teammates:  &amp;lt;/strong&amp;gt;&lt;br /&gt;
        &amp;lt;span style={{ marginTop: '0.5rem', fontSize: '1rem' }}&amp;gt;&lt;br /&gt;
          {location.state?.teamMembers?.map((member: { id: number; name: string }, index: number) =&amp;gt; (&lt;br /&gt;
            &amp;lt;span key={member.id} style={{ marginRight: '0.5rem' }}&amp;gt;&lt;br /&gt;
              &amp;lt;a href={`/students/${member.id}`} style={{ color: '#a67c52', textDecoration: 'none' }}&amp;gt;&lt;br /&gt;
                {member.name}&lt;br /&gt;
              &amp;lt;/a&amp;gt;&lt;br /&gt;
              {index &amp;lt; location.state.teamMembers.length - 1 ? ',' : ''}&lt;br /&gt;
            &amp;lt;/span&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
        &amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Teammate review section */}&lt;br /&gt;
      {teamReviews.length !== 0 &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;h3 style={{ margin: '1rem 0', textAlign: 'left' }}&amp;gt;&lt;br /&gt;
          Teammate Review&lt;br /&gt;
        &amp;lt;/h3&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {teamReviews.length !== 0 ? (&lt;br /&gt;
        &amp;lt;ReviewTable reviews={teamReviews} /&amp;gt;&lt;br /&gt;
      ) : (&lt;br /&gt;
        &amp;lt;div style={{ backgroundColor: '#fffbcc', padding: '1rem', marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
          &amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; No data provided for teammate reviews table.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      {/* Grade and comment input form */}&lt;br /&gt;
      &amp;lt;h3&amp;gt;Grade and Comment for Submission&amp;lt;/h3&amp;gt;&lt;br /&gt;
      {error &amp;amp;&amp;amp; &amp;lt;div style={{ color: 'red', marginBottom: '1rem' }}&amp;gt;{error}&amp;lt;/div&amp;gt;}&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;form onSubmit={handleSubmit}&amp;gt;&lt;br /&gt;
        {/* Grade input */}&lt;br /&gt;
        &amp;lt;label&amp;gt;Grade:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input&lt;br /&gt;
          type=&amp;quot;text&amp;quot;&lt;br /&gt;
          value={grade}&lt;br /&gt;
          onChange={e =&amp;gt; setGrade(e.target.value)}&lt;br /&gt;
          style={{ width: '100%', padding: '0.5rem', marginBottom: '1rem' }}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        {/* Comment textarea */}&lt;br /&gt;
        &amp;lt;label&amp;gt;Comment:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;textarea&lt;br /&gt;
          value={comment}&lt;br /&gt;
          onChange={e =&amp;gt; setComment(e.target.value)}&lt;br /&gt;
          rows={4}&lt;br /&gt;
          style={{ width: '100%', padding: '0.5rem' }}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        {/* Late penalty input */}&lt;br /&gt;
        &amp;lt;label&amp;gt;Late Penalty:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input&lt;br /&gt;
          type=&amp;quot;text&amp;quot;&lt;br /&gt;
          value={latePenalty}&lt;br /&gt;
          onChange={e =&amp;gt; setLatePenalty(e.target.value)}&lt;br /&gt;
          style={{ width: '100%', padding: '0.5rem', marginBottom: '1rem' }}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot; style={{ marginTop: '1rem', padding: '0.5rem 1rem' }}&amp;gt;&lt;br /&gt;
          Save&lt;br /&gt;
        &amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default AssignGrade;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Tech Stack:'''&lt;br /&gt;
React (TypeScript), React Router, HeatGrid-based ReviewTable, Inline CSS&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:'''&lt;br /&gt;
&lt;br /&gt;
Light green alert for successful submission&lt;br /&gt;
&lt;br /&gt;
Yellow info boxes for missing peer review data&lt;br /&gt;
&lt;br /&gt;
Red error text for form validation&lt;br /&gt;
&lt;br /&gt;
=== Screenshots ===&lt;br /&gt;
&lt;br /&gt;
'''AssignGrade View:'''&lt;br /&gt;
[[File:AssignGrade1.png|800px|center]]&lt;br /&gt;
[[File:AssignGrade2.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''Validation Alert:'''&lt;br /&gt;
[[File:AssignGrade3.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''Success Message:'''&lt;br /&gt;
[[File:AssignGrade4.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
* Actor: Student&lt;br /&gt;
** The student initiates the interaction with the system by clicking on **Grades View** from the main page.&lt;br /&gt;
* System Boundary&lt;br /&gt;
** Once inside the grading/feedback system, the student can:&lt;br /&gt;
*** View Grades for a Given Assignment&lt;br /&gt;
**** Allows the student to see the overall grading details for a specific assignment.&lt;br /&gt;
**** Redirects to the Stats page.&lt;br /&gt;
*** Show Submission&lt;br /&gt;
**** Displays the submitted work details for the student’s assignment.&lt;br /&gt;
**** Redirects to the Submissions page.&lt;br /&gt;
*** Show Reviews&lt;br /&gt;
**** Displays the peer or instructor reviews received.&lt;br /&gt;
**** Redirects to the Reviews page.&lt;br /&gt;
*** Show Author Feedback&lt;br /&gt;
**** Shows feedback provided by the author (instructor or peer).&lt;br /&gt;
**** Redirects to the Author Feedback page.&lt;br /&gt;
*** Teammate Review&lt;br /&gt;
**** Allows viewing or giving feedback on teammates’ work.&lt;br /&gt;
*** Average / Range&lt;br /&gt;
**** For each category (assignment, reviews, feedback), the system can display average scores or range of scores.&lt;br /&gt;
*** Back&lt;br /&gt;
**** Provides an option to navigate back to the main page or the previous screen.&lt;br /&gt;
* Redirect to Main Page&lt;br /&gt;
** After the student finishes viewing grades, submissions, reviews, or feedback, they can return to the main page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Test Environment ===&lt;br /&gt;
The tests use the following libraries and tools:&lt;br /&gt;
&lt;br /&gt;
* '''Jest:''' JavaScript testing framework&lt;br /&gt;
* '''React Testing Library:''' Testing utilities for React components&lt;br /&gt;
* '''Jest DOM:''' Custom Jest matchers for asserting on DOM elements&lt;br /&gt;
* All tests pass successfully, indicating that the ViewSubmissions and AssignGrade components are functioning as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:testcases.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164352</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164352"/>
		<updated>2025-04-21T04:23:14Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* 2. Assign Grade Page */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File:UI-1.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:UI-2.png|900px|center]]&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The revamped &amp;quot;View Submissions&amp;quot; table serves as a central hub for instructors to access and evaluate team performance efficiently. It is designed to be responsive, informative, and action-oriented, and is fully integrated with backend APIs to ensure data is always current.&lt;br /&gt;
&lt;br /&gt;
'''Key Features:'''&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:''' Adapts to mobile, tablet, and desktop screens. Columns collapse intelligently to ensure readability.&lt;br /&gt;
&lt;br /&gt;
'''Team Overview:''' Each row lists the team name, associated members, and their submission topic, all fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
'''Direct Action Links:''' Provides context-aware links such as &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot; within the table.&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:''' Highlights missing or incomplete submissions, allowing instructors to take quick action.&lt;br /&gt;
&lt;br /&gt;
'''Integrated Accessibility:''' Table supports screen readers and keyboard navigation out of the box.&lt;br /&gt;
&lt;br /&gt;
'''Performance Optimized:''' Efficient rendering through virtual scrolling and memoization for large datasets.&lt;br /&gt;
&lt;br /&gt;
'''Backend Integration:''' Data is retrieved via RESTful API endpoints, enabling real-time synchronization with the Expertiza database.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. View Submissions Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective ===&lt;br /&gt;
The View Submissions page in Expertiza provides instructors and TAs with a streamlined, responsive interface to evaluate team submissions. This modernized interface includes full backend integration, dynamic UI rendering, accessibility support, and robust error handling.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Fully Integrated with Backend:''' All team data is fetched dynamically using RESTful API, developed required backend for the task.&lt;br /&gt;
* '''Responsive UI:''' Layout adapts seamlessly across mobile, tablet, and desktop.&lt;br /&gt;
* '''Actionable Buttons:''' Each row includes direct links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot;.&lt;br /&gt;
* '''Accessibility Features:''' ARIA tags, keyboard navigation, and screen reader support.&lt;br /&gt;
* '''Optimized Performance:''' Virtual scrolling and memoization ensure smooth rendering.&lt;br /&gt;
* '''Real-Time Synchronization:''' Live data synced with Expertiza backend.&lt;br /&gt;
&lt;br /&gt;
=== Data Structure ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=\&amp;quot;typescript\&amp;quot;&amp;gt;&lt;br /&gt;
interface ITeamSubmission {&lt;br /&gt;
  id: number;&lt;br /&gt;
  teamName: string;&lt;br /&gt;
  teamMembers: { name: string; id: number }[];&lt;br /&gt;
  historyLink: string;&lt;br /&gt;
  topic?: string;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import React, { useMemo } from 'react';&lt;br /&gt;
import { createColumnHelper } from &amp;quot;@tanstack/react-table&amp;quot;;&lt;br /&gt;
import Table from &amp;quot;components/Table/Table&amp;quot;;&lt;br /&gt;
import { useLoaderData } from 'react-router-dom';&lt;br /&gt;
import { ITeamRow, TeamSubmission } from './AssignmentUtil';&lt;br /&gt;
&lt;br /&gt;
// Column helper to define typed table columns&lt;br /&gt;
const columnHelper = createColumnHelper&amp;lt;ITeamRow&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
const ViewSubmissions: React.FC = () =&amp;gt; {&lt;br /&gt;
  // Fetch data loaded from route loader (assignment teams)&lt;br /&gt;
  const assignment = useLoaderData() as TeamSubmission[];&lt;br /&gt;
&lt;br /&gt;
  // Transform the backend response to a table-friendly structure&lt;br /&gt;
  const submissions = useMemo&amp;lt;ITeamRow[]&amp;gt;(() =&amp;gt;&lt;br /&gt;
    assignment.map((team) =&amp;gt; ({&lt;br /&gt;
      id: team.id,&lt;br /&gt;
      teamName: team.name,&lt;br /&gt;
      teamMembers: team.members,&lt;br /&gt;
      historyLink: `/history/${team.team_id}`,&lt;br /&gt;
    }))&lt;br /&gt;
  , [assignment]);&lt;br /&gt;
&lt;br /&gt;
  // Define the columns used in the table&lt;br /&gt;
  const columns = useMemo(() =&amp;gt; [&lt;br /&gt;
    columnHelper.accessor('teamName', {&lt;br /&gt;
      header: 'Team Name',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ color: 'brown', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
          {info.getValue()}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.accessor('teamMembers', {&lt;br /&gt;
      header: 'Team Member(s)',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          {info.getValue().map((member) =&amp;gt; (&lt;br /&gt;
            &amp;lt;div key={member.id}&amp;gt;&lt;br /&gt;
              &amp;lt;a href={`/students/${member.id}`} style={{ color: '#b44' }}&amp;gt;&lt;br /&gt;
                {member.name}&lt;br /&gt;
              &amp;lt;/a&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.display({&lt;br /&gt;
      id: 'links',&lt;br /&gt;
      header: 'Links',&lt;br /&gt;
      cell: ({ row }) =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ display: 'flex', flexDirection: 'column' }}&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={`/assign_grade/${row.original.id}`}&lt;br /&gt;
            style={{ color: '#b44', marginBottom: '4px' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            Assign Grade&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={row.original.historyLink}&lt;br /&gt;
            style={{ color: '#b44' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            History&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
  ], []);&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div className=&amp;quot;mt-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 className=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
        View Submissions - {assignment[0]?.topic || 'Assignment'}&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Render dynamic table of submissions */}&lt;br /&gt;
      &amp;lt;Table&lt;br /&gt;
        data={submissions}&lt;br /&gt;
        columns={columns}&lt;br /&gt;
        columnVisibility={{&lt;br /&gt;
          id: false, // Hide the 'id' column from UI&lt;br /&gt;
        }}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default ViewSubmissions;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Fetches data with &amp;lt;code&amp;gt;loadAssignmentTeams()&amp;lt;/code&amp;gt; via the route's loader&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
// Middleware to fetch teams for assignment &lt;br /&gt;
export async function loadAssignmentTeams({ params }: {id:string}) {&lt;br /&gt;
  let teamsData = [];&lt;br /&gt;
&lt;br /&gt;
  if (params.id) {&lt;br /&gt;
    const response = await axiosClient.get(`/assignments/${params.id}/teams`);&lt;br /&gt;
    teamsData = response.data;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return teamsData;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;@tanstack/react-table&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;createColumnHelper&amp;lt;/code&amp;gt; for table config&lt;br /&gt;
* Displays columns: Team Name, Members, Assign Grade, and History&lt;br /&gt;
* Bootstrap-styled; includes keyboard and screen reader accessibility&lt;br /&gt;
&lt;br /&gt;
=== Backend Controller Code ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def teams&lt;br /&gt;
  assignment = Assignment.find_by(id: params[:assignment_id])&lt;br /&gt;
&lt;br /&gt;
  if assignment.nil?&lt;br /&gt;
    render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  submissions = if assignment.has_teams?&lt;br /&gt;
    assignment.teams.includes(:teams_users =&amp;gt; :user).map do |team|&lt;br /&gt;
      signed_up_team = team.signed_up_teams.first&lt;br /&gt;
      topic = signed_up_team&amp;amp;.sign_up_topic&amp;amp;.topic_name&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        name: team.name,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        topic: topic,&lt;br /&gt;
        members: team.teams_users.map { |tu| { id: tu.user.id, name: tu.user.name } }&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    assignment.participants.includes(:user).map do |participant|&lt;br /&gt;
      {&lt;br /&gt;
        id: participant.id,&lt;br /&gt;
        name: participant.user.name,&lt;br /&gt;
        team_id: nil,&lt;br /&gt;
        topic: nil,&lt;br /&gt;
        members: [{ id: participant.user.id, name: participant.user.name }]&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  render json: submissions, status: :ok&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Documentation ===&lt;br /&gt;
* '''Endpoint:''' &amp;lt;code&amp;gt;GET /api/v1/assignments/:assignment_id/teams&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Returns:''' Array of team info, members, and topic&lt;br /&gt;
* '''Swagger Docs:''' [http://152.7.177.242:3002/api-docs/index.html Swagger UI]&lt;br /&gt;
&lt;br /&gt;
=== Sample JSON Response ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Texas penguins&amp;quot;,&lt;br /&gt;
    &amp;quot;team_id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;topic&amp;quot;: &amp;quot;Progressive fresh-thinking middleware&amp;quot;,&lt;br /&gt;
    &amp;quot;members&amp;quot;: [&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 20, &amp;quot;name&amp;quot;: &amp;quot;erlinda.grimes&amp;quot; },&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 21, &amp;quot;name&amp;quot;: &amp;quot;lawanda.wilkinson&amp;quot; }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seeding Changes ===&lt;br /&gt;
&lt;br /&gt;
To test the View Submissions feature thoroughly, we updated `db/seeds.rb` to include realistic assignments, topics, teams, and student-user mappings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
# SignUpTopics&lt;br /&gt;
signup_topics = assignments.flat_map do |assignment|&lt;br /&gt;
  5.times.map do&lt;br /&gt;
    SignUpTopic.create!(&lt;br /&gt;
      topic_name: Faker::Company.catch_phrase,&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      max_choosers: 2,&lt;br /&gt;
      category: &amp;quot;Default&amp;quot;,&lt;br /&gt;
      topic_identifier: Faker::Alphanumeric.alpha(number: 8).upcase,&lt;br /&gt;
      description: Faker::Lorem.sentence&lt;br /&gt;
    )&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# SignedUpTeams&lt;br /&gt;
teams.each_with_index do |team, idx|&lt;br /&gt;
  SignedUpTeam.create!(&lt;br /&gt;
    sign_up_topic_id: signup_topics[idx % signup_topics.length].id,&lt;br /&gt;
    team_id: team.id,&lt;br /&gt;
    is_waitlisted: false,&lt;br /&gt;
    preference_priority_number: 1&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Participants&lt;br /&gt;
students.each_with_index do |student, idx|&lt;br /&gt;
  Participant.create!(&lt;br /&gt;
    user_id: student.id,&lt;br /&gt;
    assignment_id: assignments[idx % assignments.length].id,&lt;br /&gt;
    team_id: teams[idx % teams.length].id&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ensures every team has students, a valid assignment, and a topic&lt;br /&gt;
* Prepares data for consistent API response&lt;br /&gt;
* Essential for local testing and API verification&lt;br /&gt;
&lt;br /&gt;
This implementation was inspired by prior work in the Expertiza backend [https://github.com/expertiza/reimplementation-back-end/pull/173 (PR #173)], and extended in our custom implementation documented here: [https://github.com/expertiza/reimplementation-back-end/pull/190 (PR #190)].&lt;br /&gt;
&lt;br /&gt;
=== UI Previews ===&lt;br /&gt;
Visual confirmation of the working interface with accessible design, action buttons, and responsive layout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== View Assignments Page ====&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-1-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-1-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-1-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== View Submissions Page ===&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-2-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-2-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-2-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Assign Grade Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective === &lt;br /&gt;
The Assign Grade page offers instructors and TAs a clean, focused interface to view a selected team’s peer review feedback and submit final grades and comments for a given assignment. It aims to facilitate final assessment while ensuring all required fields are completed.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
'''Team Overview &amp;amp; Submission Summary:''' The page prominently displays the selected team's name and placeholder data for the assignment name and average peer review score.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Review Tables:''' Two sections show structured feedback: Author Feedback Reviews and Teammate Reviews. Each table entry includes the reviewer’s ID, comments, score, and date, offering a transparent view of peer evaluation.&lt;br /&gt;
&lt;br /&gt;
'''Grade Submission Form:''' Inputs for grade and instructor comments. A &amp;quot;Save&amp;quot; button to confirm and log the grading action. Validates input fields, preventing empty submissions and displaying appropriate error messages.&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:''' Success and error alerts provide immediate UI feedback upon submission or missing inputs. Subtle UI enhancements such as card-style boxes, badges, and table formatting for clarity and user comfort.&lt;br /&gt;
&lt;br /&gt;
'''Placeholder for Backend Integration:''' Currently, the grade and comment submission is logged via console.log. Integration with backend APIs can be achieved by:&lt;br /&gt;
&lt;br /&gt;
Fetching peer review data: Using an API to dynamically populate review tables.&lt;br /&gt;
&lt;br /&gt;
Submitting grades/comments: Making a POST or PUT request to a grading endpoint.&lt;br /&gt;
&lt;br /&gt;
Calculating average scores: Pulling peer scores from a backend service to compute and display an actual average.&lt;br /&gt;
&lt;br /&gt;
=== Data Structure ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=\&amp;quot;typescript\&amp;quot;&amp;gt;&lt;br /&gt;
interface ITeamSubmission {&lt;br /&gt;
  id: number;&lt;br /&gt;
  teamName: string;&lt;br /&gt;
  teamMembers: { name: string; id: number }[];&lt;br /&gt;
  historyLink: string;&lt;br /&gt;
  topic?: string;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;AssignGrade.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Tech Stack:''' React (TypeScript), Inline CSS (JSX style objects), React Router&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import { useLocation } from 'react-router-dom';&lt;br /&gt;
import { useState } from 'react';&lt;br /&gt;
&lt;br /&gt;
interface ReviewData {&lt;br /&gt;
  id: number;&lt;br /&gt;
  reviewer_id: number;&lt;br /&gt;
  comments: string;&lt;br /&gt;
  score: number;&lt;br /&gt;
  created_at: string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const AssignGrade = () =&amp;gt; {&lt;br /&gt;
  const location = useLocation();&lt;br /&gt;
  const [grade, setGrade] = useState('');&lt;br /&gt;
  const [comment, setComment] = useState('');&lt;br /&gt;
  const [showSuccess, setShowSuccess] = useState(false);&lt;br /&gt;
  const [error, setError] = useState('');&lt;br /&gt;
&lt;br /&gt;
  const ReviewTable = ({ title, data }: { title: string; data: ReviewData[] }) =&amp;gt; (&lt;br /&gt;
    &amp;lt;div style={{ margin: '2rem 0' }}&amp;gt;&lt;br /&gt;
      &amp;lt;h4 style={{ &lt;br /&gt;
        fontSize: '1.1rem',&lt;br /&gt;
        fontWeight: 'bold',&lt;br /&gt;
        borderBottom: '2px solid #eee',&lt;br /&gt;
        paddingBottom: '0.5rem',&lt;br /&gt;
        marginBottom: '1rem'&lt;br /&gt;
      }}&amp;gt;&lt;br /&gt;
        {title}&lt;br /&gt;
      &amp;lt;/h4&amp;gt;&lt;br /&gt;
      &amp;lt;div style={{ &lt;br /&gt;
        border: '1px solid #ddd',&lt;br /&gt;
        borderRadius: '8px',&lt;br /&gt;
        overflow: 'hidden'&lt;br /&gt;
      }}&amp;gt;&lt;br /&gt;
        &amp;lt;div style={{ &lt;br /&gt;
          display: 'flex',&lt;br /&gt;
          backgroundColor: '#f8f9fa',&lt;br /&gt;
          padding: '1rem',&lt;br /&gt;
          borderBottom: '1px solid #ddd'&lt;br /&gt;
        }}&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 1, fontWeight: 600 }}&amp;gt;Reviewer&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 3, fontWeight: 600 }}&amp;gt;Comments&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 1, fontWeight: 600 }}&amp;gt;Score&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 1, fontWeight: 600 }}&amp;gt;Date&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        {data.map((review) =&amp;gt; (&lt;br /&gt;
          &amp;lt;div key={review.id} style={{ &lt;br /&gt;
            display: 'flex',&lt;br /&gt;
            padding: '1rem',&lt;br /&gt;
            borderBottom: &lt;br /&gt;
              data.indexOf(review) === data.length - 1 &lt;br /&gt;
                ? 'none' &lt;br /&gt;
                : '1px solid #ddd'&lt;br /&gt;
          }}&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 1 }}&amp;gt;User #{review.reviewer_id}&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 3 }}&amp;gt;{review.comments}&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 1 }}&amp;gt;{review.score}/5&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 1 }}&amp;gt;&lt;br /&gt;
              {new Date(review.created_at).toLocaleDateString()}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
        ))}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  const handleSubmit = (e: React.FormEvent) =&amp;gt; {&lt;br /&gt;
    e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
    if (!grade.trim() || !comment.trim()) {&lt;br /&gt;
      setError('Both grade and comment are required');&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    setError('');&lt;br /&gt;
    console.log('Grade:', grade, 'Comment:', comment);&lt;br /&gt;
    setShowSuccess(true);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const styles = {&lt;br /&gt;
    container: {&lt;br /&gt;
      maxWidth: '700px',&lt;br /&gt;
      margin: '2rem auto',&lt;br /&gt;
      padding: '2rem',&lt;br /&gt;
      backgroundColor: '#fff',&lt;br /&gt;
      borderRadius: '10px',&lt;br /&gt;
      boxShadow: '0 4px 10px rgba(0,0,0,0.1)',&lt;br /&gt;
      fontFamily: 'Arial, sans-serif',&lt;br /&gt;
    },&lt;br /&gt;
    heading: {&lt;br /&gt;
      fontSize: '1.8rem',&lt;br /&gt;
      fontWeight: 'bold',&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
    },&lt;br /&gt;
    label: {&lt;br /&gt;
      fontWeight: 'bold',&lt;br /&gt;
      display: 'block',&lt;br /&gt;
      marginBottom: '0.5rem',&lt;br /&gt;
    },&lt;br /&gt;
    input: {&lt;br /&gt;
      width: '100%',&lt;br /&gt;
      padding: '0.6rem',&lt;br /&gt;
      border: '1px solid #ccc',&lt;br /&gt;
      borderRadius: '5px',&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
    },&lt;br /&gt;
    textarea: {&lt;br /&gt;
      width: '100%',&lt;br /&gt;
      padding: '0.6rem',&lt;br /&gt;
      border: '1px solid #ccc',&lt;br /&gt;
      borderRadius: '5px',&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
    },&lt;br /&gt;
    button: {&lt;br /&gt;
      padding: '0.6rem 1.2rem',&lt;br /&gt;
      border: '1px solid #888',&lt;br /&gt;
      backgroundColor: '#f0f0f0',&lt;br /&gt;
      borderRadius: '5px',&lt;br /&gt;
      cursor: 'pointer',&lt;br /&gt;
    },&lt;br /&gt;
    message: {&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
      padding: '0.75rem',&lt;br /&gt;
      borderRadius: '6px',&lt;br /&gt;
    },&lt;br /&gt;
    success: {&lt;br /&gt;
      backgroundColor: '#d1fae5',&lt;br /&gt;
      color: '#065f46',&lt;br /&gt;
      border: '1px solid #10b981',&lt;br /&gt;
    },&lt;br /&gt;
    error: {&lt;br /&gt;
      backgroundColor: '#fee2e2',&lt;br /&gt;
      color: '#b91c1c',&lt;br /&gt;
      border: '1px solid #ef4444',&lt;br /&gt;
    },&lt;br /&gt;
    warning: {&lt;br /&gt;
      backgroundColor: '#fef3c7',&lt;br /&gt;
      color: '#92400e',&lt;br /&gt;
      border: '1px solid #f59e0b',&lt;br /&gt;
      marginBottom: '0.5rem',&lt;br /&gt;
    },&lt;br /&gt;
    badge: {&lt;br /&gt;
      backgroundColor: '#d1fae5',&lt;br /&gt;
      color: '#065f46',&lt;br /&gt;
      padding: '0.2rem 0.5rem',&lt;br /&gt;
      borderRadius: '6px',&lt;br /&gt;
      fontSize: '0.9rem',&lt;br /&gt;
    },&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div style={styles.container}&amp;gt;&lt;br /&gt;
      {showSuccess &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;div style={{ ...styles.message, ...styles.success }}&amp;gt;&lt;br /&gt;
          Grade and comment for submission successfully saved.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;h1 style={styles.heading}&amp;gt;&lt;br /&gt;
        Summary Report for assignment: Program 1&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div style={{ marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
        &amp;lt;span style={styles.label}&amp;gt;Team:&amp;lt;/span&amp;gt;&lt;br /&gt;
        {location.state?.teamName || 'Unknown Team'}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div style={{ marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
        &amp;lt;span style={styles.label}&amp;gt;Average peer review score:&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span style={styles.badge}&amp;gt;N/A&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;button style={styles.button}&amp;gt;Show Submission&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;ReviewTable &lt;br /&gt;
        title=&amp;quot;Author Feedback Reviews&amp;quot;&lt;br /&gt;
        data={[&lt;br /&gt;
          {&lt;br /&gt;
            id: 1,&lt;br /&gt;
            reviewer_id: 4,&lt;br /&gt;
            comments: &amp;quot;Excellent documentation quality&amp;quot;,&lt;br /&gt;
            score: 4.5,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T14:48:00Z&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            id: 2,&lt;br /&gt;
            reviewer_id: 5,&lt;br /&gt;
            comments: &amp;quot;Very thorough implementation&amp;quot;,&lt;br /&gt;
            score: 4.8,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T15:12:00Z&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;ReviewTable&lt;br /&gt;
        title=&amp;quot;Teammate Reviews&amp;quot;&lt;br /&gt;
        data={[&lt;br /&gt;
          {&lt;br /&gt;
            id: 3,&lt;br /&gt;
            reviewer_id: 5,&lt;br /&gt;
            comments: &amp;quot;Great collaboration skills&amp;quot;,&lt;br /&gt;
            score: 4.0,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T15:30:00Z&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            id: 4,&lt;br /&gt;
            reviewer_id: 4,&lt;br /&gt;
            comments: &amp;quot;Consistent code quality&amp;quot;,&lt;br /&gt;
            score: 4.2,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T16:45:00Z&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;h3 style={{ ...styles.label, fontSize: '1.2rem' }}&amp;gt;&lt;br /&gt;
        Grade and Comment for Submission&lt;br /&gt;
      &amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {error &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;div style={{ ...styles.message, ...styles.error }}&amp;gt;{error}&amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;form onSubmit={handleSubmit}&amp;gt;&lt;br /&gt;
        &amp;lt;label style={styles.label}&amp;gt;Grade:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input&lt;br /&gt;
          type=&amp;quot;text&amp;quot;&lt;br /&gt;
          style={styles.input}&lt;br /&gt;
          value={grade}&lt;br /&gt;
          onChange={(e) =&amp;gt; setGrade(e.target.value)}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;label style={styles.label}&amp;gt;Comment:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;textarea&lt;br /&gt;
          rows={4}&lt;br /&gt;
          style={styles.textarea}&lt;br /&gt;
          value={comment}&lt;br /&gt;
          onChange={(e) =&amp;gt; setComment(e.target.value)}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot; style={styles.button}&amp;gt;&lt;br /&gt;
          Save&lt;br /&gt;
        &amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default AssignGrade;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current Limitations ===&lt;br /&gt;
&lt;br /&gt;
'''No Backend Integration Yet:''' All data is hardcoded. Integration with actual APIs for fetching and submitting data is needed to make the page functional.&lt;br /&gt;
&lt;br /&gt;
=== UI Previews ===&lt;br /&gt;
&lt;br /&gt;
'''1. AssignGrade Page''' [[File:AssignGrade1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:AssignGrade2.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Incomplete field alert''' [[File:AssignGrade3.png|800px|center]]&lt;br /&gt;
'''3. Submission confirmation '''[[File:AssignGrade4.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
* Actor: Student&lt;br /&gt;
** The student initiates the interaction with the system by clicking on **Grades View** from the main page.&lt;br /&gt;
* System Boundary&lt;br /&gt;
** Once inside the grading/feedback system, the student can:&lt;br /&gt;
*** View Grades for a Given Assignment&lt;br /&gt;
**** Allows the student to see the overall grading details for a specific assignment.&lt;br /&gt;
**** Redirects to the Stats page.&lt;br /&gt;
*** Show Submission&lt;br /&gt;
**** Displays the submitted work details for the student’s assignment.&lt;br /&gt;
**** Redirects to the Submissions page.&lt;br /&gt;
*** Show Reviews&lt;br /&gt;
**** Displays the peer or instructor reviews received.&lt;br /&gt;
**** Redirects to the Reviews page.&lt;br /&gt;
*** Show Author Feedback&lt;br /&gt;
**** Shows feedback provided by the author (instructor or peer).&lt;br /&gt;
**** Redirects to the Author Feedback page.&lt;br /&gt;
*** Teammate Review&lt;br /&gt;
**** Allows viewing or giving feedback on teammates’ work.&lt;br /&gt;
*** Average / Range&lt;br /&gt;
**** For each category (assignment, reviews, feedback), the system can display average scores or range of scores.&lt;br /&gt;
*** Back&lt;br /&gt;
**** Provides an option to navigate back to the main page or the previous screen.&lt;br /&gt;
* Redirect to Main Page&lt;br /&gt;
** After the student finishes viewing grades, submissions, reviews, or feedback, they can return to the main page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Test Environment ===&lt;br /&gt;
The tests use the following libraries and tools:&lt;br /&gt;
&lt;br /&gt;
* '''Jest:''' JavaScript testing framework&lt;br /&gt;
* '''React Testing Library:''' Testing utilities for React components&lt;br /&gt;
* '''Jest DOM:''' Custom Jest matchers for asserting on DOM elements&lt;br /&gt;
* All tests pass successfully, indicating that the ViewSubmissions and AssignGrade components are functioning as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:testcases.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade4.png&amp;diff=164351</id>
		<title>File:AssignGrade4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade4.png&amp;diff=164351"/>
		<updated>2025-04-21T04:17:48Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade3.png&amp;diff=164350</id>
		<title>File:AssignGrade3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade3.png&amp;diff=164350"/>
		<updated>2025-04-21T04:17:29Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade2.png&amp;diff=164349</id>
		<title>File:AssignGrade2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade2.png&amp;diff=164349"/>
		<updated>2025-04-21T04:17:08Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade1.png&amp;diff=164348</id>
		<title>File:AssignGrade1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:AssignGrade1.png&amp;diff=164348"/>
		<updated>2025-04-21T04:16:43Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164346</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=164346"/>
		<updated>2025-04-21T04:01:27Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* 1. View Submissions Page */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File:UI-1.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:UI-2.png|900px|center]]&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The revamped &amp;quot;View Submissions&amp;quot; table serves as a central hub for instructors to access and evaluate team performance efficiently. It is designed to be responsive, informative, and action-oriented, and is fully integrated with backend APIs to ensure data is always current.&lt;br /&gt;
&lt;br /&gt;
'''Key Features:'''&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:''' Adapts to mobile, tablet, and desktop screens. Columns collapse intelligently to ensure readability.&lt;br /&gt;
&lt;br /&gt;
'''Team Overview:''' Each row lists the team name, associated members, and their submission topic, all fetched dynamically from the backend.&lt;br /&gt;
&lt;br /&gt;
'''Direct Action Links:''' Provides context-aware links such as &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot; within the table.&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:''' Highlights missing or incomplete submissions, allowing instructors to take quick action.&lt;br /&gt;
&lt;br /&gt;
'''Integrated Accessibility:''' Table supports screen readers and keyboard navigation out of the box.&lt;br /&gt;
&lt;br /&gt;
'''Performance Optimized:''' Efficient rendering through virtual scrolling and memoization for large datasets.&lt;br /&gt;
&lt;br /&gt;
'''Backend Integration:''' Data is retrieved via RESTful API endpoints, enabling real-time synchronization with the Expertiza database.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. View Submissions Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective ===&lt;br /&gt;
The View Submissions page in Expertiza provides instructors and TAs with a streamlined, responsive interface to evaluate team submissions. This modernized interface includes full backend integration, dynamic UI rendering, accessibility support, and robust error handling.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Fully Integrated with Backend:''' All team data is fetched dynamically using RESTful API, developed required backend for the task.&lt;br /&gt;
* '''Responsive UI:''' Layout adapts seamlessly across mobile, tablet, and desktop.&lt;br /&gt;
* '''Actionable Buttons:''' Each row includes direct links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;View History&amp;quot;.&lt;br /&gt;
* '''Accessibility Features:''' ARIA tags, keyboard navigation, and screen reader support.&lt;br /&gt;
* '''Optimized Performance:''' Virtual scrolling and memoization ensure smooth rendering.&lt;br /&gt;
* '''Real-Time Synchronization:''' Live data synced with Expertiza backend.&lt;br /&gt;
&lt;br /&gt;
=== Data Structure ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=\&amp;quot;typescript\&amp;quot;&amp;gt;&lt;br /&gt;
interface ITeamSubmission {&lt;br /&gt;
  id: number;&lt;br /&gt;
  teamName: string;&lt;br /&gt;
  teamMembers: { name: string; id: number }[];&lt;br /&gt;
  historyLink: string;&lt;br /&gt;
  topic?: string;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import React, { useMemo } from 'react';&lt;br /&gt;
import { createColumnHelper } from &amp;quot;@tanstack/react-table&amp;quot;;&lt;br /&gt;
import Table from &amp;quot;components/Table/Table&amp;quot;;&lt;br /&gt;
import { useLoaderData } from 'react-router-dom';&lt;br /&gt;
import { ITeamRow, TeamSubmission } from './AssignmentUtil';&lt;br /&gt;
&lt;br /&gt;
// Column helper to define typed table columns&lt;br /&gt;
const columnHelper = createColumnHelper&amp;lt;ITeamRow&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
const ViewSubmissions: React.FC = () =&amp;gt; {&lt;br /&gt;
  // Fetch data loaded from route loader (assignment teams)&lt;br /&gt;
  const assignment = useLoaderData() as TeamSubmission[];&lt;br /&gt;
&lt;br /&gt;
  // Transform the backend response to a table-friendly structure&lt;br /&gt;
  const submissions = useMemo&amp;lt;ITeamRow[]&amp;gt;(() =&amp;gt;&lt;br /&gt;
    assignment.map((team) =&amp;gt; ({&lt;br /&gt;
      id: team.id,&lt;br /&gt;
      teamName: team.name,&lt;br /&gt;
      teamMembers: team.members,&lt;br /&gt;
      historyLink: `/history/${team.team_id}`,&lt;br /&gt;
    }))&lt;br /&gt;
  , [assignment]);&lt;br /&gt;
&lt;br /&gt;
  // Define the columns used in the table&lt;br /&gt;
  const columns = useMemo(() =&amp;gt; [&lt;br /&gt;
    columnHelper.accessor('teamName', {&lt;br /&gt;
      header: 'Team Name',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ color: 'brown', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
          {info.getValue()}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.accessor('teamMembers', {&lt;br /&gt;
      header: 'Team Member(s)',&lt;br /&gt;
      cell: info =&amp;gt; (&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          {info.getValue().map((member) =&amp;gt; (&lt;br /&gt;
            &amp;lt;div key={member.id}&amp;gt;&lt;br /&gt;
              &amp;lt;a href={`/students/${member.id}`} style={{ color: '#b44' }}&amp;gt;&lt;br /&gt;
                {member.name}&lt;br /&gt;
              &amp;lt;/a&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
          ))}&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
    columnHelper.display({&lt;br /&gt;
      id: 'links',&lt;br /&gt;
      header: 'Links',&lt;br /&gt;
      cell: ({ row }) =&amp;gt; (&lt;br /&gt;
        &amp;lt;div style={{ display: 'flex', flexDirection: 'column' }}&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={`/assign_grade/${row.original.id}`}&lt;br /&gt;
            style={{ color: '#b44', marginBottom: '4px' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            Assign Grade&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
          &amp;lt;a&lt;br /&gt;
            href={row.original.historyLink}&lt;br /&gt;
            style={{ color: '#b44' }}&lt;br /&gt;
          &amp;gt;&lt;br /&gt;
            History&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      ),&lt;br /&gt;
    }),&lt;br /&gt;
  ], []);&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div className=&amp;quot;mt-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1 className=&amp;quot;text-center&amp;quot;&amp;gt;&lt;br /&gt;
        View Submissions - {assignment[0]?.topic || 'Assignment'}&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {/* Render dynamic table of submissions */}&lt;br /&gt;
      &amp;lt;Table&lt;br /&gt;
        data={submissions}&lt;br /&gt;
        columns={columns}&lt;br /&gt;
        columnVisibility={{&lt;br /&gt;
          id: false, // Hide the 'id' column from UI&lt;br /&gt;
        }}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default ViewSubmissions;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Fetches data with &amp;lt;code&amp;gt;loadAssignmentTeams()&amp;lt;/code&amp;gt; via the route's loader&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
// Middleware to fetch teams for assignment &lt;br /&gt;
export async function loadAssignmentTeams({ params }: {id:string}) {&lt;br /&gt;
  let teamsData = [];&lt;br /&gt;
&lt;br /&gt;
  if (params.id) {&lt;br /&gt;
    const response = await axiosClient.get(`/assignments/${params.id}/teams`);&lt;br /&gt;
    teamsData = response.data;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return teamsData;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;@tanstack/react-table&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;createColumnHelper&amp;lt;/code&amp;gt; for table config&lt;br /&gt;
* Displays columns: Team Name, Members, Assign Grade, and History&lt;br /&gt;
* Bootstrap-styled; includes keyboard and screen reader accessibility&lt;br /&gt;
&lt;br /&gt;
=== Backend Controller Code ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def teams&lt;br /&gt;
  assignment = Assignment.find_by(id: params[:assignment_id])&lt;br /&gt;
&lt;br /&gt;
  if assignment.nil?&lt;br /&gt;
    render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  submissions = if assignment.has_teams?&lt;br /&gt;
    assignment.teams.includes(:teams_users =&amp;gt; :user).map do |team|&lt;br /&gt;
      signed_up_team = team.signed_up_teams.first&lt;br /&gt;
      topic = signed_up_team&amp;amp;.sign_up_topic&amp;amp;.topic_name&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        name: team.name,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        topic: topic,&lt;br /&gt;
        members: team.teams_users.map { |tu| { id: tu.user.id, name: tu.user.name } }&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    assignment.participants.includes(:user).map do |participant|&lt;br /&gt;
      {&lt;br /&gt;
        id: participant.id,&lt;br /&gt;
        name: participant.user.name,&lt;br /&gt;
        team_id: nil,&lt;br /&gt;
        topic: nil,&lt;br /&gt;
        members: [{ id: participant.user.id, name: participant.user.name }]&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  render json: submissions, status: :ok&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== API Documentation ===&lt;br /&gt;
* '''Endpoint:''' &amp;lt;code&amp;gt;GET /api/v1/assignments/:assignment_id/teams&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Returns:''' Array of team info, members, and topic&lt;br /&gt;
* '''Swagger Docs:''' [http://152.7.177.242:3002/api-docs/index.html Swagger UI]&lt;br /&gt;
&lt;br /&gt;
=== Sample JSON Response ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Texas penguins&amp;quot;,&lt;br /&gt;
    &amp;quot;team_id&amp;quot;: 9,&lt;br /&gt;
    &amp;quot;topic&amp;quot;: &amp;quot;Progressive fresh-thinking middleware&amp;quot;,&lt;br /&gt;
    &amp;quot;members&amp;quot;: [&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 20, &amp;quot;name&amp;quot;: &amp;quot;erlinda.grimes&amp;quot; },&lt;br /&gt;
      { &amp;quot;id&amp;quot;: 21, &amp;quot;name&amp;quot;: &amp;quot;lawanda.wilkinson&amp;quot; }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seeding Changes ===&lt;br /&gt;
&lt;br /&gt;
To test the View Submissions feature thoroughly, we updated `db/seeds.rb` to include realistic assignments, topics, teams, and student-user mappings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
# SignUpTopics&lt;br /&gt;
signup_topics = assignments.flat_map do |assignment|&lt;br /&gt;
  5.times.map do&lt;br /&gt;
    SignUpTopic.create!(&lt;br /&gt;
      topic_name: Faker::Company.catch_phrase,&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      max_choosers: 2,&lt;br /&gt;
      category: &amp;quot;Default&amp;quot;,&lt;br /&gt;
      topic_identifier: Faker::Alphanumeric.alpha(number: 8).upcase,&lt;br /&gt;
      description: Faker::Lorem.sentence&lt;br /&gt;
    )&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# SignedUpTeams&lt;br /&gt;
teams.each_with_index do |team, idx|&lt;br /&gt;
  SignedUpTeam.create!(&lt;br /&gt;
    sign_up_topic_id: signup_topics[idx % signup_topics.length].id,&lt;br /&gt;
    team_id: team.id,&lt;br /&gt;
    is_waitlisted: false,&lt;br /&gt;
    preference_priority_number: 1&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Participants&lt;br /&gt;
students.each_with_index do |student, idx|&lt;br /&gt;
  Participant.create!(&lt;br /&gt;
    user_id: student.id,&lt;br /&gt;
    assignment_id: assignments[idx % assignments.length].id,&lt;br /&gt;
    team_id: teams[idx % teams.length].id&lt;br /&gt;
  )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ensures every team has students, a valid assignment, and a topic&lt;br /&gt;
* Prepares data for consistent API response&lt;br /&gt;
* Essential for local testing and API verification&lt;br /&gt;
&lt;br /&gt;
This implementation was inspired by prior work in the Expertiza backend [https://github.com/expertiza/reimplementation-back-end/pull/173 (PR #173)], and extended in our custom implementation documented here: [https://github.com/expertiza/reimplementation-back-end/pull/190 (PR #190)].&lt;br /&gt;
&lt;br /&gt;
=== UI Previews ===&lt;br /&gt;
Visual confirmation of the working interface with accessible design, action buttons, and responsive layout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== View Assignments Page ====&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-1-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-1-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-1-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== View Submissions Page ===&lt;br /&gt;
&lt;br /&gt;
'''1. Desktop View'''&lt;br /&gt;
[[File:ass-2-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''2. Mobile View'''&lt;br /&gt;
[[File:ass-2-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''3. Network Request'''&lt;br /&gt;
[[File:ass-2-net-1.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Assign Grade Page ==&lt;br /&gt;
&lt;br /&gt;
=== Objective === &lt;br /&gt;
The Assign Grade page offers instructors and TAs a clean, focused interface to view a selected team’s peer review feedback and submit final grades and comments for a given assignment. It aims to facilitate final assessment while ensuring all required fields are completed.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
'''Team Overview &amp;amp; Submission Summary:''' The page prominently displays the selected team's name and placeholder data for the assignment name and average peer review score.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Review Tables:''' Two sections show structured feedback: Author Feedback Reviews and Teammate Reviews. Each table entry includes the reviewer’s ID, comments, score, and date, offering a transparent view of peer evaluation.&lt;br /&gt;
&lt;br /&gt;
'''Grade Submission Form:''' Inputs for grade and instructor comments. A &amp;quot;Save&amp;quot; button to confirm and log the grading action. Validates input fields, preventing empty submissions and displaying appropriate error messages.&lt;br /&gt;
&lt;br /&gt;
'''Visual Feedback:''' Success and error alerts provide immediate UI feedback upon submission or missing inputs. Subtle UI enhancements such as card-style boxes, badges, and table formatting for clarity and user comfort.&lt;br /&gt;
&lt;br /&gt;
'''Placeholder for Backend Integration:''' Currently, the grade and comment submission is logged via console.log. Integration with backend APIs can be achieved by:&lt;br /&gt;
&lt;br /&gt;
Fetching peer review data: Using an API to dynamically populate review tables.&lt;br /&gt;
&lt;br /&gt;
Submitting grades/comments: Making a POST or PUT request to a grading endpoint.&lt;br /&gt;
&lt;br /&gt;
Calculating average scores: Pulling peer scores from a backend service to compute and display an actual average.&lt;br /&gt;
&lt;br /&gt;
=== Data Structure ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=\&amp;quot;typescript\&amp;quot;&amp;gt;&lt;br /&gt;
interface ITeamSubmission {&lt;br /&gt;
  id: number;&lt;br /&gt;
  teamName: string;&lt;br /&gt;
  teamMembers: { name: string; id: number }[];&lt;br /&gt;
  historyLink: string;&lt;br /&gt;
  topic?: string;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Frontend Component ===&lt;br /&gt;
&lt;br /&gt;
'''Component:''' &amp;lt;code&amp;gt;AssignGrade.tsx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Tech Stack:''' React (TypeScript), Inline CSS (JSX style objects), React Router&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
import { useLocation } from 'react-router-dom';&lt;br /&gt;
import { useState } from 'react';&lt;br /&gt;
&lt;br /&gt;
interface ReviewData {&lt;br /&gt;
  id: number;&lt;br /&gt;
  reviewer_id: number;&lt;br /&gt;
  comments: string;&lt;br /&gt;
  score: number;&lt;br /&gt;
  created_at: string;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const AssignGrade = () =&amp;gt; {&lt;br /&gt;
  const location = useLocation();&lt;br /&gt;
  const [grade, setGrade] = useState('');&lt;br /&gt;
  const [comment, setComment] = useState('');&lt;br /&gt;
  const [showSuccess, setShowSuccess] = useState(false);&lt;br /&gt;
  const [error, setError] = useState('');&lt;br /&gt;
&lt;br /&gt;
  const ReviewTable = ({ title, data }: { title: string; data: ReviewData[] }) =&amp;gt; (&lt;br /&gt;
    &amp;lt;div style={{ margin: '2rem 0' }}&amp;gt;&lt;br /&gt;
      &amp;lt;h4 style={{ &lt;br /&gt;
        fontSize: '1.1rem',&lt;br /&gt;
        fontWeight: 'bold',&lt;br /&gt;
        borderBottom: '2px solid #eee',&lt;br /&gt;
        paddingBottom: '0.5rem',&lt;br /&gt;
        marginBottom: '1rem'&lt;br /&gt;
      }}&amp;gt;&lt;br /&gt;
        {title}&lt;br /&gt;
      &amp;lt;/h4&amp;gt;&lt;br /&gt;
      &amp;lt;div style={{ &lt;br /&gt;
        border: '1px solid #ddd',&lt;br /&gt;
        borderRadius: '8px',&lt;br /&gt;
        overflow: 'hidden'&lt;br /&gt;
      }}&amp;gt;&lt;br /&gt;
        &amp;lt;div style={{ &lt;br /&gt;
          display: 'flex',&lt;br /&gt;
          backgroundColor: '#f8f9fa',&lt;br /&gt;
          padding: '1rem',&lt;br /&gt;
          borderBottom: '1px solid #ddd'&lt;br /&gt;
        }}&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 1, fontWeight: 600 }}&amp;gt;Reviewer&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 3, fontWeight: 600 }}&amp;gt;Comments&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 1, fontWeight: 600 }}&amp;gt;Score&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div style={{ flex: 1, fontWeight: 600 }}&amp;gt;Date&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        {data.map((review) =&amp;gt; (&lt;br /&gt;
          &amp;lt;div key={review.id} style={{ &lt;br /&gt;
            display: 'flex',&lt;br /&gt;
            padding: '1rem',&lt;br /&gt;
            borderBottom: &lt;br /&gt;
              data.indexOf(review) === data.length - 1 &lt;br /&gt;
                ? 'none' &lt;br /&gt;
                : '1px solid #ddd'&lt;br /&gt;
          }}&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 1 }}&amp;gt;User #{review.reviewer_id}&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 3 }}&amp;gt;{review.comments}&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 1 }}&amp;gt;{review.score}/5&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div style={{ flex: 1 }}&amp;gt;&lt;br /&gt;
              {new Date(review.created_at).toLocaleDateString()}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
        ))}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  const handleSubmit = (e: React.FormEvent) =&amp;gt; {&lt;br /&gt;
    e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
    if (!grade.trim() || !comment.trim()) {&lt;br /&gt;
      setError('Both grade and comment are required');&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    setError('');&lt;br /&gt;
    console.log('Grade:', grade, 'Comment:', comment);&lt;br /&gt;
    setShowSuccess(true);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const styles = {&lt;br /&gt;
    container: {&lt;br /&gt;
      maxWidth: '700px',&lt;br /&gt;
      margin: '2rem auto',&lt;br /&gt;
      padding: '2rem',&lt;br /&gt;
      backgroundColor: '#fff',&lt;br /&gt;
      borderRadius: '10px',&lt;br /&gt;
      boxShadow: '0 4px 10px rgba(0,0,0,0.1)',&lt;br /&gt;
      fontFamily: 'Arial, sans-serif',&lt;br /&gt;
    },&lt;br /&gt;
    heading: {&lt;br /&gt;
      fontSize: '1.8rem',&lt;br /&gt;
      fontWeight: 'bold',&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
    },&lt;br /&gt;
    label: {&lt;br /&gt;
      fontWeight: 'bold',&lt;br /&gt;
      display: 'block',&lt;br /&gt;
      marginBottom: '0.5rem',&lt;br /&gt;
    },&lt;br /&gt;
    input: {&lt;br /&gt;
      width: '100%',&lt;br /&gt;
      padding: '0.6rem',&lt;br /&gt;
      border: '1px solid #ccc',&lt;br /&gt;
      borderRadius: '5px',&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
    },&lt;br /&gt;
    textarea: {&lt;br /&gt;
      width: '100%',&lt;br /&gt;
      padding: '0.6rem',&lt;br /&gt;
      border: '1px solid #ccc',&lt;br /&gt;
      borderRadius: '5px',&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
    },&lt;br /&gt;
    button: {&lt;br /&gt;
      padding: '0.6rem 1.2rem',&lt;br /&gt;
      border: '1px solid #888',&lt;br /&gt;
      backgroundColor: '#f0f0f0',&lt;br /&gt;
      borderRadius: '5px',&lt;br /&gt;
      cursor: 'pointer',&lt;br /&gt;
    },&lt;br /&gt;
    message: {&lt;br /&gt;
      marginBottom: '1rem',&lt;br /&gt;
      padding: '0.75rem',&lt;br /&gt;
      borderRadius: '6px',&lt;br /&gt;
    },&lt;br /&gt;
    success: {&lt;br /&gt;
      backgroundColor: '#d1fae5',&lt;br /&gt;
      color: '#065f46',&lt;br /&gt;
      border: '1px solid #10b981',&lt;br /&gt;
    },&lt;br /&gt;
    error: {&lt;br /&gt;
      backgroundColor: '#fee2e2',&lt;br /&gt;
      color: '#b91c1c',&lt;br /&gt;
      border: '1px solid #ef4444',&lt;br /&gt;
    },&lt;br /&gt;
    warning: {&lt;br /&gt;
      backgroundColor: '#fef3c7',&lt;br /&gt;
      color: '#92400e',&lt;br /&gt;
      border: '1px solid #f59e0b',&lt;br /&gt;
      marginBottom: '0.5rem',&lt;br /&gt;
    },&lt;br /&gt;
    badge: {&lt;br /&gt;
      backgroundColor: '#d1fae5',&lt;br /&gt;
      color: '#065f46',&lt;br /&gt;
      padding: '0.2rem 0.5rem',&lt;br /&gt;
      borderRadius: '6px',&lt;br /&gt;
      fontSize: '0.9rem',&lt;br /&gt;
    },&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div style={styles.container}&amp;gt;&lt;br /&gt;
      {showSuccess &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;div style={{ ...styles.message, ...styles.success }}&amp;gt;&lt;br /&gt;
          Grade and comment for submission successfully saved.&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;h1 style={styles.heading}&amp;gt;&lt;br /&gt;
        Summary Report for assignment: Program 1&lt;br /&gt;
      &amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div style={{ marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
        &amp;lt;span style={styles.label}&amp;gt;Team:&amp;lt;/span&amp;gt;&lt;br /&gt;
        {location.state?.teamName || 'Unknown Team'}&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div style={{ marginBottom: '1rem' }}&amp;gt;&lt;br /&gt;
        &amp;lt;span style={styles.label}&amp;gt;Average peer review score:&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span style={styles.badge}&amp;gt;N/A&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;button style={styles.button}&amp;gt;Show Submission&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;ReviewTable &lt;br /&gt;
        title=&amp;quot;Author Feedback Reviews&amp;quot;&lt;br /&gt;
        data={[&lt;br /&gt;
          {&lt;br /&gt;
            id: 1,&lt;br /&gt;
            reviewer_id: 4,&lt;br /&gt;
            comments: &amp;quot;Excellent documentation quality&amp;quot;,&lt;br /&gt;
            score: 4.5,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T14:48:00Z&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            id: 2,&lt;br /&gt;
            reviewer_id: 5,&lt;br /&gt;
            comments: &amp;quot;Very thorough implementation&amp;quot;,&lt;br /&gt;
            score: 4.8,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T15:12:00Z&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      &amp;lt;ReviewTable&lt;br /&gt;
        title=&amp;quot;Teammate Reviews&amp;quot;&lt;br /&gt;
        data={[&lt;br /&gt;
          {&lt;br /&gt;
            id: 3,&lt;br /&gt;
            reviewer_id: 5,&lt;br /&gt;
            comments: &amp;quot;Great collaboration skills&amp;quot;,&lt;br /&gt;
            score: 4.0,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T15:30:00Z&amp;quot;&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            id: 4,&lt;br /&gt;
            reviewer_id: 4,&lt;br /&gt;
            comments: &amp;quot;Consistent code quality&amp;quot;,&lt;br /&gt;
            score: 4.2,&lt;br /&gt;
            created_at: &amp;quot;2023-10-05T16:45:00Z&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
        ]}&lt;br /&gt;
      /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;h3 style={{ ...styles.label, fontSize: '1.2rem' }}&amp;gt;&lt;br /&gt;
        Grade and Comment for Submission&lt;br /&gt;
      &amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      {error &amp;amp;&amp;amp; (&lt;br /&gt;
        &amp;lt;div style={{ ...styles.message, ...styles.error }}&amp;gt;{error}&amp;lt;/div&amp;gt;&lt;br /&gt;
      )}&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;form onSubmit={handleSubmit}&amp;gt;&lt;br /&gt;
        &amp;lt;label style={styles.label}&amp;gt;Grade:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input&lt;br /&gt;
          type=&amp;quot;text&amp;quot;&lt;br /&gt;
          style={styles.input}&lt;br /&gt;
          value={grade}&lt;br /&gt;
          onChange={(e) =&amp;gt; setGrade(e.target.value)}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;label style={styles.label}&amp;gt;Comment:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;textarea&lt;br /&gt;
          rows={4}&lt;br /&gt;
          style={styles.textarea}&lt;br /&gt;
          value={comment}&lt;br /&gt;
          onChange={(e) =&amp;gt; setComment(e.target.value)}&lt;br /&gt;
        /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot; style={styles.button}&amp;gt;&lt;br /&gt;
          Save&lt;br /&gt;
        &amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
export default AssignGrade;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current Limitations ===&lt;br /&gt;
&lt;br /&gt;
'''No Backend Integration Yet:''' All data is hardcoded. Integration with actual APIs for fetching and submitting data is needed to make the page functional.&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
* Actor: Student&lt;br /&gt;
** The student initiates the interaction with the system by clicking on **Grades View** from the main page.&lt;br /&gt;
* System Boundary&lt;br /&gt;
** Once inside the grading/feedback system, the student can:&lt;br /&gt;
*** View Grades for a Given Assignment&lt;br /&gt;
**** Allows the student to see the overall grading details for a specific assignment.&lt;br /&gt;
**** Redirects to the Stats page.&lt;br /&gt;
*** Show Submission&lt;br /&gt;
**** Displays the submitted work details for the student’s assignment.&lt;br /&gt;
**** Redirects to the Submissions page.&lt;br /&gt;
*** Show Reviews&lt;br /&gt;
**** Displays the peer or instructor reviews received.&lt;br /&gt;
**** Redirects to the Reviews page.&lt;br /&gt;
*** Show Author Feedback&lt;br /&gt;
**** Shows feedback provided by the author (instructor or peer).&lt;br /&gt;
**** Redirects to the Author Feedback page.&lt;br /&gt;
*** Teammate Review&lt;br /&gt;
**** Allows viewing or giving feedback on teammates’ work.&lt;br /&gt;
*** Average / Range&lt;br /&gt;
**** For each category (assignment, reviews, feedback), the system can display average scores or range of scores.&lt;br /&gt;
*** Back&lt;br /&gt;
**** Provides an option to navigate back to the main page or the previous screen.&lt;br /&gt;
* Redirect to Main Page&lt;br /&gt;
** After the student finishes viewing grades, submissions, reviews, or feedback, they can return to the main page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Test Environment ===&lt;br /&gt;
The tests use the following libraries and tools:&lt;br /&gt;
&lt;br /&gt;
* '''Jest:''' JavaScript testing framework&lt;br /&gt;
* '''React Testing Library:''' Testing utilities for React components&lt;br /&gt;
* '''Jest DOM:''' Custom Jest matchers for asserting on DOM elements&lt;br /&gt;
* All tests pass successfully, indicating that the ViewSubmissions and AssignGrade components are functioning as expected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:testcases.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163215</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163215"/>
		<updated>2025-04-04T18:23:09Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* Current UI Limitations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File:UI-1.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:UI-2.png|900px|center]]&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The &amp;quot;View Submissions&amp;quot; page will display a list of teams along with their details (team name, members, resource links, submission history). The table will be responsive, ensuring usability across devices.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Context-aware column collapsing to prioritize important information on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Interactive links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;History.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Highlighting missing submissions or incomplete data.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Frontend Implementation ==&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
* Actor: Student&lt;br /&gt;
** The student initiates the interaction with the system by clicking on **Grades View** from the main page.&lt;br /&gt;
* System Boundary&lt;br /&gt;
** Once inside the grading/feedback system, the student can:&lt;br /&gt;
*** View Grades for a Given Assignment&lt;br /&gt;
**** Allows the student to see the overall grading details for a specific assignment.&lt;br /&gt;
**** Redirects to the Stats page.&lt;br /&gt;
*** Show Submission&lt;br /&gt;
**** Displays the submitted work details for the student’s assignment.&lt;br /&gt;
**** Redirects to the Submissions page.&lt;br /&gt;
*** Show Reviews&lt;br /&gt;
**** Displays the peer or instructor reviews received.&lt;br /&gt;
**** Redirects to the Reviews page.&lt;br /&gt;
*** Show Author Feedback&lt;br /&gt;
**** Shows feedback provided by the author (instructor or peer).&lt;br /&gt;
**** Redirects to the Author Feedback page.&lt;br /&gt;
*** Teammate Review&lt;br /&gt;
**** Allows viewing or giving feedback on teammates’ work.&lt;br /&gt;
*** Average / Range&lt;br /&gt;
**** For each category (assignment, reviews, feedback), the system can display average scores or range of scores.&lt;br /&gt;
*** Back&lt;br /&gt;
**** Provides an option to navigate back to the main page or the previous screen.&lt;br /&gt;
* Redirect to Main Page&lt;br /&gt;
** After the student finishes viewing grades, submissions, reviews, or feedback, they can return to the main page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:UI-2.png&amp;diff=163214</id>
		<title>File:UI-2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:UI-2.png&amp;diff=163214"/>
		<updated>2025-04-04T18:19:37Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:UI-1.png&amp;diff=163213</id>
		<title>File:UI-1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:UI-1.png&amp;diff=163213"/>
		<updated>2025-04-04T18:19:20Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163182</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163182"/>
		<updated>2025-04-04T14:14:49Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* Current UI Limitations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File:CurrentUIss.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The &amp;quot;View Submissions&amp;quot; page will display a list of teams along with their details (team name, members, resource links, submission history). The table will be responsive, ensuring usability across devices.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Context-aware column collapsing to prioritize important information on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Interactive links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;History.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Highlighting missing submissions or incomplete data.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Frontend Implementation ==&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
* Actor: Student&lt;br /&gt;
** The student initiates the interaction with the system by clicking on **Grades View** from the main page.&lt;br /&gt;
* System Boundary&lt;br /&gt;
** Once inside the grading/feedback system, the student can:&lt;br /&gt;
*** View Grades for a Given Assignment&lt;br /&gt;
**** Allows the student to see the overall grading details for a specific assignment.&lt;br /&gt;
**** Redirects to the Stats page.&lt;br /&gt;
*** Show Submission&lt;br /&gt;
**** Displays the submitted work details for the student’s assignment.&lt;br /&gt;
**** Redirects to the Submissions page.&lt;br /&gt;
*** Show Reviews&lt;br /&gt;
**** Displays the peer or instructor reviews received.&lt;br /&gt;
**** Redirects to the Reviews page.&lt;br /&gt;
*** Show Author Feedback&lt;br /&gt;
**** Shows feedback provided by the author (instructor or peer).&lt;br /&gt;
**** Redirects to the Author Feedback page.&lt;br /&gt;
*** Teammate Review&lt;br /&gt;
**** Allows viewing or giving feedback on teammates’ work.&lt;br /&gt;
*** Average / Range&lt;br /&gt;
**** For each category (assignment, reviews, feedback), the system can display average scores or range of scores.&lt;br /&gt;
*** Back&lt;br /&gt;
**** Provides an option to navigate back to the main page or the previous screen.&lt;br /&gt;
* Redirect to Main Page&lt;br /&gt;
** After the student finishes viewing grades, submissions, reviews, or feedback, they can return to the main page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:CurrentUIss.png&amp;diff=163181</id>
		<title>File:CurrentUIss.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:CurrentUIss.png&amp;diff=163181"/>
		<updated>2025-04-04T14:13:57Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Current_UI.png&amp;diff=163180</id>
		<title>File:Current UI.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Current_UI.png&amp;diff=163180"/>
		<updated>2025-04-04T14:07:45Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163179</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163179"/>
		<updated>2025-04-04T12:55:55Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* Use Case Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File: current_submissions_ui.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The &amp;quot;View Submissions&amp;quot; page will display a list of teams along with their details (team name, members, resource links, submission history). The table will be responsive, ensuring usability across devices.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Context-aware column collapsing to prioritize important information on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Interactive links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;History.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Highlighting missing submissions or incomplete data.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Frontend Implementation ==&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
* Actor: Student&lt;br /&gt;
** The student initiates the interaction with the system by clicking on **Grades View** from the main page.&lt;br /&gt;
* System Boundary&lt;br /&gt;
** Once inside the grading/feedback system, the student can:&lt;br /&gt;
*** View Grades for a Given Assignment&lt;br /&gt;
**** Allows the student to see the overall grading details for a specific assignment.&lt;br /&gt;
**** Redirects to the Stats page.&lt;br /&gt;
*** Show Submission&lt;br /&gt;
**** Displays the submitted work details for the student’s assignment.&lt;br /&gt;
**** Redirects to the Submissions page.&lt;br /&gt;
*** Show Reviews&lt;br /&gt;
**** Displays the peer or instructor reviews received.&lt;br /&gt;
**** Redirects to the Reviews page.&lt;br /&gt;
*** Show Author Feedback&lt;br /&gt;
**** Shows feedback provided by the author (instructor or peer).&lt;br /&gt;
**** Redirects to the Author Feedback page.&lt;br /&gt;
*** Teammate Review&lt;br /&gt;
**** Allows viewing or giving feedback on teammates’ work.&lt;br /&gt;
*** Average / Range&lt;br /&gt;
**** For each category (assignment, reviews, feedback), the system can display average scores or range of scores.&lt;br /&gt;
*** Back&lt;br /&gt;
**** Provides an option to navigate back to the main page or the previous screen.&lt;br /&gt;
* Redirect to Main Page&lt;br /&gt;
** After the student finishes viewing grades, submissions, reviews, or feedback, they can return to the main page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163178</id>
		<title>CSC/ECE 517 Spring 2025 - E2521 UI for View submissions/assign grades (except heatgrid)</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2521_UI_for_View_submissions/assign_grades_(except_heatgrid)&amp;diff=163178"/>
		<updated>2025-04-04T12:38:32Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* Use Case Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
=== Project Overview ===&lt;br /&gt;
This project aims to enhance the grading interface in Expertiza by implementing two key pages:&lt;br /&gt;
&lt;br /&gt;
'''1. View Submissions Page:''' Displays team submissions with resource links and history.&lt;br /&gt;
&lt;br /&gt;
'''2. Assign Grades Page:''' Enables instructors to assign grades and provide comments, integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
The redesigned interface will simplify workflows for instructors and TAs by incorporating real-time API integration, responsive design, and a clear visual hierarchy. The goal is to reduce clutter, improve accessibility, and ensure seamless functionality on all devices.&lt;br /&gt;
&lt;br /&gt;
== Design Goals ==&lt;br /&gt;
To ensure a user-friendly, efficient, and maintainable interface, the following design principles are adopted:&lt;br /&gt;
&lt;br /&gt;
* '''Clarity:''' Information should be presented in an easily digestible format. This helps instructors quickly locate relevant data without being overwhelmed by unnecessary details.&lt;br /&gt;
* '''Accessibility:''' The interface must comply with WCAG 2.1 standards to ensure usability for all users, including those with disabilities. Features like ARIA roles, keyboard navigation, and proper contrast ratios will be implemented.&lt;br /&gt;
* '''Modularity:''' By designing reusable React components (e.g., tables, forms), we adhere to the DRY principle, reducing redundancy and simplifying future updates.&lt;br /&gt;
* '''Real-Time Synchronization:''' Instant feedback through API integration ensures that users always work with the latest data. This is critical for grading workflows where delays can cause confusion.&lt;br /&gt;
* '''Error Resilience:''' Robust error handling ensures that users receive clear notifications when something goes wrong (e.g., failed API calls or invalid inputs), improving trust in the system.&lt;br /&gt;
&lt;br /&gt;
=== Why These Principles? ===&lt;br /&gt;
&lt;br /&gt;
'''1. Clarity:''' Instructors often deal with large datasets (e.g., multiple teams and submissions). A cluttered interface can slow down their workflow. By focusing on clarity, we aim to streamline their experience and reduce cognitive load.&lt;br /&gt;
&lt;br /&gt;
'''2. Accessibility:''' Accessibility ensures inclusivity. Meeting WCAG standards makes the system usable for everyone, including those relying on assistive technologies like screen readers or keyboard navigation.&lt;br /&gt;
&lt;br /&gt;
'''3. Modularity:''' Modular components reduce development time for future features (e.g., heatgrid integration) and make debugging easier by isolating functionality into smaller units.&lt;br /&gt;
&lt;br /&gt;
'''4. Real-Time Synchronization:''' Grading workflows require up-to-date information to avoid errors (e.g., grading based on outdated peer reviews). Real-time sync ensures data accuracy.&lt;br /&gt;
&lt;br /&gt;
'''5. Error Resilience:''' Instructors need immediate feedback when something goes wrong (e.g., submitting incomplete grades). Clear error messages prevent frustration and guide users toward resolution.&lt;br /&gt;
&lt;br /&gt;
== Current UI Limitations ==&lt;br /&gt;
[[File: current_submissions_ui.png|900px|center]]&lt;br /&gt;
&lt;br /&gt;
- The current layout is cluttered with overlapping action links.&lt;br /&gt;
&lt;br /&gt;
- No visual distinction between graded and ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
- Missing review indicators are not prominent.&lt;br /&gt;
&lt;br /&gt;
- Tables overflow horizontally on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Error handling is inconsistent or absent.&lt;br /&gt;
&lt;br /&gt;
== Proposed Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Optimized View Submissions Table ===&lt;br /&gt;
The &amp;quot;View Submissions&amp;quot; page will display a list of teams along with their details (team name, members, resource links, submission history). The table will be responsive, ensuring usability across devices.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Context-aware column collapsing to prioritize important information on smaller screens.&lt;br /&gt;
&lt;br /&gt;
- Interactive links for &amp;quot;Assign Grade&amp;quot; and &amp;quot;History.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Highlighting missing submissions or incomplete data.&lt;br /&gt;
&lt;br /&gt;
=== 2. Grade Assignment Form ===&lt;br /&gt;
The &amp;quot;Assign Grades&amp;quot; page will allow instructors to assign grades and provide comments while integrating peer review data.&lt;br /&gt;
&lt;br /&gt;
Key Features:&lt;br /&gt;
&lt;br /&gt;
- Color-coded alerts for missing reviews.&lt;br /&gt;
&lt;br /&gt;
- Auto-save draft functionality to prevent accidental data loss.&lt;br /&gt;
&lt;br /&gt;
- Rubric-based score suggestions for consistent grading.&lt;br /&gt;
&lt;br /&gt;
=== 3. Error Handling System ===&lt;br /&gt;
&lt;br /&gt;
Error handling is essential to ensure a seamless user experience and system reliability. The error-handling system will address three key areas: '''user input validation''', '''API communication errors''', and '''unexpected system-level failures'''.&lt;br /&gt;
&lt;br /&gt;
'''User Input Validation:'''&lt;br /&gt;
&lt;br /&gt;
- Validates user inputs on the client side to prevent invalid data submissions.&lt;br /&gt;
&lt;br /&gt;
- Ensures required fields (e.g., grades, comments) are completed before submission.&lt;br /&gt;
&lt;br /&gt;
- Provides immediate feedback through visual indicators such as error messages or field highlights.&lt;br /&gt;
&lt;br /&gt;
- Prevents submission until all fields meet validation criteria.&lt;br /&gt;
&lt;br /&gt;
'''API Communication Errors:'''&lt;br /&gt;
&lt;br /&gt;
- Handles network issues, server downtime, or incorrect API responses gracefully.&lt;br /&gt;
&lt;br /&gt;
- Displays contextual error messages (e.g., &amp;quot;Failed to fetch submissions. Please try again later.&amp;quot;) to keep users informed.&lt;br /&gt;
&lt;br /&gt;
- Implements retry mechanisms with exponential backoff for transient errors.&lt;br /&gt;
&lt;br /&gt;
- Logs errors for debugging without exposing sensitive information.&lt;br /&gt;
&lt;br /&gt;
'''System-Level Failures:'''&lt;br /&gt;
&lt;br /&gt;
- Catches unexpected rendering errors using error boundaries at the React component level.&lt;br /&gt;
&lt;br /&gt;
- Displays fallback UI with user-friendly messages like &amp;quot;Something went wrong. Please refresh the page.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Provides options for users to report issues directly to the support team.&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* '''Error Classification:''' Errors are categorized into validation, network, and server-side errors for targeted handling.&lt;br /&gt;
* '''Error Recovery:''' Users can retry failed actions (e.g., reloading data or resubmitting grades).&lt;br /&gt;
* '''User Notifications:''' Immediate feedback is provided via toast messages or modals with actionable suggestions.&lt;br /&gt;
* '''Logging and Monitoring:''' Errors are logged for developers to analyze and proactively fix issues.&lt;br /&gt;
&lt;br /&gt;
== Frontend Implementation ==&lt;br /&gt;
&lt;br /&gt;
The frontend implementation focuses on creating a modular, responsive, and accessible interface that integrates seamlessly with backend APIs. It adheres to best practices like separation of concerns, reusability, and responsiveness.&lt;br /&gt;
&lt;br /&gt;
'''State Management:'''&lt;br /&gt;
&lt;br /&gt;
- A centralized state management solution will be used to manage data such as team submissions, grading drafts, and API responses.&lt;br /&gt;
&lt;br /&gt;
- This ensures efficient data sharing across components without unnecessary re-renders.&lt;br /&gt;
&lt;br /&gt;
'''Dynamic Table Rendering:'''&lt;br /&gt;
&lt;br /&gt;
- The &amp;quot;View Submissions&amp;quot; page will feature a responsive table layout that adapts to different screen sizes.&lt;br /&gt;
&lt;br /&gt;
- Columns with lower priority (e.g., team member names) will collapse on smaller screens for better usability.&lt;br /&gt;
&lt;br /&gt;
- Virtual scrolling will be implemented for large datasets to enhance performance.&lt;br /&gt;
&lt;br /&gt;
'''Form Handling on Assign Grades Page:'''&lt;br /&gt;
&lt;br /&gt;
- Includes input fields for grades and comments with real-time validation to ensure data integrity.&lt;br /&gt;
&lt;br /&gt;
- Highlights missing peer reviews visually (e.g., using red icons or badges) so instructors can address them before submitting grades.&lt;br /&gt;
&lt;br /&gt;
'''Responsive Design:'''&lt;br /&gt;
&lt;br /&gt;
- Ensures the interface adapts to various screen sizes using CSS media queries and responsive layouts.&lt;br /&gt;
&lt;br /&gt;
- Implements touch-friendly controls (e.g., larger buttons) for mobile users.&lt;br /&gt;
&lt;br /&gt;
'''Error Handling Integration:'''&lt;br /&gt;
&lt;br /&gt;
- Displays error messages prominently on the UI (e.g., banners or modals) for failed API calls.&lt;br /&gt;
&lt;br /&gt;
- Uses fallback UI for unexpected rendering errors.&lt;br /&gt;
&lt;br /&gt;
'''Reusable Components:'''&lt;br /&gt;
&lt;br /&gt;
- Modular components like tables, forms, and buttons ensure consistency across pages and simplify future maintenance.&lt;br /&gt;
&lt;br /&gt;
- Components follow the Single Responsibility Principle for better testability and scalability.&lt;br /&gt;
&lt;br /&gt;
'''Accessibility Features:'''&lt;br /&gt;
&lt;br /&gt;
- ARIA roles and attributes are added to components for enhanced screen reader support.&lt;br /&gt;
&lt;br /&gt;
- Keyboard navigation is supported for all interactive elements.&lt;br /&gt;
&lt;br /&gt;
- Color contrast ratios meet WCAG standards for readability.&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Badges dynamically update based on real-time API data &amp;amp; A filter option allows instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: Missing reviews are highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
&lt;br /&gt;
- Functionality: A summary section shows the number of missing reviews per team &amp;amp; Incomplete submissions are flagged automatically during form validation.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: An audit log system records every grade change along with timestamps and user details.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Logs include before/after values of grades and reasons for changes (if provided) &amp;amp; Audit logs are accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: The interface includes larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
&lt;br /&gt;
- Functionality: Buttons meet minimum size requirements (48x48px) &amp;amp; Interactive elements are optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
&lt;br /&gt;
- Solution: A notification system displays errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
- Functionality: Notifications appear immediately after an error occurs &amp;amp; Detailed error logs are available in case further troubleshooting is needed.&lt;br /&gt;
&lt;br /&gt;
== Use Case Diagram ==&lt;br /&gt;
[[File:2521 Use Case Diagram.jpeg|750px|center]]&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test Case ID !! Test Description !! Expected Outcome !! Priority&lt;br /&gt;
|-&lt;br /&gt;
| TC001 || Verify that the table displays all team submissions accurately. || All rows and columns should display correct data, including team names, members, and submission links. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC002 || Validate sorting functionality for columns (e.g., team name, submission date). || Columns should sort correctly in ascending and descending order without data loss or duplication. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC003 || Test responsiveness of the table on different screen sizes (mobile, tablet, desktop). || The table layout should adapt seamlessly to various screen sizes, maintaining usability and readability. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC004 || Check filtering functionality to display only ungraded submissions. || The filter should accurately show teams with pending grades while hiding graded submissions. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC005 || Verify error handling when API fails to fetch submission data. || A user-friendly error message should be displayed, and the table should show a placeholder or retry option. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC006 || Validate missing review indicators for teams with incomplete peer reviews. || Teams with missing reviews should display visual indicators (e.g., red icons or badges). || High&lt;br /&gt;
|-&lt;br /&gt;
| TC007 || Test grade submission functionality with valid inputs. || Grades and comments should be successfully submitted, and the system should display a confirmation message. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC008 || Validate input field restrictions for grades (e.g., range 0-100). || Inputs outside the allowed range should trigger validation errors and prevent submission. || Medium&lt;br /&gt;
|-&lt;br /&gt;
| TC009 || Check accessibility features like keyboard navigation and screen reader support. || All interactive elements should be accessible via keyboard, and screen readers should announce table content correctly. || High&lt;br /&gt;
|-&lt;br /&gt;
| TC010 || Verify performance with large datasets (e.g., 500+ teams). || The table should load within 2 seconds and allow smooth scrolling without lag. || High&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Performance Metrics ==&lt;br /&gt;
The performance metrics aim to ensure the application functions efficiently under various conditions, including large datasets and high user activity. These metrics focus on responsiveness, scalability, and reliability.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metric !! Target !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Page Load Time || &amp;lt; 1.5 seconds || The &amp;quot;View Submissions&amp;quot; page should load within 1.5 seconds for up to 500 teams on a standard broadband connection.&lt;br /&gt;
|-&lt;br /&gt;
| Grade Submission Time || &amp;lt; 800 milliseconds || Submitting grades and comments should take less than 800 milliseconds, including API response time.&lt;br /&gt;
|-&lt;br /&gt;
| Mobile Render Time || &amp;lt; 1 second || The interface should render within 1 second on mobile devices with a 3G connection.&lt;br /&gt;
|-&lt;br /&gt;
| API Error Recovery || &amp;lt; 3 clicks || Users should be able to recover from API errors (e.g., retry or refresh) within three clicks.&lt;br /&gt;
|-&lt;br /&gt;
| Large Dataset Handling || Smooth scrolling || The table should support virtual scrolling for datasets with 500+ entries without lag or freezing.&lt;br /&gt;
|-&lt;br /&gt;
| Missing Review Alerts Rendering Time || &amp;lt; 500 milliseconds || Alerts for missing reviews should appear within 500 milliseconds after loading the &amp;quot;Assign Grades&amp;quot; page.&lt;br /&gt;
|-&lt;br /&gt;
| Accessibility Compliance || WCAG 2.1 AA || All interactive elements must meet WCAG 2.1 AA standards for accessibility.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Stories ==&lt;br /&gt;
&lt;br /&gt;
'''1. As an instructor, I want to see submission status at a glance so that I can quickly assess which teams need grading.'''&lt;br /&gt;
* The &amp;quot;View Submissions&amp;quot; page will display submission statuses using color-coded badges (e.g., green for graded, yellow for pending).&lt;br /&gt;
* Filtering options will allow instructors to view only ungraded submissions.&lt;br /&gt;
&lt;br /&gt;
'''2. As a TA, I need to identify missing reviews before assigning grades so that I can ensure all reviews are completed.'''&lt;br /&gt;
* Missing reviews will be highlighted visually on the &amp;quot;Assign Grades&amp;quot; page using red icons or warning messages.&lt;br /&gt;
* A summary section will show the number of missing reviews per team.&lt;br /&gt;
&lt;br /&gt;
'''3. As an admin, I require audit trails for grade changes so that I can track modifications made by instructors or TAs.'''&lt;br /&gt;
* An audit log system will record every grade change with timestamps, user details, and reasons for changes (if provided).&lt;br /&gt;
* Logs will be accessible via an admin-only interface for review.&lt;br /&gt;
&lt;br /&gt;
'''4. As a mobile user, I need touch-friendly controls so that I can grade submissions easily on my tablet or phone.'''&lt;br /&gt;
* The interface will include larger buttons, touch-friendly dropdowns, and swipe gestures where applicable.&lt;br /&gt;
* Interactive elements will be optimized for touch input without requiring precision clicks.&lt;br /&gt;
&lt;br /&gt;
'''5. As an instructor, I want error notifications when something goes wrong so that I can take corrective action without delays.'''&lt;br /&gt;
* A notification system will display errors as toast messages or modals with actionable suggestions (e.g., &amp;quot;Retry&amp;quot; or &amp;quot;Contact Support&amp;quot;).&lt;br /&gt;
* Notifications will appear immediately after an error occurs.&lt;br /&gt;
&lt;br /&gt;
'''6. As a TA, I want to sort and filter submissions easily so that I can focus on specific teams or criteria.'''&lt;br /&gt;
* Sorting functionality will allow table columns to be organized by team name, submission date, or grading status.&lt;br /&gt;
* Filtering options will enable TAs to display submissions based on specific criteria (e.g., ungraded teams).&lt;br /&gt;
&lt;br /&gt;
'''7. As an instructor, I want to assign grades and comments efficiently so that I can complete grading tasks quickly.'''&lt;br /&gt;
* Input fields for grades and comments will include real-time validation to ensure data integrity.&lt;br /&gt;
* Missing peer reviews will be flagged visually to ensure all required steps are completed before submission.&lt;br /&gt;
&lt;br /&gt;
'''8. As an admin, I want performance reports so that I can monitor system efficiency during peak usage periods.'''&lt;br /&gt;
* Performance reports will include metrics like page load times, API response times, and error rates during high user activity.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
The redesigned &amp;quot;View Submissions&amp;quot; and &amp;quot;Assign Grades&amp;quot; pages aim to streamline the grading workflow for instructors and TAs while ensuring accessibility, responsiveness, and reliability. By incorporating modular components, real-time API integration, and robust error-handling mechanisms, the system will provide a user-friendly interface that enhances functionality and usability. &lt;br /&gt;
&lt;br /&gt;
Key features such as dynamic table rendering, missing review indicators, and audit trails ensure that grading tasks are efficient and transparent. Additionally, the focus on accessibility and mobile optimization guarantees inclusivity and usability across all devices.&lt;br /&gt;
&lt;br /&gt;
Through adherence to best practices like component reusability, separation of concerns, and performance optimization, this project sets the foundation for future upgrades, including heatgrid integration. The implementation plan aligns with user needs and ensures scalability for handling large datasets without compromising performance.&lt;br /&gt;
&lt;br /&gt;
This project will significantly improve the grading experience within Expertiza by delivering a modern, intuitive, and reliable solution that meets the expectations of instructors, TAs, admins, and mobile users alike.&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:2521_Use_Case_Diagram.jpeg&amp;diff=163177</id>
		<title>File:2521 Use Case Diagram.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:2521_Use_Case_Diagram.jpeg&amp;diff=163177"/>
		<updated>2025-04-04T12:38:01Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162849</id>
		<title>CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162849"/>
		<updated>2025-03-25T20:29:16Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= E2520: Reimplement Heatgrid UI for Reviews =&lt;br /&gt;
&lt;br /&gt;
== 🌟 Introduction ==&lt;br /&gt;
The '''Heatgrid UI for Reviews''' is a '''React-based''' component designed to visually represent review scores in a '''structured and user-friendly manner'''. This project enhances usability, data handling, and efficiency while introducing new features to improve the review experience. The component ensures '''seamless interaction and role-based access control''' for different users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🚀 Key Enhancements &amp;amp; Features ==&lt;br /&gt;
&lt;br /&gt;
=== 🎛 1. Toggle Question List ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Toggle Question List&amp;quot;''' button to display or hide all review questions.  &lt;br /&gt;
* '''Implementation:''' Users can '''click the button''' to dynamically expand/collapse the list of questions.  &lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
[[File:Toggle questions before.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
After&lt;br /&gt;
[[File:Toggle questions after.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🏷 2. Hide Tags Button ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Hide Tags&amp;quot;''' button to toggle the visibility of tags.  &lt;br /&gt;
* '''Implementation:''' Clicking the button '''hides/shows''' tagging information dynamically.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🎨 3. Color Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the color legend displays a tooltip explaining the '''color scale from poor to excellent'''.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Color legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📌 4. Interaction Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the interaction legend now displays a '''tooltip''' with a detailed explanation.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Interaction legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📝 5. Renamed Comment Categories &amp;amp; Added Word Count Column ===&lt;br /&gt;
* '''Feature:''' Changed '''&amp;quot;&amp;gt; 10 Word Comments&amp;quot;''' to '''&amp;quot;Short Comments&amp;quot;''' and '''&amp;quot;&amp;gt; 20 Word Comments&amp;quot;''' to '''&amp;quot;Long Comments&amp;quot;'''. A '''new column''' displays '''word count''' for each review comment.  &lt;br /&gt;
&lt;br /&gt;
[[File:HG5 1.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
[[File:HG5 2.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows ===&lt;br /&gt;
* '''Feature:''' Users can now '''sort questions''' using ascending/descending arrows.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:HG6.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 📊 7. Sort Reviews by Total Score ===&lt;br /&gt;
* '''Feature:''' Sort reviews '''in ascending/descending order''' based on '''total review score'''.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:HG7.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 👥 8. Dynamic Team Members ===&lt;br /&gt;
* '''Feature:''' Dynamically '''fetch and display team members' names'''.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:HG8.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 💬 9. Bold &amp;amp; Underlined Comments with Hover Preview ===&lt;br /&gt;
* '''Feature:''' Review comments are now '''bold and underlined'''; hovering over them '''shows a preview'''.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:HG9.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔄 10. Refactored Heatgrid to Reusable Components ===&lt;br /&gt;
* '''Feature:''' The frontend was '''restructured''' using '''modular, reusable React components'''.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:HeatGridComponent.png|250px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔑 11. Role-Based Access Control ===&lt;br /&gt;
* '''Feature:''' Normal users see anonymous &amp;quot;Review 0, Review 1&amp;quot; labels, while '''admins see actual reviewer names'''.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Student view&lt;br /&gt;
[[File:Student view new.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
Admin view&lt;br /&gt;
[[File:Admin view.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🖥 12. Backend Integration &amp;amp; Database Configuration ===&lt;br /&gt;
* '''Feature:''' Integrated the frontend with the backend, configured the '''database''', and deployed it on '''VCL using Docker'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= ✅ Deployment &amp;amp; Testing =&lt;br /&gt;
&lt;br /&gt;
== 🚀 Deployment ==&lt;br /&gt;
* '''Deployment Platform:''' Successfully deployed on '''Virtual Computing Lab (VCL)'''.&lt;br /&gt;
* '''Deployment Method:''' Used '''Docker''' for containerized setup and consistent environment replication.&lt;br /&gt;
&lt;br /&gt;
== 🧪 Testing ==&lt;br /&gt;
&lt;br /&gt;
=== ✅ Manual Testing ===&lt;br /&gt;
Thorough manual testing was conducted for the following features:&lt;br /&gt;
&lt;br /&gt;
* Rendering of '''Summary Report''' and '''Team Information'''&lt;br /&gt;
* Display of '''Submission Links'''&lt;br /&gt;
* Functionality of the '''Round Selector'''&lt;br /&gt;
* Checkbox toggles:&lt;br /&gt;
** '''&amp;gt; 10 Word Comments'''&lt;br /&gt;
** '''&amp;gt; 20 Word Comments'''&lt;br /&gt;
* Conditional rendering of the '''Word Count''' column&lt;br /&gt;
* Sorting by:&lt;br /&gt;
** '''Row Average'''&lt;br /&gt;
** '''Total Review Score''' (ascending/descending toggle)&lt;br /&gt;
&lt;br /&gt;
=== ✅ Automated Testing (`App.test.tsx`) ===&lt;br /&gt;
Unit/UI tests written with '''@testing-library/react''' and '''jest'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;tsx&amp;quot;&amp;gt;&lt;br /&gt;
import React from &amp;quot;react&amp;quot;;&lt;br /&gt;
import { render, screen, fireEvent, waitFor } from &amp;quot;@testing-library/react&amp;quot;;&lt;br /&gt;
import { MemoryRouter, Route, Routes } from &amp;quot;react-router-dom&amp;quot;;&lt;br /&gt;
import ReviewTable from &amp;quot;./components/ReviewTable&amp;quot;; // Adjust path as needed&lt;br /&gt;
&lt;br /&gt;
describe(&amp;quot;ReviewTable page&amp;quot;, () =&amp;gt; {&lt;br /&gt;
  const setup = () =&amp;gt;&lt;br /&gt;
    render(&lt;br /&gt;
      &amp;lt;MemoryRouter initialEntries={[&amp;quot;/view-team-grades&amp;quot;]}&amp;gt;&lt;br /&gt;
        &amp;lt;Routes&amp;gt;&lt;br /&gt;
          &amp;lt;Route path=&amp;quot;/view-team-grades&amp;quot; element={&amp;lt;ReviewTable /&amp;gt;} /&amp;gt;&lt;br /&gt;
        &amp;lt;/Routes&amp;gt;&lt;br /&gt;
      &amp;lt;/MemoryRouter&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
  test(&amp;quot;renders summary report and team info&amp;quot;, async () =&amp;gt; {&lt;br /&gt;
    setup();&lt;br /&gt;
    expect(screen.getByText(/Summary Report: Program 2/i)).toBeInTheDocument();&lt;br /&gt;
    expect(screen.getByText(/Team:/i)).toBeInTheDocument();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  test(&amp;quot;renders submission links&amp;quot;, async () =&amp;gt; {&lt;br /&gt;
    setup();&lt;br /&gt;
    expect(&lt;br /&gt;
      screen.getByText(&amp;quot;https://github.ncsu.edu/Program-2-Ruby-on-Rails/WolfEvents&amp;quot;)&lt;br /&gt;
    ).toBeInTheDocument();&lt;br /&gt;
    expect(screen.getByText(&amp;quot;README.md&amp;quot;)).toBeInTheDocument();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  test(&amp;quot;renders round selector&amp;quot;, () =&amp;gt; {&lt;br /&gt;
    setup();&lt;br /&gt;
    expect(screen.getByText(/Round/i)).toBeInTheDocument();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  test(&amp;quot;renders word count checkboxes&amp;quot;, () =&amp;gt; {&lt;br /&gt;
    setup();&lt;br /&gt;
    expect(screen.getByLabelText(/&amp;gt; 10 Word Comments/i)).toBeInTheDocument();&lt;br /&gt;
    expect(screen.getByLabelText(/&amp;gt; 20 Word Comments/i)).toBeInTheDocument();&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  test(&amp;quot;shows Word Count column when checkbox is selected&amp;quot;, async () =&amp;gt; {&lt;br /&gt;
    setup();&lt;br /&gt;
&lt;br /&gt;
    expect(screen.queryByText(/Word Count/i)).not.toBeInTheDocument();&lt;br /&gt;
&lt;br /&gt;
    const checkbox10 = screen.getByLabelText(/&amp;gt; 10 Word Comments/i);&lt;br /&gt;
    fireEvent.click(checkbox10);&lt;br /&gt;
&lt;br /&gt;
    await waitFor(() =&amp;gt; {&lt;br /&gt;
      expect(screen.getAllByText(/Word Count/i).length).toBeGreaterThan(0);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  test(&amp;quot;toggle sort by total score&amp;quot;, () =&amp;gt; {&lt;br /&gt;
    setup();&lt;br /&gt;
    const button = screen.getByText(/Sort by Total Review Score/i);&lt;br /&gt;
    fireEvent.click(button);&lt;br /&gt;
    expect(button.textContent).toMatch(/desc|asc/i);&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 🎯 Future Enhancements &amp;amp; Best Practices ==&lt;br /&gt;
* Implement automated tests to '''improve maintainability'''.  &lt;br /&gt;
* Enhance '''responsiveness''' for better mobile support.  &lt;br /&gt;
* Optimize '''performance''' for larger datasets.  &lt;br /&gt;
* Follow '''best coding practices''' including '''DRY''' and '''Single Responsibility Principle'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏁 Conclusion ==&lt;br /&gt;
This project significantly '''enhances the Heatgrid UI''' for reviews, improving '''usability, accessibility, and data handling''' while maintaining an '''intuitive design'''. These newly added features ensure a '''seamless experience''' for students, faculty, and administrators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;br /&gt;
* '''Link to PR''' https://github.com/expertiza/reimplementation-front-end/pull/92&lt;br /&gt;
* '''Video of UI/UX Improvements''' https://drive.google.com/file/d/1yLXV0OzHWlY9DPobZYe9JJ7_dUclRLJ4/view?usp=sharing&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student_view_new.png&amp;diff=162848</id>
		<title>File:Student view new.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student_view_new.png&amp;diff=162848"/>
		<updated>2025-03-25T20:28:21Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Admin_view.png&amp;diff=162847</id>
		<title>File:Admin view.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Admin_view.png&amp;diff=162847"/>
		<updated>2025-03-25T20:25:10Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student_view.png&amp;diff=162846</id>
		<title>File:Student view.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student_view.png&amp;diff=162846"/>
		<updated>2025-03-25T20:24:43Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: Pnkulka2 uploaded a new version of File:Student view.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162573</id>
		<title>CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162573"/>
		<updated>2025-03-25T01:02:38Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: /* 🚀 Key Enhancements &amp;amp; Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= E2520: Reimplement Heatgrid UI for Reviews =&lt;br /&gt;
&lt;br /&gt;
== 🌟 Introduction ==&lt;br /&gt;
The '''Heatgrid UI for Reviews''' is a '''React-based''' component designed to visually represent review scores in a '''structured and user-friendly manner'''. This project enhances usability, data handling, and efficiency while introducing new features to improve the review experience. The component ensures '''seamless interaction and role-based access control''' for different users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🚀 Key Enhancements &amp;amp; Features ==&lt;br /&gt;
&lt;br /&gt;
=== 🎛 1. Toggle Question List ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Toggle Question List&amp;quot;''' button to display or hide all review questions.  &lt;br /&gt;
* '''Implementation:''' Users can '''click the button''' to dynamically expand/collapse the list of questions.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowQuestions(!showQuestions)} style={{ backgroundColor: '#4CAF50', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Toggle Question List&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showQuestions &amp;amp;&amp;amp; &amp;lt;QuestionList questions={questions} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
[[File:Toggle questions before.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
After&lt;br /&gt;
[[File:Toggle questions after.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🏷 2. Hide Tags Button ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Hide Tags&amp;quot;''' button to toggle the visibility of tags.  &lt;br /&gt;
* '''Implementation:''' Clicking the button '''hides/shows''' tagging information dynamically.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowTags(!showTags)} style={{ backgroundColor: '#FF5722', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Hide Tags&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showTags &amp;amp;&amp;amp; &amp;lt;TagList tags={tags} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🎨 3. Color Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the color legend displays a tooltip explaining the '''color scale from poor to excellent'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title=&amp;quot;Colors are scaled from poor to excellent: red, orange, yellow, light-green, dark-green&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;LegendIcon style={{ color: 'blue' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Color legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📌 4. Interaction Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the interaction legend now displays a '''tooltip''' with a detailed explanation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={t(&amp;quot;interaction_legend_tooltip&amp;quot;)}&amp;gt;&lt;br /&gt;
  &amp;lt;InteractionLegendIcon style={{ color: 'purple' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Interaction legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📝 5. Renamed Comment Categories &amp;amp; Added Word Count Column ===&lt;br /&gt;
* '''Feature:''' Changed '''&amp;quot;&amp;gt; 10 Word Comments&amp;quot;''' to '''&amp;quot;Short Comments&amp;quot;''' and '''&amp;quot;&amp;gt; 20 Word Comments&amp;quot;''' to '''&amp;quot;Long Comments&amp;quot;'''. A '''new column''' displays '''word count''' for each review comment.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{reviews.map(review =&amp;gt; (&lt;br /&gt;
  &amp;lt;TableRow&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.shortComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.longComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
  &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comments Column](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows ===&lt;br /&gt;
* '''Feature:''' Users can now '''sort questions''' using ascending/descending arrows.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;asc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▲&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;desc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▼&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG6.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 📊 7. Sort Reviews by Total Score ===&lt;br /&gt;
* '''Feature:''' Sort reviews '''in ascending/descending order''' based on '''total review score'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; toggleSortByTotalScore()} style={{ backgroundColor: '#3F51B5', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Sort by Total Review Score&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG7.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 👥 8. Dynamic Team Members ===&lt;br /&gt;
* '''Feature:''' Dynamically '''fetch and display team members' names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{teamMembers.map(member =&amp;gt; (&lt;br /&gt;
  &amp;lt;li key={member.id} style={{ fontWeight: 'bold', color: '#795548' }}&amp;gt;{member.name}&amp;lt;/li&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Team Members](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💬 9. Bold &amp;amp; Underlined Comments with Hover Preview ===&lt;br /&gt;
* '''Feature:''' Review comments are now '''bold and underlined'''; hovering over them '''shows a preview'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style={{ fontWeight: 'bold', textDecoration: 'underline', color: '#E91E63' }}&amp;gt;&lt;br /&gt;
  {review.comment}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={review.commentDetails}&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt; ℹ️&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comment Preview](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔄 10. Refactored Heatgrid to Reusable Components ===&lt;br /&gt;
* '''Feature:''' The frontend was '''restructured''' using '''modular, reusable React components'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
const HeatGrid = ({ data }) =&amp;gt; {&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      {data.map(row =&amp;gt; &amp;lt;HeatGridRow key={row.id} row={row} /&amp;gt;)}&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HeatGridComponent.png|250px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔑 11. Role-Based Access Control ===&lt;br /&gt;
* '''Feature:''' Normal users see anonymous &amp;quot;Review 0, Review 1&amp;quot; labels, while '''admins see actual reviewer names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{userRole === 'admin' ? review.reviewerName : `Review ${index}`}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Role-Based Access](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🖥 12. Backend Integration &amp;amp; Database Configuration ===&lt;br /&gt;
* '''Feature:''' Integrated the frontend with the backend, configured the '''database''', and deployed it on '''VCL using Docker'''.  &lt;br /&gt;
'''🖼 Screenshot:''' ![Backend Integration](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
== 🏗 Architecture &amp;amp; Flow Diagram ==&lt;br /&gt;
A '''visual representation''' of how the '''frontend interacts''' with the '''backend''' and '''database''', illustrating '''data flow and component structure'''.  &lt;br /&gt;
'''📌 Diagram:''' ![Flow Diagram](link-to-flow-diagram)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ✅ Deployment &amp;amp; Testing ==&lt;br /&gt;
* '''Deployment:''' Successfully deployed on '''Virtual Computing Lab (VCL)''' using '''Docker'''.  &lt;br /&gt;
* '''Testing:''' Conducted thorough '''manual test cases''' for all new functionalities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🎯 Future Enhancements &amp;amp; Best Practices ==&lt;br /&gt;
* Implement automated tests to '''improve maintainability'''.  &lt;br /&gt;
* Enhance '''responsiveness''' for better mobile support.  &lt;br /&gt;
* Optimize '''performance''' for larger datasets.  &lt;br /&gt;
* Follow '''best coding practices''' including '''DRY''' and '''Single Responsibility Principle'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏁 Conclusion ==&lt;br /&gt;
This project significantly '''enhances the Heatgrid UI''' for reviews, improving '''usability, accessibility, and data handling''' while maintaining an '''intuitive design'''. These newly added features ensure a '''seamless experience''' for students, faculty, and administrators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162569</id>
		<title>CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162569"/>
		<updated>2025-03-25T00:58:35Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= E2520: Reimplement Heatgrid UI for Reviews =&lt;br /&gt;
&lt;br /&gt;
== 🌟 Introduction ==&lt;br /&gt;
The '''Heatgrid UI for Reviews''' is a '''React-based''' component designed to visually represent review scores in a '''structured and user-friendly manner'''. This project enhances usability, data handling, and efficiency while introducing new features to improve the review experience. The component ensures '''seamless interaction and role-based access control''' for different users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🚀 Key Enhancements &amp;amp; Features ==&lt;br /&gt;
&lt;br /&gt;
=== 🎛 1. Toggle Question List ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Toggle Question List&amp;quot;''' button to display or hide all review questions.  &lt;br /&gt;
* '''Implementation:''' Users can '''click the button''' to dynamically expand/collapse the list of questions.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowQuestions(!showQuestions)} style={{ backgroundColor: '#4CAF50', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Toggle Question List&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showQuestions &amp;amp;&amp;amp; &amp;lt;QuestionList questions={questions} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle questions before.png | 1000px]]&lt;br /&gt;
[[File:Toggle questions after.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🏷 2. Hide Tags Button ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Hide Tags&amp;quot;''' button to toggle the visibility of tags.  &lt;br /&gt;
* '''Implementation:''' Clicking the button '''hides/shows''' tagging information dynamically.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowTags(!showTags)} style={{ backgroundColor: '#FF5722', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Hide Tags&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showTags &amp;amp;&amp;amp; &amp;lt;TagList tags={tags} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🎨 3. Color Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the color legend displays a tooltip explaining the '''color scale from poor to excellent'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title=&amp;quot;Colors are scaled from poor to excellent: red, orange, yellow, light-green, dark-green&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;LegendIcon style={{ color: 'blue' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Color legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📌 4. Interaction Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the interaction legend now displays a '''tooltip''' with a detailed explanation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={t(&amp;quot;interaction_legend_tooltip&amp;quot;)}&amp;gt;&lt;br /&gt;
  &amp;lt;InteractionLegendIcon style={{ color: 'purple' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Interaction legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📝 5. Renamed Comment Categories &amp;amp; Added Word Count Column ===&lt;br /&gt;
* '''Feature:''' Changed '''&amp;quot;&amp;gt; 10 Word Comments&amp;quot;''' to '''&amp;quot;Short Comments&amp;quot;''' and '''&amp;quot;&amp;gt; 20 Word Comments&amp;quot;''' to '''&amp;quot;Long Comments&amp;quot;'''. A '''new column''' displays '''word count''' for each review comment.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{reviews.map(review =&amp;gt; (&lt;br /&gt;
  &amp;lt;TableRow&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.shortComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.longComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
  &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comments Column](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows ===&lt;br /&gt;
* '''Feature:''' Users can now '''sort questions''' using ascending/descending arrows.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;asc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▲&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;desc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▼&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG6.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 📊 7. Sort Reviews by Total Score ===&lt;br /&gt;
* '''Feature:''' Sort reviews '''in ascending/descending order''' based on '''total review score'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; toggleSortByTotalScore()} style={{ backgroundColor: '#3F51B5', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Sort by Total Review Score&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG7.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 👥 8. Dynamic Team Members ===&lt;br /&gt;
* '''Feature:''' Dynamically '''fetch and display team members' names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{teamMembers.map(member =&amp;gt; (&lt;br /&gt;
  &amp;lt;li key={member.id} style={{ fontWeight: 'bold', color: '#795548' }}&amp;gt;{member.name}&amp;lt;/li&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Team Members](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💬 9. Bold &amp;amp; Underlined Comments with Hover Preview ===&lt;br /&gt;
* '''Feature:''' Review comments are now '''bold and underlined'''; hovering over them '''shows a preview'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style={{ fontWeight: 'bold', textDecoration: 'underline', color: '#E91E63' }}&amp;gt;&lt;br /&gt;
  {review.comment}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={review.commentDetails}&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt; ℹ️&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comment Preview](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔄 10. Refactored Heatgrid to Reusable Components ===&lt;br /&gt;
* '''Feature:''' The frontend was '''restructured''' using '''modular, reusable React components'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
const HeatGrid = ({ data }) =&amp;gt; {&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      {data.map(row =&amp;gt; &amp;lt;HeatGridRow key={row.id} row={row} /&amp;gt;)}&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HeatGridComponent.png|250px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔑 11. Role-Based Access Control ===&lt;br /&gt;
* '''Feature:''' Normal users see anonymous &amp;quot;Review 0, Review 1&amp;quot; labels, while '''admins see actual reviewer names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{userRole === 'admin' ? review.reviewerName : `Review ${index}`}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Role-Based Access](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🖥 12. Backend Integration &amp;amp; Database Configuration ===&lt;br /&gt;
* '''Feature:''' Integrated the frontend with the backend, configured the '''database''', and deployed it on '''VCL using Docker'''.  &lt;br /&gt;
'''🖼 Screenshot:''' ![Backend Integration](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏗 Architecture &amp;amp; Flow Diagram ==&lt;br /&gt;
A '''visual representation''' of how the '''frontend interacts''' with the '''backend''' and '''database''', illustrating '''data flow and component structure'''.  &lt;br /&gt;
'''📌 Diagram:''' ![Flow Diagram](link-to-flow-diagram)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ✅ Deployment &amp;amp; Testing ==&lt;br /&gt;
* '''Deployment:''' Successfully deployed on '''Virtual Computing Lab (VCL)''' using '''Docker'''.  &lt;br /&gt;
* '''Testing:''' Conducted thorough '''manual test cases''' for all new functionalities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🎯 Future Enhancements &amp;amp; Best Practices ==&lt;br /&gt;
* Implement automated tests to '''improve maintainability'''.  &lt;br /&gt;
* Enhance '''responsiveness''' for better mobile support.  &lt;br /&gt;
* Optimize '''performance''' for larger datasets.  &lt;br /&gt;
* Follow '''best coding practices''' including '''DRY''' and '''Single Responsibility Principle'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏁 Conclusion ==&lt;br /&gt;
This project significantly '''enhances the Heatgrid UI''' for reviews, improving '''usability, accessibility, and data handling''' while maintaining an '''intuitive design'''. These newly added features ensure a '''seamless experience''' for students, faculty, and administrators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162568</id>
		<title>CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162568"/>
		<updated>2025-03-25T00:58:10Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= E2520: Reimplement Heatgrid UI for Reviews =&lt;br /&gt;
&lt;br /&gt;
== 🌟 Introduction ==&lt;br /&gt;
The '''Heatgrid UI for Reviews''' is a '''React-based''' component designed to visually represent review scores in a '''structured and user-friendly manner'''. This project enhances usability, data handling, and efficiency while introducing new features to improve the review experience. The component ensures '''seamless interaction and role-based access control''' for different users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🚀 Key Enhancements &amp;amp; Features ==&lt;br /&gt;
&lt;br /&gt;
=== 🎛 1. Toggle Question List ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Toggle Question List&amp;quot;''' button to display or hide all review questions.  &lt;br /&gt;
* '''Implementation:''' Users can '''click the button''' to dynamically expand/collapse the list of questions.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowQuestions(!showQuestions)} style={{ backgroundColor: '#4CAF50', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Toggle Question List&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showQuestions &amp;amp;&amp;amp; &amp;lt;QuestionList questions={questions} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle questions before.png | 1000px]]&lt;br /&gt;
[[File:Toggle questions after.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🏷 2. Hide Tags Button ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Hide Tags&amp;quot;''' button to toggle the visibility of tags.  &lt;br /&gt;
* '''Implementation:''' Clicking the button '''hides/shows''' tagging information dynamically.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowTags(!showTags)} style={{ backgroundColor: '#FF5722', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Hide Tags&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showTags &amp;amp;&amp;amp; &amp;lt;TagList tags={tags} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Hide tags ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🎨 3. Color Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the color legend displays a tooltip explaining the '''color scale from poor to excellent'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title=&amp;quot;Colors are scaled from poor to excellent: red, orange, yellow, light-green, dark-green&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;LegendIcon style={{ color: 'blue' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Color legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📌 4. Interaction Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the interaction legend now displays a '''tooltip''' with a detailed explanation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={t(&amp;quot;interaction_legend_tooltip&amp;quot;)}&amp;gt;&lt;br /&gt;
  &amp;lt;InteractionLegendIcon style={{ color: 'purple' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Interaction legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📝 5. Renamed Comment Categories &amp;amp; Added Word Count Column ===&lt;br /&gt;
* '''Feature:''' Changed '''&amp;quot;&amp;gt; 10 Word Comments&amp;quot;''' to '''&amp;quot;Short Comments&amp;quot;''' and '''&amp;quot;&amp;gt; 20 Word Comments&amp;quot;''' to '''&amp;quot;Long Comments&amp;quot;'''. A '''new column''' displays '''word count''' for each review comment.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{reviews.map(review =&amp;gt; (&lt;br /&gt;
  &amp;lt;TableRow&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.shortComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.longComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
  &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comments Column](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows ===&lt;br /&gt;
* '''Feature:''' Users can now '''sort questions''' using ascending/descending arrows.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;asc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▲&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;desc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▼&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG6.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 📊 7. Sort Reviews by Total Score ===&lt;br /&gt;
* '''Feature:''' Sort reviews '''in ascending/descending order''' based on '''total review score'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; toggleSortByTotalScore()} style={{ backgroundColor: '#3F51B5', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Sort by Total Review Score&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG7.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 👥 8. Dynamic Team Members ===&lt;br /&gt;
* '''Feature:''' Dynamically '''fetch and display team members' names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{teamMembers.map(member =&amp;gt; (&lt;br /&gt;
  &amp;lt;li key={member.id} style={{ fontWeight: 'bold', color: '#795548' }}&amp;gt;{member.name}&amp;lt;/li&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Team Members](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💬 9. Bold &amp;amp; Underlined Comments with Hover Preview ===&lt;br /&gt;
* '''Feature:''' Review comments are now '''bold and underlined'''; hovering over them '''shows a preview'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style={{ fontWeight: 'bold', textDecoration: 'underline', color: '#E91E63' }}&amp;gt;&lt;br /&gt;
  {review.comment}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={review.commentDetails}&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt; ℹ️&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comment Preview](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔄 10. Refactored Heatgrid to Reusable Components ===&lt;br /&gt;
* '''Feature:''' The frontend was '''restructured''' using '''modular, reusable React components'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
const HeatGrid = ({ data }) =&amp;gt; {&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      {data.map(row =&amp;gt; &amp;lt;HeatGridRow key={row.id} row={row} /&amp;gt;)}&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HeatGridComponent.png|250px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔑 11. Role-Based Access Control ===&lt;br /&gt;
* '''Feature:''' Normal users see anonymous &amp;quot;Review 0, Review 1&amp;quot; labels, while '''admins see actual reviewer names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{userRole === 'admin' ? review.reviewerName : `Review ${index}`}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Role-Based Access](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🖥 12. Backend Integration &amp;amp; Database Configuration ===&lt;br /&gt;
* '''Feature:''' Integrated the frontend with the backend, configured the '''database''', and deployed it on '''VCL using Docker'''.  &lt;br /&gt;
'''🖼 Screenshot:''' ![Backend Integration](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏗 Architecture &amp;amp; Flow Diagram ==&lt;br /&gt;
A '''visual representation''' of how the '''frontend interacts''' with the '''backend''' and '''database''', illustrating '''data flow and component structure'''.  &lt;br /&gt;
'''📌 Diagram:''' ![Flow Diagram](link-to-flow-diagram)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ✅ Deployment &amp;amp; Testing ==&lt;br /&gt;
* '''Deployment:''' Successfully deployed on '''Virtual Computing Lab (VCL)''' using '''Docker'''.  &lt;br /&gt;
* '''Testing:''' Conducted thorough '''manual test cases''' for all new functionalities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🎯 Future Enhancements &amp;amp; Best Practices ==&lt;br /&gt;
* Implement automated tests to '''improve maintainability'''.  &lt;br /&gt;
* Enhance '''responsiveness''' for better mobile support.  &lt;br /&gt;
* Optimize '''performance''' for larger datasets.  &lt;br /&gt;
* Follow '''best coding practices''' including '''DRY''' and '''Single Responsibility Principle'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏁 Conclusion ==&lt;br /&gt;
This project significantly '''enhances the Heatgrid UI''' for reviews, improving '''usability, accessibility, and data handling''' while maintaining an '''intuitive design'''. These newly added features ensure a '''seamless experience''' for students, faculty, and administrators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Hide_tags_ss.png&amp;diff=162567</id>
		<title>File:Hide tags ss.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Hide_tags_ss.png&amp;diff=162567"/>
		<updated>2025-03-25T00:57:37Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162562</id>
		<title>CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162562"/>
		<updated>2025-03-25T00:56:03Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= E2520: Reimplement Heatgrid UI for Reviews =&lt;br /&gt;
&lt;br /&gt;
== 🌟 Introduction ==&lt;br /&gt;
The '''Heatgrid UI for Reviews''' is a '''React-based''' component designed to visually represent review scores in a '''structured and user-friendly manner'''. This project enhances usability, data handling, and efficiency while introducing new features to improve the review experience. The component ensures '''seamless interaction and role-based access control''' for different users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🚀 Key Enhancements &amp;amp; Features ==&lt;br /&gt;
&lt;br /&gt;
=== 🎛 1. Toggle Question List ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Toggle Question List&amp;quot;''' button to display or hide all review questions.  &lt;br /&gt;
* '''Implementation:''' Users can '''click the button''' to dynamically expand/collapse the list of questions.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowQuestions(!showQuestions)} style={{ backgroundColor: '#4CAF50', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Toggle Question List&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showQuestions &amp;amp;&amp;amp; &amp;lt;QuestionList questions={questions} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle questions before.png | 1000px]]&lt;br /&gt;
[[File:Toggle questions after.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🏷 2. Hide Tags Button ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Hide Tags&amp;quot;''' button to toggle the visibility of tags.  &lt;br /&gt;
* '''Implementation:''' Clicking the button '''hides/shows''' tagging information dynamically.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowTags(!showTags)} style={{ backgroundColor: '#FF5722', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Hide Tags&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showTags &amp;amp;&amp;amp; &amp;lt;TagList tags={tags} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Hide tags.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🎨 3. Color Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the color legend displays a tooltip explaining the '''color scale from poor to excellent'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title=&amp;quot;Colors are scaled from poor to excellent: red, orange, yellow, light-green, dark-green&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;LegendIcon style={{ color: 'blue' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Color legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📌 4. Interaction Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the interaction legend now displays a '''tooltip''' with a detailed explanation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={t(&amp;quot;interaction_legend_tooltip&amp;quot;)}&amp;gt;&lt;br /&gt;
  &amp;lt;InteractionLegendIcon style={{ color: 'purple' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Interaction legend ss.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📝 5. Renamed Comment Categories &amp;amp; Added Word Count Column ===&lt;br /&gt;
* '''Feature:''' Changed '''&amp;quot;&amp;gt; 10 Word Comments&amp;quot;''' to '''&amp;quot;Short Comments&amp;quot;''' and '''&amp;quot;&amp;gt; 20 Word Comments&amp;quot;''' to '''&amp;quot;Long Comments&amp;quot;'''. A '''new column''' displays '''word count''' for each review comment.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{reviews.map(review =&amp;gt; (&lt;br /&gt;
  &amp;lt;TableRow&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.shortComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.longComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
  &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comments Column](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows ===&lt;br /&gt;
* '''Feature:''' Users can now '''sort questions''' using ascending/descending arrows.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;asc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▲&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;desc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▼&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG6.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 📊 7. Sort Reviews by Total Score ===&lt;br /&gt;
* '''Feature:''' Sort reviews '''in ascending/descending order''' based on '''total review score'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; toggleSortByTotalScore()} style={{ backgroundColor: '#3F51B5', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Sort by Total Review Score&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG7.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 👥 8. Dynamic Team Members ===&lt;br /&gt;
* '''Feature:''' Dynamically '''fetch and display team members' names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{teamMembers.map(member =&amp;gt; (&lt;br /&gt;
  &amp;lt;li key={member.id} style={{ fontWeight: 'bold', color: '#795548' }}&amp;gt;{member.name}&amp;lt;/li&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Team Members](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💬 9. Bold &amp;amp; Underlined Comments with Hover Preview ===&lt;br /&gt;
* '''Feature:''' Review comments are now '''bold and underlined'''; hovering over them '''shows a preview'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style={{ fontWeight: 'bold', textDecoration: 'underline', color: '#E91E63' }}&amp;gt;&lt;br /&gt;
  {review.comment}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={review.commentDetails}&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt; ℹ️&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comment Preview](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔄 10. Refactored Heatgrid to Reusable Components ===&lt;br /&gt;
* '''Feature:''' The frontend was '''restructured''' using '''modular, reusable React components'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
const HeatGrid = ({ data }) =&amp;gt; {&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      {data.map(row =&amp;gt; &amp;lt;HeatGridRow key={row.id} row={row} /&amp;gt;)}&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HeatGridComponent.png|250px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔑 11. Role-Based Access Control ===&lt;br /&gt;
* '''Feature:''' Normal users see anonymous &amp;quot;Review 0, Review 1&amp;quot; labels, while '''admins see actual reviewer names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{userRole === 'admin' ? review.reviewerName : `Review ${index}`}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Role-Based Access](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🖥 12. Backend Integration &amp;amp; Database Configuration ===&lt;br /&gt;
* '''Feature:''' Integrated the frontend with the backend, configured the '''database''', and deployed it on '''VCL using Docker'''.  &lt;br /&gt;
'''🖼 Screenshot:''' ![Backend Integration](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏗 Architecture &amp;amp; Flow Diagram ==&lt;br /&gt;
A '''visual representation''' of how the '''frontend interacts''' with the '''backend''' and '''database''', illustrating '''data flow and component structure'''.  &lt;br /&gt;
'''📌 Diagram:''' ![Flow Diagram](link-to-flow-diagram)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ✅ Deployment &amp;amp; Testing ==&lt;br /&gt;
* '''Deployment:''' Successfully deployed on '''Virtual Computing Lab (VCL)''' using '''Docker'''.  &lt;br /&gt;
* '''Testing:''' Conducted thorough '''manual test cases''' for all new functionalities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🎯 Future Enhancements &amp;amp; Best Practices ==&lt;br /&gt;
* Implement automated tests to '''improve maintainability'''.  &lt;br /&gt;
* Enhance '''responsiveness''' for better mobile support.  &lt;br /&gt;
* Optimize '''performance''' for larger datasets.  &lt;br /&gt;
* Follow '''best coding practices''' including '''DRY''' and '''Single Responsibility Principle'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏁 Conclusion ==&lt;br /&gt;
This project significantly '''enhances the Heatgrid UI''' for reviews, improving '''usability, accessibility, and data handling''' while maintaining an '''intuitive design'''. These newly added features ensure a '''seamless experience''' for students, faculty, and administrators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Interaction_legend_ss.png&amp;diff=162554</id>
		<title>File:Interaction legend ss.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Interaction_legend_ss.png&amp;diff=162554"/>
		<updated>2025-03-25T00:54:04Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Color_legend_ss.png&amp;diff=162551</id>
		<title>File:Color legend ss.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Color_legend_ss.png&amp;diff=162551"/>
		<updated>2025-03-25T00:53:34Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162548</id>
		<title>CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162548"/>
		<updated>2025-03-25T00:53:01Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= E2520: Reimplement Heatgrid UI for Reviews =&lt;br /&gt;
&lt;br /&gt;
== 🌟 Introduction ==&lt;br /&gt;
The '''Heatgrid UI for Reviews''' is a '''React-based''' component designed to visually represent review scores in a '''structured and user-friendly manner'''. This project enhances usability, data handling, and efficiency while introducing new features to improve the review experience. The component ensures '''seamless interaction and role-based access control''' for different users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🚀 Key Enhancements &amp;amp; Features ==&lt;br /&gt;
&lt;br /&gt;
=== 🎛 1. Toggle Question List ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Toggle Question List&amp;quot;''' button to display or hide all review questions.  &lt;br /&gt;
* '''Implementation:''' Users can '''click the button''' to dynamically expand/collapse the list of questions.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowQuestions(!showQuestions)} style={{ backgroundColor: '#4CAF50', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Toggle Question List&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showQuestions &amp;amp;&amp;amp; &amp;lt;QuestionList questions={questions} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle questions before.png | 1000px]]&lt;br /&gt;
[[File:Toggle questions after.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🏷 2. Hide Tags Button ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Hide Tags&amp;quot;''' button to toggle the visibility of tags.  &lt;br /&gt;
* '''Implementation:''' Clicking the button '''hides/shows''' tagging information dynamically.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowTags(!showTags)} style={{ backgroundColor: '#FF5722', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Hide Tags&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showTags &amp;amp;&amp;amp; &amp;lt;TagList tags={tags} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Hide tags.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🎨 3. Color Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the color legend displays a tooltip explaining the '''color scale from poor to excellent'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title=&amp;quot;Colors are scaled from poor to excellent: red, orange, yellow, light-green, dark-green&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;LegendIcon style={{ color: 'blue' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Color legend.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📌 4. Interaction Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the interaction legend now displays a '''tooltip''' with a detailed explanation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={t(&amp;quot;interaction_legend_tooltip&amp;quot;)}&amp;gt;&lt;br /&gt;
  &amp;lt;InteractionLegendIcon style={{ color: 'purple' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Interaciton legend.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📝 5. Renamed Comment Categories &amp;amp; Added Word Count Column ===&lt;br /&gt;
* '''Feature:''' Changed '''&amp;quot;&amp;gt; 10 Word Comments&amp;quot;''' to '''&amp;quot;Short Comments&amp;quot;''' and '''&amp;quot;&amp;gt; 20 Word Comments&amp;quot;''' to '''&amp;quot;Long Comments&amp;quot;'''. A '''new column''' displays '''word count''' for each review comment.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{reviews.map(review =&amp;gt; (&lt;br /&gt;
  &amp;lt;TableRow&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.shortComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.longComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
  &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comments Column](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows ===&lt;br /&gt;
* '''Feature:''' Users can now '''sort questions''' using ascending/descending arrows.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;asc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▲&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;desc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▼&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Sorting Questions](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 7. Sort Reviews by Total Score ===&lt;br /&gt;
* '''Feature:''' Sort reviews '''in ascending/descending order''' based on '''total review score'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; toggleSortByTotalScore()} style={{ backgroundColor: '#3F51B5', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Sort by Total Review Score&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HG7.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
=== 👥 8. Dynamic Team Members ===&lt;br /&gt;
* '''Feature:''' Dynamically '''fetch and display team members' names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{teamMembers.map(member =&amp;gt; (&lt;br /&gt;
  &amp;lt;li key={member.id} style={{ fontWeight: 'bold', color: '#795548' }}&amp;gt;{member.name}&amp;lt;/li&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Team Members](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💬 9. Bold &amp;amp; Underlined Comments with Hover Preview ===&lt;br /&gt;
* '''Feature:''' Review comments are now '''bold and underlined'''; hovering over them '''shows a preview'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style={{ fontWeight: 'bold', textDecoration: 'underline', color: '#E91E63' }}&amp;gt;&lt;br /&gt;
  {review.comment}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={review.commentDetails}&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt; ℹ️&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comment Preview](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔄 10. Refactored Heatgrid to Reusable Components ===&lt;br /&gt;
* '''Feature:''' The frontend was '''restructured''' using '''modular, reusable React components'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
const HeatGrid = ({ data }) =&amp;gt; {&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      {data.map(row =&amp;gt; &amp;lt;HeatGridRow key={row.id} row={row} /&amp;gt;)}&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:HeatGridComponent.png|250px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔑 11. Role-Based Access Control ===&lt;br /&gt;
* '''Feature:''' Normal users see anonymous &amp;quot;Review 0, Review 1&amp;quot; labels, while '''admins see actual reviewer names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{userRole === 'admin' ? review.reviewerName : `Review ${index}`}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Role-Based Access](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🖥 12. Backend Integration &amp;amp; Database Configuration ===&lt;br /&gt;
* '''Feature:''' Integrated the frontend with the backend, configured the '''database''', and deployed it on '''VCL using Docker'''.  &lt;br /&gt;
'''🖼 Screenshot:''' ![Backend Integration](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏗 Architecture &amp;amp; Flow Diagram ==&lt;br /&gt;
A '''visual representation''' of how the '''frontend interacts''' with the '''backend''' and '''database''', illustrating '''data flow and component structure'''.  &lt;br /&gt;
'''📌 Diagram:''' ![Flow Diagram](link-to-flow-diagram)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ✅ Deployment &amp;amp; Testing ==&lt;br /&gt;
* '''Deployment:''' Successfully deployed on '''Virtual Computing Lab (VCL)''' using '''Docker'''.  &lt;br /&gt;
* '''Testing:''' Conducted thorough '''manual test cases''' for all new functionalities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🎯 Future Enhancements &amp;amp; Best Practices ==&lt;br /&gt;
* Implement automated tests to '''improve maintainability'''.  &lt;br /&gt;
* Enhance '''responsiveness''' for better mobile support.  &lt;br /&gt;
* Optimize '''performance''' for larger datasets.  &lt;br /&gt;
* Follow '''best coding practices''' including '''DRY''' and '''Single Responsibility Principle'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏁 Conclusion ==&lt;br /&gt;
This project significantly '''enhances the Heatgrid UI''' for reviews, improving '''usability, accessibility, and data handling''' while maintaining an '''intuitive design'''. These newly added features ensure a '''seamless experience''' for students, faculty, and administrators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Interaction_legend.png&amp;diff=162533</id>
		<title>File:Interaction legend.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Interaction_legend.png&amp;diff=162533"/>
		<updated>2025-03-25T00:47:08Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Color_legend.png&amp;diff=162531</id>
		<title>File:Color legend.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Color_legend.png&amp;diff=162531"/>
		<updated>2025-03-25T00:46:38Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: Pnkulka2 uploaded a new version of File:Color legend.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Toggle_questions_after.png&amp;diff=162529</id>
		<title>File:Toggle questions after.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Toggle_questions_after.png&amp;diff=162529"/>
		<updated>2025-03-25T00:45:50Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Toggle_questions_before.png&amp;diff=162527</id>
		<title>File:Toggle questions before.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Toggle_questions_before.png&amp;diff=162527"/>
		<updated>2025-03-25T00:45:30Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162230</id>
		<title>CSC/ECE 517 Spring 2025 - E2520. Reimplement heatgrid UI for reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2025_-_E2520._Reimplement_heatgrid_UI_for_reviews&amp;diff=162230"/>
		<updated>2025-03-24T14:31:00Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= E2520: Reimplement Heatgrid UI for Reviews =&lt;br /&gt;
&lt;br /&gt;
== 🌟 Introduction ==&lt;br /&gt;
The '''Heatgrid UI for Reviews''' is a '''React-based''' component designed to visually represent review scores in a '''structured and user-friendly manner'''. This project enhances usability, data handling, and efficiency while introducing new features to improve the review experience. The component ensures '''seamless interaction and role-based access control''' for different users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🚀 Key Enhancements &amp;amp; Features ==&lt;br /&gt;
&lt;br /&gt;
=== 🎛 1. Toggle Question List ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Toggle Question List&amp;quot;''' button to display or hide all review questions.  &lt;br /&gt;
* '''Implementation:''' Users can '''click the button''' to dynamically expand/collapse the list of questions.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowQuestions(!showQuestions)} style={{ backgroundColor: '#4CAF50', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Toggle Question List&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showQuestions &amp;amp;&amp;amp; &amp;lt;QuestionList questions={questions} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Toggle question.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🏷 2. Hide Tags Button ===&lt;br /&gt;
* '''Feature:''' Added a '''&amp;quot;Hide Tags&amp;quot;''' button to toggle the visibility of tags.  &lt;br /&gt;
* '''Implementation:''' Clicking the button '''hides/shows''' tagging information dynamically.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; setShowTags(!showTags)} style={{ backgroundColor: '#FF5722', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Hide Tags&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
{showTags &amp;amp;&amp;amp; &amp;lt;TagList tags={tags} /&amp;gt;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Hide tags.png | 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🎨 3. Color Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the color legend displays a tooltip explaining the '''color scale from poor to excellent'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title=&amp;quot;Colors are scaled from poor to excellent: red, orange, yellow, light-green, dark-green&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;LegendIcon style={{ color: 'blue' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Color legend.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📌 4. Interaction Legend Tooltip ===&lt;br /&gt;
* '''Feature:''' Hovering over the interaction legend now displays a '''tooltip''' with a detailed explanation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={t(&amp;quot;interaction_legend_tooltip&amp;quot;)}&amp;gt;&lt;br /&gt;
  &amp;lt;InteractionLegendIcon style={{ color: 'purple' }}/&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Interaciton legend.png| 1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📝 5. Renamed Comment Categories &amp;amp; Added Word Count Column ===&lt;br /&gt;
* '''Feature:''' Changed '''&amp;quot;&amp;gt; 10 Word Comments&amp;quot;''' to '''&amp;quot;Short Comments&amp;quot;''' and '''&amp;quot;&amp;gt; 20 Word Comments&amp;quot;''' to '''&amp;quot;Long Comments&amp;quot;'''. A '''new column''' displays '''word count''' for each review comment.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{reviews.map(review =&amp;gt; (&lt;br /&gt;
  &amp;lt;TableRow&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.shortComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
    &amp;lt;TableCell style={{ fontWeight: 'bold' }}&amp;gt;{review.longComments}&amp;lt;/TableCell&amp;gt;&lt;br /&gt;
  &amp;lt;/TableRow&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comments Column](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows ===&lt;br /&gt;
* '''Feature:''' Users can now '''sort questions''' using ascending/descending arrows.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;asc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▲&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;TableHeader onClick={() =&amp;gt; sortQuestions(&amp;quot;desc&amp;quot;)} style={{ cursor: 'pointer' }}&amp;gt;▼&amp;lt;/TableHeader&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Sorting Questions](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 📊 7. Sort Reviews by Total Score ===&lt;br /&gt;
* '''Feature:''' Sort reviews '''in ascending/descending order''' based on '''total review score'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Button onClick={() =&amp;gt; toggleSortByTotalScore()} style={{ backgroundColor: '#3F51B5', color: 'white', fontWeight: 'bold' }}&amp;gt;&lt;br /&gt;
  Sort by Total Review Score&lt;br /&gt;
&amp;lt;/Button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Sort by Score](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 👥 8. Dynamic Team Members ===&lt;br /&gt;
* '''Feature:''' Dynamically '''fetch and display team members' names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{teamMembers.map(member =&amp;gt; (&lt;br /&gt;
  &amp;lt;li key={member.id} style={{ fontWeight: 'bold', color: '#795548' }}&amp;gt;{member.name}&amp;lt;/li&amp;gt;&lt;br /&gt;
))}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Team Members](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 💬 9. Bold &amp;amp; Underlined Comments with Hover Preview ===&lt;br /&gt;
* '''Feature:''' Review comments are now '''bold and underlined'''; hovering over them '''shows a preview'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style={{ fontWeight: 'bold', textDecoration: 'underline', color: '#E91E63' }}&amp;gt;&lt;br /&gt;
  {review.comment}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;Tooltip title={review.commentDetails}&amp;gt;&lt;br /&gt;
  &amp;lt;span&amp;gt; ℹ️&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/Tooltip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Comment Preview](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔄 10. Refactored Heatgrid to Reusable Components ===&lt;br /&gt;
* '''Feature:''' The frontend was '''restructured''' using '''modular, reusable React components'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
const HeatGrid = ({ data }) =&amp;gt; {&lt;br /&gt;
  return (&lt;br /&gt;
    &amp;lt;div&amp;gt;&lt;br /&gt;
      {data.map(row =&amp;gt; &amp;lt;HeatGridRow key={row.id} row={row} /&amp;gt;)}&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  );&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Refactored Code](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🔑 11. Role-Based Access Control ===&lt;br /&gt;
* '''Feature:''' Normal users see anonymous &amp;quot;Review 0, Review 1&amp;quot; labels, while '''admins see actual reviewer names'''.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsx&amp;quot;&amp;gt;&lt;br /&gt;
{userRole === 'admin' ? review.reviewerName : `Review ${index}`}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''🖼 Screenshot:''' ![Role-Based Access](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 🖥 12. Backend Integration &amp;amp; Database Configuration ===&lt;br /&gt;
* '''Feature:''' Integrated the frontend with the backend, configured the '''database''', and deployed it on '''VCL using Docker'''.  &lt;br /&gt;
'''🖼 Screenshot:''' ![Backend Integration](link-to-screenshot)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏗 Architecture &amp;amp; Flow Diagram ==&lt;br /&gt;
A '''visual representation''' of how the '''frontend interacts''' with the '''backend''' and '''database''', illustrating '''data flow and component structure'''.  &lt;br /&gt;
'''📌 Diagram:''' ![Flow Diagram](link-to-flow-diagram)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ✅ Deployment &amp;amp; Testing ==&lt;br /&gt;
* '''Deployment:''' Successfully deployed on '''Virtual Computing Lab (VCL)''' using '''Docker'''.  &lt;br /&gt;
* '''Testing:''' Conducted thorough '''manual test cases''' for all new functionalities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🎯 Future Enhancements &amp;amp; Best Practices ==&lt;br /&gt;
* Implement automated tests to '''improve maintainability'''.  &lt;br /&gt;
* Enhance '''responsiveness''' for better mobile support.  &lt;br /&gt;
* Optimize '''performance''' for larger datasets.  &lt;br /&gt;
* Follow '''best coding practices''' including '''DRY''' and '''Single Responsibility Principle'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 🏁 Conclusion ==&lt;br /&gt;
This project significantly '''enhances the Heatgrid UI''' for reviews, improving '''usability, accessibility, and data handling''' while maintaining an '''intuitive design'''. These newly added features ensure a '''seamless experience''' for students, faculty, and administrators.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
* '''Prathyusha Kodali''' (pkodali@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* '''Raj Patel''' (rbpatel4@ncsu.edu)&lt;br /&gt;
* '''Aditya Pai''' (aapai@ncsu.edu)&lt;br /&gt;
* '''Parth Kulkarni''' (pnkulka2@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
== Contributors to this project ==&lt;br /&gt;
* '''Raj Patel''' (unityid: rbpatel4, github: Raj-mac24)&lt;br /&gt;
* '''Aditya Pai''' (unityid: aapai, github: aditya-pai-nc)&lt;br /&gt;
* '''Parth Kulkarni''' (unityid: pnkulka2, github: ParthK7)&lt;br /&gt;
* '''Github repo''' https://github.com/aditya-pai-nc/reimplementation-front-end&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Interaciton_legend.png&amp;diff=162223</id>
		<title>File:Interaciton legend.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Interaciton_legend.png&amp;diff=162223"/>
		<updated>2025-03-24T14:08:52Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Color_legend.png&amp;diff=162222</id>
		<title>File:Color legend.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Color_legend.png&amp;diff=162222"/>
		<updated>2025-03-24T14:08:38Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Hide_tags.png&amp;diff=162221</id>
		<title>File:Hide tags.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Hide_tags.png&amp;diff=162221"/>
		<updated>2025-03-24T14:08:25Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Toggle_question.png&amp;diff=162220</id>
		<title>File:Toggle question.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Toggle_question.png&amp;diff=162220"/>
		<updated>2025-03-24T14:08:11Z</updated>

		<summary type="html">&lt;p&gt;Pnkulka2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pnkulka2</name></author>
	</entry>
</feed>