--- loncom/interface/lonhtmlcommon.pm 2019/07/27 00:38:33 1.358.2.15 +++ loncom/interface/lonhtmlcommon.pm 2024/10/21 15:44:06 1.358.2.19.2.12 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.358.2.15 2019/07/27 00:38:33 raeburn Exp $ +# $Id: lonhtmlcommon.pm,v 1.358.2.19.2.12 2024/10/21 15:44:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -78,7 +78,11 @@ sub java_not_enabled { sub coursepreflink { my ($text,$category)=@_; if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) { - return '&"').'">'.$text.''; + my $target =' target="_top"'; + if (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) { + $target = ''; + } + return '&"').'">'.$text.''; } else { return ''; } @@ -101,7 +105,11 @@ sub direct_parm_link { $filter=&entity_encode($filter); $part=&entity_encode($part); if (($symb) && (&Apache::lonnet::allowed('opa')) && ($target ne 'tex')) { - return "$linktext"; + my $target=' target="_top"'; + if (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) { + $target = ''; + } + return "$linktext"; } else { return $linktext; } @@ -848,13 +856,14 @@ parameter setting wizard. ############################################## sub pjump_javascript_definition { my $Str = < - - + + + @@ -1678,13 +1687,29 @@ 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'); - - if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)}) + 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$}))); + if (($env{'request.noversionuri'} =~ m{^/adm/viewclasslist($|\?)}) || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) { 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 '') || @@ -1693,7 +1718,7 @@ sub show_return_link { (($env{'request.noversionuri'}=~/^\/adm\//) && ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && ($env{'request.noversionuri'}!~ - m{^/adm/.*/(smppg|bulletinboard)($|\?)}) + m{^/adm/.*/(smppg|bulletinboard|ext\.tool)($|\?)}) )); } @@ -1753,6 +1778,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 +} + ############################################################ ############################################################ @@ -1771,7 +1844,8 @@ Inputs: $component (the text on the righ $component_help (the help item filename (without .tex extension). $menulink (boolean, controls whether to include a link to /adm/menu) $helplink (if 'nohelp' don't include the orange help link) - $css_class (optional name for the class to apply to the table for CSS) + $crumbs_style (optional style attribute for div containing breadcrumbs + unless called from docs_breadcrumbs) $no_mt (optional flag, 1 if &mt() is _not_ to be applied to $component when including the text on the right. $CourseBreadcrumbs (optional flag, 1 if &breadcrumbs called from &docs_breadcrumbs, @@ -1780,6 +1854,7 @@ Inputs: $component (the text on the righ row, using loncommon::help_open_topic() to generate the link. $topic_help_text (text to include in the link in the optional help item on the right side of the breadcrumbs row. + $links_target optionally includes the target (_top, _parent or _self) Returns a string containing breadcrumbs for the current page. @@ -1807,11 +1882,9 @@ returns: nothing my %tools = (); sub breadcrumbs { - my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, - $CourseBreadcrumbs,$topic_help,$topic_help_text) = @_; + 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 = ''; @@ -1824,6 +1897,16 @@ returns: nothing # The first one should be the course or a menu link if (!defined($menulink)) { $menulink=1; } if ($menulink) { + if ($env{'request.course.id'}) { + my ($menucoll,$deeplinkmenu,$menuref) = &Apache::loncommon::menucoll_in_effect(); + if (($menucoll) && (ref($menuref) eq 'HASH')) { + if ($menuref->{'main'} eq 'n') { + undef($menulink); + } + } + } + } + if ($menulink) { my $description = 'Menu'; my $no_mt_descr = 0; if ((exists($env{'request.course.id'})) && @@ -1841,9 +1924,15 @@ returns: nothing } } } + my $target = '_top'; + if ($links_target) { + $target = $links_target; + } elsif (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self')) { + $target = ''; + } $menulink = { href =>'/adm/menu', title =>'Go to main menu', - target =>'_top', + target =>$target, text =>$description, no_mt =>$no_mt_descr, }; if($last) { @@ -1861,8 +1950,8 @@ returns: nothing title => &mt('Back to most recent content resource'), class => 'LC_menubuttons_link', }; - if ($env{'request.noversionuri'} eq '/adm/searchcat') { - $hashref->{'target'} = '_top'; + if ($links_target) { + $hashref->{'target'} = $links_target; } $links=&htmltag( 'a',''.$alttext.'', $hashref); @@ -1913,11 +2002,12 @@ returns: nothing if ($faq ne '' || $component_help ne '' || $bug ne '') { $icons .= &Apache::loncommon::help_open_menu($component, $component_help, - $faq,$bug); + $faq,$bug,'','','','', + $links_target); } if ($topic_help && $topic_help_text) { $icons .= ' '.&Apache::loncommon::help_open_topic($topic_help,&mt($topic_help_text),'', - undef,600); + undef,600,'',$links_target); } # @@ -1947,8 +2037,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') { @@ -2095,7 +2190,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/) { @@ -2121,8 +2216,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 { @@ -2163,9 +2260,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, @@ -2539,9 +2644,9 @@ sub course_custom_roles { sub resource_info_box { - my ($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp)=@_; + my ($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp,$divforres)=@_; my $return=''; - if ($stuvcurrent ne '') { + if (($stuvcurrent ne '') || ($divforres)) { $return = '
'; } if ($symb) { @@ -2570,7 +2675,7 @@ sub resource_info_box { } else { $return='

