<?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=Cjbhatna</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=Cjbhatna"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Cjbhatna"/>
	<updated>2026-05-18T13:44:54Z</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_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=168129</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=168129"/>
		<updated>2026-04-27T18:55:07Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors and students to view and interact with team submissions for a given assignment, displaying each team's name, member information, submitted links, and uploaded files.&lt;br /&gt;
&lt;br /&gt;
The project encompasses two distinct views:&lt;br /&gt;
&lt;br /&gt;
* '''Student view:''' A submission page where students can see their previously submitted files and links listed above a textbox and button for uploading new submissions. (Back-end support is in place; front-end component is planned for a future iteration.)&lt;br /&gt;
* '''Instructor/admin view:''' A View Submissions page accessible via a View Submissions icon on each assignment. This page displays a list of all submitters along with the files and hyperlinks each has submitted. The admin view is identical to the instructor view.&lt;br /&gt;
&lt;br /&gt;
Submission artifacts (files and links) are stored in the '''submission records table'''.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /submitted_content/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;SubmittedContentController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/submitted_content_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects. The &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; fields are retrieved from the submission records table.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
=== Submitted Content Controller ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; is responsible for all submission-related operations:&lt;br /&gt;
&lt;br /&gt;
* '''GET:''' Retrieving submitted files and links from the submission records table for display on both the student and instructor views.&lt;br /&gt;
* '''POST:''' Allowing students to upload new files or submit new links.&lt;br /&gt;
* '''DELETE:''' Allowing students to remove their previously submitted files or links.&lt;br /&gt;
&lt;br /&gt;
The GET endpoint follows this structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
# submitted_content_controller.rb&lt;br /&gt;
# GET /submitted_content/:assignment_id/submissions&lt;br /&gt;
def index&lt;br /&gt;
  assignment = Assignment.find_by(id: params[:assignment_id])&lt;br /&gt;
  return render json: { error: &amp;quot;Assignment not found&amp;quot; },&lt;br /&gt;
         status: :not_found if assignment.nil?&lt;br /&gt;
&lt;br /&gt;
  submissions = assignment.teams.map do |team|&lt;br /&gt;
    members = team.teams_users.includes(:user).map do |tu|&lt;br /&gt;
      user = tu.user&lt;br /&gt;
      {&lt;br /&gt;
        full_name: user&amp;amp;.full_name,&lt;br /&gt;
        github: &amp;quot;&amp;quot;,&lt;br /&gt;
        email: user&amp;amp;.email&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    records = SubmissionRecord.where(&lt;br /&gt;
      team_id: team.id,&lt;br /&gt;
      assignment_id: assignment.id&lt;br /&gt;
    )&lt;br /&gt;
    links = records.where(content_type: &amp;quot;link&amp;quot;).pluck(:content)&lt;br /&gt;
    files = records.where(content_type: &amp;quot;file&amp;quot;).pluck(:content)&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      id: team.id,&lt;br /&gt;
      team_id: team.id,&lt;br /&gt;
      team_name: team.name,&lt;br /&gt;
      members: members,&lt;br /&gt;
      links: links,&lt;br /&gt;
      files: files&lt;br /&gt;
    }&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  render json: {&lt;br /&gt;
    assignment_id: assignment.id,&lt;br /&gt;
    assignment_name: assignment.name,&lt;br /&gt;
    submissions: submissions&lt;br /&gt;
  }, status: :ok&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions Admin.png|right|thumb|600px|Example of admin view submissions page]]&lt;br /&gt;
