--- loncom/interface/lonhtmlcommon.pm 2022/06/11 05:07:55 1.404 +++ loncom/interface/lonhtmlcommon.pm 2025/03/06 16:42:40 1.420 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.404 2022/06/11 05:07:55 raeburn Exp $ +# $Id: lonhtmlcommon.pm,v 1.420 2025/03/06 16:42:40 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -231,15 +231,16 @@ sub dependencycheck_js { $link = '/adm/dependencies?symb='.&HTML::Entities::encode($symb,'<>&"'); } elsif ($folderpath) { $link = '/adm/dependencies?folderpath='.&HTML::Entities::encode($folderpath,'<>&"'); - $url = $uri; + $url = $uri; } elsif ($uri =~ m{^/public/$match_domain/$match_courseid/syllabus$}) { $link = '/adm/dependencies'; } - $link .= (($link=~/\?/)?'&':'?').'title='. + $link .= (($link=~/\?/)?'&':'?').'title='. &HTML::Entities::encode($title,'<>&"'); if ($url) { $link .= '&url='.&HTML::Entities::encode($url,'<>&"'); } + &js_escape(\$link); return < // 'day', + month => 'month', + year => 'year', + sec => 'seconds', + min => 'minutes', + hour => 'hours', + ); my $tzname; my ($sec,$min,$hour,$mday,$month,$year) = ('', '', undef,''.''.''); #other potentially useful values: wkday,yrday,is_daylight_savings @@ -642,7 +650,7 @@ document.$formname.$dname\_year.value, ENDJS $result .= ' '; - my $monthselector = qq{}; # Month my @Months = qw/January February March April May June July August September October November December/; @@ -656,11 +664,11 @@ ENDJS } $monthselector.= ' '; # Day - my $dayselector = qq{}; + my $dayselector = qq{}; # Year - my $yearselector = qq{}; + my $yearselector = qq{}; # - my $hourselector = qq{}; if ($includeempty) { $hourselector.=qq{}; } @@ -682,8 +690,8 @@ ENDJS $hourselector .= $timest." \n"; } $hourselector .= " \n"; - my $minuteselector = qq{}; - my $secondselector= qq{}; + my $minuteselector = qq{}; + my $secondselector= qq{}; my $cal_link; unless (($nolink) || ($state eq 'disabled')) { $cal_link = qq{}; @@ -1316,9 +1324,9 @@ sub htmlareaheaders { ENDEDITOR } $s.=(< - - + + + @@ -1737,7 +1745,11 @@ sub show_return_link { unless ($env{'request.course.id'}) { return 0; } if ($env{'request.noversionuri'}=~m{^/priv/} || $env{'request.uri'}=~m{^/priv/}) { return 1; } - return if ($env{'request.noversionuri'} eq '/adm/supplemental'); + return if (($env{'request.noversionuri'} eq '/adm/supplemental') && + ($env{'form.folder'} ne 'supplemental')); + return if (($env{'form.folderpath'} ne '') && + (($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) || + ($env{'request.noversionuri'} =~ m{^/public/$match_domain/$match_courseid/syllabus$}))); return if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') && (!$env{'request.role.adv'})); if (($env{'request.noversionuri'} =~ m{^/adm/viewclasslist($|\?)}) @@ -1745,6 +1757,19 @@ sub show_return_link { return if ($env{'form.register'}); } + if ((($env{'request.symb'} ne '') || ($env{'form.folderpath'} ne '')) && + ($env{'request.noversionuri'} =~m{^/adm/coursedocs/showdoc/uploaded/($match_domain)/($match_courseid)/(docs|supplemental)/})) { + my ($cdom,$cnum,$area) = ($1,$2,$3); + if (($env{'course.'.$env{'request.course.id'}.'.domain'} eq $cdom) && + ($env{'course.'.$env{'request.course.id'}.'.num'} eq $cnum)) { + if (($env{'request.symb'}) && ($area eq 'docs')) { + my ($map,$resid,$url) = &Apache::lonnet::decode_symb($env{'request.symb'}); + return if ($env{'request.noversionuri'} eq '/adm/coursedocs/showdoc/'.$url); + } elsif (($env{'form.folderpath'}) && ($area eq 'supplemental')) { + return; + } + } + } return (($env{'request.noversionuri'}=~m{^/(res|public)/} && $env{'request.symb'} eq '') || @@ -1813,6 +1838,54 @@ clientTime = (new Date()).getTime(); END } +## +# Client-side javascript to convert any dashes in text pasted +# into textbox(es) for numericalresponse item(s) to a standard +# minus, i.e., - . Calls to dash_to_minus_js() in end_problem() +# and in loncommon::endbodytag() for a .page (arg: dashjs => 1) +# +# Will apply to any input tag with class: LC_numresponse_text. +# Currently set in start_textline for numericalresponse items. +# + +sub dash_to_minus_js { + return <<'ENDJS'; + + + +ENDJS +} + ############################################################ ############################################################ @@ -1849,9 +1922,10 @@ boolean, controls whether to include a l if 'nohelp' don't include the orange help link -=item $css_class +=item $crumbs_style -optional name for the class to apply to the table for CSS +optional style attribute for div containing breadcrumbs +unless called from docs_breadcrumbs =item $no_mt @@ -1909,11 +1983,9 @@ returns: nothing my %tools = (); sub breadcrumbs { - my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, + my ($component,$component_help,$menulink,$helplink,$crumbs_style,$no_mt, $CourseBreadcrumbs,$topic_help,$topic_help_text,$links_target) = @_; # - $css_class ||= 'LC_breadcrumbs'; - # Make the faq and bug data cascade my $faq = ''; my $bug = ''; @@ -2015,7 +2087,7 @@ returns: nothing if ($lasttext ne '') { $links .= &htmltag( 'li', htmltag($CourseBreadcrumbs ? 'b' : 'h1', - $lasttext), {title => $lasttext}); + $lasttext)); } my $icons = ''; @@ -2067,8 +2139,13 @@ returns: nothing } if (($links ne '') || ($nav_and_tools)) { &render_tools(\$links); - $links = &htmltag('div', $links, - { id => "LC_breadcrumbs" }) unless ($CourseBreadcrumbs) ; + unless ($CourseBreadcrumbs) { + my $args = { id => 'LC_breadcrumbs' }; + if ($crumbs_style ne '') { + $args->{'style'} = $crumbs_style; + } + $links = &htmltag('div', $links, $args); + } } my $adv_tools = 0; if (ref($tools{'advtools'}) eq 'ARRAY') { @@ -2085,9 +2162,8 @@ returns: nothing # Return the breadcrumb's line - - - return "$links"; + my $labeltext = &HTML::Entities::encode(&mt('Links for navigation and information')); + return ''; } sub clear_breadcrumbs { @@ -2237,7 +2313,7 @@ returns: nothing } # End of scope for @Crumbs sub docs_breadcrumbs { - my ($allowed,$crstype,$contenteditor,$title,$precleared)=@_; + my ($allowed,$crstype,$contenteditor,$title,$precleared,$checklinkprot)=@_; my ($folderpath,@folders,$supplementalflag); @folders = split('&',$env{'form.folderpath'}); if ($env{'form.folderpath'} =~ /^supplemental/) { @@ -2263,8 +2339,10 @@ sub docs_breadcrumbs { # each of randompick number, hidden, encrypted, random order, is_page # are appended with ":"s to the foldername $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)\:?(\d*)$//; - unless ($supplementalflag) { - if ($contenteditor) { + if ($contenteditor) { + if ($supplementalflag) { + if ($2) { $ishidden=1; } + } else { if ($1 ne '') { $randompick=$1; } else { @@ -2305,9 +2383,17 @@ sub docs_breadcrumbs { $plain=~s/\>\;\s*$//; } my $menulink = 0; - if (!$allowed && !$contenteditor) { + if (!$allowed && !$contenteditor && !$supplementalflag) { $menulink = 1; } + if ($checklinkprot) { + if ($env{'request.deeplink.login'}) { + my $linkprotout = &Apache::lonmenu::linkprot_exit(); + if ($linkprotout) { + &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$linkprotout); + } + } + } return (&breadcrumbs(undef,undef,$menulink,'nohelp',undef,undef, $contenteditor), $randompick,$ishidden,$isencrypted,$plain, @@ -2410,7 +2496,7 @@ END } sub row_title { - my ($title,$css_title_class,$css_value_class, $css_value_furtherAttributes) = @_; + my ($title,$css_title_class,$css_value_class,$css_value_furtherAttributes,$nocolon) = @_; $row_count[0]++; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; $css_title_class ||= 'LC_pick_box_title'; @@ -2418,14 +2504,14 @@ sub row_title { $css_value_class ||= 'LC_pick_box_value'; - if ($title ne '') { + if (($title ne '') && (!$nocolon)) { $title .= ':'; } my $output = <<"ENDONE"; - + $title - + ENDONE return $output; @@ -3527,7 +3613,10 @@ THIRD sub javascript_jumpto_resource { my $confirm_switch = &mt("Editing requires switching to the resource's home server.")."\n". &mt('Switch server?'); + my $confirm_new_tab = &mt("Editing requires using the resource's home server.")."\n". + &mt('Open a new browser tab?'); &js_escape(\$confirm_switch); + &js_escape(\$confirm_new_tab); return (<&'); - if ($symb) { - $cfile .= '&symb='.&HTML::Entities::encode($symb,'"<>&'); + if ($shownsymb) { + $cfile .= '&symb='.&HTML::Entities::encode($shownsymb,'"<>&'); + if ($resedit) { + $cfile .= '&edit=1'; + } } elsif ($folderpath) { $cfile .= '&folderpath='.&HTML::Entities::encode($folderpath,'"<>&'); } @@ -3580,7 +3693,7 @@ sub jump_to_editres { if ($forcereg) { $cfile .= '&register=1'; } - $jscall = "need_switchserver('".&Apache::loncommon::escape_single($cfile)."');"; + $jscall = "need_switchserver('".&Apache::loncommon::escape_single($cfile)."','$target')"; } } else { unless ($cfile =~ m{^/priv/}) { @@ -3863,7 +3976,7 @@ sub list_from_array { sub generate_menu { my @menu = @_; # subs for specific html elements - my ($h3, $div, $ul, $li, $a, $img) = inittags( qw(h3 div ul li a img) ); + my ($h2, $div, $ul, $li, $a, $img) = inittags( qw(h2 div ul li a img) ); my @categories; # each element represents the entire markup for a category @@ -3886,30 +3999,25 @@ sub generate_menu { src => $src, alt => mt(defined($$link{alttext}) ? $$link{alttext} : $$link{linktext}) - }), { - href => $$link{url}, - title => mt($$link{linktitle}), - class => 'LC_menubuttons_link' - }). - $a->(mt($$link{linktext}), { + }).mt($$link{linktext}), { href => $$link{url}, title => mt($$link{linktitle}), class => "LC_menubuttons_link" }). - (defined($$link{help}) ? + (defined($$link{help}) ? Apache::loncommon::help_open_topic($$link{help}) : ''), {class => "LC_menubuttons_inline_text"})); } - # wrap categorytitle in

, concatenate with + # wrap categorytitle in

, concatenate with # joined and in
    tags wrapped @links # and wrap everything in an enclosing
    and push it into # @categories # such that each element looks like: - #

    title

    • ...
    • ...
    + #

    title

    • ...
    • ...
    # the category won't be added if there aren't any links push(@categories, - $div->($h3->(mt($$category{categorytitle}), {class=>"LC_hcell"}). + $div->($h2->(mt($$category{categorytitle}), {class=>'LC_hcell LC_heading_2'}). $ul->(join('' ,@links), {class =>"LC_ListStyleNormal" }), {class=>"LC_Box LC_400Box"})) if scalar(@links); }