--- loncom/interface/domainprefs.pm 2020/05/22 22:29:56 1.160.6.84.6.3 +++ loncom/interface/domainprefs.pm 2016/09/21 01:38:50 1.281 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.160.6.84.6.3 2020/05/22 22:29:56 raeburn Exp $ +# $Id: domainprefs.pm,v 1.281 2016/09/21 01:38:50 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -19,8 +19,7 @@ # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA# # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ @@ -104,8 +103,8 @@ $datatable - HTML containing form eleme In the case of course requests, radio buttons are displayed for each institutional affiliate type (and also default, and _LC_adv) for each of the course types -(official, unofficial, community, and textbook). In each case the radio buttons -allow the selection of one of four values: +(official, unofficial, community, textbook, and placement). +In each case the radio buttons allow the selection of one of four values: 0, approval, validate, autolimit=N (where N is blank, or a positive integer). which have the following effects: @@ -170,10 +169,12 @@ use Apache::loncoursequeueadmin(); use LONCAPA qw(:DEFAULT :match); use LONCAPA::Enrollment; use LONCAPA::lonauthcgi(); +use LONCAPA::SSL; use File::Copy; use Locale::Language; use DateTime::TimeZone; use DateTime::Locale; +use Time::HiRes qw( sleep ); my $registered_cleanup; my $modified_urls; @@ -217,26 +218,13 @@ sub handler { 'serverstatuses','requestcourses','helpsettings', 'coursedefaults','usersessions','loadbalancing', 'requestauthor','selfenrollment','inststatus', - 'ltitools'],$dom); - if (ref($domconfig{'ltitools'}) eq 'HASH') { - my %encconfig = - &Apache::lonnet::get_dom('encconfig',['ltitools'],$dom); - if (ref($encconfig{'ltitools'}) eq 'HASH') { - foreach my $id (keys(%{$domconfig{'ltitools'}})) { - if (ref($domconfig{'ltitools'}{$id}) eq 'HASH') { - foreach my $item ('key','secret') { - $domconfig{'ltitools'}{$id}{$item} = $encconfig{'ltitools'}{$id}{$item}; - } - } - } - } - } + 'ltitools','ssl','trust'],$dom); my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', 'autoupdate','autocreate','directorysrch','contacts', 'usercreation','selfcreation','usermodification','scantron', 'requestcourses','requestauthor','coursecategories', 'serverstatuses','helpsettings','coursedefaults', - 'ltitools','selfenrollment','usersessions'); + 'ltitools','selfenrollment','usersessions','ssl','trust'); my %existing; if (ref($domconfig{'loadbalancing'}) eq 'HASH') { %existing = %{$domconfig{'loadbalancing'}}; @@ -276,8 +264,6 @@ sub handler { help => 'Domain_Configuration_LangTZAuth', header => [{col1 => 'Setting', col2 => 'Value'}, - {col1 => 'Internal Authentication', - col2 => 'Value'}, {col1 => 'Institutional user types', col2 => 'Assignable to e-mail usernames'}], print => \&print_defaults, @@ -331,14 +317,10 @@ sub handler { modify => \&modify_directorysrch, }, 'contacts' => - { text => 'E-mail addresses and helpform', + { text => 'Contact Information', help => 'Domain_Configuration_Contact_Info', - header => [{col1 => 'Default e-mail addresses', - col2 => 'Value',}, - {col1 => 'Recipient(s) for notifications', - col2 => 'Value',}, - {col1 => 'Ask helpdesk form settings', - col2 => 'Value',},], + header => [{col1 => 'Setting', + col2 => 'Value',}], print => \&print_contacts, modify => \&modify_contacts, }, @@ -435,12 +417,10 @@ sub handler { modify => \&modify_serverstatuses, }, 'helpsettings' => - {text => 'Support settings', + {text => 'Help page settings', help => 'Domain_Configuration_Help_Settings', - header => [{col1 => 'Help Page Settings (logged-in users)', - col2 => 'Value'}, - {col1 => 'Helpdesk Roles', - col2 => 'Settings'},], + header => [{col1 => 'Help Settings (logged-in users)', + col2 => 'Value'}], print => \&print_helpsettings, modify => \&modify_helpsettings, }, @@ -466,6 +446,14 @@ sub handler { print => \&print_selfenrollment, modify => \&modify_selfenrollment, }, + 'privacy' => + {text => 'User Privacy', + help => 'Domain_Configuration_User_Privacy', + header => [{col1 => 'Setting', + col2 => 'Value',}], + print => \&print_privacy, + modify => \&modify_privacy, + }, 'usersessions' => {text => 'User session hosting/offloading', help => 'Domain_Configuration_User_Sessions', @@ -489,14 +477,50 @@ sub handler { print => \&print_loadbalancing, modify => \&modify_loadbalancing, }, - 'ltitools' => + 'ltitools' => {text => 'External Tools (LTI)', - help => 'Domain_Configuration_LTI_Tools', + help => 'Domain_configuration_LTI_Tools', header => [{col1 => 'Setting', col2 => 'Value',}], print => \&print_ltitools, modify => \&modify_ltitools, }, + 'ssl' => + {text => 'LON-CAPA Network (SSL)', + help => 'Domain_Configuration_Network_SSL', + header => [{col1 => 'Server', + col2 => 'Certificate Status'}, + {col1 => 'Connections to other servers', + col2 => 'Rules'}, + {col1 => "Replicating domain's published content", + col2 => 'Rules'}], + print => \&print_ssl, + modify => \&modify_ssl, + }, + 'trust' => + {text => 'Trust Settings', + help => 'Domain_Configuration_Trust', + header => [{col1 => "Access to this domain's content by others", + col2 => 'Rules'}, + {col1 => "Access to other domain's content by this domain", + col2 => 'Rules'}, + {col1 => "Enrollment in this domain's courses by others", + col2 => 'Rules',}, + {col1 => "Co-author roles in this domain for others", + col2 => 'Rules',}, + {col1 => "Co-author roles for this domain's users elsewhere", + col2 => 'Rules',}, + {col1 => "Domain roles in this domain assignable to others", + col2 => 'Rules'}, + {col1 => "Course catalog for this domain displayed elsewhere", + col2 => 'Rules'}, + {col1 => "Requests for creation of courses in this domain by others", + col2 => 'Rules'}, + {col1 => "Users in other domains can send messages to this domain", + col2 => 'Rules'},], + print => \&print_trust, + modify => \&modify_trust, + }, ); if (keys(%servers) > 1) { $prefs{'login'} = { text => 'Log-in page options', @@ -550,9 +574,6 @@ $javascript_validations $coursebrowserjs END } - if (grep(/^contacts$/,@actions)) { - $js .= &contacts_javascript(); - } &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); } else { # check if domconfig user exists for the domain. @@ -642,7 +663,7 @@ sub process_changes { } elsif ($action eq 'autocreate') { $output = &modify_autocreate($dom,%domconfig); } elsif ($action eq 'directorysrch') { - $output = &modify_directorysrch($dom,$lastactref,%domconfig); + $output = &modify_directorysrch($dom,%domconfig); } elsif ($action eq 'usercreation') { $output = &modify_usercreation($dom,%domconfig); } elsif ($action eq 'selfcreation') { @@ -664,7 +685,7 @@ sub process_changes { } elsif ($action eq 'requestauthor') { $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); } elsif ($action eq 'helpsettings') { - $output = &modify_helpsettings($r,$dom,$confname,$lastactref,%domconfig); + $output = &modify_helpsettings($r,$dom,$confname,%domconfig); } elsif ($action eq 'coursedefaults') { $output = &modify_coursedefaults($dom,$lastactref,%domconfig); } elsif ($action eq 'selfenrollment') { @@ -675,6 +696,10 @@ sub process_changes { $output = &modify_loadbalancing($dom,%domconfig); } elsif ($action eq 'ltitools') { $output = &modify_ltitools($r,$dom,$action,$lastactref,%domconfig); + } elsif ($action eq 'ssl') { + $output = &modify_ssl($dom,$lastactref,%domconfig); + } elsif ($action eq 'trust') { + $output = &modify_trust($dom,$lastactref,%domconfig); } return $output; } @@ -687,24 +712,6 @@ sub print_config_box { $output = &coursecategories_javascript($settings); } elsif ($action eq 'defaults') { $output = &defaults_javascript($settings); - } elsif ($action eq 'helpsettings') { - my (%privs,%levelscurrent); - my %full=(); - my %levels=( - course => {}, - domain => {}, - system => {}, - ); - my $context = 'domain'; - my $crstype = 'Course'; - my $formname = 'display'; - &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - $output = - &Apache::lonuserutils::custom_roledefs_js($context,$crstype,$formname,\%full, - \@templateroles); - } elsif ($action eq 'ltitools') { - $output .= <itools_javascript($settings); } $output .= ' @@ -740,8 +747,8 @@ sub print_config_box { $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || ($action eq 'usermodification') || ($action eq 'defaults') || ($action eq 'coursedefaults') || - ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'directorysrch') || - ($action eq 'helpsettings') || ($action eq 'contacts')) { + ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'ssl') || + ($action eq 'directorysrch') || ($action eq 'trust')) { $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal); @@ -771,15 +778,46 @@ sub print_config_box { $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || ($action eq 'selfenrollment') || - ($action eq 'usersessions') || ($action eq 'coursecategories') || - ($action eq 'contacts') || ($action eq 'defaults')) { + ($action eq 'usersessions') || ($action eq 'coursecategories') || + ($action eq 'ssl') || ($action eq 'trust')) { if ($action eq 'coursecategories') { $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal); $colspan = ' colspan="2"'; + } elsif ($action eq 'trust') { + $output .= $item->{'print'}->('shared',$dom,$settings,\$rowtotal); } else { $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal); } - $output .= ' + if ($action eq 'trust') { + $output .= ' +
+ + '; + my @trusthdrs = qw(2 3 4 5 6 7); + my @prefixes = qw(enroll othcoau coaurem domroles catalog reqcrs); + for (my $i=0; $i<@trusthdrs; $i++) { + $output .= ' + + + + + + '. + $item->{'print'}->($prefixes[$i],$dom,$settings,\$rowtotal).' +
'.&mt($item->{'header'}->[$trusthdrs[$i]]->{'col1'}).''.&mt($item->{'header'}->[$trusthdrs[$i]]->{'col2'}).'
+ + '; + } + $output .= ' + + + + + + '. + $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); + } else { + $output .= '
'.&mt($item->{'header'}->[8]->{'col1'}).''.&mt($item->{'header'}->[8]->{'col2'}).'
@@ -790,15 +828,15 @@ sub print_config_box { '.&mt($item->{'header'}->[2]->{'col1'}).' '.&mt($item->{'header'}->[2]->{'col2'}).' '."\n"; - if ($action eq 'coursecategories') { - $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); - } else { - $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); + if ($action eq 'coursecategories') { + $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); + } else { + $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); + } } $rowtotal ++; } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') || - ($action eq 'defaults') || ($action eq 'directorysrch') || - ($action eq 'helpsettings')) { + ($action eq 'defaults') || ($action eq 'directorysrch')) { $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'login') { if ($numheaders == 4) { @@ -956,11 +994,13 @@ sub print_config_box { if ($action eq 'quotas') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || - ($action eq 'serverstatuses') || ($action eq 'loadbalancing') || - ($action eq 'ltitools')) { + ($action eq 'contacts') || ($action eq 'serverstatuses') || + ($action eq 'loadbalancing') || ($action eq 'ltitools')) { $output .= $item->{'print'}->($dom,$settings,\$rowtotal); } elsif ($action eq 'scantron') { $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'helpsettings') { + $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal); } } $output .= ' @@ -1761,7 +1801,7 @@ sub print_quotas { my $typecount = 0; my ($css_class,%titles); if ($context eq 'requestcourses') { - @usertools = ('official','unofficial','community','textbook'); + @usertools = ('official','unofficial','community','textbook','placement'); @options =('norequest','approval','validate','autolimit'); %validations = &Apache::lonnet::auto_courserequest_checks($dom); %titles = &courserequest_titles(); @@ -2213,7 +2253,7 @@ sub print_studentcode { my ($settings,$rowtotal) = @_; my $rownum = 0; my ($output,%current); - my @crstypes = ('official','unofficial','community','textbook'); + my @crstypes = ('official','unofficial','community','textbook','placement'); if (ref($settings) eq 'HASH') { if (ref($settings->{'uniquecode'}) eq 'HASH') { foreach my $type (@crstypes) { @@ -2309,8 +2349,7 @@ sub print_textbookcourses { (' 'x2). ''.&mt('Thumbnail:'); if ($image) { - $datatable .= ''. - $imgsrc. + $datatable .= $imgsrc. ' '. ' '.&mt('Replace:').' '; @@ -2466,10 +2505,7 @@ ENDSCRIPT sub ltitools_javascript { my ($settings) = @_; - my $togglejs = <itools_toggle_js(); - unless (ref($settings) eq 'HASH') { - return $togglejs; - } + return unless(ref($settings) eq 'HASH'); my (%ordered,$total,%jstext); $total = 0; foreach my $item (keys(%{$settings})) { @@ -2487,7 +2523,7 @@ sub ltitools_javascript { return <<"ENDSCRIPT"; -$togglejs - -ENDSCRIPT -} - -sub ltitools_toggle_js { - return <<"ENDSCRIPT"; - - ENDSCRIPT } @@ -2922,636 +2927,118 @@ sub print_directorysrch { } sub print_contacts { - my ($position,$dom,$settings,$rowtotal) = @_; + my ($dom,$settings,$rowtotal) = @_; my $datatable; my @contacts = ('adminemail','supportemail'); - my (%checked,%to,%otheremails,%bccemails,%includestr,%includeloc,%currfield, - $maxsize,$fields,$fieldtitles,$fieldoptions,$possoptions,@mailings); - if ($position eq 'top') { - if (ref($settings) eq 'HASH') { - foreach my $item (@contacts) { - if (exists($settings->{$item})) { - $to{$item} = $settings->{$item}; - } - } - } - } elsif ($position eq 'middle') { - @mailings = ('errormail','packagesmail','lonstatusmail','requestsmail', - 'updatesmail','idconflictsmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - } else { - @mailings = ('helpdeskmail','otherdomsmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - $bccemails{'helpdeskmail'} = ''; - $bccemails{'otherdomsmail'} = ''; - $includestr{'helpdeskmail'} = ''; - $includestr{'otherdomsmail'} = ''; - ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields(); + my (%checked,%to,%otheremails,%bccemails); + my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail', + 'requestsmail','updatesmail','idconflictsmail'); + foreach my $type (@mailings) { + $otheremails{$type} = ''; } + $bccemails{'helpdeskmail'} = ''; if (ref($settings) eq 'HASH') { - unless ($position eq 'top') { - foreach my $type (@mailings) { - if (exists($settings->{$type})) { - if (ref($settings->{$type}) eq 'HASH') { - foreach my $item (@contacts) { - if ($settings->{$type}{$item}) { - $checked{$type}{$item} = ' checked="checked" '; - } - } - $otheremails{$type} = $settings->{$type}{'others'}; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - } - } elsif ($type eq 'lonstatusmail') { - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - } + foreach my $item (@contacts) { + if (exists($settings->{$item})) { + $to{$item} = $settings->{$item}; } } - if ($position eq 'bottom') { - foreach my $type (@mailings) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - if (ref($settings->{'helpform'}) eq 'HASH') { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = $settings->{'helpform'}{$field}; + foreach my $type (@mailings) { + if (exists($settings->{$type})) { + if (ref($settings->{$type}) eq 'HASH') { + foreach my $item (@contacts) { + if ($settings->{$type}{$item}) { + $checked{$type}{$item} = ' checked="checked" '; + } } - } - if (exists($settings->{'helpform'}{'maxsize'})) { - $maxsize = $settings->{'helpform'}{'maxsize'}; - } else { - $maxsize = '1.0'; - } - } else { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; + $otheremails{$type} = $settings->{$type}{'others'}; + if ($type eq 'helpdeskmail') { + $bccemails{$type} = $settings->{$type}{'bcc'}; } } - $maxsize = '1.0'; + } elsif ($type eq 'lonstatusmail') { + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; } } } else { - if ($position eq 'top') { - $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; - $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; - $checked{'errormail'}{'adminemail'} = ' checked="checked" '; - $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; - $checked{'updatesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" '; - } elsif ($position eq 'bottom') { - $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; - $checked{'otherdomsmail'}{'supportemail'} = ' checked="checked" '; - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; - } - } - $maxsize = '1.0'; - } + $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; + $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; + $checked{'errormail'}{'adminemail'} = ' checked="checked" '; + $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; + $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; + $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; + $checked{'updatesmail'}{'adminemail'} = ' checked="checked" '; + $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" '; } my ($titles,$short_titles) = &contact_titles(); my $rownum = 0; my $css_class; - if ($position eq 'top') { - foreach my $item (@contacts) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$titles->{$item}. - ''. - ''; - $rownum ++; - } - } else { - foreach my $type (@mailings) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - $titles->{$type}.': '. - ''; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $datatable .= '
'.&mt('E-mail recipient(s)').''; - } - $datatable .= ''; - foreach my $item (@contacts) { - $datatable .= ' '; - } - $datatable .= '
'.&mt('Others').':  '. - ''; - my %locchecked; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - foreach my $loc ('s','b') { - if ($includeloc{$type} eq $loc) { - $locchecked{$loc} = ' checked="checked"'; - last; - } - } - $datatable .= '
'.&mt('Bcc:').(' 'x6). - '
'. - '
'.&mt('Optional added text').''. - &mt('Text automatically added to e-mail:').' '. - '
'. - ''.&mt('Location:').' '. - ''. - (' 'x2). - ''. - '
'; - } - $datatable .= ''."\n"; - $rownum ++; - } + foreach my $item (@contacts) { + $css_class = $rownum%2?' class="LC_odd_row"':''; + $datatable .= ''. + ''.$titles->{$item}. + ''. + ''; + $rownum ++; } - if ($position eq 'middle') { - my %choices; - $choices{'reporterrors'} = &mt('E-mail error reports to [_1]', - &Apache::loncommon::modal_link('http://loncapa.org/core.html', - &mt('LON-CAPA core group - MSU'),600,500)); - $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]', - &Apache::loncommon::modal_link('http://loncapa.org/core.html', - &mt('LON-CAPA core group - MSU'),600,500)); - my @toggles = ('reporterrors','reportupdates'); - my %defaultchecked = ('reporterrors' => 'on', - 'reportupdates' => 'on'); - (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$rownum); - $datatable .= $reports; - } elsif ($position eq 'bottom') { + foreach my $type (@mailings) { $css_class = $rownum%2?' class="LC_odd_row"':''; $datatable .= ''. - ''.&mt('Extra helpdesk form fields:').'
'. - &mt('(e-mail, subject, and description always shown)'). - ''; - if ((ref($fields) eq 'ARRAY') && (ref($fieldtitles) eq 'HASH') && - (ref($fieldoptions) eq 'HASH') && (ref($possoptions) eq 'HASH')) { - $datatable .= ''; - foreach my $field (@{$fields}) { - $datatable .= ''. - ''; - } - $datatable .= '
'.&mt('Field').''.&mt('Status').'
'.$fieldtitles->{$field}; - if (($field eq 'screenshot') || ($field eq 'cc')) { - $datatable .= ' '.&mt('(logged-in users)'); - } - $datatable .=''; - my $clickaction; - if ($field eq 'screenshot') { - $clickaction = ' onclick="screenshotSize(this);"'; - } - if (ref($possoptions->{$field}) eq 'ARRAY') { - foreach my $option (@{$possoptions->{$field}}) { - my $checked; - if ($currfield{$field} eq $option) { - $checked = ' checked="checked"'; - } - $datatable .= ''.(' 'x2); - } - } - if ($field eq 'screenshot') { - my $display; - if ($currfield{$field} eq 'no') { - $display = ' style="display:none"'; - } - $datatable .= '
'.&mt('Maximum size for upload (MB)').''. - ''; - } - $datatable .= '
'; + ''. + $titles->{$type}.': '. + ''. + ''; + foreach my $item (@contacts) { + $datatable .= ' '; + } + $datatable .= '
'.&mt('Others').':  '. + ''; + if ($type eq 'helpdeskmail') { + $datatable .= '
'.&mt('Bcc:').(' 'x6). + ''; } $datatable .= ''."\n"; $rownum ++; } + my %choices; + $choices{'reporterrors'} = &mt('E-mail error reports to [_1]', + &Apache::loncommon::modal_link('http://loncapa.org/core.html', + &mt('LON-CAPA core group - MSU'),600,500)); + $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]', + &Apache::loncommon::modal_link('http://loncapa.org/core.html', + &mt('LON-CAPA core group - MSU'),600,500)); + my @toggles = ('reporterrors','reportupdates'); + my %defaultchecked = ('reporterrors' => 'on', + 'reportupdates' => 'on'); + (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, + \%choices,$rownum); + $datatable .= $reports; $$rowtotal += $rownum; return $datatable; } -sub contacts_javascript { - return <<"ENDSCRIPT"; - - - -ENDSCRIPT -} - sub print_helpsettings { - my ($position,$dom,$settings,$rowtotal) = @_; - my $confname = $dom.'-domainconfig'; - my $formname = 'display'; + my ($dom,$confname,$settings,$rowtotal) = @_; my ($datatable,$itemcount); - if ($position eq 'top') { - $itemcount = 1; - my (%choices,%defaultchecked,@toggles); - $choices{'submitbugs'} = &mt('Display link to: [_1]?', - &Apache::loncommon::modal_link('http://bugs.loncapa.org', - &mt('LON-CAPA bug tracker'),600,500)); - %defaultchecked = ('submitbugs' => 'on'); - @toggles = ('submitbugs'); - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount); - $$rowtotal ++; - } else { - my $css_class; - my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_'); - my (%customroles,%ordered,%current); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'adhoc'}) eq 'HASH') { - %current = %{$settings->{'adhoc'}}; - } - } - my $count = 0; - foreach my $key (sort(keys(%existing))) { - if ($key=~/^rolesdef\_(\w+)$/) { - my $rolename = $1; - my (%privs,$order); - ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key}); - $customroles{$rolename} = \%privs; - if (ref($current{$rolename}) eq 'HASH') { - $order = $current{$rolename}{'order'}; - } - if ($order eq '') { - $order = $count; - } - $ordered{$order} = $rolename; - $count++; - } - } - my $maxnum = scalar(keys(%ordered)); - my @roles_by_num = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@roles_by_num,$item); - } - my $context = 'domprefs'; - my $crstype = 'Course'; - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my @accesstypes = ('all','dh','da','none'); - my ($numstatustypes,@jsarray); - if (ref($types) eq 'ARRAY') { - if (@{$types} > 0) { - $numstatustypes = scalar(@{$types}); - push(@accesstypes,'status'); - @jsarray = ('bystatus'); - } - } - my %domhelpdesk = &Apache::lonnet::get_active_domroles($dom,['dh','da']); - if (keys(%domhelpdesk)) { - push(@accesstypes,('inc','exc')); - push(@jsarray,('notinc','notexc')); - } - my $hiddenstr = join("','",@jsarray); - $datatable .= &helpsettings_javascript(\@roles_by_num,$maxnum,$hiddenstr,$formname); - my $context = 'domprefs'; - my $crstype = 'Course'; - my $prefix = 'helproles_'; - my $add_class = 'LC_hidden'; - foreach my $num (@roles_by_num) { - my $role = $ordered{$num}; - my ($desc,$access,@statuses); - if (ref($current{$role}) eq 'HASH') { - $desc = $current{$role}{'desc'}; - $access = $current{$role}{'access'}; - if (ref($current{$role}{'insttypes'}) eq 'ARRAY') { - @statuses = @{$current{$role}{'insttypes'}}; - } - } - if ($desc eq '') { - $desc = $role; - } - my $identifier = 'custhelp'.$num; - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - my %levelscurrent=( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$num."_pos'".');"'; - $datatable .= ''.$role.'
'. - ''.(' 'x2). - ''. - ''. - '
'.&mt('Role name').''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$num,$add_class,$current{$role},\@accesstypes, - $othertitle,$usertypes,$types,\%domhelpdesk). - '
'. - ''.&mt('Role privileges').&adhocbutton($prefix,$num,'privs','show').''. - &Apache::lonuserutils::custom_role_table($crstype,\%full,\%levels, - \%levelscurrent,$identifier, - 'LC_hidden',$prefix.$num.'_privs'). - '
'; - $itemcount ++; - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $newcust = 'custhelp'.$count; - my (%privs,%levelscurrent); - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$count."_pos'".');"'; - $datatable .= ''. - '
'.&mt('Role name').''. - ''. - &mt('Internal name:'). - ''. - ''.(' 'x4). - ''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$count,'',undef,\@accesstypes,$othertitle, - $usertypes,$types,\%domhelpdesk). - '
'.&mt('Role privileges').''. - &Apache::lonuserutils::custom_role_header($context,$crstype, - \@templateroles,$newcust). - &Apache::lonuserutils::custom_role_table('Course',\%full,\%levels, - \%levelscurrent,$newcust). - '
'; - $count ++; - $$rowtotal += $count; - } - return $datatable; -} - -sub adhocbutton { - my ($prefix,$num,$field,$visibility) = @_; - my %lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - return ''.(' 'x10). - ''.(' 'x2).''.(' 'x2); -} - -sub helpsettings_javascript { - my ($roles_by_num,$total,$hiddenstr,$formname) = @_; - return unless(ref($roles_by_num) eq 'ARRAY'); - my %html_js_lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - &html_escape(\%html_js_lt); - my $jstext = ' var helproles = Array('."'".join("','",@{$roles_by_num})."'".');'."\n"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub helpdeskroles_access { - my ($dom,$prefix,$num,$add_class,$current,$accesstypes,$othertitle, - $usertypes,$types,$domhelpdesk) = @_; - return unless ((ref($accesstypes) eq 'ARRAY') && (ref($domhelpdesk) eq 'HASH')); - my %lt = &Apache::lonlocal::texthash( - 'rou' => 'Role usage', - 'whi' => 'Which helpdesk personnel may use this role?', - 'all' => 'All with domain helpdesk or helpdesk assistant role', - 'dh' => 'All with domain helpdesk role', - 'da' => 'All with domain helpdesk assistant role', - 'none' => 'None', - 'status' => 'Determined based on institutional status', - 'inc' => 'Include all, but exclude specific personnel', - 'exc' => 'Exclude all, but include specific personnel', - ); - my %usecheck = ( - all => ' checked="checked"', - ); - my %displaydiv = ( - status => 'none', - inc => 'none', - exc => 'none', - priv => 'block', - ); - my $output; - if (ref($current) eq 'HASH') { - if (($current->{'access'} ne '') && ($current->{'access'} ne 'all')) { - if (grep(/^\Q$current->{access}\E$/,@{$accesstypes})) { - $usecheck{$current->{access}} = $usecheck{'all'}; - delete($usecheck{'all'}); - if ($current->{access} =~ /^(status|inc|exc)$/) { - my $access = $1; - $displaydiv{$access} = 'inline'; - } elsif ($current->{access} eq 'none') { - $displaydiv{'priv'} = 'none'; - } - } - } - } - $output = '
'.$lt{'rou'}.''. - '

'.$lt{'whi'}.'

'; - foreach my $access (@{$accesstypes}) { - $output .= '

'; - if ($access eq 'status') { - $output .= '

'. - &Apache::lonuserutils::adhoc_status_types($dom,$prefix,$num,$current->{$access}, - $othertitle,$usertypes,$types). - '
'; - } elsif (($access eq 'inc') && (keys(%{$domhelpdesk}) > 0)) { - $output .= '
'. - &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk). - '
'; - } elsif (($access eq 'exc') && (keys(%{$domhelpdesk}) > 0)) { - $output .= '
'. - &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk). - '
'; - } - $output .= '

'; - } - $output .= '
'; - return $output; + ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, + \%choices,$itemcount); + return $datatable; } sub radiobutton_prefs { @@ -3596,7 +3083,7 @@ sub radiobutton_prefs { } else { $datatable .= ''; } - $datatable .= + $datatable .= ''. ''. (' 'x2); } - $datatable .= '
'. - '
'.$lt{'linktext'}.'
'. - '
'. - '
'.$lt{'explanation'}.'
'. - '
'. - '
'; - $datatable .= ''.$lt{'icon'}.': '; + $datatable .= '
'; + foreach my $extra ('passback','roster') { + my $checkedon = ''; + my $checkedoff = ' checked="checked"'; + if ($settings->{$item}->{$extra}) { + $checkedon = $checkedoff; + $checkedoff = ''; + } + $datatable .= $lt{$extra}.' '. + ''.(' 'x2). + ''.(' 'x4); + } + $datatable .= '

'.$lt{'icon'}.': '; if ($imgsrc) { $datatable .= $imgsrc. ''; - my (%checkedfields,%rolemaps,$userincdom); + my (%checkedfields,%rolemaps); if (ref($settings->{$item}) eq 'HASH') { if (ref($settings->{$item}->{'fields'}) eq 'HASH') { %checkedfields = %{$settings->{$item}->{'fields'}}; } - $userincdom = $settings->{$item}->{'incdom'}; if (ref($settings->{$item}->{'roles'}) eq 'HASH') { %rolemaps = %{$settings->{$item}->{'roles'}}; $checkedfields{'roles'} = 1; @@ -3764,47 +3240,23 @@ sub print_ltitools { } $datatable .= '
'.&mt('User data sent on launch').''. ''; - my $userfieldstyle = 'display:none;'; - my $seluserdom = ''; - my $unseluserdom = ' selected="selected"'; foreach my $field (@fields) { - my ($checked,$onclick,$id,$spacer); + my $checked; if ($checkedfields{$field}) { $checked = ' checked="checked"'; } - if ($field eq 'user') { - $id = ' id="ltitools_user_field_'.$i.'"'; - $onclick = ' onclick="toggleLTITools(this.form,'."'$field','$i'".')"'; - if ($checked) { - $userfieldstyle = 'display:inline-block'; - if ($userincdom) { - $seluserdom = $unseluserdom; - $unseluserdom = ''; - } - } - } else { - $spacer = (' ' x2); - } $datatable .= ''.$spacer; + ''. + $lt{$field}.''.(' ' x2); } - $datatable .= ''; - $datatable .= '
'. - ' : '. - '
'; - $datatable .= '
'. + $datatable .= '
'. '
'.&mt('Role mapping').''; foreach my $role (@courseroles) { my ($selected,$selectnone); if (!$rolemaps{$role}) { $selectnone = ' selected="selected"'; } - $datatable .= ''."\n". + ''.&mt('Add').''."\n". ''. - '
'. + $datatable .= ''. &Apache::lonnet::plaintext($role,'Course').'
'. '
'."\n". ''."\n". ' '."\n". - ''.&mt('Add').''. '
'.&mt('Required settings').''. - ''.$lt{'title'}.': '."\n". + ''.$lt{'title'}.': '."\n". (' 'x2). ''.$lt{'version'}.': '."\n". (' 'x2). ''.$lt{'msgtype'}.': '. - ''.$lt{'sigmethod'}.':'. '
'. - ''.$lt{'url'}.': '."\n". + ''.$lt{'url'}.': '."\n". (' 'x2). ''.$lt{'key'}.': '."\n". (' 'x2). - ''.$lt{'lifetime'}.': '."\n". - (' 'x2). ''.$lt{'secret'}.':'. ' '."\n". '
'. @@ -3901,7 +3348,7 @@ sub print_ltitools { ''.&mt('Display target:'); my %defaultdisp; $defaultdisp{'iframe'} = ' checked="checked"'; - foreach my $disp ('iframe','tab','window') { + foreach my $disp ('iframe','window') { $datatable .= ''.(' 'x2); } @@ -3911,14 +3358,15 @@ sub print_ltitools { ''. (' 'x2); } - $datatable .= '
'. - '
'.$lt{'linktext'}.'
'. - '
'. - '
'.$lt{'explanation'}.'
'. - ''. - '
'. - '
'; - $datatable .= ''.$lt{'icon'}.': '. + $datatable .= '
'; + foreach my $extra ('passback','roster') { + $datatable .= $lt{$extra}.' '. + ''.(' 'x2). + ''.(' 'x4); + } + $datatable .= '

'.$lt{'icon'}.': '. '('.&mt('if larger than 21x21 pixels, image will be scaled').') '; if ($switchserver) { $datatable .= &mt('Upload to library server: [_1]',$switchserver); @@ -3929,26 +3377,12 @@ sub print_ltitools { '
'.&mt('User data sent on launch').''. ''; foreach my $field (@fields) { - my ($id,$onclick,$spacer); - if ($field eq 'user') { - $id = ' id="ltitools_user_field_add"'; - $onclick = ' onclick="toggleLTITools(this.form,'."'$field','add'".')"'; - } else { - $spacer = (' ' x2); - } $datatable .= ''.$spacer; + ''. + $lt{$field}.''.(' ' x2); } - $datatable .= ''. - '
'; - $datatable .= '
'.&mt('Role mapping').''; + $datatable .= ''. + '
'.&mt('Role mapping').'
'; foreach my $role (@courseroles) { my ($checked,$checkednone); $datatable .= '
'. @@ -3962,10 +3396,10 @@ sub print_ltitools { } $datatable .= '
'. '
'.&mt('Configurable in course').''; - foreach my $item ('label','title','target','linktext','explanation','append') { - $datatable .= ''.(' ' x2)."\n"; + foreach my $item ('label','title','target') { + $datatable .= ''.(' ' x2)."\n"; } $datatable .= '
'. '
'.&mt('Custom items sent on launch').''. @@ -3974,7 +3408,7 @@ sub print_ltitools { '
'. '
'."\n". + ''."\n". ''."\n". ''."\n"; $itemcount ++; @@ -3983,36 +3417,29 @@ sub print_ltitools { sub ltitools_names { my %lt = &Apache::lonlocal::texthash( - 'title' => 'Title', - 'version' => 'Version', - 'msgtype' => 'Message Type', - 'sigmethod' => 'Signature Method', - 'url' => 'URL', - 'key' => 'Key', - 'lifetime' => 'Nonce lifetime (s)', - 'secret' => 'Secret', - 'icon' => 'Icon', - 'user' => 'User', - 'fullname' => 'Full Name', - 'firstname' => 'First Name', - 'lastname' => 'Last Name', - 'email' => 'E-mail', - 'roles' => 'Role', - 'window' => 'Window', - 'tab' => 'Tab', - 'iframe' => 'iFrame', - 'height' => 'Height', - 'width' => 'Width', - 'linktext' => 'Default Link Text', - 'explanation' => 'Default Explanation', - 'crstarget' => 'Display target', - 'crslabel' => 'Course label', - 'crstitle' => 'Course title', - 'crslinktext' => 'Link Text', - 'crsexplanation' => 'Explanation', - 'crsappend' => 'Provider URL', + 'title' => 'Title', + 'version' => 'Version', + 'msgtype' => 'Message Type', + 'url' => 'URL', + 'key' => 'Key', + 'secret' => 'Secret', + 'icon' => 'Icon', + 'user' => 'Username:domain', + 'fullname' => 'Full Name', + 'firstname' => 'First Name', + 'lastname' => 'Last Name', + 'email' => 'E-mail', + 'roles' => 'Role', + 'window' => 'Window/Tab', + 'iframe' => 'iFrame', + 'height' => 'Height', + 'width' => 'Width', + 'passback' => 'Tool can return grades:', + 'roster' => 'Tool can retrieve roster:', + 'crstarget' => 'Display target', + 'crslabel' => 'Course label', + 'crstitle' => 'Course title', ); - return %lt; } @@ -4021,6 +3448,7 @@ sub print_coursedefaults { my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked,@toggles); my $itemcount = 1; my %choices = &Apache::lonlocal::texthash ( + canuse_pdfforms => 'Course/Community users can create/upload PDF forms', uploadquota => 'Default quota for files uploaded directly to course/community using Course Editor (MB)', anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys', coursecredits => 'Credits can be specified for courses', @@ -4038,11 +3466,12 @@ sub print_coursedefaults { ); if ($position eq 'top') { %defaultchecked = ( + 'canuse_pdfforms' => 'off', 'uselcmath' => 'on', 'usejsme' => 'on', - 'canclone' => 'none', + 'canclone' => 'none', ); - @toggles = ('uselcmath','usejsme'); + @toggles = ('canuse_pdfforms','uselcmath','usejsme'); ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, \%choices,$itemcount); $css_class = $itemcount%2?' class="LC_odd_row"':''; @@ -4079,7 +3508,7 @@ sub print_coursedefaults { $currcanclone = $settings->{'canclone'}; } } - } + } foreach my $option (@cloneoptions) { my ($checked,$additional); if ($currcanclone eq $option) { @@ -4121,7 +3550,7 @@ sub print_coursedefaults { my ($currdefresponder,%defcredits,%curruploadquota,%deftimeout,%currmysql); my $currusecredits = 0; my $postsubmitclient = 1; - my @types = ('official','unofficial','community','textbook'); + my @types = ('official','unofficial','community','textbook','placement'); if (ref($settings) eq 'HASH') { $currdefresponder = $settings->{'anonsurvey_threshold'}; if (ref($settings->{'uploadquota'}) eq 'HASH') { @@ -4148,7 +3577,7 @@ sub print_coursedefaults { foreach my $type (@types) { if (ref($settings->{'postsubmit'}->{'timeout'}) eq 'HASH') { if ($settings->{'postsubmit'}->{'timeout'}->{$type} =~ /^\d+$/) { - $deftimeout{$type} = $settings->{'postsubmit'}->{'timeout'}->{$type}; + $deftimeout{$type} = $settings->{'postsubmit'}->{'timeout'}->{$type}; } else { $deftimeout{$type} = $staticdefaults{'postsubmit'}; } @@ -4264,7 +3693,7 @@ sub print_coursedefaults { foreach my $type (@types) { $datatable .= ''.&mt($type).'
'. ''; + ' value="'.$currmysql{$type}.'" size="5" />'; } $datatable .= ''."\n"; $itemcount ++; @@ -4278,7 +3707,7 @@ sub print_selfenrollment { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable); my $itemcount = 1; - my @types = ('official','unofficial','community','textbook'); + my @types = ('official','unofficial','community','textbook','placement'); if (($position eq 'top') || ($position eq 'middle')) { my ($rowsref,$titlesref) = &Apache::lonuserutils::get_selfenroll_titles(); my %descs = &Apache::lonuserutils::selfenroll_default_descs(); @@ -4501,15 +3930,14 @@ sub print_validation_rows { sub print_usersessions { my ($position,$dom,$settings,$rowtotal) = @_; - my ($css_class,$datatable,%checked,%choices); - my (%by_ip,%by_location,@intdoms); - &build_location_hashes(\@intdoms,\%by_ip,\%by_location); + my ($css_class,$datatable,$itemcount,%checked,%choices); + my (%by_ip,%by_location,@intdoms,@instdoms); + &build_location_hashes(\@intdoms,\%by_ip,\%by_location,\@instdoms); my @alldoms = &Apache::lonnet::all_domains(); my %serverhomes = %Apache::lonnet::serverhomeIDs; my %servers = &Apache::lonnet::internet_dom_servers($dom); my %altids = &id_for_thisdom(%servers); - my $itemcount = 1; if ($position eq 'top') { if (keys(%serverhomes) > 1) { my %spareid = ¤t_offloads_to($dom,$settings,\%servers); @@ -4522,118 +3950,226 @@ sub print_usersessions { $datatable .= &spares_row($dom,\%servers,\%spareid,\%serverhomes,\%altids,$curroffloadnow,$rowtotal); } else { $datatable .= ''. - &mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'); + &mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'). + ''; } } else { - if (keys(%by_location) == 0) { - $datatable .= ''. - &mt('Nothing to set here, as the cluster to which this domain belongs only contains one institution.'); + my %titles = &usersession_titles(); + my ($prefix,@types); + if ($position eq 'bottom') { + $prefix = 'remote'; + @types = ('version','excludedomain','includedomain'); } else { - my %lt = &usersession_titles(); - my $numinrow = 5; - my $prefix; - my @types; - if ($position eq 'bottom') { - $prefix = 'remote'; - @types = ('version','excludedomain','includedomain'); - } else { - $prefix = 'hosted'; - @types = ('excludedomain','includedomain'); - } - my (%current,%checkedon,%checkedoff); - my @lcversions = &Apache::lonnet::all_loncaparevs(); - my @locations = sort(keys(%by_location)); - foreach my $type (@types) { - $checkedon{$type} = ''; - $checkedoff{$type} = ' checked="checked"'; - } - if (ref($settings) eq 'HASH') { - if (ref($settings->{$prefix}) eq 'HASH') { - foreach my $key (keys(%{$settings->{$prefix}})) { - $current{$key} = $settings->{$prefix}{$key}; - if ($key eq 'version') { - if ($current{$key} ne '') { - $checkedon{$key} = ' checked="checked"'; - $checkedoff{$key} = ''; - } - } elsif (ref($current{$key}) eq 'ARRAY') { + $prefix = 'hosted'; + @types = ('excludedomain','includedomain'); + } + ($datatable,$itemcount) = &rules_by_location($settings,$prefix,\%by_location,\%by_ip,\@types,\%titles); + } + $$rowtotal += $itemcount; + return $datatable; +} + +sub rules_by_location { + my ($settings,$prefix,$by_location,$by_ip,$types,$titles) = @_; + my ($datatable,$itemcount,$css_class); + if (keys(%{$by_location}) == 0) { + $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; + $datatable = ''. + &mt('Nothing to set here, as the cluster to which this domain belongs only contains one institution.'). + ''; + $itemcount = 1; + } else { + $itemcount = 0; + my $numinrow = 5; + my (%current,%checkedon,%checkedoff); + my @locations = sort(keys(%{$by_location})); + foreach my $type (@{$types}) { + $checkedon{$type} = ''; + $checkedoff{$type} = ' checked="checked"'; + } + if (ref($settings) eq 'HASH') { + if (ref($settings->{$prefix}) eq 'HASH') { + foreach my $key (keys(%{$settings->{$prefix}})) { + $current{$key} = $settings->{$prefix}{$key}; + if ($key eq 'version') { + if ($current{$key} ne '') { $checkedon{$key} = ' checked="checked"'; $checkedoff{$key} = ''; } + } elsif (ref($current{$key}) eq 'ARRAY') { + $checkedon{$key} = ' checked="checked"'; + $checkedoff{$key} = ''; } } } - foreach my $type (@types) { - next if ($type ne 'version' && !@locations); - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ' - '.$lt{$type}.'
-   -   - '; - if ($type eq 'version') { - my $selector = ''.&mt('Not in use').'  +
'; + if ($type eq 'version') { + my @lcversions = &Apache::lonnet::all_loncaparevs(); + my $selector = ' '; - $datatable .= &mt('remote server must be version: [_1] or later',$selector); - } else { - $datatable.= '
'.(' 'x2). - ''. - "\n". - '
'; - my $rem; - for (my $i=0; $i<@locations; $i++) { - my ($showloc,$value,$checkedtype); - if (ref($by_location{$locations[$i]}) eq 'ARRAY') { - my $ip = $by_location{$locations[$i]}->[0]; - if (ref($by_ip{$ip}) eq 'ARRAY') { - $value = join(':',@{$by_ip{$ip}}); - $showloc = join(', ',@{$by_ip{$ip}}); - if (ref($current{$type}) eq 'ARRAY') { - foreach my $loc (@{$by_ip{$ip}}) { - if (grep(/^\Q$loc\E$/,@{$current{$type}})) { - $checkedtype = ' checked="checked"'; - last; - } + $selector .= ' '; + } + $selector .= ' '; + $datatable .= &mt('remote server must be version: [_1] or later',$selector); + } else { + $datatable.= '
'.(' 'x2). + ''. + "\n". + '
'; + my $rem; + for (my $i=0; $i<@locations; $i++) { + my ($showloc,$value,$checkedtype); + if (ref($by_location->{$locations[$i]}) eq 'ARRAY') { + my $ip = $by_location->{$locations[$i]}->[0]; + if (ref($by_ip->{$ip}) eq 'ARRAY') { + $value = join(':',@{$by_ip->{$ip}}); + $showloc = join(', ',@{$by_ip->{$ip}}); + if (ref($current{$type}) eq 'ARRAY') { + foreach my $loc (@{$by_ip->{$ip}}) { + if (grep(/^\Q$loc\E$/,@{$current{$type}})) { + $checkedtype = ' checked="checked"'; + last; } } } } - $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $datatable .= ''; - } - $datatable .= ''; - } - $datatable .= ''; } - $rem = @locations%($numinrow); - my $colsleft = $numinrow - $rem; - if ($colsleft > 1 ) { - $datatable .= ''; - } elsif ($colsleft == 1) { - $datatable .= ''; + $rem = $i%($numinrow); + if ($rem == 0) { + if ($i > 0) { + $datatable .= ''; + } + $datatable .= ''; + } + $datatable .= ''; + } + $rem = @locations%($numinrow); + my $colsleft = $numinrow - $rem; + if ($colsleft > 1 ) { + $datatable .= ''; + } elsif ($colsleft == 1) { + $datatable .= ''; + } + $datatable .= '
'. - ''. - '  
'. + ''. + '  
'; + } + $datatable .= ''; + $itemcount ++; + } + } + return ($datatable,$itemcount); +} + +sub print_ssl { + my ($position,$dom,$settings,$rowtotal) = @_; + my ($css_class,$datatable); + my $itemcount = 1; + if ($position eq 'top') { + my $primary_id = &Apache::lonnet::domain($dom,'primary'); + my $intdom = &Apache::lonnet::internet_dom($primary_id); + my $same_institution; + if ($intdom ne '') { + my $internet_names = &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'}); + if (ref($internet_names) eq 'ARRAY') { + if (grep(/^\Q$intdom\E$/,@{$internet_names})) { + $same_institution = 1; + } + } + } + $css_class = $itemcount%2?' class="LC_odd_row"':''; + $datatable = ''; + if ($same_institution) { + my %domservers = &Apache::lonnet::get_servers($dom); + $datatable .= &LONCAPA::SSL::print_certstatus(\%domservers,'web','domprefs'); + } else { + $datatable .= &mt("You need to be logged into one of your own domain's servers to display information about the status of LON-CAPA SSL certificates."); + } + $datatable .= ''; + $itemcount ++; + } else { + my %titles = &ssl_titles(); + my (%by_ip,%by_location,@intdoms,@instdoms); + &build_location_hashes(\@intdoms,\%by_ip,\%by_location,\@instdoms); + my @alldoms = &Apache::lonnet::all_domains(); + my %serverhomes = %Apache::lonnet::serverhomeIDs; + my @domservers = &Apache::lonnet::get_servers($dom); + my %servers = &Apache::lonnet::internet_dom_servers($dom); + my %altids = &id_for_thisdom(%servers); + if ($position eq 'middle') { + foreach my $type ('dom','intdom','other') { + my %checked; + $css_class = $itemcount%2?' class="LC_odd_row"':''; + $datatable .= ''.$titles{$type}.''. + ''; + my $skip; + if ($type eq 'dom') { + unless (keys(%servers) > 1) { + $datatable .= &mt('Nothing to set here, as there are no other servers/VMs'); + $skip = 1; + } + } + if ($type eq 'intdom') { + unless (@instdoms > 1) { + $datatable .= &mt('Nothing to set here, as there are no other domains for this institution'); + $skip = 1; + } + } elsif ($type eq 'other') { + if (keys(%by_location) == 0) { + $datatable .= &mt('Nothing to set here, as there are no other institutions'); + $skip = 1; + } + } + unless ($skip) { + $checked{'yes'} = ' checked="checked"'; + if (ref($settings) eq 'HASH') { + if (ref($settings->{'connect'}) eq 'HASH') { + if ($settings->{'connect'}->{$type} =~ /^(no|req)$/) { + $checked{$1} = $checked{'yes'}; + delete($checked{'yes'}); + } + } + } + foreach my $option ('no','yes','req') { + $datatable .= ''.(' 'x2); } - $datatable .= ''; } $datatable .= ''; + $itemcount ++; + } + } else { + my $prefix = 'replication'; + my @types = ('certreq','nocertreq'); + if (keys(%by_location) == 0) { + $datatable .= ''. + &mt('Nothing to set here, as there are no other institutions'). + ''; $itemcount ++; + } else { + ($datatable,$itemcount) = + &rules_by_location($settings,$prefix,\%by_location,\%by_ip,\@types,\%titles); } } } @@ -4641,10 +4177,59 @@ sub print_usersessions { return $datatable; } +sub ssl_titles { + return &Apache::lonlocal::texthash ( + dom => 'LON-CAPA servers/VMs from same domain', + intdom => 'LON-CAPA servers/VMs from same "internet" domain', + other => 'External LON-CAPA servers/VMs', + connect => 'Connections to other servers', + replication => 'Replicating content to other institutions', + certreq => 'Client certificate required, but specific domains exempt', + nocertreq => 'No client certificate required, except for specific domains', + no => 'SSL not used', + yes => 'SSL Optional (used if available)', + req => 'SSL Required', + ); +} + +sub print_trust { + my ($prefix,$dom,$settings,$rowtotal) = @_; + my ($css_class,$datatable,%checked,%choices); + my (%by_ip,%by_location,@intdoms,@instdoms); + &build_location_hashes(\@intdoms,\%by_ip,\%by_location,\@instdoms); + my $itemcount = 1; + my %titles = &trust_titles(); + my @types = ('exc','inc'); + if ($prefix eq 'top') { + $prefix = 'content'; + } elsif ($prefix eq 'bottom') { + $prefix = 'msg'; + } + ($datatable,$itemcount) = &rules_by_location($settings,$prefix,\%by_location,\%by_ip,\@types,\%titles); + $$rowtotal += $itemcount; + return $datatable; +} + +sub trust_titles { + return &Apache::lonlocal::texthash( + content => "Access to this domain's content by others", + shared => "Access to other domain's content by this domain", + enroll => "Enrollment in this domain's courses by others", + othcoau => "Co-author roles in this domain for others", + coaurem => "Co-author roles for this domain's users elsewhere", + domroles => "Domain roles in this domain assignable to others", + catalog => "Course Catalog for this domain displayed elsewhere", + reqcrs => "Requests for creation of courses in this domain by others", + msg => "Users in other domains can send messages to this domain", + exc => "Allow all, but exclude specific domains", + inc => "Deny all, but include specific domains", + ); +} + sub build_location_hashes { - my ($intdoms,$by_ip,$by_location) = @_; + my ($intdoms,$by_ip,$by_location,$instdoms) = @_; return unless((ref($intdoms) eq 'ARRAY') && (ref($by_ip) eq 'HASH') && - (ref($by_location) eq 'HASH')); + (ref($by_location) eq 'HASH') && (ref($instdoms) eq 'ARRAY')); my %iphost = &Apache::lonnet::get_iphost(); my $primary_id = &Apache::lonnet::domain($env{'request.role.domain'},'primary'); my $primary_ip = &Apache::lonnet::get_host_ip($primary_id); @@ -4661,7 +4246,13 @@ sub build_location_hashes { foreach my $id (@{$iphost{$ip}}) { my $location = &Apache::lonnet::internet_dom($id); if ($location) { - next if (grep(/^\Q$location\E$/,@{$intdoms})); + if (grep(/^\Q$location\E$/,@{$intdoms})) { + my $dom = &Apache::lonnet::host_domain($id); + unless (grep(/^\Q$dom\E/,@{$instdoms})) { + push(@{$instdoms},$dom); + } + next; + } if (ref($by_ip->{$ip}) eq 'ARRAY') { unless(grep(/^\Q$location\E$/,@{$by_ip->{$ip}})) { push(@{$by_ip->{$ip}},$location); @@ -4801,7 +4392,7 @@ sub spares_row { '. &mt('[_1] when busy, offloads to:' ,''.$server.'').'
'. - ''."\n". + ''."\n". ''. "\n"; @@ -5008,9 +4599,6 @@ sub print_loadbalancing { my ($numspares,@spares) = &count_servers($lonhost,%servers); my @sparestypes = ('primary','default'); my %typetitles = &sparestype_titles(); - my %hostherechecked = ( - no => ' checked="checked"', - ); foreach my $sparetype (@sparestypes) { my $targettable; for (my $i=0; $i<$numspares; $i++) { @@ -5056,23 +4644,6 @@ sub print_loadbalancing { $datatable .= ''.$typetitles{$sparetype}.'
'. ''.$targettable.'

'; } - $hostherechecked{$sparetype} = ''; - if (ref($currtargets{$lonhost}) eq 'HASH') { - if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') { - if (grep(/^\Q$lonhost\E$/,@{$currtargets{$lonhost}{$sparetype}})) { - $hostherechecked{$sparetype} = ' checked="checked"'; - $hostherechecked{'no'} = ''; - } - } - } - } - $datatable .= &mt('Hosting on balancer itself').'
'. - '
'; - foreach my $sparetype (@sparestypes) { - $datatable .= '
'; } $datatable .= '
'. &loadbalancing_rules($dom,$intdom,$currrules{$lonhost}, @@ -5290,15 +4861,14 @@ sub sparestype_titles { sub contact_titles { my %titles = &Apache::lonlocal::texthash ( - 'supportemail' => 'Support E-mail address', - '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', - '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', + 'supportemail' => 'Support E-mail address', + '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 to be e-mailed to', + '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', 'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID', ); my %short_titles = &Apache::lonlocal::texthash ( @@ -5308,34 +4878,6 @@ sub contact_titles { return (\%titles,\%short_titles); } -sub helpform_fields { - my %titles = &Apache::lonlocal::texthash ( - 'username' => 'Name', - 'user' => 'Username/domain', - 'phone' => 'Phone', - 'cc' => 'Cc e-mail', - 'course' => 'Course Details', - 'section' => 'Sections', - 'screenshot' => 'File upload', - ); - my @fields = ('username','phone','user','course','section','cc','screenshot'); - my %possoptions = ( - username => ['yes','no','req'], - phone => ['yes','no','req'], - user => ['yes','no'], - cc => ['yes','no'], - course => ['yes','no'], - section => ['yes','no'], - screenshot => ['yes','no'], - ); - my %fieldoptions = &Apache::lonlocal::texthash ( - 'yes' => 'Optional', - 'req' => 'Required', - 'no' => "Not shown", - ); - return (\@fields,\%titles,\%fieldoptions,\%possoptions); -} - sub tool_titles { my %titles = &Apache::lonlocal::texthash ( aboutme => 'Personal web page', @@ -5346,6 +4888,7 @@ sub tool_titles { unofficial => 'Unofficial courses', community => 'Communities', textbook => 'Textbook courses', + placement => 'Placement tests', ); return %titles; } @@ -5356,6 +4899,7 @@ sub courserequest_titles { unofficial => 'Unofficial', community => 'Communities', textbook => 'Textbook', + placement => 'Placement tests', norequest => 'Not allowed', approval => 'Approval by Dom. Coord.', validate => 'With validation', @@ -5746,7 +5290,7 @@ sub email_as_username { sub captcha_choice { my ($context,$settings,$itemcount) = @_; my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext, - $vertext,$currver); + $vertext,$currver); my %lt = &captcha_phrases(); $keyentry = 'hidden'; if ($context eq 'cancreate') { @@ -5941,10 +5485,7 @@ sub print_usermodification { sub print_defaults { my ($position,$dom,$settings,$rowtotal) = @_; my $rownum = 0; - my ($datatable,$css_class,$titles); - unless ($position eq 'bottom') { - $titles = &defaults_titles($dom); - } + my ($datatable,$css_class); if ($position eq 'top') { my @items = ('auth_def','auth_arg_def','lang_def','timezone_def', 'datelocale_def','portal_def'); @@ -5957,6 +5498,7 @@ sub print_defaults { $defaults{$item} = $domdefaults{$item}; } } + my $titles = &defaults_titles($dom); foreach my $item (@items) { if ($rownum%2) { $css_class = ''; @@ -6004,87 +5546,8 @@ sub print_defaults { $datatable .= ''; $rownum ++; } - } elsif ($position eq 'middle') { - my @items = ('intauth_cost','intauth_check','intauth_switch'); - my %defaults; - if (ref($settings) eq 'HASH') { - %defaults = %{$settings}; - if ($defaults{'intauth_cost'} !~ /^\d+$/) { - $defaults{'intauth_cost'} = 10; - } - if ($defaults{'intauth_check'} !~ /^(0|1|2)$/) { - $defaults{'intauth_check'} = 0; - } - if ($defaults{'intauth_switch'} !~ /^(0|1|2)$/) { - $defaults{'intauth_switch'} = 0; - } - } else { - %defaults = ( - 'intauth_cost' => 10, - 'intauth_check' => 0, - 'intauth_switch' => 0, - ); - } - foreach my $item (@items) { - if ($rownum%2) { - $css_class = ''; - } else { - $css_class = ' class="LC_odd_row" '; - } - $datatable .= ''. - ''.$titles->{$item}. - ''; - if ($item eq 'intauth_switch') { - my @options = (0,1,2); - my %optiondesc = &Apache::lonlocal::texthash ( - 0 => 'No', - 1 => 'Yes', - 2 => 'Yes, and copy existing passwd file to passwd.bak file', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } elsif ($item eq 'intauth_check') { - my @options = (0,1,2); - my %optiondesc = &Apache::lonlocal::texthash ( - 0 => 'No', - 1 => 'Yes, allow login then update passwd file using default cost (if higher)', - 2 => 'Yes, disallow login if stored cost is less than domain default', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - my $onclick; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - if ($option == 2) { - $onclick = ' onclick="javascript:warnIntAuth(this);"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } else { - $datatable .= ''; - } - $datatable .= ''; - $rownum ++; - } } else { - my %defaults; + my (%defaults); if (ref($settings) eq 'HASH') { if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH') && (ref($settings->{'inststatusguest'}) eq 'ARRAY')) { @@ -6179,9 +5642,6 @@ sub defaults_titles { 'timezone_def' => 'Default timezone', 'datelocale_def' => 'Default locale for dates', 'portal_def' => 'Portal/Default URL', - 'intauth_cost' => 'Encryption cost for bcrypt (positive integer)', - 'intauth_check' => 'Check bcrypt cost if authenticated', - 'intauth_switch' => 'Existing crypt-based switched to bcrypt on authentication', ); if ($dom) { my $uprimary_id = &Apache::lonnet::domain($dom,'primary'); @@ -6424,6 +5884,10 @@ sub print_coursecategories { my $toggle_catscomm_dom = ' checked="checked" '; my $can_catcomm_comm = ' '; my $can_catcomm_dom = ' checked="checked" '; + my $toggle_catsplace_place = ' '; + my $toggle_catsplace_dom = ' checked="checked" '; + my $can_catplace_place = ' '; + my $can_catplace_dom = ' checked="checked" '; if (ref($settings) eq 'HASH') { if ($settings->{'togglecats'} eq 'crs') { @@ -6442,17 +5906,28 @@ sub print_coursecategories { $can_catcomm_comm = $can_catcomm_dom; $can_catcomm_dom = ' '; } + if ($settings->{'togglecatsplace'} eq 'place') { + $toggle_catsplace_place = $toggle_catsplace_dom; + $toggle_catsplace_dom = ' '; + } + if ($settings->{'categorizeplace'} eq 'place') { + $can_catplace_place = $can_catplace_dom; + $can_catplace_dom = ' '; + } } my %title = &Apache::lonlocal::texthash ( - togglecats => 'Show/Hide a course in catalog', - togglecatscomm => 'Show/Hide a community in catalog', - categorize => 'Assign a category to a course', - categorizecomm => 'Assign a category to a community', + togglecats => 'Show/Hide a course in catalog', + togglecatscomm => 'Show/Hide a community in catalog', + togglecatsplace => 'Show/Hide a placement test in catalog', + categorize => 'Assign a category to a course', + categorizecomm => 'Assign a category to a community', + categorizeplace => 'Assign a category to a placement test', ); my %level = &Apache::lonlocal::texthash ( - dom => 'Set in Domain', - crs => 'Set in Course', - comm => 'Set in Community', + dom => 'Set in Domain', + crs => 'Set in Course', + comm => 'Set in Community', + place => 'Set in Placement Test', ); $datatable = ''. ''.$title{'togglecats'}.''. @@ -6482,8 +5957,22 @@ sub print_coursecategories { $can_catcomm_dom.' value="dom" />'.$level{'dom'}.' '. '
'. + ''. + ''.$title{'togglecatsplace'}.''. + ' '. + ''. + ''. + ''.$title{'categorizeplace'}.''. + ''. + ' '. + ''. ''; - $$rowtotal += 4; + $$rowtotal += 6; } else { my $css_class; my $itemcount = 1; @@ -6508,12 +5997,15 @@ sub print_coursecategories { my %default_names = ( instcode => &mt('Official courses'), communities => &mt('Communities'), + placement => &mt('Placement Tests'), ); if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '') || (!grep(/^communities$/,@{$cats[0]})) || - ($cathash->{'communities::0'} eq '')) { + ($cathash->{'communities::0'} eq '') || + (!grep(/^placement$/,@{$cats[0]})) || + ($cathash->{'placement::0'} eq '')) { $maxnum ++; } my $lastidx; @@ -6534,7 +6026,7 @@ sub print_coursecategories { $datatable .= ''; } $datatable .= ''; - if ($parent eq 'instcode' || $parent eq 'communities') { + if ($parent eq 'instcode' || $parent eq 'communities' || $parent eq 'placement') { $datatable .= '' .$default_names{$parent}.''; if ($parent eq 'instcode') { @@ -6557,7 +6049,7 @@ sub print_coursecategories { $datatable .= ''; - if ($parent eq 'communities') { + if (($parent eq 'communities') || ($parent eq 'placement')) { $datatable .= ''; } $datatable .= ''; @@ -6589,7 +6081,7 @@ sub print_coursecategories { .'' .''."\n"; $itemcount ++; - foreach my $default ('instcode','communities') { + foreach my $default ('instcode','communities','placement') { if ((!grep(/^\Q$default\E$/,@{$cats[0]})) || ($cathash->{$default.'::0'} eq '')) { $css_class = $itemcount%2?' class="LC_odd_row"':''; my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$default"."_pos','$lastidx'".');"'; @@ -6678,42 +6170,14 @@ sub print_serverstatuses { sub serverstatus_pages { return ('userstatus','lonstatus','loncron','server-status','codeversions', - 'checksums','clusterstatus','metadata_keywords','metadata_harvest', - 'takeoffline','takeonline','showenv','toggledebug','ping','domconf', - 'uniquecodes','diskusage','coursecatalog'); + 'checksums','clusterstatus','certstatus','metadata_keywords', + 'metadata_harvest','takeoffline','takeonline','showenv','toggledebug', + 'ping','domconf','uniquecodes','diskusage','coursecatalog'); } sub defaults_javascript { my ($settings) = @_; - my $intauthcheck = &mt('Warning: disallowing login for an authenticated user if the stored cost is less than the default will require a password reset by/for the user.'); - my $intauthcost = &mt('Warning: bcrypt encryption cost for internal authentication must be an integer.'); - &js_escape(\$intauthcheck); - &js_escape(\$intauthcost); - my $intauthjs = <<"ENDSCRIPT"; - -function warnIntAuth(field) { - if (field.name == 'intauth_check') { - if (field.value == '2') { - alert('$intauthcheck'); - } - } - if (field.name == 'intauth_cost') { - field.value.replace(/\s/g,''); - if (field.value != '') { - var regexdigit=/^\\d+\$/; - if (!regexdigit.test(field.value)) { - alert('$intauthcost'); - } - } - } - return; -} - -ENDSCRIPT - - if (ref($settings) ne 'HASH') { - return &Apache::lonhtmlcommon::scripttag($intauthjs); - } + return unless (ref($settings) eq 'HASH'); if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) { my $maxnum = scalar(@{$settings->{'inststatusorder'}}); if ($maxnum eq '') { @@ -6767,14 +6231,10 @@ $jstext return; } -$intauthjs - // ]]> ENDSCRIPT - } else { - return &Apache::lonhtmlcommon::scripttag($intauthjs); } } @@ -6802,9 +6262,11 @@ sub coursecategories_javascript { } my $instcode_reserved = &mt('The name: [_1] is a reserved category.','"instcode"'); my $communities_reserved = &mt('The name: [_1] is a reserved category.','"communities"'); + my $placement_reserved = &mt('The name: [_1] is a reserved category.','"placement"'); my $choose_again = "\n".&mt('Please use a different name for the new top level category.'); &js_escape(\$instcode_reserved); &js_escape(\$communities_reserved); + &js_escape(\$placement_reserved); &js_escape(\$choose_again); $output = <<"ENDSCRIPT";