--- loncom/interface/lonmenu.pm 2021/06/07 03:32:02 1.507 +++ loncom/interface/lonmenu.pm 2022/05/26 15:41:38 1.517 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.507 2021/06/07 03:32:02 raeburn Exp $ +# $Id: lonmenu.pm,v 1.517 2022/05/26 15:41:38 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -99,7 +99,7 @@ It gets filled in the BEGIN block of thi =over -=item prep_menuitems(\@menuitem,$ltitarget) +=item prep_menuitems(\@menuitem,$ltitarget,$deeplinktarget,$listclass,$linkattr) This routine wraps a menuitem in proper HTML. It is used by primary_menu() and secondary_menu(). @@ -220,7 +220,7 @@ use vars qw(@desklines %category_names % my @inlineremote; sub prep_menuitem { - my ($menuitem,$ltitarget) = @_; + my ($menuitem,$ltitarget,$deeplinktarget,$listclass,$linkattr) = @_; return '' unless(ref($menuitem) eq 'ARRAY'); my $link; if ($$menuitem[1]) { # graphical Link @@ -233,11 +233,13 @@ sub prep_menuitem { my $target = ' target="_top"'; if ($ltitarget eq 'iframe') { $target =''; + } elsif ($deeplinktarget eq '_self') { + $target = ' target="'.$deeplinktarget.'"'; } - return '
  • ':'
  • ').'$link
  • |; + . qq| href="$$menuitem[0]"$target $linkattr>$link|; } # primary_menu() evaluates @primary_menu and returns a two item array, @@ -247,7 +249,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,$ltimenu,$menucoll,$menuref) = @_; + my ($crstype,$ltimenu,$menucoll,$menuref,$links_disabled) = @_; my (%menu,%ltiexc,%menuopts); # each element of @primary contains following array: # (link url, icon path, alt text, link text, condition, position) @@ -265,7 +267,7 @@ sub primary_menu { my %roles_in_env; $rolecount = &Apache::lonroles::roles_from_env(\%roles_in_env,$update); } - my ($lti,$ltitarget); + my ($lti,$ltitarget,$deeplinktarget); if ($env{'request.lti.login'}) { $lti = 1; $ltitarget = $env{'request.lti.target'}; @@ -277,6 +279,9 @@ sub primary_menu { } } } + if ($env{'request.deeplink.login'}) { + $deeplinktarget = $env{'request.deeplink.target'}; + } if (($menucoll) && (ref($menuref) eq 'HASH')) { %menuopts = %{$menuref}; } @@ -295,10 +300,10 @@ sub primary_menu { # users next if $$menuitem[4] eq 'roles' ##show links depending on && (&Apache::loncommon::show_course() ##term 'Courses' or - || $env{'request.lti.login'}); ##'Roles' wanted + || $lti); ##'Roles' wanted next if $$menuitem[4] eq 'courses' ##and not LTI access && (!&Apache::loncommon::show_course() - || !$env{'request.lti.login'}); + || $lti); next if $$menuitem[4] eq 'notlti' && $lti; next if $$menuitem[4] eq 'ltiexc' @@ -316,13 +321,32 @@ sub primary_menu { $position = 'right'; } if ($env{'request.course.id'} && $menucoll) { - next if (($menuitem->[6]) && (!$menuopts{$menuitem->[6]})); + if (($menuitem->[6]) && (!$menuopts{$menuitem->[6]})) { + if ($menuitem->[6] eq 'pers') { + if ($menuopts{'name'} && !$ltiexc{'fullname'} && + $env{'user.name'} && $env{'user.domain'}) { + $menu{$position} .= '
  • '. + &Apache::loncommon::plainname($env{'user.name'}, + $env{'user.domain'}).'
  • '; + next; + } else { + next; + } + } else { + next; + } + } + } + my ($listclass,$linkattr); + if ($links_disabled) { + $listclass = 'LCisDisabled'; + $linkattr = 'aria-disabled="true"'; } if (defined($primary_submenu{$title})) { my ($link,$target); if ($menuitem->[0] ne '') { $link = $menuitem->[0]; - unless ($ltitarget eq 'iframe') { + unless (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) { $target = '_top'; } } else { @@ -342,18 +366,25 @@ sub primary_menu { } push(@primsub,$item); } - if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) { - unless (($ltiexc{'fullname'}) || - (($env{'request.course.id'}) && ($menucoll) && (!$menuopts{'name'}))) { - $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); + if ($title eq 'Personal') { + if ($env{'user.name'} && $env{'user.domain'} && !$ltiexc{'fullname'}) { + unless (($env{'request.course.id'}) && ($menucoll) && (!$menuopts{'name'})) { + $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}); + } + } + next if (($env{'request.course.id'}) && ($menucoll) && ($title eq 'Personal') && + (!@primsub)); + if ($title eq 'Personal') { + $title = &mt($title); } } else { $title = &mt($title); } if (@primsub > 0) { - $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1); + $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1,undef,$listclass,$linkattr); } elsif ($link) { - $menu{$position} .= '
  • '.$title.'
  • '; + $menu{$position} .= ($listclass?'
  • ':'
  • '). + ''.$title.'
  • '; } } } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink @@ -365,13 +396,22 @@ sub primary_menu { 'helpdeskmail', $defdom,$origmail); if ($to ne '') { - $menu{$position} .= &prep_menuitem($menuitem,$ltitarget); + $menu{$position} .= &prep_menuitem($menuitem,$ltitarget,$deeplinktarget,$listclass,$linkattr); } } else { - $menu{$position} .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; + $menu{$position} .= ($listclass?'
  • ':'
  • '). + &Apache::loncommon::top_nav_help('Help',$linkattr). + '
  • '; } + } elsif ($$menuitem[3] eq 'Log In') { + if ($public) { + if (&Apache::lonnet::get_saml_landing()) { + $$menuitem[0] = '/adm/login'; + } + } + $menu{$position} .= prep_menuitem($menuitem,$ltitarget,$deeplinktarget,$listclass,$linkattr); } else { - $menu{$position} .= prep_menuitem($menuitem,$ltitarget); + $menu{$position} .= prep_menuitem($menuitem,$ltitarget,$deeplinktarget,$listclass,$linkattr); } } my @output = ('',''); @@ -410,7 +450,7 @@ sub getauthor{ } sub secondary_menu { - my ($httphost,$ltiscope,$ltimenu,$noprimary,$menucoll,$menuref) = @_; + my ($httphost,$ltiscope,$ltimenu,$noprimary,$menucoll,$menuref,$links_disabled) = @_; my $menu; my $crstype = &Apache::loncommon::course_type(); @@ -487,6 +527,12 @@ sub secondary_menu { %menuopts = %{$menuref}; } + my ($listclass,$linkattr); + if ($links_disabled) { + $listclass = 'LCisDisabled'; + $linkattr = 'aria-disabled="true"'; + } + my ($canmodifycoauthor); if ($env{'request.role'} eq "au./$env{'user.domain'}/") { my $extent = "$env{'user.domain'}/$env{'user.name'}"; @@ -496,10 +542,13 @@ sub secondary_menu { } } - my ($roleswitcher_js,$roleswitcher_form,$ltitarget); + my ($roleswitcher_js,$roleswitcher_form,$ltitarget,$deeplinktarget); if ($env{'request.lti.login'}) { $ltitarget = $env{'request.lti.target'}; } + if ($env{'request.deeplink.login'}) { + $deeplinktarget = $env{'request.deeplink.target'}; + } foreach my $menuitem (@secondary_menu) { # evaluate conditions @@ -557,7 +606,7 @@ sub secondary_menu { my ($link,$target); if ($menuitem->[0] ne '') { $link = $menuitem->[0]; - unless ($ltitarget eq 'iframe') { + unless (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) { $target = '_top'; } } else { @@ -593,9 +642,12 @@ sub secondary_menu { } } if (@scndsub > 0) { - $menu .= &create_submenu($link,$target,&mt($title),\@scndsub,1); + $menu .= &create_submenu($link,$target,&mt($title),\@scndsub,1,undef, + $listclass,$linkattr); } elsif ($link ne '#') { - $menu .= '
  • '.&mt($title).'
  • '; + $menu .= ($listclass?'
  • ':'
  • '). + ''. + &mt($title).'
  • '; } } } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) { @@ -605,7 +657,7 @@ sub secondary_menu { &roles_selector( $env{'course.' . $env{'request.course.id'} . '.domain'}, $env{'course.' . $env{'request.course.id'} . '.num'}, - $httphost,$ltitarget + $httphost ); if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]})) { next unless ($has_opa_priv); @@ -639,7 +691,7 @@ sub secondary_menu { } $$menuitem[0] = &HTML::Entities::encode($$menuitem[0],'&<>"'); } - $menu .= &prep_menuitem(\@$menuitem,$ltitarget); + $menu .= &prep_menuitem(\@$menuitem,$ltitarget,$deeplinktarget,$listclass,$linkattr); } } if ($menu =~ /\[url\].*\[symb\]/) { @@ -677,7 +729,7 @@ sub secondary_menu { } sub create_submenu { - my ($link,$target,$title,$submenu,$translate,$addclass) = @_; + my ($link,$target,$title,$submenu,$translate,$addclass,$listclass,$linkattr) = @_; return unless (ref($submenu) eq 'ARRAY'); my $disptarget; if ($target ne '') { @@ -692,7 +744,7 @@ sub create_submenu { # $link and $title are only used in the initial string written in $menu # as seen above, not needed for nested submenus - $menu .= &build_submenu($target, $submenu, $translate, '1'); + $menu .= &build_submenu($target, $submenu, $translate, '1', $listclass, $linkattr); $menu .= ''; return $menu; @@ -702,7 +754,7 @@ sub create_submenu { # build the dropdown (and nested submenus) recursively # see perldoc create_submenu documentation for further information sub build_submenu { - my ($target, $submenu, $translate, $first_level) = @_; + my ($target, $submenu, $translate, $first_level, $listclass, $linkattr) = @_; unless (@{$submenu}) { return ''; } @@ -767,8 +819,10 @@ sub build_submenu { } } - $menu .= '
  • '; - $menu .= '' . $title . ''; + $menu .= '
  • '; + $menu .= '' . $title . ''; $menu .= '
  • '; } } @@ -1010,6 +1064,13 @@ sub innerregister { $currdir =~ s|[^/]+$||; my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn); my $esc_currdir = &Apache::loncommon::escape_single($currdir); + my $pubfile = "/res/$udom/$uname/$thisdisfn"; + my $candelete = 1; + if (-e $londocroot.$pubfile) { + unless (&Apache::lonnet::metadata($pubfile,'obsolete')) { + undef($candelete); + } + } # # Probably should be in mydesk.tab # @@ -1017,7 +1078,18 @@ sub innerregister { s&6&1&list.png&Directory&dir[_1]&golist('$esc_currdir')&List current directory s&6&2&rtrv.png&Retrieve&version[_1]&gocstr('/adm/retrieve','/priv/$udom/$uname/$cleandisfn')&Retrieve old version s&6&3&pub.png&Publish&resource[_3]&gocstr('/adm/publish','/priv/$udom/$uname/$cleandisfn')&Publish this resource +s&7&3©.png&Copy&resource[_4]&gocstr('/adm/cfile?action=copy','/priv/$udom/$uname/$cleandisfn')&Copy this resource +ENDMENUITEMS +# +# Rename and Delete only available if obsolete or unpublished +# + if ($candelete) { + $menuitems .= (< @@ -2380,7 +2482,8 @@ ENDSERVERFORM sub constspaceform { my ($target,$printtarget); - unless (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + unless ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) || + (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) { $target = ' target="_top"'; $printtarget = ' target="_parent"'; } @@ -2397,6 +2500,11 @@ sub constspaceform { +
    + + + +
    ENDCONSTSPACEFORM } @@ -2412,7 +2520,7 @@ sub hidden_button_check { } sub roles_selector { - my ($cdom,$cnum,$httphost,$ltitarget) = @_; + my ($cdom,$cnum,$httphost) = @_; my $crstype = &Apache::loncommon::course_type(); my $now = time; my (%courseroles,%seccount,%courseprivs,%roledesc); @@ -2584,7 +2692,7 @@ sub roles_selector { } } if (@submenu > 0) { - $switcher = &create_submenu('','',&mt('Switch role'),\@submenu,'','',$ltitarget); + $switcher = &create_submenu('','',&mt('Switch role'),\@submenu); } } return ($js,$form,$switcher,$has_opa_priv);