--- loncom/interface/domainprefs.pm 2024/05/01 15:18:58 1.440 +++ loncom/interface/domainprefs.pm 2025/03/13 14:28:53 1.451 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.440 2024/05/01 15:18:58 raeburn Exp $ +# $Id: domainprefs.pm,v 1.451 2025/03/13 14:28:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -472,6 +472,8 @@ sub handler { header => [{col1 => 'Target user has role', col2 => 'User information updatable in author context'}, {col1 => 'Target user has role', + col2 => 'User information updatable by co-author manager'}, + {col1 => 'Target user has role', col2 => 'User information updatable in course context'}], print => \&print_usermodification, modify => \&modify_usermodification, @@ -1031,7 +1033,7 @@ sub print_config_box { ($action eq 'usersessions') || ($action eq 'coursecategories') || ($action eq 'trust') || ($action eq 'contacts') || ($action eq 'defaults') || ($action eq 'privacy') || ($action eq 'passwords') || ($action eq 'lti') || - ($action eq 'ltitools')) { + ($action eq 'ltitools') || ($action eq 'usermodification')) { if ($action eq 'coursecategories') { $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal); $colspan = ' colspan="2"'; @@ -1135,9 +1137,9 @@ sub print_config_box { } } $rowtotal ++; - } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') || + } elsif (($action eq 'coursedefaults') || ($action eq 'authordefaults') || ($action eq 'directorysrch') || ($action eq 'helpsettings') || - ($action eq 'wafproxy') || ($action eq 'authordefaults')) { + ($action eq 'wafproxy')) { $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'scantron') { $output .= $item->{'print'}->($r,'bottom',$dom,$confname,$settings,\$rowtotal); @@ -2007,10 +2009,11 @@ sub commblocktype_text { 'passwd' => 'Change Password', 'grades' => 'Gradebook', 'search' => 'Course search', + 'index' => 'Course content index', 'wishlist' => 'Stored links', 'annotate' => 'Annotations', ); - my $typeorder = ['com','chat','boards','port','groups','blogs','about','wishlist','printout','grades','search','annotate','passwd']; + my $typeorder = ['com','chat','boards','port','groups','blogs','about','wishlist','printout','grades','search','index','annotate','passwd']; return ($typeorder,\%types); } @@ -2019,7 +2022,7 @@ sub print_rolecolors { my %choices = &color_font_choices(); my @bgs = ('pgbg','tabbg','sidebg'); my @links = ('link','alink','vlink'); - my @images = ('img'); + my @images = (); my %alt_text = &Apache::lonlocal::texthash(img => "Banner for $role role"); my %designhash = &Apache::loncommon::get_domainconf($dom); my %defaultdesign = %Apache::loncommon::defaultdesign; @@ -2027,10 +2030,6 @@ sub print_rolecolors { my %defaults = &role_defaults($role,\@bgs,\@links,\@images); if (ref($settings) eq 'HASH') { if (ref($settings->{$role}) eq 'HASH') { - if ($settings->{$role}->{'img'} ne '') { - $designs{'img'} = $settings->{$role}->{'img'}; - $is_custom{'img'} = 1; - } if ($settings->{$role}->{'font'} ne '') { $designs{'font'} = $settings->{$role}->{'font'}; $is_custom{'font'} = 1; @@ -2053,10 +2052,6 @@ sub print_rolecolors { } } } else { - if ($designhash{$dom.'.'.$role.'.img'} ne '') { - $designs{img} = $designhash{$dom.'.'.$role.'.img'}; - $is_custom{'img'} = 1; - } if ($designhash{$dom.'.'.$role.'.fontmenu'} ne '') { $designs{fontmenu} = $designhash{$dom.'.'.$role.'.fontmenu'}; $is_custom{'fontmenu'} = 1; @@ -2106,7 +2101,6 @@ sub role_defaults { } } else { %defaults = ( - img => $defaultdesign{$role.'.img'}, font => $defaultdesign{$role.'.font'}, fontmenu => $defaultdesign{$role.'.fontmenu'}, ); @@ -5405,42 +5399,6 @@ sub print_ltitools { return $datatable; } -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', - 'passback' => 'Tool can return grades:', - 'roster' => 'Tool can retrieve roster:', - 'crstarget' => 'Display target', - 'crslabel' => 'Course label', - 'crstitle' => 'Course title', - 'crslinktext' => 'Link Text', - 'crsexplanation' => 'Explanation', - 'crsappend' => 'Provider URL', - ); - return %lt; -} - sub secrets_form { my ($dom,$context,$encrypt,$privkeys,$rowtotal) = @_; my @ids=&Apache::lonnet::current_machine_ids(); @@ -10724,6 +10682,15 @@ sub print_usermodification { $$rowtotal ++; $rowcount ++; } + } elsif ($position eq 'middle') { + $rowcount = 0; + $context = 'coauthor'; + foreach my $role ('ca','aa') { + $datatable .= &modifiable_userdata_row($context,$role,$settings, + $numinrow,$rowcount); + $$rowtotal ++; + $rowcount ++; + } } elsif ($position eq 'bottom') { $context = 'course'; $rowcount = 0; @@ -12137,7 +12104,11 @@ sub modifiable_userdata_row { my $hashref; if ($context eq 'lti') { if (ref($settings) eq 'HASH') { - $hashref = $settings->{'instdata'}; + my %instdata; + if (ref($settings->{'instdata'}) eq 'ARRAY') { + map { $instdata{$_} = 1; } @{$settings->{'instdata'}}; + } + $hashref = \%instdata; } } elsif ($context eq 'privacy') { my ($key,$inner) = split(/_/,$role); @@ -12148,7 +12119,7 @@ sub modifiable_userdata_row { } } elsif (ref($settings->{$context}) eq 'HASH') { if (ref($settings->{$context}->{$role}) eq 'HASH') { - $hashref = $settings->{'lti_instdata'}; + $hashref = $settings->{$context}->{$role}; } if ($role eq 'emailusername') { if ($statustype) { @@ -12229,6 +12200,8 @@ sub modifiable_userdata_row { } else { if ($context eq 'lti') { $prefix = 'lti'; + } elsif ($context eq 'coauthor') { + $prefix = 'cacanmodify'; } elsif ($context eq 'privacy') { $prefix = 'privacy'; } @@ -13121,7 +13094,6 @@ sub check_exempt_addresses { sub color_font_choices { my %choices = &Apache::lonlocal::texthash ( - img => "Header", bgs => "Background colors", links => "Link colors", images => "Images", @@ -13176,13 +13148,15 @@ sub modify_ipaccess { foreach my $idx (@items) { my $itemid = $itemids{$idx}; next unless ($itemid); - my %current; - unless ($idx eq 'add') { + my ($position,%current); + if ($idx eq 'add') { + $position = $env{'form.ipaccess_pos_add'}; + } else { + $position = $env{'form.ipaccess_pos_'.$itemid}; if (ref($domconfig{'ipaccess'}{$itemid}) eq 'HASH') { %current = %{$domconfig{'ipaccess'}{$itemid}}; } } - my $position = $env{'form.ipaccess_pos_'.$itemid}; $position =~ s/\D+//g; if ($position ne '') { $allpos[$position] = $itemid; @@ -13637,6 +13611,7 @@ sub modify_authordefaults { $shown = $titles{'none'}; } } elsif ($key eq 'archive') { + $domdefaults{$key} = $confhash{$key}; $shown = ($confhash{$key} ? &mt('Yes') : &mt('No')); } $resulttext .= '
  • '.&mt('[_1] set to: [_2]',$titles{$key},$shown).'
  • '; @@ -13714,11 +13689,15 @@ sub modify_colors { @images = ('img','logo','domlogo','login'); @bgs = ('pgbg','mainbg','sidebg'); } else { - @images = ('img'); + @images = (); @bgs = ('pgbg','tabbg','sidebg'); } my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@logintext); - unless ($env{'form.'.$role.'_font'} eq $defaults{'font'}) { + $env{'form.'.$role.'_font'} = lc($env{'form.'.$role.'_font'}); + if ($env{'form.'.$role.'_font'} =~ /^\w+/) { + $env{'form.'.$role.'_font'} = '#'.$env{'form.'.$role.'_font'}; + } + unless ($env{'form.'.$role.'_font'} eq lc($defaults{'font'})) { $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'}; } if ($role eq 'login') { @@ -13736,7 +13715,7 @@ sub modify_colors { if ($env{'form.'.$role.'_fontmenu'} =~ /^\w+/) { $env{'form.'.$role.'_fontmenu'} = '#'.$env{'form.'.$role.'_fontmenu'}; } - unless($env{'form.'.$role.'_fontmenu'} eq lc($defaults{'fontmenu'})) { + unless ($env{'form.'.$role.'_fontmenu'} eq lc($defaults{'fontmenu'})) { $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'}; } } @@ -14849,6 +14828,7 @@ sub modify_quotas { $resulttext .= '
  • '.&mt('Validated course requests identified as processed by: [_1]', ''.$changes{'validation'}{'dc'}.'').'
  • '; } + $resulttext .= ''; } } } @@ -16075,9 +16055,9 @@ sub modify_lti { } my @possinstdata = &Apache::loncommon::get_env_multiple('form.lti_instdata_'.$idx); if (@possinstdata) { - foreach my $field (@possinstdata) { + foreach my $field (sort(@possinstdata)) { if (exists($fieldtitles{$field})) { - push(@{$confhash{$itemid}{'instdata'}}); + push(@{$confhash{$itemid}{'instdata'}},$field); } } } @@ -16239,7 +16219,7 @@ sub modify_lti { } } unless ($changes{$itemid}) { - foreach my $field ('makeuser','lcmenu') { + foreach my $field ('makeuser','lcmenu','instdata') { if (ref($currlti{$field}) eq 'ARRAY') { if (ref($confhash{$itemid}{$field}) eq 'ARRAY') { my @diffs = &Apache::loncommon::compare_arrays($currlti{$field}, @@ -16453,8 +16433,10 @@ sub modify_lti { $resulttext .= '
  • '.&mt('Institutional data will be used when creating a new user for: [_1]', join(', ',map { $fieldtitles{$_}; } @{$confhash{$itemid}{'instdata'}})).'
  • '; } else { - $resulttext .= '
  • '.&mt('No institutional data used when creating a new user.').'
  • '; + $resulttext .= '
  • '.&mt('No institutional data used when creating a new user').'
  • '; } + } else { + $resulttext .= '
  • '.&mt('No institutional data used when creating a new user').'
  • '; } foreach my $item ('topmenu','inlinemenu') { $resulttext .= '
  • '.$lt{$item}.': '; @@ -17965,6 +17947,8 @@ sub modify_privacy { if (@diffs > 0) { $changes{$status} = 1; } + } elsif (@newvalues > 0) { + $changes{$status} = 1; } } else { my @stdfields; @@ -18004,6 +17988,8 @@ sub modify_privacy { if (@diffs > 0) { $changes{'othdom'} = 1; } + } elsif (@newvalues > 0) { + $changes{'othdom'} = 1; } } else { my @stdfields = ('lastname','firstname','middlename','generation','permanentemail'); @@ -19879,21 +19865,27 @@ sub modify_usermodification { } } } - my @contexts = ('author','course'); + my @contexts = ('author','coauthor','course'); my %context_title = ( author => 'In author context', + coauthor => 'As co-author manager', course => 'In course context', ); my @fields = ('lastname','firstname','middlename','generation', 'permanentemail','id'); my %roles = ( author => ['ca','aa'], + coauthor => ['ca','aa'], course => ['st','ep','ta','in','cr'], ); my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); foreach my $context (@contexts) { + my $prefix = 'canmodify'; + if ($context eq 'coauthor') { + $prefix = 'cacanmodify'; + } foreach my $role (@{$roles{$context}}) { - my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$role); + my @modifiable = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_'.$role); foreach my $item (@fields) { if (grep(/^\Q$item\E$/,@modifiable)) { $modifyhash{$context}{$role}{$item} = 1;