Skip to content

Commit

Permalink
Merge pull request #1 from ThErOCk07/dmehta4
Browse files Browse the repository at this point in the history
Dmehta4
  • Loading branch information
dakshmehta23 committed Apr 22, 2024
2 parents db036e8 + 4cf7553 commit ffb9667
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 72 deletions.
60 changes: 35 additions & 25 deletions app/controllers/assessment360_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@ def all_students_all_reviews
insure_existence_of(@course_participants, course)
# hash for view
@meta_review = {}
@meta_review_exists = {}
@teammate_review = {}
@teammate_review_exists = {}
@teamed_count = {}
@assignment_columns = {}
# for course
# eg. @overall_teammate_review_grades = {assgt_id1: 100, assgt_id2: 178, ...}
# @overall_teammate_review_count = {assgt_id1: 1, assgt_id2: 2, ...}
Expand All @@ -36,6 +39,10 @@ def all_students_all_reviews
@meta_review[cp.id] = {} unless @meta_review.key?(cp.id)
@teammate_review[cp.id] = {} unless @teammate_review.key?(cp.id)
assignment_participant = assignment.participants.find_by(user_id: cp.user_id)
# initializing assignment_columns with default 0 colspan for all the columns
@assignment_columns[assignment.id].nil? ? @assignment_columns[assignment.id] = {} : nil
@assignment_columns[assignment.id]["meta_review"].nil? ? @assignment_columns[assignment.id]["meta_review"] = 0 : nil
@assignment_columns[assignment.id]["teammate_review"].nil? ? @assignment_columns[assignment.id]["teammate_review"] = 0 : nil
next if assignment_participant.nil?

teammate_reviews = assignment_participant.teammate_reviews
Expand All @@ -54,10 +61,20 @@ def all_students_all_reviews
@overall_meta_review_grades,
@overall_meta_review_count,
@meta_review_info_per_stu)
end
# calculate average grade for each student on all assignments in this course
avg_review_calc_per_student(cp, @teammate_review_info_per_stu, @teammate_review)
avg_review_calc_per_student(cp, @meta_review_info_per_stu, @meta_review)
if !@meta_review[cp.id][assignment.id].nil?
@meta_review_exists[assignment.id] = true
@assignment_columns[assignment.id]["meta_review"] = 1
end
# If teammate review exists for particular assignment then update teammate_review_exist to true
# and make assignment_columns as 1 to add to colspan
if !@teammate_review[cp.id][assignment.id].nil?
@teammate_review_exists[assignment.id] = true
@assignment_columns[assignment.id]["teammate_review"] = 1
end
end
end
# avoid divide by zero error
overall_review_count(@assignments, @overall_teammate_review_count, @overall_meta_review_count)
Expand Down Expand Up @@ -152,37 +169,30 @@ def insure_existence_of(course_participants, course)
# The function populates the hash value for all students for all the reviews that they have gotten.
# I.e., Teammate and Meta for each of the assignments that they have taken
# This value is then used to display the overall teammate_review and meta_review grade in the view
def calc_overall_review_info(assignment,
course_participant,
reviews,
hash_per_stu,
overall_review_grade_hash,
overall_review_count_hash,
review_info_per_stu)
# If a student has not taken an assignment or if they have not received any grade for the same,
# assign it as 0 instead of leaving it blank. This helps in easier calculation of overall grade
overall_review_grade_hash[assignment.id] = 0 unless overall_review_grade_hash.key?(assignment.id)
overall_review_count_hash[assignment.id] = 0 unless overall_review_count_hash.key?(assignment.id)
def calc_overall_review_info(assignment, course_participant, reviews, hash_per_stu, overall_review_grade_hash, overall_review_count_hash, review_info_per_stu)
overall_review_grade_hash[assignment.id] ||= 0
overall_review_count_hash[assignment.id] ||= 0

# Do not consider reviews that have not been filled out by teammates when calculating averages.
reviews = reviews.reject { |review| review.average_score == 'N/A' }
grades = 0
# Check if they person has gotten any review for the assignment
if reviews.count > 0
reviews.each { |review| grades += review.average_score.to_i }
avg_grades = (grades * 1.0 / reviews.count).round
hash_per_stu[course_participant.id][assignment.id] = avg_grades.to_s + '%'
end
# Calculate sum of averages to get student's overall grade
if avg_grades && (grades >= 0)
# for each assignment
review_info_per_stu[0] += avg_grades

