'
.'';
for (my $k=0; $k<=$maxnum; $k++) {
@@ -3762,7 +3968,7 @@ sub print_ltitools {
''.$lt{'url'}.': '.
(' 'x2).
- ''.$lt{'key'}.
+ ''.$lt{'key'}.':'.
' '.
(' 'x2).
''.$lt{'secret'}.':'.
@@ -3808,21 +4014,36 @@ sub print_ltitools {
''.$lt{'explanation'}.' '.
'
';
- $datatable .= ' ';
+ my %units = (
+ 'passback' => 'days',
+ 'roster' => 'seconds',
+ );
foreach my $extra ('passback','roster') {
+ my $validsty = 'none';
+ my $currvalid;
my $checkedon = '';
my $checkedoff = ' checked="checked"';
if ($settings->{$item}->{$extra}) {
$checkedon = $checkedoff;
$checkedoff = '';
- }
- $datatable .= $lt{$extra}.' '.
- ' '.
- &mt('Yes').' '.(' 'x2).
- ' '.
- &mt('No').' '.(' 'x4);
+ $validsty = 'inline-block';
+ if ($settings->{$item}->{$extra.'valid'} =~ /^\d+\.?\d*$/) {
+ $currvalid = $settings->{$item}->{$extra.'valid'};
+ }
+ }
+ my $onclick = ' onclick="toggleLTITools(this.form,'."'$extra','$i'".');"';
+ $datatable .= ''.$lt{$extra}.' '.
+ ' '.
+ &mt('No').' '.(' 'x2).
+ ' '.
+ &mt('Yes').'
'.
+ '
';
}
- $datatable .= ''.$lt{'icon'}.': ';
+ $datatable .= ''.$lt{'icon'}.': ';
if ($imgsrc) {
$datatable .= $imgsrc.
'';
- foreach my $item ('label','title','target','linktext','explanation') {
+ foreach my $item ('label','title','target','linktext','explanation','append') {
my $checked;
if ($courseconfig{$item}) {
$checked = ' checked="checked"';
@@ -3922,7 +4143,7 @@ sub print_ltitools {
}
}
$css_class = $itemcount%2?' class="LC_odd_row"':'';
- my $chgstr = ' onchange="javascript:reorderLTI(this.form,'."'ltitools_add_pos'".');"';
+ my $chgstr = ' onchange="javascript:reorderLTITools(this.form,'."'ltitools_add_pos'".');"';
$datatable .= ''."\n".
' '."\n".
'';
@@ -3973,14 +4194,28 @@ sub print_ltitools {
''.$lt{'explanation'}.' '.
''.
'
';
+ my %units = (
+ 'passback' => 'days',
+ 'roster' => 'seconds',
+ );
+ my %defaulttimes = (
+ 'passback' => '7',
+ 'roster' => '300',
+ );
foreach my $extra ('passback','roster') {
- $datatable .= $lt{$extra}.' '.
- ' '.
- &mt('Yes').' '.(' 'x2).
- ' '.
- &mt('No').' '.(' 'x4);
+ my $onclick = ' onclick="toggleLTITools(this.form,'."'$extra','add'".');"';
+ $datatable .= ''.$lt{$extra}.' '.
+ ' '.
+ &mt('No').' '.(' 'x2).''.
+ ' '.
+ &mt('Yes').'
'.
+ '
';
}
- $datatable .= ''.$lt{'icon'}.': '.
+ $datatable .= ''.$lt{'icon'}.': '.
'('.&mt('if larger than 21x21 pixels, image will be scaled').') ';
if ($switchserver) {
$datatable .= &mt('Upload to library server: [_1]',$switchserver);
@@ -4010,7 +4245,7 @@ sub print_ltitools {
}
$datatable .= ' '.
''.&mt('Configurable in course').' ';
- foreach my $item ('label','title','target','linktext','explanation') {
+ foreach my $item ('label','title','target','linktext','explanation','append') {
$datatable .= ''.
' '.
$lt{'crs'.$item}.' '.(' ' x2)."\n";
@@ -4058,6 +4293,7 @@ sub ltitools_names {
'crstitle' => 'Course title',
'crslinktext' => 'Link Text',
'crsexplanation' => 'Explanation',
+ 'crsappend' => 'Provider URL',
);
return %lt;
}
@@ -4073,11 +4309,13 @@ sub print_coursedefaults {
coursecredits => 'Credits can be specified for courses',
uselcmath => 'Math preview uses LON-CAPA previewer (javascript) in place of DragMath (Java)',
usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)',
+ texengine => 'Default method to display mathematics',
postsubmit => 'Disable submit button/keypress following student submission',
canclone => "People who may clone a course (besides course's owner and coordinators)",
mysqltables => 'Lifetime (s) of "Temporary" MySQL tables (student performance data) on homeserver',
);
my %staticdefaults = (
+ texengine => 'MathJax',
anonsurvey_threshold => 10,
uploadquota => 500,
postsubmit => 60,
@@ -4091,8 +4329,36 @@ sub print_coursedefaults {
'canclone' => 'none',
);
@toggles = ('canuse_pdfforms','uselcmath','usejsme');
+ my $deftex = $staticdefaults{'texengine'};
+ if (ref($settings) eq 'HASH') {
+ if ($settings->{'texengine'}) {
+ if ($settings->{'texengine'} =~ /^(MathJax|mimetex|tth)$/) {
+ $deftex = $settings->{'texengine'};
+ }
+ }
+ }
+ $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ my $mathdisp = ''.
+ ''.$choices{'texengine'}.
+ ' '.
+ ''."\n";
+ my %texoptions = (
+ MathJax => 'MathJax',
+ mimetex => &mt('Convert to Images'),
+ tth => &mt('TeX to HTML'),
+ );
+ foreach my $renderer ('MathJax','mimetex','tth') {
+ my $selected = '';
+ if ($renderer eq $deftex) {
+ $selected = ' selected="selected"';
+ }
+ $mathdisp .= ''.$texoptions{$renderer}.' '."\n";
+ }
+ $mathdisp .= ' '."\n";
+ $itemcount ++;
($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
\%choices,$itemcount);
+ $datatable = $mathdisp.$datatable;
$css_class = $itemcount%2?' class="LC_odd_row"':'';
$datatable .=
''.
@@ -4139,7 +4405,7 @@ sub print_coursedefaults {
if ($checked) {
$show = 'block';
}
- $additional = '
'.
+ $additional = '
'.
&mt('Institutional codes for new and cloned course have identical:').
' ';
foreach my $item (@code_order) {
@@ -5454,7 +5720,7 @@ sub loadbalance_rule_row {
}
my $space;
if ($islast && $num == 1) {
- $space = '
';
+ $space = '
';
}
my $output =
' '.$space.
@@ -5540,8 +5806,8 @@ sub contact_titles {
'adminemail' => 'Default Server Admin E-mail address',
'errormail' => 'Error reports to be e-mailed to',
'packagesmail' => 'Package update alerts to be e-mailed to',
- 'helpdeskmail' => "Helpdesk requests for this domain's users",
- 'otherdomsmail' => 'Helpdesk requests for other (unconfigured) domains',
+ 'helpdeskmail' => "Helpdesk requests from all users in this domain",
+ 'otherdomsmail' => 'Helpdesk requests from users in other (unconfigured) domains',
'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
'requestsmail' => 'E-mail from course requests requiring approval',
'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates',
@@ -7746,6 +8012,7 @@ sub insttypes_row {
statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
lockablenames => 'User preference to lock name',
selfassign => 'Self-reportable affiliations',
+ overrides => "Override domain's helpdesk settings based on requester's affiliation",
);
my $showdom;
if ($context eq 'cansearch') {
@@ -7792,6 +8059,10 @@ sub insttypes_row {
if (grep(/^\Q$types->[$i]\E$/,@{$settings->{$context}})) {
$check = ' checked="checked" ';
}
+ } elsif (ref($settings->{$context}) eq 'HASH') {
+ if (ref($settings->{$context}->{$types->[$i]}) eq 'HASH') {
+ $check = ' checked="checked" ';
+ }
} elsif ($context eq 'statustocreate') {
$check = ' checked="checked" ';
}
@@ -7806,29 +8077,38 @@ sub insttypes_row {
$rem = @{$types}%($numinrow);
}
my $colsleft = $numinrow - $rem;
- if (($rem == 0) && (@{$types} > 0)) {
- $output .= ' ';
- }
- if ($colsleft > 1) {
- $output .= '';
+ if ($context eq 'overrides') {
+ if ($colsleft > 1) {
+ $output .= ' ';
+ } else {
+ $output .= ' ';
+ }
+ $output .= ' ';
} else {
- $output .= ' ';
- }
- my $defcheck = ' ';
- if (ref($settings) eq 'HASH') {
- if (ref($settings->{$context}) eq 'ARRAY') {
- if (grep(/^default$/,@{$settings->{$context}})) {
+ if (($rem == 0) && (@{$types} > 0)) {
+ $output .= ' ';
+ }
+ if ($colsleft > 1) {
+ $output .= '';
+ } else {
+ $output .= ' ';
+ }
+ my $defcheck = ' ';
+ if (ref($settings) eq 'HASH') {
+ if (ref($settings->{$context}) eq 'ARRAY') {
+ if (grep(/^default$/,@{$settings->{$context}})) {
+ $defcheck = ' checked="checked" ';
+ }
+ } elsif ($context eq 'statustocreate') {
$defcheck = ' checked="checked" ';
}
- } elsif ($context eq 'statustocreate') {
- $defcheck = ' checked="checked" ';
}
+ $output .= ''.
+ ' '.
+ $othertitle.' ';
}
- $output .= ''.
- ' '.
- $othertitle.' '.
- ' ';
+ $output .= '';
return $output;
}
@@ -8862,14 +9142,14 @@ sub publishlogo {
} else {
my $source = $filepath.'/'.$file;
my $logfile;
- if (!open($logfile,">>$source".'.log')) {
+ if (!open($logfile,">>",$source.'.log')) {
return (&mt('No write permission to Authoring Space'));
}
print $logfile
"\n================= Publish ".localtime()." ================\n".
$env{'user.name'}.':'.$env{'user.domain'}."\n";
# Save the file
- if (!open(FH,'>'.$source)) {
+ if (!open(FH,">",$source)) {
&Apache::lonnet::logthis('Failed to create '.$source);
return (&mt('Failed to create file'));
}
@@ -8930,7 +9210,8 @@ $env{'user.name'}.':'.$env{'user.domain'
if ($fullwidth ne '' && $fullheight ne '') {
if ($fullwidth > $thumbwidth && $fullheight > $thumbheight) {
my $thumbsize = $thumbwidth.'x'.$thumbheight;
- system("convert -sample $thumbsize $inputfile $outfile");
+ my @args = ('convert','-sample',$thumbsize,$inputfile,$outfile);
+ system({$args[0]} @args);
chmod(0660, $filepath.'/tn-'.$file);
if (-e $outfile) {
my $copyfile=$targetdir.'/tn-'.$file;
@@ -9010,7 +9291,7 @@ sub write_metadata {
{
print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
my $mfh;
- if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
+ if (open($mfh,">",$targetdir.'/'.$file.'.meta')) {
foreach (sort(keys(%metadatafields))) {
unless ($_=~/\./) {
my $unikey=$_;
@@ -9044,7 +9325,7 @@ sub notifysubscribed {
next unless (ref($targetsource) eq 'ARRAY');
my ($target,$source)=@{$targetsource};
if ($source ne '') {
- if (open(my $logfh,'>>'.$source.'.log')) {
+ if (open(my $logfh,">>",$source.'.log')) {
print $logfh "\nCleanup phase: Notifications\n";
my @subscribed=&subscribed_hosts($target);
foreach my $subhost (@subscribed) {
@@ -9070,7 +9351,7 @@ sub notifysubscribed {
sub subscribed_hosts {
my ($target) = @_;
my @subscribed;
- if (open(my $fh,"<$target.subscription")) {
+ if (open(my $fh,"<","$target.subscription")) {
while (my $subline=<$fh>) {
if ($subline =~ /^($match_lonid):/) {
my $host = $1;
@@ -9897,8 +10178,15 @@ sub modify_ltitools {
$confhash{$newid}{'display'}{'target'} = 'iframe';
}
foreach my $item ('passback','roster') {
- if ($env{'form.ltitools_add_'.$item}) {
+ if ($env{'form.ltitools_'.$item.'_add'}) {
$confhash{$newid}{$item} = 1;
+ if ($env{'form.ltitools_'.$item.'valid_add'} ne '') {
+ my $lifetime = $env{'form.ltitools_'.$item.'valid_add'};
+ $lifetime =~ s/^\s+|\s+$//g;
+ if ($lifetime =~ /^\d+\.?\d*$/) {
+ $confhash{$newid}{$item.'valid'} = $lifetime;
+ }
+ }
}
}
if ($env{'form.ltitools_add_image.filename'} ne '') {
@@ -10048,13 +10336,23 @@ sub modify_ltitools {
foreach my $extra ('passback','roster') {
if ($env{'form.ltitools_'.$extra.'_'.$i}) {
$confhash{$itemid}{$extra} = 1;
+ if ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') {
+ my $lifetime = $env{'form.ltitools_'.$extra.'valid_add'};
+ $lifetime =~ s/^\s+|\s+$//g;
+ if ($lifetime =~ /^\d+\.?\d*$/) {
+ $confhash{$itemid}{$extra.'valid'} = $lifetime;
+ }
+ }
}
if ($domconfig{$action}{$itemid}{$extra} ne $confhash{$itemid}{$extra}) {
$changes{$itemid} = 1;
}
+ if ($domconfig{$action}{$itemid}{$extra.'valid'} ne $confhash{$itemid}{$extra.'valid'}) {
+ $changes{$itemid} = 1;
+ }
}
my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig_'.$i);
- foreach my $item ('label','title','target','linktext','explanation') {
+ foreach my $item ('label','title','target','linktext','explanation','append') {
if (grep(/^\Q$item\E$/,@courseconfig)) {
$confhash{$itemid}{'crsconf'}{$item} = 1;
if (ref($domconfig{$action}{$itemid}{'crsconf'}) eq 'HASH') {
@@ -10245,7 +10543,7 @@ sub modify_ltitools {
$resulttext .= ('*'x$num).'';
}
$resulttext .= '