'.&mt('No context provided.').'

'; } - if ($stuvcurrent ne '') { + if (($stuvcurrent ne '') || ($divforres)) { $return .= '
'; } return $return; @@ -3301,12 +3406,18 @@ PARAMSONE if (itemid != null) { itemh = itemid.offsetHeight; } - var primaryheight = document.getElementById('LC_nav_bar').offsetHeight; - var secondaryheight; + var primaryheight = 0; + if (document.getElementById('LC_nav_bar') != null) { + primaryheight = document.getElementById('LC_nav_bar').offsetHeight; + } + var secondaryheight = 0; if (document.getElementById('LC_secondary_menu') != null) { secondaryheight = document.getElementById('LC_secondary_menu').offsetHeight; } - var crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight; + var crumbsheight = 0; + if (document.getElementById('LC_breadcrumbs') != null) { + crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight; + } var dccidheight = 0; if (document.getElementById('dccid') != null) { dccidheight = document.getElementById('dccid').offsetHeight; @@ -3379,7 +3490,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,'"<>&'); } @@ -3432,7 +3566,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/}) { @@ -3442,7 +3576,7 @@ sub jump_to_editres { $anchor = $3; $is_ext = 1; if (($extlink !~ /^https:/) && ($ENV{'SERVER_PORT'} == 443)) { - unless (&Apache::lonnet::uses_sts()) { + unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { $usehttp = 1; } } elsif ($env{'request.use_absolute'}) { @@ -3457,7 +3591,7 @@ sub jump_to_editres { ($env{'course.'.$env{'request.course.id'}.'.num'} eq $cnum) && ($env{'course.'.$env{'request.course.id'}.'.domain'} eq $cdom)) { if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://}) { - unless (&Apache::lonnet::uses_sts()) { + unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { $usehttp = 1; } } @@ -3528,15 +3662,18 @@ sub jump_to_editres { # javascript_valid_email # # Generates javascript to validate an e-mail address. -# Returns a javascript function which accetps a form field as argumnent, and +# Returns a javascript function which accepts a form field as argument, and # returns false if field.value does not satisfy two regular expression matches # for a valid e-mail address. Backwards compatible with old browsers without # support for javascript RegExp (just checks for @ in field.value in this case). sub javascript_valid_email { my $scripttag .= <<'END'; -function validmail(field) { +function validmail(field,suffix) { var str = field.value; + if (suffix != '' && suffix != undefined) { + str += suffix; + } if (window.RegExp) { var reg1str = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)"; var reg2str = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"; //"