<?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=Aapai</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=Aapai"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Aapai"/>
	<updated>2026-08-10T15:55:35Z</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=164183</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=164183"/>
		<updated>2025-04-20T06:44:11Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 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;
=== 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;
== 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>Aapai</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=164182</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=164182"/>
		<updated>2025-04-20T06:43:27Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 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;
=== 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;
'''4. Desktop View'''&lt;br /&gt;
[[File:ass-2-ui.png|800px|center]]&lt;br /&gt;
&lt;br /&gt;
'''5. Mobile View'''&lt;br /&gt;
[[File:ass-2-ui-2.png|400px|center]]&lt;br /&gt;
&lt;br /&gt;
'''6. Network Request'''&lt;br /&gt;
[[File:ass-2-net-1.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>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-2-ui-2.png&amp;diff=164181</id>
		<title>File:Ass-2-ui-2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-2-ui-2.png&amp;diff=164181"/>
		<updated>2025-04-20T06:40:58Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-1-ui-2.png&amp;diff=164180</id>
		<title>File:Ass-1-ui-2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-1-ui-2.png&amp;diff=164180"/>
		<updated>2025-04-20T06:40:40Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-2-net-1.png&amp;diff=164179</id>
		<title>File:Ass-2-net-1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-2-net-1.png&amp;diff=164179"/>
		<updated>2025-04-20T06:38:31Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-2-ui.png&amp;diff=164178</id>
		<title>File:Ass-2-ui.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-2-ui.png&amp;diff=164178"/>
		<updated>2025-04-20T06:37:39Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-1-net-1.png&amp;diff=164177</id>
		<title>File:Ass-1-net-1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-1-net-1.png&amp;diff=164177"/>
		<updated>2025-04-20T06:36:26Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-1-ui.png&amp;diff=164176</id>
		<title>File:Ass-1-ui.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Ass-1-ui.png&amp;diff=164176"/>
		<updated>2025-04-20T06:34:14Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</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=164175</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=164175"/>
		<updated>2025-04-20T06:29:21Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 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;
=== 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;
== 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>Aapai</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=164174</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=164174"/>
		<updated>2025-04-20T06:25:00Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 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;
=== 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;
== 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>Aapai</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=164173</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=164173"/>
		<updated>2025-04-20T06:23:27Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* Key Features */&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;
=== 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;
== 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>Aapai</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=164172</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=164172"/>
		<updated>2025-04-20T06:22:16Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 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;
=== 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.&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;
== 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>Aapai</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=164171</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=164171"/>
		<updated>2025-04-20T06:21:43Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* Key Features */&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;
== View Submissions Page ==&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.&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;
== 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>Aapai</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=164170</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=164170"/>
		<updated>2025-04-20T06:20:16Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* Sample JSON Response */&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;
== View Submissions Page ==&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.&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;
== 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>Aapai</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=164169</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=164169"/>
		<updated>2025-04-20T06:19:19Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* Backend Controller Code */&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;
== View Submissions Page ==&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.&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;
== 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>Aapai</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=164168</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=164168"/>
		<updated>2025-04-20T06:19:02Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* Backend Controller Code */&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;
== View Submissions Page ==&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.&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;
== 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>Aapai</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=164167</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=164167"/>
		<updated>2025-04-20T06:17:58Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* API Documentation */&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;
== View Submissions Page ==&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.&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;
== 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>Aapai</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=164166</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=164166"/>
		<updated>2025-04-20T06:16:16Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* Frontend Component */&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;
== View Submissions Page ==&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.&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.178.127: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;
== 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>Aapai</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=164165</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=164165"/>
		<updated>2025-04-20T06:10:16Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* Frontend Implementation */&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;
== View Submissions Page ==&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.&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;
* Fetches data with &amp;lt;code&amp;gt;useLoaderData()&amp;lt;/code&amp;gt; via the route's loader&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, Topic, Members, Assign Grade, History&lt;br /&gt;
* Styled with Bootstrap, accessible via keyboard and ARIA roles&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.178.127: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;
== 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>Aapai</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=164019</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=164019"/>
		<updated>2025-04-19T03:28:55Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &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;
== 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;
=== 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>Aapai</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=162692</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=162692"/>
		<updated>2025-03-25T02:34:21Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* ✅ Deployment &amp;amp; Testing */&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;
'''🖼 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;
&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''' &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>Aapai</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=162687</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=162687"/>
		<updated>2025-03-25T02:32:23Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* ✅ Deployment &amp;amp; Testing */&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;
'''🖼 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;
&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;
=== ✅ Route Under Test ===&lt;br /&gt;
* '''URL:''' [http://localhost:3000/view-team-grades http://localhost:3000/view-team-grades]&lt;br /&gt;
* '''Entry Component:''' &amp;lt;code&amp;gt;ReviewTable.tsx&amp;lt;/code&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''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Aapai</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=162678</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=162678"/>
		<updated>2025-03-25T02:28:01Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 👥 8. Dynamic Team Members */&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;
'''🖼 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;
&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;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Aapai</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=162677</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=162677"/>
		<updated>2025-03-25T02:27:52Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 👥 8. Dynamic Team Members */&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|600px]]&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;
