--- loncom/interface/domainprefs.pm 2008/05/29 02:58:41 1.52 +++ loncom/interface/domainprefs.pm 2008/07/06 22:14:46 1.60 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.52 2008/05/29 02:58:41 raeburn Exp $ +# $Id: domainprefs.pm,v 1.60 2008/07/06 22:14:46 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,7 +62,7 @@ sub handler { } &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['phase']); + ['phase','actions']); my $phase = 'pickactions'; if ( exists($env{'form.phase'}) ) { $phase = $env{'form.phase'}; @@ -96,7 +96,7 @@ sub handler { col2 => '',}], }, 'defaults' => - { text => 'Default authentication/language', + { text => 'Default authentication/language/timezone', help => '', header => [{col1 => 'Setting', col2 => 'Value'}], @@ -162,9 +162,11 @@ sub handler { 'coursecategories' => { text => 'Cataloging of courses', help => 'Domain_Course_Catalog', - header => [ {col1 => 'Categories', - col2 => '', - }], + header => [{col1 => 'Category settings', + col2 => '',}, + {col1 => 'Categories', + col2 => '', + }], } ); my @roles = ('student','coordinator','author','admin'); @@ -300,10 +302,10 @@ sub handler { $r->print('

'.&mt('Functionality to display/modify').'

'); $r->print(''."\n".'

'."\n".'

  '. - '

'); my ($numitems,$midpoint,$seconddiv,$count); @@ -314,7 +316,7 @@ sub handler { } $count = 0; foreach my $item (@prefs_order) { - $r->print('

'); + $r->print('

