Skip to content

Commit

Permalink
SAK-49998 Assignments: Improve performance and UX of Assignments by s…
Browse files Browse the repository at this point in the history
…tudent view (#6)

Co-authored-by: fadesta102 <[email protected]>
  • Loading branch information
JuanDavid102 and fadesta102 authored May 17, 2024
1 parent 10452d9 commit 5ebdf53
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,7 @@ public class AssignmentAction extends PagedResourceActionII {
private static final String CONTEXT_GO_NEXT_UNGRADED_ENABLED = "goNextUngradedEnabled";
private static final String CONTEXT_GO_PREV_UNGRADED_ENABLED = "goPrevUngradedEnabled";
private static final String PARAMS_VIEW_SUBS_ONLY_CHECKBOX = "chkSubsOnly1";
private static final String EXPANDED_USER_NAME = "expandedUserName";
private static ResourceLoader rb = new ResourceLoader("assignment");
private boolean nextUngraded = false;
private boolean prevUngraded = false;
Expand Down Expand Up @@ -5732,17 +5733,10 @@ private String build_instructor_view_students_assignment_context(VelocityPortlet
"&searchFilterOnly=" + searchFilterOnly.toString() +
"&estimate=true";
context.put("accessPointUrl", accessPointUrl);

Collection<Assignment> assignments = assignmentService.getAssignmentsForContext(contextString);

boolean hasAtLeastOneAnonAssigment = false;
for (Assignment assignment : assignments) {
if (assignmentService.assignmentUsesAnonymousGrading(assignment)) {
hasAtLeastOneAnonAssigment = true;
break;
}
}
context.put("hasAtLeastOneAnonAssignment", hasAtLeastOneAnonAssigment);

Collection<Assignment> assignments = assignmentService.getAssignmentsForContext(contextString)
.stream().filter(a -> !assignmentService.assignmentUsesAnonymousGrading(a))
.collect(Collectors.toList());

List<String> nonSubmitterPermissions = serverConfigurationService.getStringList(AssignmentConstants.SAK_PROP_NON_SUBMITTER_PERMISSIONS,
AssignmentConstants.SAK_PROP_NON_SUBMITTER_PERMISSIONS_DEFAULT);
Expand Down Expand Up @@ -5784,6 +5778,8 @@ private String build_instructor_view_students_assignment_context(VelocityPortlet
}
}


context.put("expandedUserName", state.getAttribute(EXPANDED_USER_NAME));
context.put("studentMembersMap", studentMembers);
context.put("studentMembers", new SortedIterator(studentMembers.values().iterator(), new AssignmentComparator(state, SORTED_USER_BY_SORTNAME, Boolean.TRUE.toString())));
context.put("viewGroup", state.getAttribute(VIEW_SUBMISSION_LIST_OPTION));
Expand Down Expand Up @@ -5814,17 +5810,6 @@ private String build_instructor_report_submissions(VelocityPortlet portlet, Cont
List submissions = prepPage(state);
context.put("submissions", submissions);

List<SubmitterSubmission> allSubmissions = (List<SubmitterSubmission>) state.getAttribute(STATE_PAGEING_TOTAL_ITEMS);
boolean hasAtLeastOneAnonAssigment = false;
for (SubmitterSubmission submission : allSubmissions) {
Assignment assignment = submission.getSubmission().getAssignment();
if (assignmentService.assignmentUsesAnonymousGrading(assignment)) {
hasAtLeastOneAnonAssigment = true;
break;
}
}
context.put("hasAtLeastOneAnonAssignment", hasAtLeastOneAnonAssigment);

context.put("sortedBy", state.getAttribute(SORTED_SUBMISSION_BY));
context.put("sortedAsc", state.getAttribute(SORTED_SUBMISSION_ASC));

Expand Down Expand Up @@ -11024,7 +11009,14 @@ public void doGrade_submission(RunData data) {
String assignmentId = params.getString("assignmentId");
state.setAttribute(EXPORT_ASSIGNMENT_REF, assignmentId);
String submissionId = params.getString("submissionId");

try {
String userId = params.getString("user_id");
User expandedUser = userDirectoryService.getUser(userId);
state.setAttribute(EXPANDED_USER_NAME, expandedUser.getSortName() + " (" + expandedUser.getDisplayId() + ")");
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}

// SAK-29314 - put submission information into state
boolean viewSubsOnlySelected = stringToBool((String) data.getParameters().getString(PARAMS_VIEW_SUBS_ONLY_CHECKBOX));
putSubmissionInfoIntoState(state, assignmentId, submissionId, viewSubsOnlySelected);
Expand Down Expand Up @@ -11231,6 +11223,12 @@ public void doShow_student_submission(RunData data) {
ParameterParser params = data.getParameters();

String id = params.getString("studentId");
try {
User expandedUser = userDirectoryService.getUser(id);
state.setAttribute(EXPANDED_USER_NAME, expandedUser.getSortName() + " (" + expandedUser.getDisplayId() + ")");
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
// add the student id into the table
t.add(id);

Expand All @@ -11247,6 +11245,7 @@ public void doHide_student_submission(RunData data) {
ParameterParser params = data.getParameters();

String id = params.getString("studentId");
state.removeAttribute(EXPANDED_USER_NAME);
// remove the student id from the table
t.remove(id);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
#else
<div class="sakai-table-toolBar">
<div class="sakai-table-filterContainer">
#if ($!groups.hasNext() || !$hasAtLeastOneAnonAssignment)
#if ($!groups.hasNext())
#define($viewSelectOptions)
#if (!$showSubmissionByFilterSearchOnly)
<option value="all" #if($!viewGroup.equals("all"))selected="selected"#end >$tlang.getString('gen.viewallgroupssections')</option>
Expand All @@ -59,6 +59,7 @@
#end
#viewFilterPanel("viewFilterForm", "viewgroup", $viewSelectOptions, "doChange_submission_list_option")
#end
#searchFilterPanel("$form_search", $searchString, "doView_submission_list_search", "doView_submission_list_search_clear")
</div>
<div class="sakai-table-toolBar-centre">
#if ($!isTimesheet)
Expand Down Expand Up @@ -119,62 +120,61 @@
#else
data-action-href='#toolLinkParam("AssignmentAction" "doHide_student_submission" "studentId=$formattedText.escapeUrl($member.Id)")'
#end
data-expanded="$isExpanded"
>
$submitterName
</span>
</td>
<td headers="assignment" data-order="ZZZZZZZZ"></td>
<td headers="submitted"></td>
<td headers="status" data-order="999999999999"></td>
#if ($!isTimesheet)
<td headers="time"></td>
#end
<td headers="grade"></td>
</tr>
#else
</div>
<div>
<div class="spinnerBesideContainer" id="$submitterName">
#set( $userSpinnerID = "userSpinner_" + $member.Id )
#if (!$studentListShowSet.contains($member.Id))
<a href="javascript:void(0)" onclick="SPNR.insertSpinnerInPreallocated( this, null, '$userSpinnerID' ); location='#toolLinkParam("AssignmentAction" "doShow_student_submission" "studentId=$formattedText.escapeUrl($member.Id)")'; return false;"
title="$tlang.getString("stulistsunbm.shostuass")" name="studentLink" >
<img src="#imageLink("sakai/expand.gif")" alt="$tlang.getString("stulistsunbm.shostuass")" width="13" height="13" border="0" />
#else
<a href="javascript:void(0)" onclick="SPNR.insertSpinnerInPreallocated( this, null, '$userSpinnerID' ); location='#toolLinkParam("AssignmentAction" "doHide_student_submission" "studentId=$formattedText.escapeUrl($member.Id)")'; return false;"
title="$tlang.getString("stulistsunbm.hidstuass")" name="studentLink" >
<img src="#imageLink("sakai/collapse.gif")" alt="$tlang.getString("stulistsunbm.hidstuass")" width="13" height="13" border="0" />
#end
$formattedText.escapeHtml($submitterName)
</a>
<div id="$userSpinnerID" class="allocatedSpinPlaceholder"></div>
</div>
</div>
</div>
</td>
<td colspan="5">
</td>
</tr>
#if ($studentListShowSet.contains($member.Id))
#set($assignments=false)
#set($assignments=$!studentAssignmentsTable.get($member))
#foreach ($assignment in $!assignments)
#set ($assignmentReference = $!service.assignmentReference($assignment.Id))
#set ($isAnon = $!service.assignmentUsesAnonymousGrading($assignment))
#set($assignmentTitle = $formattedText.escapeHtml($assignment.Title))
#if (!$assignment.Draft)
#if ($assignment.IsGroup)
#set($displayAssignment = $service.canSubmit($assignment, $member.id))
#else
#set($displayAssignment = true)
#end
#if (!$assignment.Draft && $displayAssignment)
## do not show draft assignments
#set($submission = false)
#set($submission=$service.getSubmission($assignment.Id, $member))
#set($submissionReference=$service.submissionReference($assignment.Context, $submission.Id, $assignment.Id))
<tr>
<td headers="studentname" data-order="$submitterName">
<span data-user-id="$member.Id"
#if (!$studentListShowSet.contains($member.Id))
data-action-href='#toolLinkParam("AssignmentAction" "doShow_student_submission" "studentId=$formattedText.escapeUrl($member.Id)")'
<td headers="studentname"/>
<td headers="assignment">
<a href="#toolLinkParam("AssignmentAction" "doGrade_submission" "assignmentId=$formattedText.escapeUrl($assignmentReference)&submissionId=$formattedText.escapeUrl($submissionReference)&option=lisofass2&user_id=$member.id")" title="$formattedText.escapeHtml($assignment.Title)">$formattedText.escapeHtml($assignment.Title)</a>
#if ($allowAddAssignment && $allowSubmitByInstructor)
#set( $submitSpinnerID = "submitFor_" + $member.Id + "_" + $formattedText.escapeUrl($assignmentReference) )
<div class="itemAction spinnerBesideContainer">
#if ($assignment.DueDate.isAfter($currentTime))
<a onclick="SPNR.insertSpinnerInPreallocated( this, null, '$submitSpinnerID' );" href="#toolLinkParam("AssignmentAction" "doView_submission" "assignmentReference=$formattedText.escapeUrl($assignmentReference)&submitterId=$formattedText.escapeUrl($member.id)")">
$tlang.getString("submitforstudent")
</a>
#else
data-action-href='#toolLinkParam("AssignmentAction" "doHide_student_submission" "studentId=$formattedText.escapeUrl($member.Id)")'
#end
data-expanded="$isExpanded"
>
$submitterName
</span>
</td>
<td headers="assignment" data-order="$assignmentTitle">
#if (!$isAnon)
<a href="#toolLinkParam("AssignmentAction" "doGrade_submission" "assignmentId=$formattedText.escapeUrl($assignmentReference)&submissionId=$formattedText.escapeUrl($submissionReference)&option=lisofass2")">$assignmentTitle</a>
#if ($allowAddAssignment && $allowSubmitByInstructor)
#set( $submitSpinnerID = "submitFor_" + $member.Id + "_" + $formattedText.escapeUrl($assignmentReference) )
<div class="itemAction spinnerBesideContainer">
#if ($assignment.DueDate.isAfter($currentTime))
<a onclick="SPNR.insertSpinnerInPreallocated( this, null, '$submitSpinnerID' );" href="#toolLinkParam("AssignmentAction" "doView_submission" "assignmentReference=$formattedText.escapeUrl($assignmentReference)&submitterId=$formattedText.escapeUrl($member.id)")">
$tlang.getString("submitforstudent")
</a>
#else
$tlang.getString("submitforstudentnotallowed")
#end
<div id="$submitSpinnerID" class="allocatedSpinPlaceholder"></div>
</div>
$tlang.getString("submitforstudentnotallowed")
#end
#else
$assignmentTitle ($tlang.getString("grading.anonymous.title"))
<div id="$submitSpinnerID" class="allocatedSpinPlaceholder"></div>
</div>
#end
</td>
<td headers="submitted">
Expand Down Expand Up @@ -259,5 +259,10 @@
<input type="hidden" name="sakai_csrf_token" value="$sakai_csrf_token" />
</form>
#end
#if ($expandedUserName)
<script>
window.location.href = window.location.href + "#" + "$expandedUserName";
</script>
#end
</div>
<!-- end: chef_assignments_instructor_student_list_submissions.vm -->

0 comments on commit 5ebdf53

Please sign in to comment.