--- loncom/interface/loncommon.pm 2010/02/21 02:38:23 1.942 +++ loncom/interface/loncommon.pm 2010/03/17 20:00:02 1.955 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.942 2010/02/21 02:38:23 raeburn Exp $ +# $Id: loncommon.pm,v 1.955 2010/03/17 20:00:02 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1202,12 +1202,7 @@ ENDOUTPUT sub help_open_menu { my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) = @_; - $stayOnPage = 0 if (not defined $stayOnPage); - # only use pop-up help (stayOnPage == 0) - # if environment.remote is on (using remote control UI) - if ($env{'environment.remote'} eq 'off' ) { - $stayOnPage=1; - } + $stayOnPage = 1; my $output; if ($component_help) { if (!$text) { @@ -1228,8 +1223,8 @@ sub help_open_menu { sub top_nav_help { my ($text) = @_; $text = &mt($text); - my $stay_on_page = - ($env{'environment.remote'} eq 'off' ); + my $stay_on_page = 1; + my $link = ($stay_on_page) ? "javascript:helpMenu('display')" : "javascript:helpMenu('open')"; my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page); @@ -1244,10 +1239,7 @@ END sub help_menu_js { my ($text) = @_; - - my $stayOnPage = - ($env{'environment.remote'} eq 'off' ); - + my $stayOnPage = 1; my $width = 620; my $height = 600; my $helptopic=&general_help(); @@ -1304,10 +1296,7 @@ sub help_open_bug { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 600 if (not defined $width); $height = 600 if (not defined $height); @@ -1348,10 +1337,7 @@ sub help_open_faq { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 350 if (not defined $width); $height = 400 if (not defined $height); @@ -3412,12 +3398,22 @@ sub get_previous_attempt { } $prevattempts=&start_data_table().&start_data_table_header_row(); $prevattempts.='<th>'.&mt('History').'</th>'; + my %typeparts; + my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'}); foreach my $key (sort(keys(%lasthash))) { my ($ign,@parts) = split(/\./,$key); if ($#parts > 0) { my $data=$parts[-1]; pop(@parts); - $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.' </th>'; + if ($data eq 'type') { + unless ($showsurv) { + my $id = join(',',@parts); + $typeparts{$ign.'.'.$id} = $lasthash{$key}; + } + delete($lasthash{$key}); + } else { + $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.' </th>'; + } } else { if ($#parts == 0) { $prevattempts.='<th>'.$parts[0].'</th>'; @@ -3427,23 +3423,98 @@ sub get_previous_attempt { } } $prevattempts.=&end_data_table_header_row(); + my %lasthidden; if ($getattempt eq '') { for ($version=1;$version<=$returnhash{'version'};$version++) { - $prevattempts.=&start_data_table_row(). - '<td>'.&mt('Transaction [_1]',$version).'</td>'; - foreach my $key (sort(keys(%lasthash))) { - my $value = &format_previous_attempt_value($key, - $returnhash{$version.':'.$key}); - $prevattempts.='<td>'.$value.' </td>'; - } - $prevattempts.=&end_data_table_row(); + my @hidden; + if (%typeparts) { + foreach my $id (keys(%typeparts)) { + if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { + push(@hidden,$id); + $lasthidden{$id} = 1; + } elsif ($lasthidden{$id}) { + if (exists($returnhash{$version.':'.$id.'.award'})) { + delete($lasthidden{$id}); + } + } + } + } + $prevattempts.=&start_data_table_row(). + '<td>'.&mt('Transaction [_1]',$version).'</td>'; + if (@hidden) { + foreach my $key (sort(keys(%lasthash))) { + my $hide; + foreach my $id (@hidden) { + if ($key =~ /^\Q$id\E/) { + $hide = 1; + last; + } + } + if ($hide) { + my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/); + if (($data eq 'award') || ($data eq 'awarddetail')) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.='<td>'.$value.' </td>'; + } else { + $prevattempts.='<td> </td>'; + } + } else { + if ($key =~ /\./) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.='<td>'.$value.' </td>'; + } else { + $prevattempts.='<td> </td>'; + } + } + } + } else { + foreach my $key (sort(keys(%lasthash))) { + my $value = &format_previous_attempt_value($key, + $returnhash{$version.':'.$key}); + $prevattempts.='<td>'.$value.' </td>'; + } + } + $prevattempts.=&end_data_table_row(); } } + my @currhidden = keys(%lasthidden); $prevattempts.=&start_data_table_row().'<td>'.&mt('Current').'</td>'; foreach my $key (sort(keys(%lasthash))) { - my $value = &format_previous_attempt_value($key,$lasthash{$key}); - if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)} - $prevattempts.='<td>'.$value.' </td>'; + if (%typeparts) { + my $hidden; + foreach my $id (@currhidden) { + if ($key =~ /^\Q$id\E/) { + $hidden = 1; + last; + } + } + if ($hidden) { + my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/); + if (($data eq 'award') || ($data eq 'awarddetail')) { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.='<td>'.$value.' </td>'; + } else { + $prevattempts.='<td> </td>'; + } + } else { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.='<td>'.$value.' </td>'; + } + } else { + my $value = &format_previous_attempt_value($key,$lasthash{$key}); + if ($key =~/$regexp$/ && (defined &$gradesub)) { + $value = &$gradesub($value); + } + $prevattempts.='<td>'.$value.' </td>'; + } } $prevattempts.= &end_data_table_row().&end_data_table(); } else { @@ -4146,16 +4217,39 @@ sub get_domainconf { if (defined($cached)) { return %{$result}; } my %domconfig = &Apache::lonnet::get_dom('configuration', - ['login','rolecolors'],$udom); + ['login','rolecolors','autoenroll'],$udom); my (%designhash,%legacy); if (keys(%domconfig) > 0) { if (ref($domconfig{'login'}) eq 'HASH') { if (keys(%{$domconfig{'login'}})) { foreach my $key (keys(%{$domconfig{'login'}})) { if (ref($domconfig{'login'}{$key}) eq 'HASH') { - foreach my $img (keys(%{$domconfig{'login'}{$key}})) { - $designhash{$udom.'.login.'.$key.'_'.$img} = - $domconfig{'login'}{$key}{$img}; + if ($key eq 'loginvia') { + if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') { + my @ids = &Apache::lonnet::current_machine_ids(); + foreach my $hostname (@ids) { + if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') { + if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) { + my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; + $designhash{$udom.'.login.loginvia'} = $server; + if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') { + + $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; + } else { + $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; + } + if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) { + $designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}; + } + } + } + } + } + } else { + foreach my $img (keys(%{$domconfig{'login'}{$key}})) { + $designhash{$udom.'.login.'.$key.'_'.$img} = + $domconfig{'login'}{$key}{$img}; + } } } else { $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key}; @@ -4182,6 +4276,11 @@ sub get_domainconf { } else { $legacy{'rolecolors'} = 1; } + if (ref($domconfig{'autoenroll'}) eq 'HASH') { + if ($domconfig{'autoenroll'}{'co-owners'}) { + $designhash{$udom.'.autoassign.co-owners'}=$domconfig{'autoenroll'}{'co-owners'}; + } + } if (keys(%legacy) > 0) { my %legacyhash = &get_legacy_domconf($udom); foreach my $item (keys(%legacyhash)) { @@ -4437,9 +4536,10 @@ Inputs: =item * $bgcolor, used to override the bgcolor on a webpage to a specific value -=item * $no_inline_link, if true and in remote mode, don't show the - 'Switch To Inline Menu' link - +#SD +#RC =item * $no_inline_link, if true and in remote mode, don't show the +#RC 'Switch To Inline Menu' link +#RC =item * $args, optional argument valid values are no_auto_mt_title -> prevents &mt()ing the title arg inherit_jsmath -> when creating popup window in a page, @@ -4459,6 +4559,11 @@ sub bodytag { my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_; + my $public; + if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) + || ($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) { + $public = 1; + } if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } $function = &get_users_function() if (!$function); @@ -4508,7 +4613,7 @@ sub bodytag { } my $name = &plainname($env{'user.name'},$env{'user.domain'}); - if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { + if ($public) { undef($role); } else { $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); @@ -4529,7 +4634,6 @@ sub bodytag { $role = '<span class="LC_nobreak">('.$role.')</span>' if $role; &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); - if ($env{'environment.remote'} eq 'off') { # No Remote if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { return $bodytag; @@ -4567,7 +4671,7 @@ sub bodytag { $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|; #don't show menus for public users - if($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){ + if (!$public){ $bodytag .= Apache::lonmenu::secondary_menu(); $bodytag .= Apache::lonmenu::serverform(); $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); @@ -4585,40 +4689,6 @@ sub bodytag { } return $bodytag; - } - -# -# Top frame rendering, Remote is up -# - - my $imgsrc = $img; - if ($img =~ /^\/adm/) { - $imgsrc = &lonhttpdurl($img); - } - my $upperleft='<img src="'.$imgsrc.'" alt="'.$function.'" />'; - - # Explicit link to get inline menu - my $menu= ($no_inline_link?'' - :'<a href="/adm/remote?action=collapse" target="_top">'.&mt('Switch to Inline Menu Mode').'</a>'); - - if ($dc_info) { - $dc_info = qq|<span class="LC_cusr_subheading">($dc_info)</span>|; - } - - $bodytag .= qq|<div id="LC_nav_bar">$name $role</div> - <ol class="LC_primary_menu LC_right"> - <li>$menu</li> - </ol><div id="LC_realm"> $realm $dc_info</div>| unless $env{'form.inhibitmenu'}; - return(<<ENDBODY); -$bodytag -<table id="LC_title_bar" class="LC_with_remote"> -<tr><td>$upperleft</td> - <td>$messages </td> -</tr> -<tr><td>$titleinfo $dc_info $menu</td> -</tr> -</table> -ENDBODY } sub dc_courseid_toggle { @@ -4650,22 +4720,8 @@ sub make_attr_string { delete($attr_ref->{$key}); } } - $attr_ref->{'onload'} = - &Apache::lonmenu::loadevents(). $on_load; - $attr_ref->{'onunload'}= - &Apache::lonmenu::unloadevents().$on_unload; - } - -# Accessibility font enhance - if ($env{'browser.fontenhance'} eq 'on') { - my $style; - foreach my $key (keys(%{$attr_ref})) { - if (lc($key) eq 'style') { - $style.=$attr_ref->{$key}.';'; - delete($attr_ref->{$key}); - } - } - $attr_ref->{'style'}=$style.'; font-size: x-large;'; + $attr_ref->{'onload'} = $on_load; + $attr_ref->{'onunload'}= $on_unload; } my $attr_string; @@ -4761,6 +4817,7 @@ sub standard_css { my $table_header = '#DDDDDD'; my $feedback_link_bg = '#BBBBBB'; my $lg_border_color = '#C8C8C8'; + my $button_hover = '#BF2317'; my $border = ($env{'browser.type'} eq 'explorer' || $env{'browser.type'} eq 'safari' ) ? '0 2px 0 2px' @@ -4768,6 +4825,14 @@ sub standard_css { return <<END; + +/* needed for iframe to allow 100% height in FF */ +body, html { + margin: 0; + padding: 0 0.5%; + height: 99%; /* to avoid scrollbars */ +} + body { font-family: $sans; line-height:130%; @@ -4796,6 +4861,20 @@ form, .inline { width:400px; } +.LC_iframecontainer { + width: 98%; + margin: 0; + position: fixed; + top: 8.5em; + bottom: 0; +} + +.LC_iframecontainer iframe{ + border: none; + width: 100%; + height: 100%; +} + .LC_filename { font-family: $mono; white-space:pre; @@ -4976,11 +5055,6 @@ td.LC_table_cell_checkbox { padding: 0; } -/* Preliminary fix to hide breadcrumbs inside remote control window */ -#LC_remote #LC_breadcrumbs { - display:none; -} - #LC_head_subbox { clear:both; background: #F8F8F8; /* $sidebg; */ @@ -5006,6 +5080,10 @@ td.LC_table_cell_checkbox { vertical-align: middle; } +li.LC_menubuttons_inline_text img,a { + cursor:pointer; +} + .LC_menubuttons_link { text-decoration: none; } @@ -5884,7 +5962,7 @@ ol#LC_PathBreadcrumbs a:hover, ul#LC_secondary_menu a:hover, .LC_FormSectionClearButton input:hover ul.LC_TabContent li:hover a { - color:#BF2317; + color:$button_hover; text-decoration:none; } @@ -5971,11 +6049,6 @@ ol.LC_primary_menu { margin: 0; } -span.LC_new_message{ - font-weight:bold; - color: darkred; -} - ol#LC_PathBreadcrumbs { margin: 0; } @@ -5996,6 +6069,11 @@ ol.LC_primary_menu a { text-decoration: none; } +ol.LC_primary_menu a.LC_new_message { + font-weight:bold; + color: darkred; +} + ul#LC_secondary_menu { clear: both; color: $fontmenu; @@ -6035,7 +6113,7 @@ ul#LC_secondary_menu li a { } ul.LC_TabContent { - min-height:1.5em; + min-height:20px; } ul.LC_TabContent li { @@ -6043,6 +6121,7 @@ ul.LC_TabContent li { padding: 0 10px 0 10px; background-color:$tabbg; border-bottom:solid 1px $lg_border_color; + border-right: solid 1px $font; } ul.LC_TabContent .right { @@ -6056,13 +6135,23 @@ ul.LC_TabContent li { font-size:95%; font-weight:bold; padding-right: 16px; + min-height:20px; +} + +ul.LC_TabContent li a:hover { + color: $button_hover; +} + +ul.LC_TabContent li:hover { + color: $button_hover; + cursor:pointer; } -ul.LC_TabContent li:hover, ul.LC_TabContent li.active { + color: $font; background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center; - border-bottom:solid 2px #FFFFFF; - padding-right: 16px; + border-bottom:solid 1px #FFFFFF; + cursor: default; } #maincoursedoc { @@ -6322,14 +6411,6 @@ a#LC_content_toolbar_firsthomework { background-image:url(/res/adm/pages/open-first-problem.gif); } -a#LC_content_toolbar_launchnav { - background-image:url(/res/adm/pages/start-navigation.gif); -} - -a#LC_content_toolbar_closenav { - background-image:url(/res/adm/pages/close-navigation.gif); -} - a#LC_content_toolbar_everything { background-image:url(/res/adm/pages/show-all.gif); } @@ -6472,7 +6553,7 @@ sub headtag { $result .= &Apache::lonhtmlcommon::htmlareaheaders(); } if ($args->{'force_register'}) { - $result .= &Apache::lonmenu::registerurl(1); + $result .= &Apache::lonmenu::registerurl(); } if (!$args->{'no_nav_bar'} && !$args->{'only_body'} @@ -6629,8 +6710,8 @@ $args - additional optional args support skip_phases -> hash ref of head -> skip the <html><head> generation body -> skip all <body> generation - no_inline_link -> if true and in remote mode, don't show the - 'Switch To Inline Menu' link +#RC no_inline_link -> if true and in remote mode, don't show the +#RC 'Switch To Inline Menu' link no_auto_mt_title -> prevent &mt()ing the title arg inherit_jsmath -> when creating popup window in a page, should it have jsmath forced on by the @@ -6696,7 +6777,8 @@ sub start_page { return $result if $args->{'only_body'}; #Breadcrumbs for Construction Space provided by &bodytag. - if (($env{'environment.remote'} eq 'off') && ($env{'request.state'} eq 'construct')) { + if ( + $env{'request.state'} eq 'construct') { return $result; } @@ -9993,19 +10075,19 @@ sub check_clone { my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); my $clonemsg; my $can_clone = 0; - my $lctype = lc($args->{'type'}); + my $lctype = lc($args->{'crstype'}); if ($lctype ne 'community') { $lctype = 'course'; } if ($clonehome eq 'no_host') { - if ($args->{'type'} eq 'Community') { + if ($args->{'crstype'} eq 'Community') { $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); } else { $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); } } else { my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); - if ($args->{'type'} eq 'Community') { + if ($args->{'crstype'} eq 'Community') { if ($clonedesc{'type'} ne 'Community') { $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'}); return ($can_clone, $clonemsg, $cloneid, $clonehome); @@ -10024,7 +10106,7 @@ sub check_clone { $can_clone = 1; } else { my $ccrole = 'cc'; - if ($args->{'type'} eq 'Community') { + if ($args->{'crstype'} eq 'Community') { $ccrole = 'co'; } my %roleshash = @@ -10037,7 +10119,7 @@ sub check_clone { } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) { $can_clone = 1; } else { - if ($args->{'type'} eq 'Community') { + if ($args->{'crstype'} eq 'Community') { $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); } else { $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); @@ -10096,11 +10178,19 @@ sub construct_course { # if anyone ever decides to not show this, and Utils::Course::new # will need to be suitably modified. $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; + if ($$courseid =~ /^error:/) { + return (0,$outcome); + } + # # Check if created correctly # ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid); my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom); + if ($crsuhome eq 'no_host') { + $outcome .= &mt('Course creation failed, unrecognized course home server.').$linefeed; + return (0,$outcome); + } $outcome .= &mt('Created on').': '.$crsuhome.$linefeed; # @@ -10119,6 +10209,10 @@ sub construct_course { $cenv{'url'}=$oldcenv{'url'}; # Restore title $cenv{'description'}=$oldcenv{'description'}; +# Restore creation date, creator and creation context. + $cenv{'internal.created'}=$oldcenv{'internal.created'}; + $cenv{'internal.creator'}=$oldcenv{'internal.creator'}; + $cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'}; # Mark as cloned $cenv{'clonedfrom'}=$cloneid; # Need to clone grading mode @@ -10382,6 +10476,8 @@ sub construct_course { ############################################################ ############################################################ +#SD +# only Community and Course, or anything else? sub course_type { my ($cid) = @_; if (!defined($cid)) { @@ -10547,15 +10643,12 @@ sub init_user_environment { my %userenv = &Apache::lonnet::dump('environment',$domain,$username); my ($tmp) = keys(%userenv); if ($tmp !~ /^(con_lost|error|no_such_host)/i) { - # default remote control to off - if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; } } else { undef(%userenv); } if (($userenv{'interface'}) && (!$form->{'interface'})) { $form->{'interface'}=$userenv{'interface'}; } - $env{'environment.remote'}=$userenv{'remote'}; if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; } # --------------- Do not trust query string to be put directly into environment @@ -10587,9 +10680,6 @@ sub init_user_environment { $initial_env{"browser.localres"} = $form->{'localres'}; } - if ($public) { - $initial_env{"environment.remote"} = "off"; - } if ($form->{'interface'}) { $form->{'interface'}=~s/\W//gs; $initial_env{"browser.interface"} = $form->{'interface'};