--- loncom/interface/lonmenu.pm 2012/05/25 03:23:36 1.369.2.7 +++ loncom/interface/lonmenu.pm 2012/05/29 19:40:44 1.381 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.369.2.7 2012/05/25 03:23:36 raeburn Exp $ +# $Id: lonmenu.pm,v 1.381 2012/05/29 19:40:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -117,9 +117,9 @@ Same as primary_menu() but operates on @ =item create_submenu() -Creates XHTML for unordered list of sub-menu items which belong to a +Creates XHTML for unordered list of sub-menu items which belong to a particular top-level menu item. Uses hover pseudo class in css to display -dropdown list when mouse hovers over top-level item. Support for IE6 +dropdown list when mouse hovers over top-level item. Support for IE6 (no hover psuedo class) via LC_hoverable class for <li> tag for top- level item, which employs jQuery to handle behavior on mouseover. @@ -179,9 +179,10 @@ use Apache::lonlocal; use Apache::lonmsg(); use LONCAPA qw(:DEFAULT :match); use HTML::Entities(); +use Apache::lonwishlist(); use vars qw(@desklines %category_names %category_members %category_positions - $readdesk @primary_menu %primary_submenu @secondary_menu %secondary_submenu); + $readdesk @primary_menu %primary_submenu @secondary_menu); my @inlineremote; @@ -246,12 +247,12 @@ sub primary_menu { my @primsub; if (ref($primary_submenu{$title}) eq 'ARRAY') { foreach my $item (@{$primary_submenu{$title}}) { - next if (($item->[2] eq 'wishlist') && + next if (($item->[2] eq 'wishlist') && ((!&Apache::lonnet::allowed('bre',"/res/$env{'user.domain'}/")) && (!&Apache::lonnet::allowed('bro',"/res/$env{'user.domain'}/")))); next if (($item->[2] eq 'reqcrs') && (!&check_for_rcrs())); - next if ((($item->[2] eq 'portfolio') || - ($item->[2] eq 'blog')) && + next if ((($item->[2] eq 'portfolio') || + ($item->[2] eq 'blog')) && (!&Apache::lonnet::usertools_access('','',$item->[2], undef,'tools'))); push(@primsub,$item); @@ -319,12 +320,12 @@ sub secondary_menu { : ''); my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'}); my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'}; - my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec); - my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec); - my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec); + my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec); + my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec); + my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec); my $canmodpara = &Apache::lonnet::allowed('opa', $crs_sec); my $canvgr = &Apache::lonnet::allowed('vgr', $crs_sec); - my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec); + my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec); my $author = &getauthor(); my %groups = &Apache::lonnet::get_active_groups( @@ -340,10 +341,6 @@ sub secondary_menu { && !$env{'request.course.id'}; next if $$menuitem[4] =~ /^mdc/ && !$canedit; - next if $$menuitem[4] eq 'mdcCourse' - && ($crstype eq 'Community'); - next if $$menuitem[4] eq 'mdcCommunity' - && ($crstype eq 'Course'); next if $$menuitem[4] eq 'nvgr' && $canvgr; next if $$menuitem[4] eq 'vgr' @@ -360,45 +357,19 @@ sub secondary_menu { && !$canviewwnew; next if $$menuitem[4] eq 'opa' && !$canmodpara; - next if $$menuitem[4] eq 'nvcg' - && ($canviewgrps || !%groups); + next if $$menuitem[4] =~ /showgroups$/ + && !$canviewgrps + && !%groups; next if $$menuitem[4] eq 'author' && !$author; - my $title = $menuitem->[3]; - if (defined($secondary_submenu{$title})) { - my ($link,$target); - if ($menuitem->[0] ne '') { - $link = $menuitem->[0]; - $target = '_top'; - } else { - $link = '#'; - } - my @scndsub; - if (ref($secondary_submenu{$title}) eq 'ARRAY') { - foreach my $item (@{$secondary_submenu{$title}}) { - if (ref($item) eq 'ARRAY') { - next if ($item->[2] eq 'vgr' && !$canvgr); - next if ($item->[2] eq 'opa' && !$canmodpara); - next if ($item->[2] eq 'cst' && !$canmodifyuser); - next if ($item->[2] eq 'mgr' && !$canmgr); - next if ($item->[2] eq 'vcg' && !$canviewgrps); - push(@scndsub,$item); - } - } - if (@scndsub > 0) { - $menu .= &create_submenu($link,$target,$title,\@scndsub); - } elsif ($link) { - $menu .= '<li><a href="'.$link.'" target="'.$target.'">'.&mt($title).'</a></li>'; - } - } - } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) { + if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) { # special treatment for role selector my $roles_selector = &roles_selector( $env{'course.' . $env{'request.course.id'} . '.domain'}, $env{'course.' . $env{'request.course.id'} . '.num'} ); - $menu .= $roles_selector ? "<li style=\"padding: 0 0.8em;\">$roles_selector</li>" + $menu .= $roles_selector ? "<li>$roles_selector</li>" : ''; } else { $menu .= &prep_menuitem(\@$menuitem); @@ -431,8 +402,12 @@ sub secondary_menu { sub create_submenu { my ($link,$target,$title,$submenu) = @_; return unless (ref($submenu) eq 'ARRAY'); + my $disptarget; + if ($target ne '') { + $disptarget = ' target="'.$target.'"'; + } my $menu = '<li class="LC_hoverable">'. - '<a href="'.$link.'" target="'.$target.'">'. + '<a href="'.$link.'"'.$disptarget.'>'. '<span class="LC_nobreak">'.&mt($title). '<span class="LC_fontsize_small" style="font-weight:normal;">'. ' ▼</span></span></a>'. @@ -448,7 +423,6 @@ sub create_submenu { } $menu .= '<li style="margin:0;padding:0;'. $borderbot.'"><a href="'.$item->[0].'">'. - '" style="padding:0;">'. &mt($item->[1]).'</a></li>'; } } @@ -736,9 +710,14 @@ c&6&3 c&8&1 c&8&2 s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document -s&9&1&sbkm.png&Bookmark&set[_1]bookmark[_2]&set_bookmark()&Set a bookmark for this resource&&1 - ENDMENUITEMS + if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F' && $env{'request.uri'} =~ /^\/res/) { + # wishlist is only available for users with access to resource-pool + # and links can only be set for resources within the resource-pool + $menuitems .= (<<ENDMENUITEMS); +s&9&1&wishlist-link.png&Stored Links&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1 +ENDMENUITEMS + } my $currentURL = &Apache::loncommon::get_symb(); my ($symb_old,$symb_old_enc) = &Apache::loncommon::clean_symb($currentURL); @@ -768,6 +747,12 @@ ENDREALRES $menuitems .= (<<ENDMENUITEMS); s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document ENDMENUITEMS + if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F') { + # wishlist is only available for users with access to resource-pool + $menuitems .= (<<ENDMENUITEMS); +s&9&1&wishlist-link.png&Stored Links&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1 +ENDMENUITEMS + } } my $buttons=''; foreach (split(/\n/,$menuitems)) { @@ -797,9 +782,18 @@ ENDMENUITEMS &Apache::lonhtmlcommon::add_breadcrumb_tool( 'navigation', @inlineremote[21,23]); - if(hidden_button_check() ne 'yes') { + my $countdown = &countdown_timer(); + if (&hidden_button_check() eq 'yes') { + if ($countdown) { + &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown); + } + } else { + my @tools = @inlineremote[93,91,81,82,83]; + if ($countdown) { + unshift(@tools,$countdown); + } &Apache::lonhtmlcommon::add_breadcrumb_tool( - 'tools', @inlineremote[93,91,81,82,83]); + 'tools',@tools); #publish button in construction space if ($env{'request.state'} eq 'construct'){ @@ -858,164 +852,6 @@ sub edit_course_upload { return $cfile; } -sub startupremote { - my ($lowerurl)=@_; - if ($env{'environment.remote'} eq 'off') { - return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />'); - } -# -# The Remote actually gets launched! -# - my $configmenu=&rawconfig(); - my $esclowerurl=&escape($lowerurl); - my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited'); - return(<<ENDREMOTESTARTUP); -<script type="text/javascript"> -// <![CDATA[ -var timestart; -function wheelswitch() { - if (typeof(document.wheel) != 'undefined') { - if (typeof(document.wheel.spin) != 'undefined') { - var date=new Date(); - var waited=Math.round(30-((date.getTime()-timestart)/1000)); - document.wheel.spin.value=$message; - } - } - if (window.status=='|') { - window.status='/'; - } else { - if (window.status=='/') { - window.status='-'; - } else { - if (window.status=='-') { - window.status='\\\\'; - } else { - if (window.status=='\\\\') { window.status='|'; } - } - } - } -} - -// ---------------------------------------------------------- The wait function -var canceltim; -function wait() { - if ((menuloaded==1) || (tim==1)) { - window.status='Done.'; - if (tim==0) { - clearTimeout(canceltim); - $configmenu - window.location='$lowerurl'; - } else { - window.location='/adm/remote?action=collapse&url=$esclowerurl'; - } - } else { - wheelswitch(); - setTimeout('wait();',200); - } -} - -function main() { - canceltim=setTimeout('tim=1;',30000); - window.status='-'; - var date=new Date(); - timestart=date.getTime(); - wait(); -} - -// ]]> -</script> -ENDREMOTESTARTUP -} - -sub setflags() { - return(<<ENDSETFLAGS); -<script type="text/javascript"> -// <![CDATA[ - menuloaded=0; - tim=0; -// ]]> -</script> -ENDSETFLAGS -} - -sub maincall() { - if ($env{'environment.remote'} eq 'off') { return ''; } - return(<<ENDMAINCALL); -<script type="text/javascript"> -// <![CDATA[ - main(); -// ]]> -</script> -ENDMAINCALL -} - -sub load_remote_msg { - my ($lowerurl)=@_; - - if ($env{'environment.remote'} eq 'off') { return ''; } - - my $esclowerurl=&escape($lowerurl); - my $link=&mt('[_1]Continue[_2] on in Inline Menu mode' - ,'<a href="/adm/remote?action=collapse&url='.$esclowerurl.'">' - ,'</a>'); - return(<<ENDREMOTEFORM); -<p> -<form name="wheel"> -<input name="spin" type="text" size="60" /> -</form> -</p> -<p>$link</p> -ENDREMOTEFORM -} - -sub get_menu_name { - my $hostid = $Apache::lonnet::perlvar{'lonHostID'}; - $hostid =~ s/\W//g; - return 'LCmenu'.$hostid; -} - - -sub reopenmenu { - if ($env{'environment.remote'} eq 'off') { return ''; } - my $menuname = &get_menu_name(); - my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); - return('window.open('.$nothing.',"'.$menuname.'","",false);'); -} - - -sub open { - my $returnval=''; - if ($env{'environment.remote'} eq 'off') { - return - '<script type="text/javascript">'."\n" - .'// <![CDATA['."\n" - .'self.name="loncapaclient";'."\n" - .'// ]]>'."\n" - .'</script>'; - } - my $menuname = &get_menu_name(); - -# unless (shift eq 'unix') { -# resizing does not work on linux because of virtual desktop sizes -# $returnval.=(<<ENDRESIZE); -#if (window.screen) { -# self.resizeTo(screen.availWidth-215,screen.availHeight-55); -# self.moveTo(190,15); -#} -#ENDRESIZE -# } - $returnval=(<<ENDOPEN); -// <![CDATA[ -window.status='Opening LON-CAPA Remote Control'; -var menu=window.open("/res/adm/pages/menu.html?inhibitmenu=yes","$menuname", -"height=375,width=150,scrollbars=no,menubar=no,top=5,left=5,screenX=5,screenY=5"); -self.name='loncapaclient'; -// ]]> -ENDOPEN - return '<script type="text/javascript">'.$returnval.'</script>'; -} - - # ================================================================== Raw Config sub clear { @@ -1068,9 +904,19 @@ sub switch { } } else { # Inline Menu - $inlineremote[$idx]= + my @tools = (93,91,81,82,83); + unless ($env{'request.state'} eq 'construct') { + push(@tools,63); + } + if (($env{'environment.icons'} eq 'iconsonly') && + (grep(/^$idx$/,@tools))) { + $inlineremote[$idx] = + '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.'</a>'; + } else { + $inlineremote[$idx] = '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic. '<span class="LC_menubuttons_inline_text">'.$top.' </span></a>'; + } } return ''; } @@ -1331,28 +1177,6 @@ sub check_for_rcrs { return $showreqcrs; } -# ======================================================================= Close - -sub close { - if ($env{'environment.remote'} eq 'off') { return ''; } - my $menuname = &get_menu_name(); - return(<<ENDCLOSE); -<script type="text/javascript"> -// <![CDATA[ -window.status='Accessing Remote Control'; -menu=window.open("/adm/rat/empty.html","$menuname", - "height=350,width=150,scrollbars=no,menubar=no"); -window.status='Disabling Remote Control'; -menu.active=0; -menu.autologout=0; -window.status='Closing Remote Control'; -menu.close(); -window.status='Done.'; -// ]]> -</script> -ENDCLOSE -} - sub dc_popup_js { my %lt = &Apache::lonlocal::texthash( more => '(More ...)', @@ -1378,6 +1202,27 @@ END } +sub countdown_toggle_js { + return <<"END"; + +function toggleCountdown() { + var countdownid = document.getElementById('duedatecountdown'); + var currstyle = countdownid.style.display; + if (currstyle == 'inline') { + countdownid.style.display = 'none'; + document.getElementById('ddcountcollapse').innerHTML=''; + document.getElementById('ddcountexpand').innerHTML='◄ '; + } else { + countdownid.style.display = 'inline'; + document.getElementById('ddcountcollapse').innerHTML='► '; + document.getElementById('ddcountexpand').innerHTML=''; + } + return; +} + +END +} + sub utilityfunctions { my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0])); if ($currenturl =~ m{^/adm/wrapper/ext/} @@ -1406,21 +1251,14 @@ sub utilityfunctions { my $end_page_annotate = &Apache::loncommon::end_page({'js_ready' => 1}); - my $start_page_bookmark = - &Apache::loncommon::start_page('Bookmarks',undef, - {'only_body' => 1, - 'js_ready' => 1, - 'bgcolor' => '#BBBBBB',}); - - my $end_page_bookmark = - &Apache::loncommon::end_page({'js_ready' => 1}); - my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'. &mt('Switch server?'); my $esc_url=&escape($currenturl); my $esc_symb=&escape($currentsymb); + my $countdown = &countdown_toggle_js(); + return (<<ENDUTILITY) var currentURL=unescape("$esc_url"); @@ -1531,13 +1369,6 @@ function group_chat(group) { grpchat=window.open(url,winName,'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no'); } -function edit_bookmarks() { - go(''); - w_BookmarkPal_flag=1; - bookmarkpal=window.open("/adm/bookmarks", - "BookmarkPal", "width=500,height=505,scrollbars=0"); -} - function annotate() { w_Annotator_flag=1; annotator=window.open('','Annotator','width=365,height=265,scrollbars=0'); @@ -1551,6 +1382,19 @@ function annotate() { annotator.document.close(); } +function open_StoredLinks_Import(rat) { + var newWin; + if (rat) { + newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import&rat='+rat, + 'wishlistImport','scrollbars=1,resizable=1,menubar=0'); + } + else { + newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import', + 'wishlistImport','scrollbars=1,resizable=1,menubar=0'); + } + newWin.focus(); +} + (function (\$) { \$(document).ready(function () { \$.single=function(a){return function(b){a[0]=b;return a}}(\$([1])); @@ -1565,27 +1409,7 @@ function annotate() { }); }(jQuery)); -function set_bookmark() { - go(''); - clienttitle=document.title; - clienthref=location.pathname; - w_bmquery_flag=1; - bmquery=window.open('','bmquery','width=365,height=165,scrollbars=0'); - bmquery.document.write( - '$start_page_bookmark' - +'<center><form method="post"' - +' name="newlink" action="/adm/bookmarks" target="bmquery" ' - +'> <table width="340" height="150" ' - +'bgcolor="#FFFFFF" align="center"><tr><td>Link Name:<br /><input ' - +'type="text" name="title" size="45" value="'+clienttitle+'" />' - +'<br />Address:<br /><input type="text" name="address" size="45" ' - +'value="'+clienthref+'" /><br /><center><input type="submit" ' - +'value="Save" /> <input type="button" value="Close" ' - +'onclick="javascript:window.close();" /></center></td>' - +'</tr></table></form></center>' - +'$end_page_bookmark' ); - bmquery.document.close(); -} +$countdown ENDUTILITY } @@ -1985,6 +1809,52 @@ sub required_privs { return $privs; } +sub countdown_timer { + if (($env{'request.course.id'}) && ($env{'request.symb'} ne '') && + ($env{'request.filename'}=~/$LONCAPA::assess_re/) && + ($Apache::inputtags::status[-1] eq 'CAN_ANSWER')) { + my $duedate = &Apache::lonnet::EXT("resource.0.duedate"); + my @interval=&Apache::lonnet::EXT("resource.0.interval"); + my $hastimeleft; + if (@interval > 1) { + my $first_access=&Apache::lonnet::get_first_access($interval[1]); + if ($first_access > 0) { + if ($first_access+$interval[0] > time) { + $hastimeleft = 1; + } + } + } + if (($duedate && $duedate > time) || + (!$duedate && $hastimeleft)) { + my ($collapse,$expand,$alttxt,$title,$currdisp); + if (@interval > 1 && $hastimeleft) { + $currdisp = 'inline'; + $collapse = '► '; + } else { + $currdisp = 'none'; + $expand = '◄ '; + } + unless ($env{'environment.icons'} eq 'iconsonly') { + $alttxt = &mt('Timer'); + $title = $alttxt.' '; + } + my $desc = &mt('Countdown to due date/time'); + return <<END; + +<a href="javascript:toggleCountdown();" class="LC_menubuttons_link"> +<span id="ddcountcollapse" class="LC_menubuttons_inline_text"> +$collapse +</span></a> +<span id="duedatecountdown" class="LC_menubuttons_inline_text" style="display: $currdisp;"></span> +<a href="javascript:toggleCountdown();" class="LC_menubuttons_link"> +<span id="ddcountexpand" class="LC_menubuttons_inline_text" >$expand</span> +<img src="/res/adm/pages/timer.png" title="$desc" class="LC_icon" alt="$alttxt" /><span class="LC_menubuttons_inline_text">$title</span></a> +END + } + } + return; +} + # ================================================================ Main Program BEGIN { @@ -2009,9 +1879,6 @@ BEGIN { } elsif ($configline=~/^scnd\:/) { my @entries = (split(/\:/, $configline))[1..5]; push @secondary_menu, \@entries; - } elsif ($configline=~/^scndsub\:/) { - my ($parent,@entries) = (split(/\:/, $configline))[1..4]; - push (@{$secondary_submenu{$parent}},\@entries); } elsif ($configline) { push(@desklines,$configline); }