# Check if the student has received any review for the assignment
if reviews.any?
grades_sum = reviews.sum { |review| review.average_score.to_i }
avg_grade = (grades_sum.to_f / reviews.size).round
hash_per_stu[course_participant.id][assignment.id] = "#{avg_grade}%"

# Update review counts for the student
review_info_per_stu[0] += avg_grade
review_info_per_stu[1] += 1
# for course
overall_review_grade_hash[assignment.id] += avg_grades

# Update overall review counts for the assignment
overall_review_grade_hash[assignment.id] += avg_grade
overall_review_count_hash[assignment.id] += 1
end
end


# The peer review score is taken from the questions for the assignment
def find_peer_review_score(user_id, assignment_id)
participant = AssignmentParticipant.find_by(user_id: user_id, parent_id: assignment_id)
Expand Down
160 changes: 113 additions & 47 deletions app/views/assessment360/all_students_all_reviews.html.erb
Original file line number Diff line number Diff line change
@@ -1,55 +1,121 @@
<!-- Defines the CSS styles for the HTML elements in the view. -->
<style>
th, td {
text-align: center;
}
}
.visibility {
display: none
}
</style>
<table class="table table-striped">
<tr>
<th rowspan=2 width="320">Students</th>
<th rowspan=2 width="30">Teammate Count</th>
<% @assignments.each do |assignment| %>
<th colspan=2 width="300"> <%= assignment.name %> </th>

<!--# Checkbox for Metareviews and Teammate Reviews -->
<b style="margin-bottom: 40px;">Select columns:</b>
<tr>
<td>
<label for="metareview"><b>Metareviews</b></label>
<input type="checkbox" value="show-hide" checked="checked" id="metareviewbox">
</td>
<td>
<label for="teammateReview"><b>Teammate Reviews</b></label>
<input type="checkbox" value="show-hide" checked="checked" id="teammatereviewbox">
</td>
</tr>
<br>
<br>

<!-- # Table to display the students' reviews -->
<table class="table table-striped">
<tr>
<th rowspan=2 width="320">Students</th>
<th rowspan=2 width="30">Teammate Count</th>
<% @assignments.each do |assignment| %>
<% if !@teammate_review_exists[assignment.id].nil? || !@meta_review_exists[assignment.id].nil? %>
<!-- # Assignment header with colspan for Metareviews and Teammate Reviews -->
<th colspan="<%= @assignment_columns[assignment.id]["meta_review"] + @assignment_columns[assignment.id]["teammate_review"] %>" width="300" class="assignment-header" id="<%= assignment.id %>"> <%= assignment.name %> </th>
<% end %>
<th colspan="2" width="300">Aggregate Score</th>
</tr>
<% end %>
<th colspan="2" width="300" id="aggregate-score-header">Aggregate Score</th>
</tr>
<tr>
<% @assignments.each do |assignment| %>
<!-- # Metareviews and Teammate Reviews columns -->
<% if !@meta_review_exists[assignment.id].nil? %> <td class="metaReviews" id="metaReviews-<%= assignment.id %>"><b>Metareviews</b></td> <% end %>
<% if !@teammate_review_exists[assignment.id].nil? %> <td class="teammateReviews" id="teammateReviews-<%= assignment.id %>"><b>Teammate Reviews</b></td> <% end %>
<% end %>
<td class="metaReviews"><b>Metareviews</b></td>
<td class="teammateReviews"><b>Teammate Reviews</b></td>
</tr>

<!-- # Iterates through each course participant to display their reviews -->
<% @course_participants.each do |cp|%>
<tr>
<% (0..@assignments.size).each do %>
<td><b>Metareviews</b></td>
<td><b>Teammate Reviews</b></td>
<% end %>
<td align="center"><%= "#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})" %> </td>
<td><%= @teamed_count[cp.id] %></td>
<% @assignments.each do |assignment|%>
<!-- # Displays the Metareviews and Teammate Reviews for each course participant -->
<% if !@meta_review_exists[assignment.id].nil? %> <td class="metaReviews"><%= format_score(@meta_review[cp.id][assignment.id]) unless @meta_review.nil? %></td> <% end %>
<% if !@teammate_review_exists[assignment.id].nil? %> <td class="teammateReviews"><%= format_score(@teammate_review[cp.id][assignment.id]) unless @teammate_review.nil? %></td> <% end %>
<% end%>
<!-- # Displays the overall Metareviews and Teammate Reviews for each course participant -->
<td class="metaReviews"><%= format_score(@meta_review[cp.id][:avg_grade_for_assgt]) unless @meta_review.nil? || @meta_review[cp.id].nil? %></td>
<td class="teammateReviews"><%= format_score(@teammate_review[cp.id][:avg_grade_for_assgt]) unless @teammate_review.nil? || @teammate_review[cp.id].nil?%></td>
</tr>

