From f28f78e506cf60232b4ef685a81383b00f3f6536 Mon Sep 17 00:00:00 2001 From: Jaimos Skriletz Date: Sun, 15 Dec 2024 17:41:26 -0700 Subject: [PATCH] When sorting achievements, make level achievements last. Level achievements need to be processed last, and currently an instructor can edit achievement numbers which could place some achievements after the level achievements. Update the sortAchievements utility method to always place level achievements at the end of the list. --- lib/WeBWorK/Utils.pm | 14 ++++++++++---- .../HelpFiles/InstructorAchievementList.html.ep | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/WeBWorK/Utils.pm b/lib/WeBWorK/Utils.pm index 766904200f..f35898287f 100644 --- a/lib/WeBWorK/Utils.pm +++ b/lib/WeBWorK/Utils.pm @@ -215,15 +215,21 @@ sub sortAchievements (@achievements) { # Next sort by number. @achievements = sort { ($a->number || 0) <=> ($b->number || 0) } @achievements; - # Finally sort by category. + # Finally sort by category. Always place level achievements last. @achievements = sort { - if ($a->number && $b->number) { + if ($a->{category} eq 'level' && $b->{category} eq 'level') { + return 0; + } elsif ($a->{category} eq 'level') { + return 1; + } elsif ($b->{category} eq 'level') { + return -1; + } elsif ($a->number && $b->number) { return $a->number <=> $b->number; } elsif ($a->{category} eq $b->{category}) { return 0; - } elsif ($a->{category} eq 'secret' or $b->{category} eq 'level') { + } elsif ($a->{category} eq 'secret') { return -1; - } elsif ($a->{category} eq 'level' or $b->{category} eq 'secret') { + } elsif ($b->{category} eq 'secret') { return 1; } else { return $a->{category} cmp $b->{category}; diff --git a/templates/HelpFiles/InstructorAchievementList.html.ep b/templates/HelpFiles/InstructorAchievementList.html.ep index dc3db86284..078a882a5d 100644 --- a/templates/HelpFiles/InstructorAchievementList.html.ep +++ b/templates/HelpFiles/InstructorAchievementList.html.ep @@ -24,7 +24,7 @@

<%= maketext('Achievements are evaluated in the order shown below, with the exception of "level" achievements. ' - . 'Achievements in the "level" category are evaluated first and control the XP thresholds and rewards ' + . 'Achievements in the "level" category are evaluated last and control the XP thresholds and rewards ' . '(achievement items) for reaching each level. Achievements in the "secret" category are not shown to ' . 'students until they earn the achievement, and is used for fun/surprise achievements.') =%>