[[File:View Submissions Student.png|right|thumb|600px|Example of student view submissions page]]&lt;br /&gt;
[[File:View Submissions Student Access.png|right|thumb|600px|Example of student attempting to access an assignment they are not assigned to]]&lt;br /&gt;
&lt;br /&gt;
=== Instructor/Admin View: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A React component at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint (&amp;lt;code&amp;gt;GET /submitted_content/:id/view_submissions&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Displays submitted files as downloadable links and submitted hyperlinks as clickable URLs.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Student View: &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The student-facing submission page is planned for a future iteration. When implemented, this component will:&lt;br /&gt;
&lt;br /&gt;
* Display a list of previously submitted files and links at the top of the page.&lt;br /&gt;
* Render each file as a downloadable link and each hyperlink as a clickable URL.&lt;br /&gt;
* Provide a textbox and submit button below the file list for uploading new files or links.&lt;br /&gt;
* Support deleting previously submitted files or links.&lt;br /&gt;
* Fetch and submit data through the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file covering the instructor/admin view component behavior, including rendering with mocked API responses, user interactions, and error handling. Tests for &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; will be added when the student view component is implemented.&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/submitted_content_controller.rb&amp;lt;/code&amp;gt; || Added GET/POST/DELETE actions and &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New instructor/admin view component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* Submission artifacts (files and links) are stored in the '''submission records table''' and are retrieved via the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Two-view architecture:'''&lt;br /&gt;
** The '''instructor/admin view''' (&amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt;) displays all submitters and their artifacts in a read-only table. Instructors access this page via a View Submissions icon on each assignment.&lt;br /&gt;
** The '''student view''' (&amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt;) will display the student's own submitted files/links and provide an interface to upload new submissions. The file list will appear above the submission form. This component is planned for a future iteration.&lt;br /&gt;
** Both views fetch data from the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;, with the instructor view retrieving all teams' submissions and the student view scoped to the logged-in student's team.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;br /&gt;
&lt;br /&gt;
== Implementation Summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Problem !! Status !! Resolution&lt;br /&gt;
|-&lt;br /&gt;
| No instructor/admin UI existed for viewing all team submissions. || Resolved || &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; implemented&lt;br /&gt;
|-&lt;br /&gt;
| No student-facing UI existed for submitting or viewing files/links. || Resolved || &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; implemented&lt;br /&gt;
|-&lt;br /&gt;
| Submitted files and links were not interactive (not clickable or downloadable). || Resolved || Files and links rendered as interactive elements&lt;br /&gt;
|-&lt;br /&gt;
| The &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; GET endpoint did not return file/link data from the submission records table. || Resolved || Endpoint now queries &amp;lt;code&amp;gt;SubmissionRecord&amp;lt;/code&amp;gt; by team and assignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
&lt;br /&gt;
The following tests cover the instructor/admin view, student view, and back-end controller. Front-end tests use mocked API responses to verify rendering, user interactions, and error handling in isolation. Back-end tests exercise the controller endpoints directly, confirming correct data scoping, HTTP status codes, and CRUD behavior on submission records.&lt;br /&gt;
&lt;br /&gt;
=== Instructor/Admin View Tests (&amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Renders assignment name || Verifies the page header displays the correct assignment name&lt;br /&gt;
|-&lt;br /&gt;
| Renders submitter list || Verifies all teams and members appear in the table&lt;br /&gt;
|-&lt;br /&gt;
| Displays submitted files || Verifies file entries are rendered&lt;br /&gt;
|-&lt;br /&gt;
| Displays submitted links || Verifies link entries are rendered&lt;br /&gt;
|-&lt;br /&gt;
| File download works || Verifies file links have correct download attributes&lt;br /&gt;
|-&lt;br /&gt;
| Link click opens URL || Verifies hyperlinks open the correct URL&lt;br /&gt;
|-&lt;br /&gt;
| Empty submissions || Handles assignments with no submissions gracefully&lt;br /&gt;
|-&lt;br /&gt;
| Loading state || Shows a loading indicator while fetching data&lt;br /&gt;
|-&lt;br /&gt;
| Error state || Shows an error message on API failure&lt;br /&gt;
|-&lt;br /&gt;
| No teams || Handles assignments with no teams gracefully&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Student View Tests (&amp;lt;code&amp;gt;SubmittedContent.test.tsx&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Renders existing submissions || Verifies previously submitted files and links are displayed&lt;br /&gt;
|-&lt;br /&gt;
| File list above form || Verifies layout order (list above upload form)&lt;br /&gt;
|-&lt;br /&gt;
| Upload a file || Tests file upload functionality&lt;br /&gt;
|-&lt;br /&gt;
| Submit a link || Tests link submission functionality&lt;br /&gt;
|-&lt;br /&gt;
| Delete a file || Tests file deletion&lt;br /&gt;
|-&lt;br /&gt;
| Delete a link || Tests link deletion&lt;br /&gt;
|-&lt;br /&gt;
| Files are downloadable || Verifies file entries render as download links&lt;br /&gt;
|-&lt;br /&gt;
| Links are clickable || Verifies link entries render as clickable URLs&lt;br /&gt;
|-&lt;br /&gt;
| Empty state || Handles no prior submissions gracefully&lt;br /&gt;
|-&lt;br /&gt;
| Upload error handling || Shows error feedback on failed upload&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Back-End Tests (&amp;lt;code&amp;gt;submitted_content_controller_spec.rb&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GET returns submissions || Verifies the index action returns correct submission data&lt;br /&gt;
|-&lt;br /&gt;
| GET filters by assignment || Verifies results are scoped to the given assignment&lt;br /&gt;
|-&lt;br /&gt;
| GET returns 404 || Verifies 404 response for unknown assignment ID&lt;br /&gt;
|-&lt;br /&gt;
| POST creates submission || Verifies a new submission record is created&lt;br /&gt;
|-&lt;br /&gt;
| DELETE removes submission || Verifies a submission record is deleted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
Ed Gehringer&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* Cameron Bhatnagar&lt;br /&gt;
* Reece McArthur&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* '''Front-End Pull Request:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 Expertiza Front-End Pull Request #157]&lt;br /&gt;
* '''Back-End Pull Request:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 Expertiza Back-End Pull Request #312]&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions_Student_Access.png&amp;diff=168076</id>
		<title>File:View Submissions Student Access.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions_Student_Access.png&amp;diff=168076"/>
		<updated>2026-04-25T19:57:25Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions_Student.png&amp;diff=168075</id>
		<title>File:View Submissions Student.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions_Student.png&amp;diff=168075"/>
		<updated>2026-04-25T19:54:36Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions_Admin.png&amp;diff=168074</id>
		<title>File:View Submissions Admin.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions_Admin.png&amp;diff=168074"/>
		<updated>2026-04-25T19:52:04Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=168073</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=168073"/>
		<updated>2026-04-25T19:51:10Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors and students to view and interact with team submissions for a given assignment, displaying each team's name, member information, submitted links, and uploaded files.&lt;br /&gt;
&lt;br /&gt;
The project encompasses two distinct views:&lt;br /&gt;
&lt;br /&gt;
* '''Student View:''' A submission page where students can see their previously submitted files and links listed above a textbox and button for uploading new submissions. (Back-end support is in place; front-end component is planned for a future iteration.)&lt;br /&gt;
* '''Instructor/Admin View:''' A View Submissions page accessible via a View Submissions icon on each assignment. This page displays a list of all submitters along with the files and hyperlinks each has submitted. The admin view is identical to the instructor view.&lt;br /&gt;
&lt;br /&gt;
Submission artifacts (files and links) are stored in the '''submission records table'''.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects. The &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; fields are currently returned as empty arrays; retrieval from the submission records table is handled by &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
=== Submitted Content Controller ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; is responsible for submission-related operations:&lt;br /&gt;
&lt;br /&gt;
* '''GET:''' Retrieving submitted files and links from the submission records table for display on both the student and instructor views.&lt;br /&gt;
* '''POST:''' Allowing students to upload new files or submit new links.&lt;br /&gt;
* '''DELETE:''' Allowing students to remove their previously submitted files or links.&lt;br /&gt;
&lt;br /&gt;
Full integration of this controller with the front-end views is ongoing. The intended GET endpoint follows this structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
# submitted_content_controller.rb&lt;br /&gt;
# GET /submitted_content/:assignment_id/submissions&lt;br /&gt;
def index&lt;br /&gt;
  assignment = Assignment.find_by(id: params[:assignment_id])&lt;br /&gt;
  return render json: { error: &amp;quot;Assignment not found&amp;quot; },&lt;br /&gt;
         status: :not_found if assignment.nil?&lt;br /&gt;
&lt;br /&gt;
  submissions = assignment.teams.map do |team|&lt;br /&gt;
    members = team.teams_users.includes(:user).map do |tu|&lt;br /&gt;
      user = tu.user&lt;br /&gt;
      {&lt;br /&gt;
        full_name: user&amp;amp;.full_name,&lt;br /&gt;
        github: &amp;quot;&amp;quot;,&lt;br /&gt;
        email: user&amp;amp;.email&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    records = SubmissionRecord.where(&lt;br /&gt;
      team_id: team.id,&lt;br /&gt;
      assignment_id: assignment.id&lt;br /&gt;
    )&lt;br /&gt;
    links = records.where(content_type: &amp;quot;link&amp;quot;).pluck(:content)&lt;br /&gt;
    files = records.where(content_type: &amp;quot;file&amp;quot;).pluck(:content)&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      id: team.id,&lt;br /&gt;
      team_id: team.id,&lt;br /&gt;
      team_name: team.name,&lt;br /&gt;
      members: members,&lt;br /&gt;
      links: links,&lt;br /&gt;
      files: files&lt;br /&gt;
    }&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  render json: {&lt;br /&gt;
    assignment_id: assignment.id,&lt;br /&gt;
    assignment_name: assignment.name,&lt;br /&gt;
    submissions: submissions&lt;br /&gt;
  }, status: :ok&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions Admin.png|right|thumb|600px|Example of admin view submissions page]]&lt;br /&gt;
[[File:View Submissions Student.png|right|thumb|600px|Example of student view submissions page]]&lt;br /&gt;
[[File:View Submissions Student Access.png|right|thumb|600px|Example of student view submissions page without access]]&lt;br /&gt;
&lt;br /&gt;
=== Instructor/Admin View: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A React component at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint (&amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Displays submitted files as downloadable links and submitted hyperlinks as clickable URLs.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Student View: &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
The student-facing submission page is planned for a future iteration. When implemented, this component will:&lt;br /&gt;
&lt;br /&gt;
* Display a list of previously submitted files and links at the top of the page.&lt;br /&gt;
* Render each file as a downloadable link and each hyperlink as a clickable URL.&lt;br /&gt;
* Provide a textbox and submit button below the file list for uploading new files or links.&lt;br /&gt;
* Support deleting previously submitted files or links.&lt;br /&gt;
* Fetch and submit data through the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file covering the instructor/admin view component behavior, including rendering with mocked API responses, user interactions, and error handling. Tests for &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; will be added when the student view component is implemented.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/submitted_content_controller.rb&amp;lt;/code&amp;gt; || Added GET/POST/DELETE actions&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New instructor/admin view component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; to ignore list&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* Submission artifacts (files and links) are stored in the '''submission records table''' and are intended to be retrieved via the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;. The current &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; endpoint in &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; returns empty &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays as scaffolding; full artifact retrieval is the next integration step.&lt;br /&gt;
* '''Two-view architecture:'''&lt;br /&gt;
** The '''instructor/admin view''' (&amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt;) displays all submitters and their artifacts in a read-only table. Instructors access this page via a View Submissions icon on each assignment.&lt;br /&gt;
** The '''student view''' (&amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt;) will display the student's own submitted files/links and provide an interface to upload new submissions. The file list will appear above the submission form. This component is planned for a future iteration.&lt;br /&gt;
** Both views will ultimately fetch data from the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;, with the instructor view retrieving all teams' submissions and the student view scoped to the logged-in student's team.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;br /&gt;
&lt;br /&gt;
== Implementation Summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Problem !! Status !! Resolution&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; was being used to retrieve and display submission data, which should be handled by &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;. || Resolved || Logic moved to &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| No instructor/admin UI existed for viewing all team submissions. || Resolved || &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; implemented&lt;br /&gt;
|-&lt;br /&gt;
| No student-facing UI existed for submitting or viewing files/links. || In Progress || &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; planned for future iteration&lt;br /&gt;
|-&lt;br /&gt;
| Submitted files and links were not interactive (not clickable or downloadable). || Resolved || Files and links rendered as interactive elements&lt;br /&gt;
|-&lt;br /&gt;
| The &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; GET endpoint did not return file/link data from the submission records table. || Resolved || Endpoint now queries &amp;lt;code&amp;gt;SubmissionRecord&amp;lt;/code&amp;gt; by team and assignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
&lt;br /&gt;
=== Instructor/Admin View Tests (&amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Renders assignment name || Verifies the page header displays the correct assignment name&lt;br /&gt;
|-&lt;br /&gt;
| Renders submitter list || Verifies all teams and members appear in the table&lt;br /&gt;
|-&lt;br /&gt;
| Displays submitted files || Verifies file entries are rendered&lt;br /&gt;
|-&lt;br /&gt;
| Displays submitted links || Verifies link entries are rendered&lt;br /&gt;
|-&lt;br /&gt;
| File download works || Verifies file links have correct download attributes&lt;br /&gt;
|-&lt;br /&gt;
| Link click opens URL || Verifies hyperlinks open the correct URL&lt;br /&gt;
|-&lt;br /&gt;
| Empty submissions || Handles assignments with no submissions gracefully&lt;br /&gt;
|-&lt;br /&gt;
| Loading state || Shows a loading indicator while fetching data&lt;br /&gt;
|-&lt;br /&gt;
| Error state || Shows an error message on API failure&lt;br /&gt;
|-&lt;br /&gt;
| No teams || Handles assignments with no teams gracefully&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Student View Tests (&amp;lt;code&amp;gt;SubmittedContent.test.tsx&amp;lt;/code&amp;gt;) — Planned ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Renders existing submissions || Verifies previously submitted files and links are displayed&lt;br /&gt;
|-&lt;br /&gt;
| File list above form || Verifies layout order (list above upload form)&lt;br /&gt;
|-&lt;br /&gt;
| Upload a file || Tests file upload functionality&lt;br /&gt;
|-&lt;br /&gt;
| Submit a link || Tests link submission functionality&lt;br /&gt;
|-&lt;br /&gt;
| Delete a file || Tests file deletion&lt;br /&gt;
|-&lt;br /&gt;
| Delete a link || Tests link deletion&lt;br /&gt;
|-&lt;br /&gt;
| Files are downloadable || Verifies file entries render as download links&lt;br /&gt;
|-&lt;br /&gt;
| Links are clickable || Verifies link entries render as clickable URLs&lt;br /&gt;
|-&lt;br /&gt;
| Empty state || Handles no prior submissions gracefully&lt;br /&gt;
|-&lt;br /&gt;
| Upload error handling || Shows error feedback on failed upload&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Back-End Tests (&amp;lt;code&amp;gt;submitted_content_controller_spec.rb&amp;lt;/code&amp;gt;) — Planned ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GET returns submissions || Verifies the index action returns correct submission data&lt;br /&gt;
|-&lt;br /&gt;
| GET filters by assignment || Verifies results are scoped to the given assignment&lt;br /&gt;
|-&lt;br /&gt;
| GET returns 404 || Verifies 404 response for unknown assignment ID&lt;br /&gt;
|-&lt;br /&gt;
| POST creates submission || Verifies a new submission record is created&lt;br /&gt;
|-&lt;br /&gt;
| DELETE removes submission || Verifies a submission record is deleted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
Ed Gehringer&lt;br /&gt;
&lt;br /&gt;
=== Members ===&lt;br /&gt;
* Cameron Bhatnagar&lt;br /&gt;
* Reece McArthur&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* '''Front-End Pull Request:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 Expertiza Front-End Pull Request #157]&lt;br /&gt;
* '''Back-End Pull Request:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 Expertiza Back-End Pull Request #312]&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167896</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167896"/>
		<updated>2026-04-13T23:49:09Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors and students to view and interact with team submissions for a given assignment, displaying each team's name, member information, submitted links, and uploaded files.&lt;br /&gt;
&lt;br /&gt;
The project encompasses two distinct views:&lt;br /&gt;
&lt;br /&gt;
* '''Student View:''' A submission page where students can see their previously submitted files and links listed above a textbox and button for uploading new submissions.&lt;br /&gt;
* '''Instructor/Admin View:''' A View Submissions page accessible via a View Submissions icon on each assignment. This page displays a list of all submitters along with the files and hyperlinks each has submitted. The admin view is identical to the instructor view.&lt;br /&gt;
&lt;br /&gt;
Submission artifacts (files and links) are stored in the '''submission records table'''.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Queries the '''submission records table''' to retrieve submitted files and links for each team.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [&amp;quot;https://github.com/example/repo&amp;quot;],&lt;br /&gt;
      &amp;quot;files&amp;quot;: [&amp;quot;submission.pdf&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;
=== Submitted Content Controller Updates ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; will be updated to handle submission-related operations that were previously handled by the &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt;. This controller is responsible for:&lt;br /&gt;
&lt;br /&gt;
* '''GET:''' Retrieving submitted files and links from the submission records table for display on both the student and instructor views.&lt;br /&gt;
* '''POST:''' Allowing students to upload new files or submit new links.&lt;br /&gt;
* '''DELETE:''' Allowing students to remove their previously submitted files or links.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|right|thumb|600px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== Instructor/Admin View: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A React component at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Displays submitted files as downloadable links and submitted hyperlinks as clickable URLs.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Student View: &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A React component for the student-facing submission page. This component:&lt;br /&gt;
&lt;br /&gt;
* Displays a list of previously submitted files and links at the top of the page.&lt;br /&gt;
* Renders each file as a downloadable link and each hyperlink as a clickable URL.&lt;br /&gt;
* Provides a textbox and submit button below the file list for uploading new files or links.&lt;br /&gt;
* Supports deleting previously submitted files or links.&lt;br /&gt;
* Fetches and submits data through the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SubmittedContent.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Test files covering both component behaviors, including rendering with mocked API responses, user interactions, and error handling.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/submitted_content_controller.rb&amp;lt;/code&amp;gt; || Updated with GET/POST/DELETE for submission records&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new routes&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || Instructor/admin view component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/SubmittedContent.tsx&amp;lt;/code&amp;gt; || Student submission view component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || Instructor view tests&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/SubmittedContent.test.tsx&amp;lt;/code&amp;gt; || Student view tests&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* Submission artifacts (files and links) are stored in the '''submission records table''' and retrieved via the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Two-view architecture:'''&lt;br /&gt;
** The '''instructor/admin view''' (&amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt;) displays all submitters and their artifacts in a read-only table. Instructors access this page via a View Submissions icon on each assignment.&lt;br /&gt;
** The '''student view''' (&amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt;) displays the student's own submitted files/links and provides an interface to upload new submissions. The file list appears above the submission form.&lt;br /&gt;
** Both views fetch data from the &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;, but the instructor view retrieves all teams' submissions while the student view is scoped to the logged-in student's team.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Final Project Overview ==&lt;br /&gt;
&lt;br /&gt;
Building on the initial scaffolding, the final implementation will:&lt;br /&gt;
&lt;br /&gt;
# '''Migrate data fetching to &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;''' — Move submission-related logic out of &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; and into &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;, querying the submission records table for files and links.&lt;br /&gt;
# '''Build the student submission page''' — Create the &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; component where students can view their existing submissions (listed above) and upload new files/links (form below).&lt;br /&gt;
# '''Build the instructor/admin View Submissions page''' — Update &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; to display all submitters with their associated files and hyperlinks, accessible via the View Submissions icon on each assignment.&lt;br /&gt;
# '''Make files downloadable and links clickable''' — Render all submitted files as downloadable links and all submitted hyperlinks as clickable URLs in both views.&lt;br /&gt;
# '''Support file/link deletion''' — Allow students to remove their own previously submitted files or links from the student view.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Problem Statements ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Problem !! Design Goals&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; is currently used to get information and display the View Submissions page, but submission data should be handled by &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;. || Migrate submission data fetching to &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt;, querying the '''submission records table''' for files and links.&lt;br /&gt;
|-&lt;br /&gt;
| No student-facing UI exists for submitting or viewing files/links. || Build a student submission page (&amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt;) that lists existing submissions above a textbox and button for uploading new ones. Support file upload, link submission, and deletion.&lt;br /&gt;
|-&lt;br /&gt;
| The instructor/admin View Submissions page does not yet display submitted files or links. || Update &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; to show all submitters with their files (downloadable) and hyperlinks (clickable). The admin view is identical to the instructor view.&lt;br /&gt;
|-&lt;br /&gt;
| Submitted files and links are not interactive (not clickable or downloadable). || Render all files as downloadable links and all hyperlinks as clickable URLs in both student and instructor views.&lt;br /&gt;
|-&lt;br /&gt;
| The &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; GET endpoint does not yet return file/link data from the submission records table. || Update the controller with a GET endpoint that retrieves submission artifacts from the submission records table and returns them in a structured JSON response.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Problem&lt;br /&gt;
! Design Goals&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | '''&amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; is currently being used to get information and display view submissions page'''&lt;br /&gt;
&lt;br /&gt;
This should be running through &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; as it is meant to handle all submitted content being displayed.&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; will be updated with a new GET call that queries the submission records table. The response will include files and links for each team.&lt;br /&gt;
|-&lt;br /&gt;
| Test that submitted content controller pulls files properly through a GET api call.&lt;br /&gt;
|-&lt;br /&gt;
| Connecting Submitted Content Controller with current front-end TypeScript.&lt;br /&gt;
|-&lt;br /&gt;
| '''No student submission UI exists.'''&lt;br /&gt;
&lt;br /&gt;
Students need a page to upload files/links and view their existing submissions.&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;code&amp;gt;SubmittedContent.tsx&amp;lt;/code&amp;gt; will be created with a file/link list at the top and an upload form (textbox + button) below. It will call &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; POST for uploads and DELETE for removals.&lt;br /&gt;
|-&lt;br /&gt;
| '''Instructor view does not show submission artifacts.'''&lt;br /&gt;
&lt;br /&gt;
The View Submissions page needs to display files and links for each submitter.&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; will be updated to display files as downloadable links and hyperlinks as clickable URLs for each submitter, using data from &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; GET.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; will be updated with a new GET call similar to what already exists in &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Old Code&lt;br /&gt;
! New Code&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  # GET /assignments/:id/view_submissions&lt;br /&gt;
  def view_submissions&lt;br /&gt;
    assignment = Assignment.find_by(id: params[:id])&lt;br /&gt;
    return render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found if assignment.nil?&lt;br /&gt;
&lt;br /&gt;
    submissions = assignment.teams.map do |team|&lt;br /&gt;
      members = team.teams_users.includes(:user).map do |tu|&lt;br /&gt;
        user = tu.user&lt;br /&gt;
        {&lt;br /&gt;
          full_name: user&amp;amp;.full_name,&lt;br /&gt;
          github: &amp;quot;&amp;quot;,&lt;br /&gt;
          email: user&amp;amp;.email&lt;br /&gt;
        }&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        team_name: team.name,&lt;br /&gt;
        members: members,&lt;br /&gt;
        links: [],&lt;br /&gt;
        files: []&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    render json: {&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      assignment_name: assignment.name,&lt;br /&gt;
      submissions: submissions&lt;br /&gt;
    }, status: :ok&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  # submitted_content_controller.rb&lt;br /&gt;
  # GET /submitted_content/:assignment_id/submissions&lt;br /&gt;
  def index&lt;br /&gt;
    assignment = Assignment.find_by(id: params[:assignment_id])&lt;br /&gt;
    return render json: { error: &amp;quot;Assignment not found&amp;quot; },&lt;br /&gt;
           status: :not_found if assignment.nil?&lt;br /&gt;
&lt;br /&gt;
    submissions = assignment.teams.map do |team|&lt;br /&gt;
      members = team.teams_users.includes(:user).map do |tu|&lt;br /&gt;
        user = tu.user&lt;br /&gt;
        {&lt;br /&gt;
          full_name: user&amp;amp;.full_name,&lt;br /&gt;
          github: &amp;quot;&amp;quot;,&lt;br /&gt;
          email: user&amp;amp;.email&lt;br /&gt;
        }&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # Fetch files and links from submission records table&lt;br /&gt;
      records = SubmissionRecord.where(&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        assignment_id: assignment.id&lt;br /&gt;
      )&lt;br /&gt;
      links = records.where(content_type: &amp;quot;link&amp;quot;).pluck(:content)&lt;br /&gt;
      files = records.where(content_type: &amp;quot;file&amp;quot;).pluck(:content)&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        team_name: team.name,&lt;br /&gt;
        members: members,&lt;br /&gt;
        links: links,&lt;br /&gt;
        files: files&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    render json: {&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      assignment_name: assignment.name,&lt;br /&gt;
      submissions: submissions&lt;br /&gt;
    }, status: :ok&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # POST /submitted_content/:assignment_id/submit&lt;br /&gt;
  def create&lt;br /&gt;
    # Handles file upload and link submission&lt;br /&gt;
    # for the student's team&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # DELETE /submitted_content/:id&lt;br /&gt;
  def destroy&lt;br /&gt;
    # Handles deletion of a submitted file or link&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The new code above is a draft and will be refined as we explore the existing &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; structure and the submission records table schema.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
&lt;br /&gt;
=== Instructor/Admin View Tests (&amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Renders assignment name || Verify the assignment name displays as a page header.&lt;br /&gt;
|-&lt;br /&gt;
| Renders submitter list || Verify all teams and their members are displayed in the table.&lt;br /&gt;
|-&lt;br /&gt;
| Displays submitted files || Verify that files returned from the API appear as downloadable links for each team.&lt;br /&gt;
|-&lt;br /&gt;
| Displays submitted links || Verify that hyperlinks returned from the API appear as clickable URLs for each team.&lt;br /&gt;
|-&lt;br /&gt;
| File download works || Verify clicking a file link initiates a download.&lt;br /&gt;
|-&lt;br /&gt;
| Link click opens URL || Verify clicking a hyperlink opens the URL in a new tab.&lt;br /&gt;
|-&lt;br /&gt;
| Empty submissions || Verify appropriate messaging when a team has no submitted files or links.&lt;br /&gt;
|-&lt;br /&gt;
| Loading state || Verify a loading indicator is displayed while data is being fetched.&lt;br /&gt;
|-&lt;br /&gt;
| Error state || Verify an error message is displayed if the API call fails.&lt;br /&gt;
|-&lt;br /&gt;
| No teams || Verify appropriate messaging when an assignment has no teams.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Student View Tests (&amp;lt;code&amp;gt;SubmittedContent.test.tsx&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Renders existing submissions || Verify previously submitted files and links are displayed above the upload form.&lt;br /&gt;
|-&lt;br /&gt;
| File list above form || Verify the file/link list renders above the textbox and submit button.&lt;br /&gt;
|-&lt;br /&gt;
| Upload a file || Verify a student can upload a file and it appears in the list.&lt;br /&gt;
|-&lt;br /&gt;
| Submit a link || Verify a student can submit a hyperlink and it appears in the list.&lt;br /&gt;
|-&lt;br /&gt;
| Delete a file || Verify a student can delete a previously submitted file.&lt;br /&gt;
|-&lt;br /&gt;
| Delete a link || Verify a student can delete a previously submitted link.&lt;br /&gt;
|-&lt;br /&gt;
| Files are downloadable || Verify submitted files render as downloadable links in the student view.&lt;br /&gt;
|-&lt;br /&gt;
| Links are clickable || Verify submitted hyperlinks render as clickable URLs in the student view.&lt;br /&gt;
|-&lt;br /&gt;
| Empty state || Verify appropriate messaging when no files or links have been submitted yet.&lt;br /&gt;
|-&lt;br /&gt;
| Upload error handling || Verify an error message is displayed if a file upload fails.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Back-End Tests (&amp;lt;code&amp;gt;submitted_content_controller_spec.rb&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Test !! Description&lt;br /&gt;
|-&lt;br /&gt;
| GET returns submissions || Verify the GET endpoint returns files and links from the submission records table.&lt;br /&gt;
|-&lt;br /&gt;
| GET filters by assignment || Verify submissions are scoped to the correct assignment.&lt;br /&gt;
|-&lt;br /&gt;
| GET returns 404 || Verify a 404 is returned when the assignment does not exist.&lt;br /&gt;
|-&lt;br /&gt;
| POST creates submission || Verify a new file or link record is created in the submission records table.&lt;br /&gt;
|-&lt;br /&gt;
| DELETE removes submission || Verify a submission record is removed from the submission records table.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-1.-mentor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
&lt;br /&gt;
* Ed Gehringer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-2.-members&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Members ===&lt;br /&gt;
&lt;br /&gt;
* Cameron Bhatnagar&lt;br /&gt;
* Reece McArthur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;xi.-links&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Front-End Pull Request:&lt;br /&gt;
[https://github.com/expertiza/reimplementation-front-end/pull/157 Expertiza Front-End Pull Request #157]&lt;br /&gt;
&lt;br /&gt;
Back-End Pull Request:&lt;br /&gt;
[https://github.com/expertiza/reimplementation-back-end/pull/312 Expertiza Back-End Pull Request #312]&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167814</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167814"/>
		<updated>2026-04-12T16:05:07Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|right|thumb|600px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Final Project Overview ==&lt;br /&gt;
&lt;br /&gt;
To further iterate on the OSS project, we will:&lt;br /&gt;
&lt;br /&gt;
* Update implementation to utilize the Submitted Content Controller&lt;br /&gt;
* Ensure proper handling of file/ link uploads&lt;br /&gt;
* Update submissions page to display all files/ links uploaded&lt;br /&gt;
* Make uploaded files/ links clickable/ downloadable&lt;br /&gt;
&lt;br /&gt;
== Problem Statements ==&lt;br /&gt;
&lt;br /&gt;
* Connecting Submitted Content Controller with current front-end TypeScript&lt;br /&gt;
* Allow student to upload, delete, and view submitted files through submitted content controller&lt;br /&gt;
* Allow admin to view submitted files&lt;br /&gt;
* Test that submitted content controller pulls files properly through a GET api call&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Problem&lt;br /&gt;
! Design Goals&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;| '''&amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; is currently being used to get information and display view submissions page'''&lt;br /&gt;
&lt;br /&gt;
This should be running through &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; as it is meant to handle all submitted content being displayed.&lt;br /&gt;
&lt;br /&gt;
| Connecting Submitted Content Controller with current front-end TypeScript&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Test that submitted content controller pulls files properly through a GET api call&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; will be updated with a new GET call similar to what already exists in &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Old Code&lt;br /&gt;
! New Code&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  # GET /assignments/:id/view_submissions&lt;br /&gt;
  def view_submissions&lt;br /&gt;
    assignment = Assignment.find_by(id: params[:id])&lt;br /&gt;
    return render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found if assignment.nil?&lt;br /&gt;
&lt;br /&gt;
    submissions = assignment.teams.map do |team|&lt;br /&gt;
      members = team.teams_users.includes(:user).map do |tu|&lt;br /&gt;
        user = tu.user&lt;br /&gt;
        {&lt;br /&gt;
          full_name: user&amp;amp;.full_name,&lt;br /&gt;
          github: &amp;quot;&amp;quot;,&lt;br /&gt;
          email: user&amp;amp;.email&lt;br /&gt;
        }&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        team_name: team.name,&lt;br /&gt;
        members: members,&lt;br /&gt;
        links: [],&lt;br /&gt;
        files: []&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    render json: {&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      assignment_name: assignment.name,&lt;br /&gt;
      submissions: submissions&lt;br /&gt;
    }, status: :ok&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
TBD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
&lt;br /&gt;
* Test files call from &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; and are linked to be downloadable&lt;br /&gt;
* Test links call from &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; and are linked&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-1.-mentor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
&lt;br /&gt;
* Ed Gehringer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-2.-members&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Members ===&lt;br /&gt;
&lt;br /&gt;
* Cameron Bhatnagar&lt;br /&gt;
* Reece McArthur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;xi.-links&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Front-End Pull Request:&lt;br /&gt;
[https://github.com/expertiza/reimplementation-front-end/pull/157 Expertiza Front-End Pull Request #157]&lt;br /&gt;
&lt;br /&gt;
Back-End Pull Request:&lt;br /&gt;
[https://github.com/expertiza/reimplementation-back-end/pull/312 Expertiza Front-End Pull Request #312]&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167813</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167813"/>
		<updated>2026-04-12T15:55:13Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|right|thumb|600px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Final Project Overview ==&lt;br /&gt;
&lt;br /&gt;
To further iterate on the OSS project, we will:&lt;br /&gt;
&lt;br /&gt;
* Update implementation to utilize the Submitted Content Controller&lt;br /&gt;
* Ensure proper handling of file/ link uploads&lt;br /&gt;
* Update submissions page to display all files/ links uploaded&lt;br /&gt;
* Make uploaded files/ links clickable/ downloadable&lt;br /&gt;
&lt;br /&gt;
== Problem Statements ==&lt;br /&gt;
&lt;br /&gt;
* Connecting Submitted Content Controller with current front-end TypeScript&lt;br /&gt;
* Allow student to upload, delete, and view submitted files through submitted content controller&lt;br /&gt;
* Allow admin to view submitted files&lt;br /&gt;
* Test that submitted content controller pulls files properly through a GET api call&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Problem&lt;br /&gt;
! Design Goals&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;| '''&amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; is currently being used to get information and display view submissions page'''&lt;br /&gt;
&lt;br /&gt;
This should be running through &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; as it is meant to handle all submitted content being displayed.&lt;br /&gt;
&lt;br /&gt;
| Connecting Submitted Content Controller with current front-end TypeScript&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Test that submitted content controller pulls files properly through a GET api call&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; will be updated with a new GET call similar to what already exists in &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Old Code&lt;br /&gt;
! New Code&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  # GET /assignments/:id/view_submissions&lt;br /&gt;
  def view_submissions&lt;br /&gt;
    assignment = Assignment.find_by(id: params[:id])&lt;br /&gt;
    return render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found if assignment.nil?&lt;br /&gt;
&lt;br /&gt;
    submissions = assignment.teams.map do |team|&lt;br /&gt;
      members = team.teams_users.includes(:user).map do |tu|&lt;br /&gt;
        user = tu.user&lt;br /&gt;
        {&lt;br /&gt;
          full_name: user&amp;amp;.full_name,&lt;br /&gt;
          github: &amp;quot;&amp;quot;,&lt;br /&gt;
          email: user&amp;amp;.email&lt;br /&gt;
        }&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        team_name: team.name,&lt;br /&gt;
        members: members,&lt;br /&gt;
        links: [],&lt;br /&gt;
        files: []&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    render json: {&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      assignment_name: assignment.name,&lt;br /&gt;
      submissions: submissions&lt;br /&gt;
    }, status: :ok&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
TBD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
&lt;br /&gt;
* Test files call from &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; and are linked to be downloadable&lt;br /&gt;
* Test links call from &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; and are linked&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-1.-mentor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
&lt;br /&gt;
* Ed Gehringer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-2.-members&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Members ===&lt;br /&gt;
&lt;br /&gt;
* Cameron Bhatnagar&lt;br /&gt;
* Reece McArthur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;xi.-links&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
Pull Request:&lt;br /&gt;
[TBD Expertiza Pull Request #]&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167812</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167812"/>
		<updated>2026-04-12T15:35:41Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|right|thumb|600px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Final Project Overview ==&lt;br /&gt;
&lt;br /&gt;
To further iterate on the OSS project, we will:&lt;br /&gt;
&lt;br /&gt;
* Update implementation to utilize the Submitted Content Controller&lt;br /&gt;
* Ensure proper handling of file/ link uploads&lt;br /&gt;
* Update submissions page to display all files/ links uploaded&lt;br /&gt;
* Make uploaded files/ links clickable/ downloadable&lt;br /&gt;
&lt;br /&gt;
== Problem Statements ==&lt;br /&gt;
&lt;br /&gt;
* Connecting Submitted Content Controller with current front-end TypeScript&lt;br /&gt;
* Allow student to upload, delete, and view submitted files through submitted content controller&lt;br /&gt;
* Allow admin to view submitted files&lt;br /&gt;
* Test that submitted content controller pulls files properly through a GET api call&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Problem&lt;br /&gt;
! Design Goals&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot;| '''&amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt; is currently being used to get information and display view submissions page'''&lt;br /&gt;
&lt;br /&gt;
This should be running through &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; as it is meant to handle all submitted content being displayed.&lt;br /&gt;
&lt;br /&gt;
| Connecting Submitted Content Controller with current front-end TypeScript&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Test that submitted content controller pulls files properly through a GET api call&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; will be updated with a new GET call similar to what already exists in &amp;lt;code&amp;gt;assignments_controller&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Old Code&lt;br /&gt;
! New Code&lt;br /&gt;
|-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  # GET /assignments/:id/view_submissions&lt;br /&gt;
  def view_submissions&lt;br /&gt;
    assignment = Assignment.find_by(id: params[:id])&lt;br /&gt;
    return render json: { error: &amp;quot;Assignment not found&amp;quot; }, status: :not_found if assignment.nil?&lt;br /&gt;
&lt;br /&gt;
    submissions = assignment.teams.map do |team|&lt;br /&gt;
      members = team.teams_users.includes(:user).map do |tu|&lt;br /&gt;
        user = tu.user&lt;br /&gt;
        {&lt;br /&gt;
          full_name: user&amp;amp;.full_name,&lt;br /&gt;
          github: &amp;quot;&amp;quot;,&lt;br /&gt;
          email: user&amp;amp;.email&lt;br /&gt;
        }&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      {&lt;br /&gt;
        id: team.id,&lt;br /&gt;
        team_id: team.id,&lt;br /&gt;
        team_name: team.name,&lt;br /&gt;
        members: members,&lt;br /&gt;
        links: [],&lt;br /&gt;
        files: []&lt;br /&gt;
      }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    render json: {&lt;br /&gt;
      assignment_id: assignment.id,&lt;br /&gt;
      assignment_name: assignment.name,&lt;br /&gt;
      submissions: submissions&lt;br /&gt;
    }, status: :ok&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;white-space: pre-wrap;&amp;quot; |&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
TBD&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
&lt;br /&gt;
* Test files call from &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; and are linked to be downloadable&lt;br /&gt;
* Test links call from &amp;lt;code&amp;gt;submitted_content_controller&amp;lt;/code&amp;gt; and are linked&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-1.-mentor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Mentor ===&lt;br /&gt;
&lt;br /&gt;
* Ed Gehringer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;x-2.-members&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Members ===&lt;br /&gt;
&lt;br /&gt;
* Cameron Bhatnagar&lt;br /&gt;
* Reece McArthur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;xi.-links&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
TBD&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167701</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167701"/>
		<updated>2026-04-03T20:13:47Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|right|thumb|600px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167700</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167700"/>
		<updated>2026-04-03T20:12:26Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|right|thumb|600px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167699</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167699"/>
		<updated>2026-04-03T20:12:09Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|left|thumb|1000px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167698</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167698"/>
		<updated>2026-04-03T20:11:54Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|left|1000px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167697</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167697"/>
		<updated>2026-04-03T20:11:35Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|left|400px|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167696</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167696"/>
		<updated>2026-04-03T20:11:05Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167695</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167695"/>
		<updated>2026-04-03T20:10:49Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View Submissions.png|thumb|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions.png&amp;diff=167694</id>
		<title>File:View Submissions.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:View_Submissions.png&amp;diff=167694"/>
		<updated>2026-04-03T20:09:40Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: Example of view submissions page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Example of view submissions page&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167693</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167693"/>
		<updated>2026-04-03T20:09:07Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
[[File:View_Submissions.png|thumb|Example of view submissions page]]&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167692</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167692"/>
		<updated>2026-04-03T20:06:28Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= View Submissions Page – E2603 =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This feature implements the '''View Submissions''' page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
* '''Front-end PR:''' [https://github.com/expertiza/reimplementation-front-end/pull/157 reimplementation-front-end #157]&lt;br /&gt;
* '''Back-end PR:''' [https://github.com/expertiza/reimplementation-back-end/pull/312 reimplementation-back-end #312]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Back-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New API Endpoint: &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new action, &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt;, was added to &amp;lt;code&amp;gt;AssignmentsController&amp;lt;/code&amp;gt;. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
'''Route added (&amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
 get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
&lt;br /&gt;
'''Controller action (&amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt;):'''&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
# Finds the assignment by the provided &amp;lt;code&amp;gt;:id&amp;lt;/code&amp;gt;. Returns a &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; error if not found.&lt;br /&gt;
# Iterates over all teams associated with the assignment.&lt;br /&gt;
# For each team, fetches member details (full name and email) via the &amp;lt;code&amp;gt;teams_users&amp;lt;/code&amp;gt; association.&lt;br /&gt;
# Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
'''Response structure:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&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;
'''Note:''' &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
=== Schema ===&lt;br /&gt;
&lt;br /&gt;
A minor schema update (&amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt;) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Front-End Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New Component: &amp;lt;code&amp;gt;ViewSubmissions.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A new React component was created at &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt;. This component:&lt;br /&gt;
&lt;br /&gt;
* Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
* Fetches submission data from the back-end API endpoint &amp;lt;code&amp;gt;GET /assignments/:id/view_submissions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Displays the assignment name as a page header.&lt;br /&gt;
* Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
* Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
=== Tests: &amp;lt;code&amp;gt;ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
A test file was created at &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; Update ===&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; to exclude the &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt; build output directory.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Files Changed ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repository !! File !! Change&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;app/controllers/assignments_controller.rb&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;view_submissions&amp;lt;/code&amp;gt; action (+32 lines)&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;config/routes.rb&amp;lt;/code&amp;gt; || Registered new GET route&lt;br /&gt;
|-&lt;br /&gt;
| Back-end || &amp;lt;code&amp;gt;db/schema.rb&amp;lt;/code&amp;gt; || Schema version update&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/ViewSubmissions.tsx&amp;lt;/code&amp;gt; || New component&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;src/pages/Assignments/__tests__/ViewSubmissions.test.tsx&amp;lt;/code&amp;gt; || New test file&lt;br /&gt;
|-&lt;br /&gt;
| Front-end || &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; || Added &amp;lt;code&amp;gt;/dist&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Design Notes ==&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;github&amp;lt;/code&amp;gt; field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
* &amp;lt;code&amp;gt;links&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt; arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
* The back-end follows existing Expertiza controller conventions, using &amp;lt;code&amp;gt;render json:&amp;lt;/code&amp;gt; with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167691</id>
		<title>CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026_-_E2603._Implement_ViewSubmissions_frontend&amp;diff=167691"/>
		<updated>2026-04-03T20:04:21Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: Implement ViewSubmissions frontend&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# View Submissions Page – E2603&lt;br /&gt;
&lt;br /&gt;
## Overview&lt;br /&gt;
&lt;br /&gt;
This feature implements the **View Submissions** page for the Expertiza reimplementation. It allows instructors to view all team submissions for a given assignment, displaying each team's name, member information, and (in future iterations) submitted links and files.&lt;br /&gt;
&lt;br /&gt;
This work spans both the front-end and back-end repositories:&lt;br /&gt;
&lt;br /&gt;
- **Front-end PR:** [reimplementation-front-end #157](https://github.com/expertiza/reimplementation-front-end/pull/157)&lt;br /&gt;
- **Back-end PR:** [reimplementation-back-end #312](https://github.com/expertiza/reimplementation-back-end/pull/312)&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Back-End Changes&lt;br /&gt;
&lt;br /&gt;
### New API Endpoint: `GET /assignments/:id/view_submissions`&lt;br /&gt;
&lt;br /&gt;
A new action, `view_submissions`, was added to `AssignmentsController`. This endpoint accepts an assignment ID and returns a JSON payload containing the assignment's metadata and a list of all team submissions.&lt;br /&gt;
&lt;br /&gt;
**Route added (`config/routes.rb`):**&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
get '/:id/view_submissions', action: :view_submissions&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Controller action (`app/controllers/assignments_controller.rb`):**&lt;br /&gt;
&lt;br /&gt;
The action performs the following steps:&lt;br /&gt;
&lt;br /&gt;
1. Finds the assignment by the provided `:id`. Returns a `404` error if not found.&lt;br /&gt;
2. Iterates over all teams associated with the assignment.&lt;br /&gt;
3. For each team, fetches member details (full name and email) via the `teams_users` association.&lt;br /&gt;
4. Returns a structured JSON response containing the assignment ID, assignment name, and an array of submission objects.&lt;br /&gt;
&lt;br /&gt;
**Response structure:**&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;assignment_id&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;assignment_name&amp;quot;: &amp;quot;Assignment 1&amp;quot;,&lt;br /&gt;
  &amp;quot;submissions&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_id&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;team_name&amp;quot;: &amp;quot;Team Alpha&amp;quot;,&lt;br /&gt;
      &amp;quot;members&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;full_name&amp;quot;: &amp;quot;Jane Doe&amp;quot;,&lt;br /&gt;
          &amp;quot;github&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
          &amp;quot;email&amp;quot;: &amp;quot;jdoe@example.com&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;links&amp;quot;: [],&lt;br /&gt;
      &amp;quot;files&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;gt; **Note:** `links` and `files` are included as empty arrays in this initial implementation, laying the groundwork for future submission artifact support.&lt;br /&gt;
&lt;br /&gt;
### Schema&lt;br /&gt;
&lt;br /&gt;
A minor schema update (`db/schema.rb`) was included to reflect the current state of the database.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Front-End Changes&lt;br /&gt;
&lt;br /&gt;
### New Component: `ViewSubmissions.tsx`&lt;br /&gt;
&lt;br /&gt;
A new React component was created at `src/pages/Assignments/ViewSubmissions.tsx`. This component:&lt;br /&gt;
&lt;br /&gt;
- Reads the assignment ID from the URL parameters via React Router.&lt;br /&gt;
- Fetches submission data from the back-end API endpoint `GET /assignments/:id/view_submissions`.&lt;br /&gt;
- Displays the assignment name as a page header.&lt;br /&gt;
- Renders a table listing each team and its members, including their name and email.&lt;br /&gt;
- Handles loading and error states gracefully.&lt;br /&gt;
&lt;br /&gt;
### Tests: `ViewSubmissions.test.tsx`&lt;br /&gt;
&lt;br /&gt;
A test file was created at `src/pages/Assignments/__tests__/ViewSubmissions.test.tsx` to cover the component's behavior, including rendering with mocked API responses.&lt;br /&gt;
&lt;br /&gt;
### `.gitignore` Update&lt;br /&gt;
&lt;br /&gt;
A minor addition was made to `.gitignore` to exclude the `/dist` build output directory.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Files Changed&lt;br /&gt;
&lt;br /&gt;
| Repository | File | Change |&lt;br /&gt;
|---|---|---|&lt;br /&gt;
| Back-end | `app/controllers/assignments_controller.rb` | Added `view_submissions` action (+32 lines) |&lt;br /&gt;
| Back-end | `config/routes.rb` | Registered new GET route |&lt;br /&gt;
| Back-end | `db/schema.rb` | Schema version update |&lt;br /&gt;
| Front-end | `src/pages/Assignments/ViewSubmissions.tsx` | New component |&lt;br /&gt;
| Front-end | `src/pages/Assignments/__tests__/ViewSubmissions.test.tsx` | New test file |&lt;br /&gt;
| Front-end | `.gitignore` | Added `/dist` |&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Design Notes&lt;br /&gt;
&lt;br /&gt;
- The `github` field in the member object is currently returned as an empty string. This is a placeholder for a future integration with GitHub profile links.&lt;br /&gt;
- `links` and `files` arrays are scaffolded but not yet populated; these represent submission artifacts to be implemented in a subsequent iteration.&lt;br /&gt;
- The back-end follows existing Expertiza controller conventions, using `render json:` with appropriate HTTP status codes.&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026&amp;diff=167690</id>
		<title>CSC/ECE 517 Spring 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Spring_2026&amp;diff=167690"/>
		<updated>2026-04-03T19:59:43Z</updated>

		<summary type="html">&lt;p&gt;Cjbhatna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[CSC/ECE 517 Spring 2026 - E2600. Reimplement review_mapping_controller]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2026 - E2601. Reimplement student quizzes]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2026 - E2602. Reimplement student task view]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2026 - E2603. Implement ViewSubmissions frontend]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2026 - E2604. Finish Password Resets]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2026 - E2606. Finishing Import and Export helper module]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2026 - E2607. ResponseController Frontend]]&lt;br /&gt;
* [[CSC/ECE 517 Spring 2026 - E2610. Teams hierarchy testing]]&lt;/div&gt;</summary>
		<author><name>Cjbhatna</name></author>
	</entry>
</feed>