<% @course_participants.each do |cp|%>
<tr>
<td align="center"><%= "#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})" %> </td>
<td><%= @teamed_count[cp.id] %></td>
<% @assignments.each do |assignment|%>
<td><%= @meta_review[cp.id][assignment.id] unless @meta_review.nil? %></td>
<td><%= @teammate_review[cp.id][assignment.id] unless @teammate_review.nil? %></td>
<% end%>
<td><%= @meta_review[cp.id][:avg_grade_for_assgt] unless @meta_review.nil? || @meta_review[cp.id].nil? %></td>
<td><%= @teammate_review[cp.id][:avg_grade_for_assgt] unless @teammate_review.nil? || @teammate_review[cp.id].nil?%></td>
<%end%>
<tr>
<td><b>Class Average</b></td>
<td></td>
<% @assignments.each do |assignment|%>
<% if !@meta_review_exists[assignment.id].nil? %> <td class="metaReviews"><%= "#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%" %></td> <% end %>
<% if !@teammate_review_exists[assignment.id].nil? %> <td class="teammateReviews"><%= "#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%" %></td> <% end %>
<% end%>
<!-- # Displays the overall Metareviews and Teammate Reviews for the class average -->
<% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td class="metaReviews">
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_meta_review_grade / total_meta_review_count}%" %>
</td>
<!-- # Displays the overall Metareviews and Teammate Reviews for the class average -->
<% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td class="teammateReviews">
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_teammate_review_grade / total_teammate_review_count}%" %>
</td>
</tr>
<%end%>
<tr>
<td><b>Class Average</b></td>
<td></td>
<% @assignments.each do |assignment|%>
<td><%= "#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%" %></td>
<td><%= "#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%" %></td>
<% end%>
<% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td>
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_meta_review_grade / total_meta_review_count}%" %>
</td>
<% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %>
<% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %>
<td>
<%= total_meta_review_count.zero? ? "N/A" :
"#{total_teammate_review_grade / total_teammate_review_count}%" %>
</td>
</tr>
</table>
</div>
</table>


<script>
const aggregateScoreHeader = document.getElementById("aggregate-score-header");
let aggregateScoreColSpan = 2;
const assignmentHeaderClasses = document.querySelectorAll(".assignment-header");
// # Function to handle checkbox change
function handleCheckboxChange(checkboxId, reviewClassesSelector, reviewPrefix) {
const reviewClasses = document.querySelectorAll(reviewClassesSelector);
const checkBox = document.getElementById(checkboxId);

checkBox.addEventListener('change', function() {
this.checked ? aggregateScoreColSpan += 1 : aggregateScoreColSpan -= 1; //# Update aggregate score colspan based on checkbox state
aggregateScoreHeader.setAttribute("colspan", aggregateScoreColSpan);

reviewClasses.forEach(el => { //#Toggle visibility of review classes
el.classList.toggle('visibility');
});

//# Update assignment header colspan and visibility based on checkbox state
assignmentHeaderClasses.forEach(el => {
let assignmentColSpan = Number(el.getAttribute("colspan"));
this.checked ? assignmentColSpan += 1 : assignmentColSpan -= 1;
const element = document.getElementById(reviewPrefix + '-' + el.id);

if (element){
el.setAttribute("colspan", assignmentColSpan);
el.style.display = assignmentColSpan <= 0 ? "none" : null;
}
});
});
}
handleCheckboxChange('metareviewbox', '.metaReviews', 'metaReviews'); //#Call handleCheckboxChange for Metareviews checkbox
handleCheckboxChange('teammatereviewbox', '.teammateReviews', 'teammateReviews'); //#Call handleCheckboxChange for Teammate Reviews checkbox
</script>

0 comments on commit ffb9667

Please sign in to comment.