--- loncom/interface/lonmenu.pm 2016/03/16 13:54:06 1.441 +++ loncom/interface/lonmenu.pm 2016/06/02 01:43:46 1.450 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.441 2016/03/16 13:54:06 raeburn Exp $ +# $Id: lonmenu.pm,v 1.450 2016/06/02 01:43:46 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -124,9 +124,13 @@ dropdown list when mouse hovers over top (no hover psuedo class) via LC_hoverable class for
  • tag for top- level item, which employs jQuery to handle behavior on mouseover. -Inputs: 4 - (a) link and (b) target for anchor href in top level item, - (c) title for text wrapped by anchor tag in top level item. - (d) reference to array of arrays of sub-menu items. +Inputs: 6 - (a) link and (b) target for anchor href in top level item, + (c) title for text wrapped by anchor tag in top level item, + (d) reference to array of arrays of sub-menu items, + (e) boolean to indicate whether to call &mt() to translate + name of menu item, + (f) optional class for
  • element in primary menu, for which + sub menu is being generated. The underlying datastructure used in (d) contains data from mydesk.tab. It consists of an array which has an array for each item appearing in @@ -238,6 +242,7 @@ sub prep_menuitem { # @primary_menu is filled within the BEGIN block of this module with # entries from mydesk.tab sub primary_menu { + my ($crstype) = @_; my (%menu); # each element of @primary contains following array: # (link url, icon path, alt text, link text, condition, position) @@ -246,6 +251,15 @@ sub primary_menu { || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) { $public = 1; } + my $rolecount; + if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) { + my $update=$env{'user.update.time'}; + if (!$update) { + $update = $env{'user.login.time'}; + } + my %roles_in_env; + $rolecount = &Apache::lonroles::roles_from_env(\%roles_in_env,$update); + } foreach my $menuitem (@primary_menu) { # evaluate conditions next if ref($menuitem) ne 'ARRAY'; # @@ -263,8 +277,14 @@ sub primary_menu { && &Apache::loncommon::show_course(); ##term 'Courses' or next if $$menuitem[4] eq 'courses' ##'Roles' wanted && !&Apache::loncommon::show_course(); ## - my $title = $menuitem->[3]; + if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) { + if ($menuitem->[4] eq 'courses') { + next unless ($rolecount>1); + } else { + next unless (($title eq 'Personal') || ($title eq 'Logout')); + } + } my $position = $menuitem->[5]; if ($position eq '') { $position = 'right'; @@ -280,6 +300,7 @@ sub primary_menu { my @primsub; if (ref($primary_submenu{$title}) eq 'ARRAY') { foreach my $item (@{$primary_submenu{$title}}) { + next if (($crstype eq 'Placement') && (!$env{'request.role.adv'})); next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'})); next if ((($item->[2] eq 'portfolio') || ($item->[2] eq 'blog')) && @@ -287,18 +308,19 @@ sub primary_menu { undef,'tools'))); push(@primsub,$item); } + if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) { + $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); + } else { + $title = &mt($title); + } if (@primsub > 0) { - if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) { - $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); - } else { - $title = &mt($title); - } $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1); } elsif ($link) { - $menu{$position} .= '
  • '.&mt($title).'
  • '; + $menu{$position} .= '
  • '.$title.'
  • '; } } } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink + next if ($crstype eq 'Placement'); if ($public) { my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'}; my $defdom = &Apache::lonnet::default_login_domain(); @@ -424,6 +446,7 @@ sub secondary_menu { foreach my $menuitem (@secondary_menu) { # evaluate conditions next if ref($menuitem) ne 'ARRAY'; + next if (($crstype eq 'Placement') && ($$menuitem[3] ne 'Roles') && (!$env{'request.role.adv'})); next if $$menuitem[4] ne 'always' && ($$menuitem[4] ne 'author' && $$menuitem[4] ne 'cca') && !$env{'request.course.id'}; @@ -515,13 +538,13 @@ sub secondary_menu { } sub create_submenu { - my ($link,$target,$title,$submenu,$translate) = @_; + my ($link,$target,$title,$submenu,$translate,$addclass) = @_; return unless (ref($submenu) eq 'ARRAY'); my $disptarget; if ($target ne '') { $disptarget = ' target="'.$target.'"'; } - my $menu = '
  • '. + my $menu = '
  • '. ''. ''.$title. ''. @@ -541,7 +564,7 @@ sub create_submenu { # see perldoc create_submenu documentation for further information sub build_submenu { my ($target, $submenu, $translate, $first_level) = @_; - if (!defined(@{$submenu})) { + unless (@{$submenu}) { return ''; } @@ -609,25 +632,25 @@ sub innerregister { undef(@inlineremote); - my ($mapurl,$resurl); + my ($mapurl,$resurl,$crstype); if ($env{'request.course.id'}) { +# +#course_type: Course, Community, or Placement +# + $crstype = &Apache::loncommon::course_type(); if ($env{'request.symb'}) { ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread()); my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'}; my $maptitle = &Apache::lonnet::gettitle($mapurl); my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread()); - -#SD -#course_type only Course and Community? -# my @crumbs; unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps') && - ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) { - @crumbs = ({text => Apache::loncommon::course_type() - . ' Contents', + ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) || + (($crstype eq 'Placement') && (!$env{'request.role.adv'}))) { + @crumbs = ({text => $crstype.' Contents', href => "Javascript:gopost('/adm/navmaps','')"}); } if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { @@ -635,9 +658,11 @@ sub innerregister { no_mt => 1}); } - push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle - && $maptitle ne 'default.sequence' - && $maptitle ne $coursetitle); + unless (($crstype eq 'Placement') || (!$env{'request.role.adv'})) { + push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle + && $maptitle ne 'default.sequence' + && $maptitle ne $coursetitle); + } push @crumbs, {text => $restitle, no_mt => 1} if $restitle; my @tools; @@ -655,7 +680,6 @@ sub innerregister { } else { $resurl = $env{'request.noversionuri'}; my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'}); - my $crstype = &Apache::loncommon::course_type(); my $title = &mt('View Resource'); if ($resurl =~ m{^\Q/uploaded$courseurl/supplemental/\E(default|\d+)/}) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folderpath','title']); @@ -817,10 +841,30 @@ ENDMENUITEMS # We are in a course and looking at a registered URL # Should probably be in mydesk.tab # - $menuitems=(<new(); + if (ref($navmap)) { + if (&Apache::lonplacementtest::is_lastres($env{'request.symb'},$navmap)) { + $showforw = 0; + } + } + } + if ($showforw) { + $menuitems.=" +s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3"; + } + } + $menuitems .= (< 'WARNING!', - button => 'Done', preamble => 'You are trying to end this timed event early.', map => 'Confirming that you are done will cause the time to expire and prevent you from changing any answers in the current folder.', resource => 'Confirming that you are done will cause the time to expire for this question, and prevent you from changing your answer(s).', @@ -1595,14 +1650,12 @@ sub done_button_js { nokey => 'A proctor key is required', ); my $navmap = Apache::lonnavmaps::navmap->new(); - my ($missing,$tried); + my ($missing,$tried) = (0,0); if (ref($navmap)) { - $missing=0; - $tried=0; my @resources=(); if ($type eq 'map') { my ($mapurl,$rid,$resurl)=&Apache::lonnet::decode_symb($env{'request.symb'}); - @resources=$navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0); + @resources=$navmap->retrieveResources($mapurl,sub { $_[0]->is_problem() }); } else { my $res = $navmap->getBySymb($env{'request.symb'}); if (ref($res)) { @@ -1612,13 +1665,7 @@ sub done_button_js { } } foreach my $res (@resources) { - if ($res->singlepart()) { - if (!$res->tries()) { - $missing++; - } else { - $tried++; - } - } else { + if (ref($res->parts()) eq 'ARRAY') { foreach my $part (@{$res->parts()}) { if (!$res->tries($part)) { $missing++; @@ -1642,6 +1689,7 @@ sub done_button_js { $lt{'miss'} .= ' '.&mt('If you confirm you are done you will be unable to submit an answer for it.').'

    '; } } + $donebuttontext = &HTML::Entities::encode($donebuttontext,'<>&"'); if ($proctor) { if ($height !~ /^\d+$/) { $height = 400; @@ -1659,14 +1707,14 @@ sub done_button_js {
    - +

    $lt{'preamble'} $lt{$type}

    $lt{'miss'}

    $lt{'proctor'}

    -
    +
    @@ -1740,7 +1788,7 @@ END
    - +
    @@ -2445,9 +2493,17 @@ sub countdown_timer { } my $duedate = &Apache::lonnet::EXT("resource.0.duedate"); my @interval=&Apache::lonnet::EXT("resource.0.interval"); - my ($timelimit,$usesdone,$proctor,$secret); + my ($timelimit,$usesdone,$donebuttontext,$proctor,$secret); if (@interval > 1) { - ($timelimit,$usesdone,$proctor,$secret) = split(/_/,$interval[0]); + ($timelimit,my $donesuffix) = split(/_/,$interval[0],2); + if ($donesuffix =~ /^done\:([^\:]+)\:(.*)$/) { + $usesdone = 'done'; + $donebuttontext = $1; + (undef,$proctor,$secret) = split(/_/,$2); + } elsif ($donesuffix =~ /^done(|_.+)$/) { + $donebuttontext = &mt('Done'); + ($usesdone,$proctor,$secret) = split(/_/,$donesuffix); + } my $first_access=&Apache::lonnet::get_first_access($interval[1]); if ($first_access > 0) { if ($first_access+$timelimit > time) { @@ -2465,7 +2521,7 @@ sub countdown_timer { $collapse = '► '; if ((@interval > 1) && ($hastimeleft)) { if ($usesdone eq 'done') { - $donebutton = &done_button_js($interval[1],'','',$proctor); + $donebutton = &done_button_js($interval[1],'','',$proctor,$donebuttontext); } } } else { @@ -2494,6 +2550,13 @@ END return; } +sub placement_progress { + my ($totalpoints,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1); + my $complete = 100 - $incomplete; + return ''. + &mt('Test is [_1]% complete',$complete).''; +} + # ================================================================ Main Program BEGIN {