'); $count ++; if ((!$seconddiv) && ($count >= $midpoint)) { $r->print('
'."\n".'
'."\n"); @@ -386,15 +388,16 @@ sub print_config_box { # '); $rowtotal ++; if (($action eq 'autoupdate') || ($action eq 'rolecolors') || - ($action eq 'usercreation') || ($action eq 'usermodification')) { + ($action eq 'usercreation') || ($action eq 'usermodification') || + ($action eq 'coursecategories')) { my $colspan = ($action eq 'rolecolors')?' colspan="2"':''; $output .= ' - - + + '; $rowtotal ++; if ($action eq 'autoupdate') { @@ -403,6 +406,8 @@ sub print_config_box { $output .= &print_usercreation('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'usermodification') { $output .= &print_usermodification('top',$dom,$settings,\$rowtotal); + } elsif ($action eq 'coursecategories') { + $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal); } else { $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal); } @@ -414,8 +419,10 @@ sub print_config_box {
'.$item->{'header'}->[0]->{'col1'}.''.$item->{'header'}->[0]->{'col2'}.''.&mt($item->{'header'}->[0]->{'col1'}).''.&mt($item->{'header'}->[0]->{'col2'}).'
- - + '; + my $colspan = ($action eq 'coursecategories')?' colspan="2"':''; + $output .= ' + '; $rowtotal ++; if ($action eq 'autoupdate') { @@ -429,12 +436,14 @@ sub print_config_box {
'.$item->{'header'}->[1]->{'col1'}.''.$item->{'header'}->[1]->{'col2'}.''.&mt($item->{'header'}->[1]->{'col1'}).''.&mt($item->{'header'}->[1]->{'col2'}).'
- - '. + + '. &print_usercreation('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; } elsif ($action eq 'usermodification') { $output .= &print_usermodification('bottom',$dom,$settings,\$rowtotal); + } elsif ($action eq 'coursecategories') { + $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); } else { $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
'.$item->{'header'}->[2]->{'col1'}.''.$item->{'header'}->[2]->{'col2'}.'
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
@@ -444,8 +453,8 @@ sub print_config_box {
- - + + '. &print_rolecolors($phase,'author',$dom,$confname,$settings,\$rowtotal).'
'.$item->{'header'}->[2]->{'col1'}.''.$item->{'header'}->[2]->{'col2'}.''.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
@@ -455,8 +464,8 @@ sub print_config_box {
- - + + '. &print_rolecolors($phase,'admin',$dom,$confname,$settings,\$rowtotal); $rowtotal += 2; @@ -469,14 +478,13 @@ sub print_config_box { '; if (($action eq 'login') || ($action eq 'directorysrch')) { $output .= ' - '; + '; } else { $output .= ' - '; + '; } - my $colspan = ($action eq 'coursecategories')?' colspan="2"':''; $output .= ' - + '; $rowtotal ++; if ($action eq 'login') { @@ -493,8 +501,6 @@ sub print_config_box { $output .= &print_defaults($dom,\$rowtotal); } elsif ($action eq 'scantron') { $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal); - } elsif ($action eq 'coursecategories'){ - $output .= &print_coursecategories($dom,$item,$settings,\$rowtotal); } } $output .= ' @@ -1782,7 +1788,7 @@ sub print_usermodification { sub print_defaults { my ($dom,$rowtotal) = @_; - my @items = ('auth_def','auth_arg_def','lang_def'); + my @items = ('auth_def','auth_arg_def','lang_def','timezone_def'); my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); my $titles = &defaults_titles(); my $rownum = 0; @@ -1814,6 +1820,9 @@ sub print_defaults { '" value="'.$auth.'"'.$checked.'/>'. $authnames{$shortauth{$auth}}.'  '; } + } elsif ($item eq 'timezone_def') { + my $includeempty = 1; + $datatable .= &Apache::loncommon::select_timezone($item,$domdefaults{$item},undef,$includeempty); } else { $datatable .= ''; @@ -1830,6 +1839,7 @@ sub defaults_titles { 'auth_def' => 'Default authentication type', 'auth_arg_def' => 'Default authentication argument', 'lang_def' => 'Default language', + 'timezone_def' => 'Default timezone', ); return (\%titles); } @@ -1837,7 +1847,8 @@ sub defaults_titles { sub print_scantronformat { my ($r,$dom,$confname,$settings,$rowtotal) = @_; my $itemcount = 1; - my ($datatable,$css_class,$scantronurl,$is_custom,%error,%scantronurls); + my ($datatable,$css_class,$scantronurl,$is_custom,%error,%scantronurls, + %confhash); my $switchserver = &check_switchserver($dom,$confname); my %lt = &Apache::lonlocal::texthash ( default => 'Default scantron format file error', @@ -1864,23 +1875,52 @@ sub print_scantronformat { ); my %md5chk; foreach my $type (keys(%legacyfile)) { - $md5chk{$type} = split(/ /,`md5sum $legacyfile{$type}`); - chop($md5chk{$type}); + ($md5chk{$type}) = split(/ /,`md5sum $legacyfile{$type}`); + chomp($md5chk{$type}); } if ($md5chk{'default'} ne $md5chk{'custom'}) { foreach my $type (keys(%legacyfile)) { - ($scantronurls{$type},$error{$type}) = + ($scantronurls{$type},my $error) = &legacy_scantronformat($r,$dom,$confname, $type,$legacyfile{$type}, $scantronurls{$type}, $scantronfiles{$type}); + if ($error ne '') { + $error{$type} = $error; + } + } + if (keys(%error) == 0) { + $is_custom = 1; + $confhash{'scantron'}{'scantronformat'} = + $scantronurls{'custom'}; + my $putresult = + &Apache::lonnet::put_dom('configuration', + \%confhash,$dom); + if ($putresult ne 'ok') { + $error{'custom'} = + ''. + &mt('An error occurred updating the domain configuration: [_1]',$putresult).''; + } } } else { - ($scantronurls{'default'},$error{'default'}) = + ($scantronurls{'default'},my $error) = &legacy_scantronformat($r,$dom,$confname, 'default',$legacyfile{'default'}, $scantronurls{'default'}, $scantronfiles{'default'}); + if ($error eq '') { + $confhash{'scantron'}{'scantronformat'} = ''; + my $putresult = + &Apache::lonnet::put_dom('configuration', + \%confhash,$dom); + if ($putresult ne 'ok') { + $error{'default'} = + ''. + &mt('An error occurred updating the domain configuration: [_1]',$putresult).''; + } + } else { + $error{'default'} = $error; + } } } } @@ -1901,7 +1941,11 @@ sub print_scantronformat { $scantronurl = $scantronurls{'default'}; } } else { - $scantronurl = $scantronurls{'default'}; + if ($is_custom) { + $scantronurl = $scantronurls{'custom'}; + } else { + $scantronurl = $scantronurls{'default'}; + } } $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= ''; @@ -1913,14 +1957,26 @@ sub print_scantronformat { } else { $datatable = &mt('File unavailable for display'); } - $datatable .= ''; + if (keys(%error) == 0) { + $datatable .= ''. + ''. + ''. + ''. + ''. + ''. + ''; + $$rowtotal += 2; + } else { + my $css_class; + my $itemcount = 1; + my $cathash; + if (ref($settings) eq 'HASH') { + $cathash = $settings->{'cats'}; + } + if (ref($cathash) eq 'HASH') { + my (@cats,@trails,%allitems,%idx,@jsarray); + &Apache::loncommon::extract_categories($cathash,\@cats,\@trails, + \%allitems,\%idx,\@jsarray); + my $maxdepth = scalar(@cats); + my $colattrib = ''; + if ($maxdepth > 2) { + $colattrib = ' colspan="2" '; + } + my @path; + if (@cats > 0) { + if (ref($cats[0]) eq 'ARRAY') { + my $numtop = @{$cats[0]}; + my $maxnum = $numtop; + if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '')) { + $maxnum ++; + } + my $lastidx; + for (my $i=0; $i<$numtop; $i++) { + my $parent = $cats[0][$i]; + $css_class = $itemcount%2?' class="LC_odd_row"':''; + my $item = &escape($parent).'::0'; + my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$item','$idx{$item}'".');"'; + $lastidx = $idx{$item}; + $datatable .= '' + .' ' + .''; + } else { + $datatable .= $parent + .' '; + } + my $depth = 1; + push(@path,$parent); + $datatable .= &build_category_rows($itemcount,\@cats,$depth,$parent,\@path,\%idx); + pop(@path); + $datatable .= ''; + $itemcount ++; + } $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $item = &escape($parent).'::0'; - my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$item','$idx{$item}'".');"'; - $lastidx = $idx{$item}; - $datatable .= '' - .' ' - .''; - } else { - $datatable .= $parent - .' '; - } - my $depth = 1; - push(@path,$parent); - $datatable .= &build_category_rows($itemcount,\@cats,$depth,$parent,\@path,\%idx); - pop(@path); - $datatable .= ''; + $datatable .= '' + .''."\n"; $itemcount ++; - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','$lastidx'".');"'; - $datatable .= '' - .''."\n"; - $itemcount ++; - if ((!grep(/^instcode$/,@{$cats[0]})) || ($settings->{'instcode::0'} eq '')) { - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','instcode_pos','$lastidx'".');"'; - $datatable .= '' + .''; } - $datatable .= '' - .''; } + } else { + $datatable .= &initialize_categories($itemcount); } } else { - $datatable .= &initialize_categories($itemcount); + $datatable .= '' + .&initialize_categories($itemcount); } - } else { - $datatable .= '' - .&initialize_categories($itemcount); + $$rowtotal += $itemcount; } - $$rowtotal += $itemcount; return $datatable; } sub coursecategories_javascript { my ($settings) = @_; - my ($output,$jstext); + my ($output,$jstext,$cathash); if (ref($settings) eq 'HASH') { + $cathash = $settings->{'cats'}; + } + if (ref($cathash) eq 'HASH') { my (@cats,@jsarray,%idx); - &Apache::loncommon::gather_categories($settings,\@cats,\%idx,\@jsarray); + &Apache::loncommon::gather_categories($cathash,\@cats,\%idx,\@jsarray); if (@jsarray > 0) { $jstext = ' var categories = Array('.scalar(@jsarray).');'."\n"; for (my $i=0; $i<@jsarray; $i++) { @@ -2165,7 +2270,7 @@ sub initialize_categories { $css_class = $itemcount%2?' class="LC_odd_row"':''; $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','0'".');"'; $datatable .= ''; @@ -2223,7 +2328,7 @@ sub build_category_rows { pop(@{$path}); } } else { - $text .= &mt('New:').'  "Background colors", links => "Link colors", + images => "Images", font => "Font color", pgbg => "Page", tabbg => "Header", @@ -2545,6 +2653,11 @@ sub modify_rolecolors { my ($r,$dom,$confname,$roles,%domconfig) = @_; my ($resulttext,%rolehash); $rolehash{'rolecolors'} = {}; + if (ref($domconfig{'rolecolors'}) ne 'HASH') { + if ($domconfig{'rolecolors'} eq '') { + $domconfig{'rolecolors'} = {}; + } + } my ($errors,%changes) = &modify_colors($r,$dom,$confname,$roles, $domconfig{'rolecolors'},$rolehash{'rolecolors'}); my $putresult = &Apache::lonnet::put_dom('configuration',\%rolehash, @@ -3140,7 +3253,11 @@ sub modify_quotas { } foreach my $key (keys(%formhash)) { if ($formhash{$key} ne '') { - if (!exists($domconfig{'quotas'}{$key})) { + if (ref($domconfig{'quotas'}) eq 'HASH') { + if (!exists($domconfig{'quotas'}{$key})) { + $changes{$key} = 1; + } + } else { $changes{$key} = 1; } } @@ -4067,7 +4184,7 @@ sub modify_defaults { my ($dom,$r) = @_; my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors); my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); - my @items = ('auth_def','auth_arg_def','lang_def'); + my @items = ('auth_def','auth_arg_def','lang_def','timezone_def'); my @authtypes = ('internal','krb4','krb5','localauth'); foreach my $item (@items) { $newvalues{$item} = $env{'form.'.$item}; @@ -4088,6 +4205,13 @@ sub modify_defaults { push(@errors,$item); } } + } elsif ($item eq 'timezone_def') { + if ($newvalues{$item} ne '') { + my @timezones = &DateTime::TimeZone->all_names; + if (!grep(/^\Q$newvalues{$item}\E/,@timezones)) { + push(@errors,$item); + } + } } if (grep(/^\Q$item\E$/,@errors)) { $newvalues{$item} = $domdefaults{$item}; @@ -4099,6 +4223,7 @@ sub modify_defaults { defaults => { auth_def => $newvalues{'auth_def'}, auth_arg_def => $newvalues{'auth_arg_def'}, lang_def => $newvalues{'lang_def'}, + timezone_def => $newvalues{'timezone_def'}, } ); my $title = &defaults_titles(); @@ -4131,10 +4256,12 @@ sub modify_defaults { my $cachetime = 24*60*60; &Apache::lonnet::do_cache_new('domdefaults',$dom, $defaults_hash{'defaults'},$cachetime); - my $sysmail = $r->dir_config('lonSysEMail'); - &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext); + if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'}) { + my $sysmail = $r->dir_config('lonSysEMail'); + &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext); + } } else { - $resulttext = &mt('No changes made to default authentication/language settings'); + $resulttext = &mt('No changes made to default authentication/language/timezone settings'); } } else { $resulttext = ''. @@ -4231,67 +4358,85 @@ sub modify_scantron { sub modify_coursecategories { my ($dom,%domconfig) = @_; - my ($resulttext,%deletions,%reorderings,%needreordering,%adds,$errors); + my ($resulttext,%deletions,%reorderings,%needreordering,%adds,%changes,$errors, + $cathash); my @deletecategory = &Apache::loncommon::get_env_multiple('form.deletecategory'); - if (($domconfig{'coursecategories'}{'instcode::0'} ne '') && ($env{'form.instcode'} == 0)) { - push (@deletecategory,'instcode::0'); - } - my (@predelcats,@predeltrails,%predelallitems); if (ref($domconfig{'coursecategories'}) eq 'HASH') { + $cathash = $domconfig{'coursecategories'}{'cats'}; + if ($domconfig{'coursecategories'}{'togglecats'} ne $env{'form.togglecats'}) { + $changes{'togglecats'} = 1; + $domconfig{'coursecategories'}{'togglecats'} = $env{'form.togglecats'}; + } + if ($domconfig{'coursecategories'}{'categorize'} ne $env{'form.categorize'}) { + $changes{'categorize'} = 1; + $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'}; + } + } else { + $changes{'togglecats'} = 1; + $changes{'categorize'} = 1; + $domconfig{'coursecategories'}{'togglecats'} = $env{'form.togglecats'}; + $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'}; + } + if (ref($cathash) eq 'HASH') { + if (($domconfig{'coursecategories'}{'cats'}{'instcode::0'} ne '') && ($env{'form.instcode'} == 0)) { + push (@deletecategory,'instcode::0'); + } + } + my (@predelcats,@predeltrails,%predelallitems,%sort_by_deltrail); + if (ref($cathash) eq 'HASH') { if (@deletecategory > 0) { #FIXME Need to remove category from all courses using a deleted category - &Apache::loncommon::extract_categories($domconfig{'coursecategories'},\@predelcats,\@predeltrails,\%predelallitems); + &Apache::loncommon::extract_categories($cathash,\@predelcats,\@predeltrails,\%predelallitems); foreach my $item (@deletecategory) { - if ($domconfig{'coursecategories'}{$item} ne '') { - delete($domconfig{'coursecategories'}{$item}); + if ($domconfig{'coursecategories'}{'cats'}{$item} ne '') { + delete($domconfig{'coursecategories'}{'cats'}{$item}); $deletions{$item} = 1; - &recurse_cat_deletes($item,$domconfig{'coursecategories'}, - \%deletions); + &recurse_cat_deletes($item,$cathash,\%deletions); } } } - foreach my $item (keys(%{$domconfig{'coursecategories'}})) { + foreach my $item (keys(%{$cathash})) { my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$item); - if ($domconfig{'coursecategories'}{$item} ne $env{'form.'.$item}) { + if ($cathash->{$item} ne $env{'form.'.$item}) { $reorderings{$item} = 1; - $domconfig{'coursecategories'}{$item} = $env{'form.'.$item}; + $domconfig{'coursecategories'}{'cats'}{$item} = $env{'form.'.$item}; } if ($env{'form.addcategory_name_'.$item} ne '') { my $newcat = $env{'form.addcategory_name_'.$item}; my $newdepth = $depth+1; my $newitem = &escape($newcat).':'.&escape($cat).':'.$newdepth; - $domconfig{'coursecategories'}{$newitem} = $env{'form.addcategory_pos_'.$item}; + $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos_'.$item}; $adds{$newitem} = 1; } if ($env{'form.subcat_'.$item} ne '') { my $newcat = $env{'form.subcat_'.$item}; my $newdepth = $depth+1; my $newitem = &escape($newcat).':'.&escape($cat).':'.$newdepth; - $domconfig{'coursecategories'}{$newitem} = 0; + $domconfig{'coursecategories'}{'cats'}{$newitem} = 0; $adds{$newitem} = 1; } } } if ($env{'form.instcode'} eq '1') { - if (ref($domconfig{'coursecategories'}) eq 'HASH') { + if (ref($cathash) eq 'HASH') { my $newitem = 'instcode::0'; - if ($domconfig{'coursecategories'}{$newitem} eq '') { - $domconfig{'coursecategories'}{$newitem} = $env{'form.instcode_pos'}; + if ($cathash->{$newitem} eq '') { + $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.instcode_pos'}; $adds{$newitem} = 1; } } else { my $newitem = 'instcode::0'; - $domconfig{'coursecategories'}{$newitem} = $env{'form.instcode_pos'}; + $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.instcode_pos'}; $adds{$newitem} = 1; } } if ($env{'form.addcategory_name'} ne '') { my $newitem = &escape($env{'form.addcategory_name'}).'::0'; - $domconfig{'coursecategories'}{$newitem} = $env{'form.addcategory_pos'}; + $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos'}; $adds{$newitem} = 1; } + my $putresult; if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) { - my %sort_by_deltrail; if (keys(%deletions) > 0) { foreach my $key (keys(%deletions)) { if ($predelallitems{$key} ne '') { @@ -4300,7 +4445,7 @@ sub modify_coursecategories { } } my (@chkcats,@chktrails,%chkallitems); - &Apache::loncommon::extract_categories($domconfig{'coursecategories'},\@chkcats,\@chktrails,\%chkallitems); + &Apache::loncommon::extract_categories($domconfig{'coursecategories'}{'cats'},\@chkcats,\@chktrails,\%chkallitems); if (ref($chkcats[0]) eq 'ARRAY') { my $depth = 0; my $chg = 0; @@ -4312,56 +4457,80 @@ sub modify_coursecategories { } else { $item = &escape($name).'::0'; if ($chg) { - $domconfig{'coursecategories'}{$item} -= $chg; + $domconfig{'coursecategories'}{'cats'}{$item} -= $chg; } $depth ++; - &recurse_check(\@chkcats,$domconfig{'coursecategories'},$depth,$name); + &recurse_check(\@chkcats,$domconfig{'coursecategories'}{'cats'},$depth,$name); $depth --; } } } - my $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom); - my (@cats,@trails,%allitems); - &Apache::loncommon::extract_categories($domconfig{'coursecategories'},\@cats,\@trails,\%allitems); + } + if ((keys(%changes) > 0) || (keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) { + $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom); if ($putresult eq 'ok') { + my %title = ( + togglecats => 'Show/Hide a course in the catalog', + categorize => 'Category assigned to course', + ); + my %level = ( + dom => 'set from "Modify Course" (Domain)', + crs => 'set from "Parameters" (Course)', + ); $resulttext = &mt('Changes made:').'
    '; - if (keys(%deletions) > 0) { - $resulttext .= '
  • '.&mt('Deleted categories:').'
      '; - foreach my $predeltrail (sort {$a <=> $b } (keys(%sort_by_deltrail))) { - $resulttext .= '
    • '.$predeltrails[$predeltrail].'
    • '; - } - $resulttext .= '
  • '; + if ($changes{'togglecats'}) { + $resulttext .= '
  • '.&mt("$title{'togglecats'} $level{$env{'form.togglecats'}}").'
  • '; } - if (keys(%reorderings) > 0) { - my %sort_by_trail; - $resulttext .= '
  • '.&mt('Reordered categories:').'
      '; - foreach my $key (keys(%reorderings)) { - if ($allitems{$key} ne '') { - $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}]; - } - } - foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) { - $resulttext .= '
    • '.$trails[$trail].'
    • '; - } - $resulttext .= '
  • '; + if ($changes{'categorize'}) { + $resulttext .= '
  • '.&mt("$title{'categorize'} $level{$env{'form.categorize'}}").'
  • '; } - if (keys(%adds) > 0) { - my %sort_by_trail; - $resulttext .= '
  • '.&mt('Added categories:').'
      '; - foreach my $key (keys(%adds)) { - if ($allitems{$key} ne '') { - $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}]; + if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) { + my $cathash; + if (ref($domconfig{'coursecategories'}) eq 'HASH') { + $cathash = $domconfig{'coursecategories'}{'cats'}; + } else { + $cathash = {}; + } + my (@cats,@trails,%allitems); + &Apache::loncommon::extract_categories($cathash,\@cats,\@trails,\%allitems); + if (keys(%deletions) > 0) { + $resulttext .= '
    • '.&mt('Deleted categories:').'
        '; + foreach my $predeltrail (sort {$a <=> $b } (keys(%sort_by_deltrail))) { + $resulttext .= '
      • '.$predeltrails[$predeltrail].'
      • '; + } + $resulttext .= '
    • '; + } + if (keys(%reorderings) > 0) { + my %sort_by_trail; + $resulttext .= '
    • '.&mt('Reordered categories:').'
        '; + foreach my $key (keys(%reorderings)) { + if ($allitems{$key} ne '') { + $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}]; + } } + foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) { + $resulttext .= '
      • '.$trails[$trail].'
      • '; + } + $resulttext .= '
    • '; } - foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) { - $resulttext .= '
    • '.$trails[$trail].'
    • '; + if (keys(%adds) > 0) { + my %sort_by_trail; + $resulttext .= '
    • '.&mt('Added categories:').'
        '; + foreach my $key (keys(%adds)) { + if ($allitems{$key} ne '') { + $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}]; + } + } + foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) { + $resulttext .= '
      • '.$trails[$trail].'
      • '; + } + $resulttext .= '
    • '; } - $resulttext .= '
  • '; } $resulttext .= '
'; } else { $resulttext = ''. - &mt('An error occurred: [_1]',$putresult).''; + &mt('An error occurred: [_1]',$putresult).'
'; } } else { $resulttext = &mt('No changes made to course categories');
'.$item->{'header'}->[3]->{'col1'}.''.$item->{'header'}->[3]->{'col2'}.''.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
'.$item->{'header'}->[0]->{'col1'}.''.&mt($item->{'header'}->[0]->{'col1'}).''.$item->{'header'}->[0]->{'col1'}.''.&mt($item->{'header'}->[0]->{'col1'}).''.$item->{'header'}->[0]->{'col2'}.''.&mt($item->{'header'}->[0]->{'col2'}).'
'.&mt('Upload:').'
'; + $datatable .= '
'; + if (!$switchserver) { + $datatable .= &mt('Upload:').'
'; + } + } else { + my $errorstr; + foreach my $key (sort(keys(%error))) { + $errorstr .= $lt{$key}.': '.$error{$key}.'
'; + } + $datatable .= '
'.$errorstr; + } } else { if (keys(%error) > 0) { my $errorstr; foreach my $key (sort(keys(%error))) { $errorstr .= $lt{$key}.': '.$error{$key}.'
'; } - $datatable .= '
'.$errorstr.''; + $datatable .= ''.$errorstr.' '; } elsif ($scantronurl) { $datatable .= '' .&mt('Custom scantron format file').'' .'
'.$title{'togglecats'}.' '. + '
'.$title{'categorize'}.''. + ' '. + '
' + .''; + if ($parent eq 'instcode') { + $datatable .= ''.&mt('Official courses') + .'
(' + .&mt('with institutional codes').')
' - .'
'; - if ($parent eq 'instcode') { - $datatable .= ''.&mt('Official courses') - .'
(' - .&mt('with institutional codes').')
'.&mt('Add category:').' ' + .'
'.&mt('New:').' ' - .'
'. - '
'. + '' + .&mt('Official courses').''.'
(' + .&mt('with institutional codes').')
 ' + .'
' - .&mt('Official courses').''.'
(' - .&mt('with institutional codes').')
 ' - .'
'.$hdritem->{'header'}->[0]->{'col2'}.''.$hdritem->{'header'}->[0]->{'col2'}.'
' - .'' .' ' .&mt('Add category').''.&mt('Name:') .'