Skip to content

Commit 9b2452f

Browse files
Alex-Jordanclaude
andcommitted
Make conditional release in the set details page use a select.
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 486157f commit 9b2452f

1 file changed

Lines changed: 38 additions & 22 deletions

File tree

lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use WeBWorK::Utils qw(cryptPassword x);
1414
use WeBWorK::Utils::Files qw(surePathToFile readFile);
1515
use WeBWorK::Utils::Instructor qw(assignProblemToAllSetUsers addProblemToSet);
1616
use WeBWorK::Utils::JITAR qw(seq_to_jitar_id jitar_id_to_seq);
17-
use WeBWorK::Utils::Sets qw(format_set_name_internal format_set_name_display);
17+
use WeBWorK::Utils::Sets qw(format_set_name_display);
1818
require WeBWorK::PG;
1919

2020
our @EXPORT_OK = qw(FIELD_PROPERTIES);
@@ -197,7 +197,7 @@ use constant FIELD_PROPERTIES => {
197197
override => 'any',
198198
help_text => x(
199199
'This set will be unavailable to students until they have earned the "Score Required for Release" on the '
200-
. 'sets specified in this field. The sets should be written as a comma separated list.'
200+
. 'sets selected in this field. Hold down Ctrl (or Cmd on Mac) to select or deselect multiple sets.'
201201
)
202202
},
203203
restricted_status => {
@@ -886,14 +886,31 @@ sub fieldHTML ($c, $userID, $setID, $problemID, $globalRecord, $userRecord, $fie
886886
if ($field eq 'problems_per_page'
887887
&& $c->ce->{test}{maxProblemsPerPage}
888888
&& ($value == 0 || $value > $c->ce->{test}{maxProblemsPerPage}));
889-
$value = format_set_name_display($value =~ s/\s*,\s*/,/gr) if $field eq 'restricted_release';
890889

891890
my @field_args = (
892891
id => "$recordType.$recordID.${field}_id",
893892
class => 'form-control form-control-sm',
894-
$field eq 'restricted_release' || $field eq 'source_file' ? (dir => 'ltr') : ()
893+
$field eq 'source_file' ? (dir => 'ltr') : ()
895894
);
896-
if ($field eq 'problem_seed') {
895+
if ($field eq 'restricted_release') {
896+
# Only sets that currently exist in the course are valid choices.
897+
my @setIDs = sort grep { $_ ne $setID } $db->listGlobalSets;
898+
my %isSelected =
899+
map { $_ => 1 } split(/\s*,\s*/, $value =~ s/^\s*|\s*$//gr);
900+
901+
$input = $c->select_field(
902+
"$recordType.$recordID.$field",
903+
[
904+
map {
905+
[ format_set_name_display($_) => $_, $isSelected{$_} ? (selected => undef) : () ]
906+
} @setIDs
907+
],
908+
id => "$recordType.$recordID.${field}_id",
909+
class => 'form-select form-select-sm',
910+
multiple => undef,
911+
size => (@setIDs ? (@setIDs > 8 ? 8 : scalar(@setIDs)) : 1)
912+
);
913+
} elsif ($field eq 'problem_seed') {
897914
# Insert a randomization button
898915
$input = $c->tag(
899916
'div',
@@ -1411,7 +1428,14 @@ sub initialize ($c) {
14111428
next unless canChange($forUsers, $field);
14121429

14131430
my @paramValues = $c->param("set.$setID.$field");
1414-
my $param = @paramValues > 1 && $paramValues[0] eq 'numeric' ? $paramValues[1] : $paramValues[0];
1431+
my $param;
1432+
if ($field eq 'restricted_release') {
1433+
$param = join(',', grep {$_} @paramValues);
1434+
} elsif (@paramValues > 1 && $paramValues[0] eq 'numeric') {
1435+
$param = $paramValues[1];
1436+
} else {
1437+
$param = $paramValues[0];
1438+
}
14151439
if ($param && $param ne '') {
14161440
$param = $param * $properties{$field}->{convertby} if $properties{$field}{convertby};
14171441

@@ -1488,13 +1512,16 @@ sub initialize ($c) {
14881512
next unless canChange($forUsers, $field);
14891513

14901514
my @paramValues = $c->param("set.$setID.$field");
1491-
my $param = @paramValues > 1 && $paramValues[0] eq 'numeric' ? $paramValues[1] : $paramValues[0];
1515+
my $param;
1516+
if ($field eq 'restricted_release') {
1517+
$param = join(',', grep {$_} @paramValues);
1518+
} elsif (@paramValues > 1 && $paramValues[0] eq 'numeric') {
1519+
$param = $paramValues[1];
1520+
} else {
1521+
$param = $paramValues[0];
1522+
}
14921523
$param = defined $properties{$field}{default} ? $properties{$field}{default} : ''
14931524
unless defined $param && $param ne '';
1494-
if ($field =~ /restricted_release/ && $param) {
1495-
$param = format_set_name_internal($param =~ s/\s*,\s*/,/gr);
1496-
$c->check_sets($db, $param);
1497-
}
14981525
if ($properties{$field}->{convertby} && $param) {
14991526
$param = $param * $properties{$field}->{convertby};
15001527
}
@@ -2093,17 +2120,6 @@ sub checkFile ($c, $filePath, $headerType) {
20932120
return $c->maketext("This source file is not a plain file!");
20942121
}
20952122

2096-
# Make sure restrictor sets exist.
2097-
sub check_sets ($c, $db, $sets_string) {
2098-
my @proposed_sets = split(/\s*,\s*/, $sets_string);
2099-
for (@proposed_sets) {
2100-
$c->addbadmessage("Error: $_ is not a valid set name in restricted release list!")
2101-
unless $db->existsGlobalSet($_);
2102-
}
2103-
2104-
return;
2105-
}
2106-
21072123
sub userCountMessage ($c, $count, $numUsers) {
21082124
if ($count == 0) {
21092125
return $c->tag('em', $c->maketext('no students'));

0 commit comments

Comments
 (0)