'''🖼 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;
&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;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Aapai</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=162675</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=162675"/>
		<updated>2025-03-25T02:27:42Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 👥 8. Dynamic Team Members */&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|300px]]&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;
'''🖼 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;
&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;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Aapai</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=162674</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=162674"/>
		<updated>2025-03-25T02:27:30Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 👥 8. Dynamic Team Members */&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]]&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;
'''🖼 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;
&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;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Aapai</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=162673</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=162673"/>
		<updated>2025-03-25T02:27:23Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 👥 8. Dynamic Team Members */&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| 150px]]&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;
'''🖼 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;
&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;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Aapai</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=162670</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=162670"/>
		<updated>2025-03-25T02:27:02Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &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;
&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;
'''🖼 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;
&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;
* '''Backend Hosted on VCL''' http://152.7.178.127:3002/api-docs/index.html&lt;br /&gt;
* '''Link to PR''' &lt;br /&gt;
* '''Video of UI/UX Improvements'''&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:HG9.png&amp;diff=162669</id>
		<title>File:HG9.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:HG9.png&amp;diff=162669"/>
		<updated>2025-03-25T02:26:42Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:HG8.png&amp;diff=162667</id>
		<title>File:HG8.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:HG8.png&amp;diff=162667"/>
		<updated>2025-03-25T02:26:01Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:HG5_2.png&amp;diff=162666</id>
		<title>File:HG5 2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:HG5_2.png&amp;diff=162666"/>
		<updated>2025-03-25T02:24:02Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:HG5_1.png&amp;diff=162665</id>
		<title>File:HG5 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:HG5_1.png&amp;diff=162665"/>
		<updated>2025-03-25T02:23:54Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</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=162552</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=162552"/>
		<updated>2025-03-25T00:53:40Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 🔼 6. Sorting Questions with Ascending &amp;amp; Descending Arrows */&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;
[[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>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:HG6.png&amp;diff=162550</id>
		<title>File:HG6.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:HG6.png&amp;diff=162550"/>
		<updated>2025-03-25T00:53:25Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</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=162532</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=162532"/>
		<updated>2025-03-25T00:47:01Z</updated>

		<summary type="html">&lt;p&gt;Aapai: /* 📊 7. Sort Reviews by Total Score */&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;
[[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>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:HG7.png&amp;diff=162530</id>
		<title>File:HG7.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:HG7.png&amp;diff=162530"/>
		<updated>2025-03-25T00:46:17Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aapai</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=162481</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=162481"/>
		<updated>2025-03-24T23:42:26Z</updated>

		<summary type="html">&lt;p&gt;Aapai: &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;
[[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>Aapai</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:HeatGridComponent.png&amp;diff=162456</id>
		<title>File:HeatGridComponent.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:HeatGridComponent.png&amp;diff=162456"/>
		<updated>2025-03-24T23:09:01Z</updated>

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