--- loncom/interface/courseprefs.pm 2023/09/06 13:32:28 1.49.2.28.2.17
+++ loncom/interface/courseprefs.pm 2025/03/15 01:24:03 1.49.2.28.2.22
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set configuration settings for a course
#
-# $Id: courseprefs.pm,v 1.49.2.28.2.17 2023/09/06 13:32:28 raeburn Exp $
+# $Id: courseprefs.pm,v 1.49.2.28.2.22 2025/03/15 01:24:03 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -372,6 +372,12 @@ sub handler {
my %values=&Apache::lonnet::dump('environment',$cdom,$cnum);
my %linkprot=&Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1);
+ my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
+ unless ($phase eq 'process') {
+ if (ref($domdefs{'linkprotsuggested'}) eq 'HASH') {
+ $values{'suggested'} = $domdefs{'linkprotsuggested'};
+ }
+ }
my %ltienc = &Apache::lonnet::dump('nohist_ltienc',$cdom,$cnum,undef,undef,undef,1);
my %ltitools = &Apache::lonnet::dump('ltitools',$cdom,$cnum,undef,undef,undef,1);
my %ltitoolsenc = &Apache::lonnet::dump('nohist_toolsenc',$cdom,$cnum,undef,undef,undef,1);
@@ -778,9 +784,38 @@ sub print_config_box {
';
+ if ($action eq 'linkprot') {
+ if ((ref($settings) eq 'HASH') && (ref($settings->{'suggested'}) eq 'HASH')) {
+ my $hints;
+ my $hintcount = 0;
+ foreach my $key (sort { $a <=> $b } keys(%{$settings->{'suggested'}})) {
+ if ((ref($settings->{'suggested'}->{$key}) eq 'HASH')) {
+ if (($settings->{'suggested'}->{$key}-{'name'} ne '') &&
+ ($settings->{'suggested'}->{$key}-{'info'} ne '')) {
+ my $css_class = $hintcount%2?' class="LC_odd_row"':' class="LC_even_row"';
+ $hints .= ''.
+ $settings->{'suggested'}->{$key}->{'name'}.' | '.
+ ''.
+ $settings->{'suggested'}->{$key}->{'info'}.
+ ' | ';
+ $hintcount ++;
+ }
+ }
+ }
+ if ($hintcount) {
+ $output .= ''.
+ ''.&mt('Recommendation(s) for specific launcher application(s)').' | '.
+ ' '."\n".
+ ''.
+ ''.&mt('Launcher Application').' | '.
+ ''.&mt('Recommendation(s)').' | '."\n".
+ $hints;
+ }
+ }
+ }
if (exists $item->{'header'}->[0]->{'col1'} ||
exists $item->{'header'}->[0]->{'col2'}) {
- $output .= '
+ $output .= '
'.&mt($item->{'header'}->[0]->{'col1'}).' | ';
if (($action eq 'courseinfo') || ($action eq 'localization') ||
@@ -807,7 +842,7 @@ sub print_config_box {
} elsif ($action eq 'appearance') {
$output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'grading') {
- $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
+ $output .= &print_grading($cdom,$cnum,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'printouts') {
$output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
} elsif ($action eq 'spreadsheet') {
@@ -1499,6 +1534,33 @@ sub process_changes {
} elsif ($values->{$entry}) {
$changes->{$entry} = '';
}
+ } elsif ($entry eq 'grading') {
+ if ($env{'form.'.$entry} eq 'standard') {
+ if ($env{'form.hidetotals'}) {
+ my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
+ if (keys(%sections)) {
+ my @secs = &Apache::loncommon::get_env_multiple('form.hidetotals_sections');
+ if (grep(/^all$/,@secs)) {
+ $newvalues{'hidetotals'} = 'all';
+ } elsif (@secs) {
+ $newvalues{'hidetotals'} = '';
+ foreach my $sec (sort {$a <=> $b} @secs) {
+ if (exists($sections{$sec})) {
+ $newvalues{'hidetotals'} .= $sec.','
+ }
+ }
+ $newvalues{'hidetotals'} =~ s/,$//;
+ }
+ } else {
+ $newvalues{'hidetotals'} = 'all';
+ }
+ }
+ }
+ if ($newvalues{'hidetotals'} ne $values->{'hidetotals'}) {
+ $changes->{'hidetotals'} = $newvalues{'hidetotals'};
+ $changes->{'grading'} = $env{'form.'.$entry};
+ }
+ $newvalues{$entry} = $env{'form.'.$entry};
} else {
$newvalues{$entry} = $env{'form.'.$entry};
}
@@ -1913,10 +1975,14 @@ sub process_ltitools {
} else {
$ltitools{$newid}{'display'}{'target'} = 'iframe';
}
- foreach my $item ('passback','roster') {
+ foreach my $item ('passback','roster','returnurl') {
if ($env{'form.ltitools_'.$item.'_add'}) {
$ltitools{$newid}{$item} = 1;
- if ($env{'form.ltitools_'.$item.'valid_add'} ne '') {
+ if ($item eq 'returnurl') {
+ if ($env{'form.ltitools_crs'.$item.'_add'}) {
+ $ltitools{$newid}{'crsconf'}{$item} = 1;
+ }
+ } elsif ($env{'form.ltitools_'.$item.'valid_add'} ne '') {
my $lifetime = $env{'form.ltitools_'.$item.'valid_add'};
$lifetime =~ s/^\s+|\s+$//g;
if ($lifetime =~ /^\d+\.?\d*$/) {
@@ -2100,10 +2166,21 @@ sub process_ltitools {
} else {
$haschanges{$itemid} = 1;
}
- foreach my $extra ('passback','roster') {
+ foreach my $extra ('passback','roster','returnurl') {
if ($env{'form.ltitools_'.$extra.'_'.$i}) {
$ltitools{$itemid}{$extra} = 1;
- if ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') {
+ if ($extra eq 'returnurl') {
+ if ($env{'form.ltitools_crs'.$extra.'_'.$i}) {
+ $ltitools{$itemid}{'crsconf'}{$extra} = 1;
+ if (ref($values->{$itemid}{'crsconf'}) eq 'HASH') {
+ if (!$values->{$itemid}{'crsconf'}{$extra}) {
+ $haschanges{$itemid} = 1;
+ }
+ } else {
+ $haschanges{$itemid} = 1;
+ }
+ }
+ } elsif ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') {
my $lifetime = $env{'form.ltitools_'.$extra.'valid_'.$i};
$lifetime =~ s/^\s+|\s+$//g;
if ($lifetime =~ /^\d+\.?\d*$/) {
@@ -2580,6 +2657,40 @@ sub store_changes {
unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts') || ($key eq 'extresource')) {
$displayval = $changes->{$item}{$key};
}
+ if (($item eq 'grading') && ($key eq 'grading')) {
+ if ($displayval eq 'standard') {
+ my $hidetotals;
+ if (exists($changes->{$item}{'hidetotals'})) {
+ if ($changes->{$item}{'hidetotals'} eq '') {
+ if (exists($values->{'hidetotals'})) {
+ push(@delkeys,'hidetotals');
+ }
+ } else {
+ $hidetotals = $changes->{$item}{'hidetotals'};
+ }
+ } elsif (exists($values->{'hidetotals'})) {
+ $hidetotals = $values->{'hidetotals'};
+ }
+ if ($hidetotals eq '') {
+ $displayval = &mt('standard with "hide course totals" set to "No"');
+ if (exists($values->{'hidetotals'})) {
+ push(@delkeys,'hidetotals');
+ }
+ } elsif ($hidetotals =~ /^([\w,]+)$/) {
+ my $secstr = $1;
+ my @secs = split(/,/,$secstr);
+ if (grep(/^all$/,@secs)) {
+ $displayval = &mt('standard with "hide course totals" set to "Yes" for all users');
+ $hidetotals = 'all';
+ } else {
+ $displayval = &mt('standard with "hide course totals" set to "Yes" for users in section(s): [_1]',join(', ',@secs));
+ }
+ $storehash{'hidetotals'} = $hidetotals;
+ }
+ } elsif (exists($values->{'hidetotals'})) {
+ push(@delkeys,'hidetotals');
+ }
+ }
if ($item eq 'feedback') {
if ($key =~ /^(question|policy|comment)(\.email)\.text$/) {
$text = $prefs->{$item}->{'itemtext'}{$1.$2};
@@ -3142,7 +3253,7 @@ sub store_ltitools {
}
}
}
- $output .= ''.&mt('Configurable in course:');
+ $output .= ''.&mt('Configurable in course').':';
my @possconfig = ('label','title','target','linktext','explanation','append');
my $numconfig = 0;
if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') {
@@ -3157,11 +3268,21 @@ sub store_ltitools {
$output .= ' '.&mt('None');
}
$output .= '';
- foreach my $item ('passback','roster') {
+ foreach my $item ('passback','roster','returnurl') {
$output .= ''.$lt{$item}.' ';
if ($changes->{$itemid}{$item}) {
$output .= &mt('Yes');
- if ($changes->{$itemid}{$item.'valid'}) {
+ if ($item eq 'returnurl') {
+ if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') {
+ $output .= ' ['.&mt('Configurable in course').': ';
+ if ($changes->{$itemid}{'crsconf'}{$item}) {
+ $output .= &mt('Yes');
+ } else {
+ $output .= &mt('No');
+ }
+ $output .= ']';
+ }
+ } elsif ($changes->{$itemid}{$item.'valid'}) {
if ($item eq 'passback') {
$output .= ' '.&mt('valid for at least [quant,_1,day] after launch',
$changes->{$itemid}{$item.'valid'});
@@ -3507,7 +3628,7 @@ function syllabusinfo() {
}
}
ENDSCRIPT
- my $menuitems_js;
+ my ($menuitems_js,$grading_js);
unless ($noedit) {
my $collections;
my $next = 1;
@@ -3589,6 +3710,48 @@ function toggleAddmenucoll() {
}
}
ENDSCRIPT
+ $grading_js = <<"ENDSCRIPT";
+function toggleGrading(form) {
+ if (document.getElementById('hidetotalsdiv')) {
+ var totalsdivid = document.getElementById('hidetotalsdiv');
+ var selname = form.elements['grading'];
+ if (selname) {
+ var current = selname.options[selname.selectedIndex].value
+ if (current == 'standard') {
+ totalsdivid.style.display = 'inline-block';
+ } else {
+ totalsdivid.style.display = 'none';
+ }
+ }
+ }
+ return;
+}
+
+function toggleHiddenTotalsSec(form) {
+ if (document.getElementById('sectotalsdiv')) {
+ var sectotalsdivid = document.getElementById('sectotalsdiv');
+ var radioname = form.elements['hidetotals'];
+ if (radioname) {
+ if (radioname.length > 0) {
+ var setvis;
+ for (var i=0; i'."\n".
+ $grading_js."\n".&linkprot_javascript()."\n".'//]]>'."\n".
''."\n".$stubrowse_js."\n".$ltitools_js."\n";
return $jscript;
}
@@ -4931,8 +5094,7 @@ sub update_releasereq {
}
$modified_courses = [];
}
- undef($registered_cleanup);
- return;
+ return OK;
}
sub show_autocoowners {
@@ -5347,7 +5509,7 @@ sub select_recipient {
}
sub select_sections {
- my ($item,$num,$sections,$selected,$noedit) = @_;
+ my ($item,$num,$sections,$selected,$noedit,$allval) = @_;
my ($output,@currsecs,$allsec,$disabled);
if (ref($selected) eq 'ARRAY') {
@currsecs = @{$selected};
@@ -5363,16 +5525,24 @@ sub select_sections {
my $mult;
if (@{$sections} > 1) {
$mult = ' multiple="multiple"';
+ my $size;
if (@{$sections} > 3) {
- $mult .= ' size="4"';
+ $size = 4;
+ } else {
+ $size = 1 + scalar(@{$sections});
}
+ $mult .= ' size="'.$size.'"';
+ }
+ my $name = $item.'_sections';
+ unless ($item eq 'hidetotals') {
+ $name .= '_'.$num;
}
- $output = ' ';
- my %courseconfig;
- if (ref($settings->{$item}) eq 'HASH') {
- if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') {
- %courseconfig = %{$settings->{$item}->{'crsconf'}};
- }
- }
- $datatable .= ' |
'."\n".
+ '