From 81ae1835d5c245d86ff0a4dfab83a303feedfd3c 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.') =%>