Diff for /loncom/interface/loncommon.pm between versions 1.1422 and 1.1435

version 1.1422, 2023/11/26 20:47:16 version 1.1435, 2024/09/10 20:34:41
Line 1372  sub helpLatexCheatsheet { Line 1372  sub helpLatexCheatsheet {
         $out .= '<span>'          $out .= '<span>'
                .&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600)                 .&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600)
                .'</span> <span>'                 .'</span> <span>'
                .&help_open_topic('Authoring_Multilingual_Problems',&mt('How to create problems in different languages'),$stayOnPage,undef,600)                 .&help_open_topic('Authoring_Multilingual_Problems',&mt('Languages'),$stayOnPage,undef,600)
        .'</span>';         .'</span>';
     }      }
     $out .= '</span>'; # End cheatsheet      $out .= '</span>'; # End cheatsheet
Line 1764  the id of the element to resize, second Line 1764  the id of the element to resize, second
 surrounds everything that comes after the textarea, this routine needs  surrounds everything that comes after the textarea, this routine needs
 to be attached to the <body> for the onload and onresize events.  to be attached to the <body> for the onload and onresize events.
   
 =back  
   
 =cut  =cut
   
 sub resize_textarea_js {  sub resize_textarea_js {
Line 2439  sub show_crsfiles_js { Line 2437  sub show_crsfiles_js {
 END  END
 }  }
   
   sub crsauthor_rights {
       my ($rightsfile,$path,$docroot,$cnum,$cdom) = @_;
       my $sourcerights = "$path/$rightsfile";
       my $now = time;
       if (!-e $sourcerights) {
           my $cid = $cdom.'_'.$cnum;
           if (!-e "$docroot/priv/$cdom") {
               mkdir("$docroot/priv/$cdom",0755);
           }
           if (!-e "$docroot/priv/$cdom/$cnum") {
               mkdir("$docroot/priv/$cdom/$cnum",0755);
           }
           if (open(my $fh,">$sourcerights")) {
               print $fh <<END;
   <accessrule effect="deny" realm="" type="course" role="" />
   <accessrule effect="allow" realm="$cid" type="course" role="" />
   END
               close($fh);
           }
       }
       if (!-e "$sourcerights.meta") {
           if (open(my $fh,">$sourcerights.meta")) {
               my $author=$env{'environment.firstname'}.' '.
                          $env{'environment.middlename'}.' '.
                          $env{'environment.lastname'}.' '.
                          $env{'environment.generation'};
               $author =~ s/\s+$//;
               print $fh <<"END";
   
   <abstract></abstract>
   <author>$author</author>
   <authorspace>$cnum:$cdom</authorspace>
   <copyright>private</copyright>
   <creationdate>$now</creationdate>
   <customdistributionfile></customdistributionfile>
   <dependencies></dependencies>
   <domain>$cdom</domain>
   <highestgradelevel>0</highestgradelevel>
   <keywords></keywords>
   <language>notset </language>
   <lastrevisiondate>$now</lastrevisiondate>
   <lowestgradelevel>0</lowestgradelevel>
   <mime>rights</mime>
   <modifyinguser>$env{'user.name'}:$env{'user.domain'}</modifyinguser>
   <notes></notes>
   <obsolete></obsolete>
   <obsoletereplacement></obsoletereplacement>
   <owner>$cnum:$cdom</owner>
   <rule>deny:::course,allow:$cid::course</rule>
   <sourceavail></sourceavail>
   <standards></standards>
   <subject></subject>
   <title>Course Authoring Rights</title>
   END
               close($fh);
           }
       }
       return;
   }
   
 =pod  =pod
   
 =item * &iframe_wrapper_headjs()  =item * &iframe_wrapper_headjs()
   
   emits javascript containing two global vars to facilitate handling of resizing
   by code in iframe_wrapper_resizejs() used when an iframe is present in a page
   with standard LON-CAPA menus.
   
   =cut
   
 #  #
 # Where iframe is in use, if window.onload() executes before the custom resize function  # Where iframe is in use, if window.onload() executes before the custom resize function
 # has been defined (jQuery), two global javascript vars (LCnotready and LCresizedef)  # has been defined (jQuery), two global javascript vars (LCnotready and LCresizedef)
Line 2450  END Line 2514  END
 # do not obscure the Functions menu.  # do not obscure the Functions menu.
 #  #
   
 =back  
   
 =cut  
   
   
 sub iframe_wrapper_headjs {  sub iframe_wrapper_headjs {
     return <<"ENDJS";      return <<"ENDJS";
 <script type="text/javascript">  <script type="text/javascript">
Line 2472  ENDJS Line 2531  ENDJS
   
 =item * &iframe_wrapper_resizejs()  =item * &iframe_wrapper_resizejs()
   
   emits javascript used to handle resizing for a page containing
   an iframe, to ensure that the iframe does not obscure any
   standard LON-CAPA menu items.
   
   =back
   
   =cut
   
 #  #
 # jQuery to use when iframe is in use and a page resize occurs.  # jQuery to use when iframe is in use and a page resize occurs.
 # This script will ensure that the iframe does not obscure any  # This script will ensure that the iframe does not obscure any
Line 2481  ENDJS Line 2548  ENDJS
 # e.g., by inclusion in second arg passed to &start_page().  # e.g., by inclusion in second arg passed to &start_page().
 #  #
   
 =back  
   
 =cut  
   
 sub iframe_wrapper_resizejs {  sub iframe_wrapper_resizejs {
     my $offset = 5;      my $offset = 5;
     &get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);      &get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);
Line 2501  sub iframe_wrapper_resizejs { Line 2564  sub iframe_wrapper_resizejs {
             if (\$('div.LC_menus_content:first').length) {              if (\$('div.LC_menus_content:first').length) {
                 if (\$('div.LC_menus_content:first').hasClass ("shown")) {                  if (\$('div.LC_menus_content:first').hasClass ("shown")) {
                     header = \$('div.LC_menus_content:first');                      header = \$('div.LC_menus_content:first');
                     offset = 9;                      offset = 12;
                 }                  }
             } else if (\$('div.LC_head_subbox:first').length) {              } else if (\$('div.LC_head_subbox:first').length) {
                 header = \$('div.LC_head_subbox:first');                  header = \$('div.LC_head_subbox:first');
Line 3887  sub passwd_validation_js { Line 3950  sub passwd_validation_js {
         } else {          } else {
             $alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';              $alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';
         }          }
       } elsif ($context eq 'ltitools') {
           my %domconfig = &Apache::lonnet::get_dom('configuration',['toolsec'],$domain);
           if (ref($domconfig{'toolsec'}) eq 'HASH') {
               if (ref($domconfig{'toolsec'}{'rules'}) eq 'HASH') {
                   %passwdconf = %{$domconfig{'toolsec'}{'rules'}};
               }
           }
           if ($id eq 'add') {
               $alertmsg = &mt('Secret for added external tool did not satisfy requirement(s):').'\n\n';
           } elsif ($id =~ /^\d+$/) {
               my $pos = $id+1;
               $alertmsg = &mt('Secret for external tool [_1] did not satisfy requirement(s):','#'.$pos).'\n\n';
           } else {
               $alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';
           }
     } else {      } else {
         %passwdconf = &Apache::lonnet::get_passwdconf($domain);          %passwdconf = &Apache::lonnet::get_passwdconf($domain);
         $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';          $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';
Line 6473  Input: (optional) filename from which br Line 6551  Input: (optional) filename from which br
        If page header is being requested for use in a frameset, then         If page header is being requested for use in a frameset, then
        the second (option) argument -- frameset will be true, and         the second (option) argument -- frameset will be true, and
        the target attribute set for links should be target="_parent".         the target attribute set for links should be target="_parent".
        If $title is supplied as the thitd arg, that will be used to          If $title is supplied as the third arg, that will be used to 
        the left of the breadcrumbs tail for the current path.         the left of the breadcrumbs tail for the current path.
   
 Returns: HTML div with CSTR path and recent box  Returns: HTML div with CSTR path and recent box
Line 6593  sub nocodemirror { Line 6671  sub nocodemirror {
 Input: $uri (optional)  Input: $uri (optional)
   
 Returns: %editors hash in which keys are editors  Returns: %editors hash in which keys are editors
          permitted in current Authoring Space.           permitted in current Authoring Space,
            or in current course for web pages
            created in a course.
   
          Value for each key is 1. Possible keys           Value for each key is 1. Possible keys
          are: edit, xml, and daxe. If no specific           are: edit, xml, and daxe.
   
            For a regular Authoring Space, if no specific
          set of editors has been set for the Author           set of editors has been set for the Author
          who owns the Authoring Space, then the           who owns the Authoring Space, then the
          domain default will be used.  If no domain           domain default will be used.  If no domain
          default has been set, then the keys will be           default has been set, then the keys will be
          edit and xml.           edit and xml.
   
            For a course author, or for web pages created
            in a course, if no specific set of editors has
            been set for the course, then the domain
            course default will be used. If no domain
            course default has been set, then the keys
            will be edit and xml.
   
 =cut  =cut
   
 sub permitted_editors {  sub permitted_editors {
     my ($uri) = @_;      my ($uri) = @_;
     my ($is_author,$is_coauthor,$auname,$audom,%editors);      my ($is_author,$is_coauthor,$is_course,$auname,$audom,%editors);
     if ($env{'request.role'} =~ m{^au\./}) {      if ($env{'request.role'} =~ m{^au\./}) {
         $is_author = 1;          $is_author = 1;
     } elsif ($env{'request.role'} =~ m{^(?:ca|aa)\./($match_domain)/($match_username)}) {      } elsif ($env{'request.role'} =~ m{^(?:ca|aa)\./($match_domain)/($match_username)}) {
Line 6620  sub permitted_editors { Line 6710  sub permitted_editors {
             }              }
         }          }
     } elsif ($env{'request.course.id'}) {      } elsif ($env{'request.course.id'}) {
         if ($env{'request.editurl'} =~ m{^/priv/($match_domain)/($match_username)/}) {          my ($cdom,$cnum);
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           if (($env{'request.editurl'} =~ m{^/priv/\Q$cdom/$cnum\E/}) ||
               ($env{'request.editurl'} =~ m{^/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/}) ||
               ($uri =~ m{^/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/})) {
               $is_course = 1;
           } elsif ($env{'request.editurl'} =~ m{^/priv/($match_domain)/($match_username)/}) {
             ($audom,$auname) = ($1,$2);              ($audom,$auname) = ($1,$2);
         } elsif ($env{'request.uri'} =~ m{^/priv/($match_domain)/($match_username)/}) {          } elsif ($env{'request.uri'} =~ m{^/priv/($match_domain)/($match_username)/}) {
             ($audom,$auname) = ($1,$2);              ($audom,$auname) = ($1,$2);
         } elsif (($uri eq '/daxesave') &&          } elsif (($uri eq '/daxesave') &&
                    (($env{'form.path'} =~ m{^/daxeopen/priv/\Q$cdom/$cnum\E/}) ||
                     ($env{'form.path'} =~ m{^/daxeopen/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/}))) {
               $is_course = 1;
           } elsif (($uri eq '/daxesave') &&
                  ($env{'form.path'} =~ m{^/daxeopen/priv/($match_domain)/($match_username)/})) {                   ($env{'form.path'} =~ m{^/daxeopen/priv/($match_domain)/($match_username)/})) {
             ($audom,$auname) = ($1,$2);              ($audom,$auname) = ($1,$2);
         }          }
         if (($audom ne '') && ($auname ne '')) {          unless ($is_course) {
             if (($env{'user.domain'} eq $audom) &&              if (($audom ne '') && ($auname ne '')) {
                 ($env{'user.name'} eq $auname)) {                  if (($env{'user.domain'} eq $audom) &&
                 $is_author = 1;                      ($env{'user.name'} eq $auname)) {
             } else {                      $is_author = 1;
                 $is_coauthor = 1;                  } else {
                       $is_coauthor = 1;
                   }
             }              }
         }          }
     }      }
Line 6653  sub permitted_editors { Line 6756  sub permitted_editors {
                          xml => 1,                           xml => 1,
                        );                         );
         }          }
       } elsif ($is_course) {
           if (exists($env{'course.'.$env{'request.course.id'}.'.internal.crseditors'})) {
               map { $editors{$_} = 1; } split(/,/,$env{'course.'.$env{'request.course.id'}.'.internal.crseditors'});
           } else {
               my %domdefaults = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
               if (exists($domdefaults{'crseditors'})) {
                   map { $editors{$_} = 1; } split(/,/,$domdefaults{'crseditors'});
               } else {
                   %editors = ( edit => 1,
                                xml => 1,
                              );
               }
           }
     } else {      } else {
         %editors = ( edit => 1,          %editors = ( edit => 1,
                      xml => 1,                       xml => 1,
Line 6887  sub bodytag { Line 7003  sub bodytag {
         $bodytag .= Apache::lonhtmlcommon::scripttag(          $bodytag .= Apache::lonhtmlcommon::scripttag(
             Apache::lonmenu::utilityfunctions($httphost), 'start');              Apache::lonmenu::utilityfunctions($httphost), 'start');
   
         if ($args->{'collapsible_header'}) {          my $collapsible;
             my $alttext = &mt('menu state: collapsed');          if ($args->{'collapsible_header'} ne '') {
             my $tooltip = &mt('display standard menus');              $collapsible = 1;
               my ($menustate,$tiptext,$divclass);
               if ($args->{'start_collapsed'}) {
                   $menustate = 'collapsed';
                   $tiptext = 'display';
                   $divclass = 'hidden';
               } else {
                   $menustate = 'expanded';
                   $tiptext = 'hide';
                   $divclass = 'shown';
               }
               my $alttext = &mt('menu state: '.$menustate);
               my $tooltip = &mt($tiptext.' standard menus');
             $bodytag .= <<"END";              $bodytag .= <<"END";
 <div id="LC_expandingContainer" style="display:inline;">  <div id="LC_expandingContainer" style="display:inline;">
 <div id="LC_collapsible" class="LC_collapse_trigger" style="position: absolute;top: -5px;left: 0px; z-index:101; display:inline;">  <div id="LC_collapsible" class="LC_collapse_trigger" style="position: absolute;top: -5px;left: 0px; z-index:101; display:inline;">
 <a href="#" style="text-decoration:none;"><img class="LC_collapsible_indicator" alt="$alttext" title="$tooltip" src="/res/adm/pages/collapsed.png" style="border:0;margin:0;padding:0;max-width:100%;height:auto" /></a></div>  <a href="#" style="text-decoration:none;"><img class="LC_collapsible_indicator" alt="$alttext" title="$tooltip" src="/res/adm/pages/$menustate.png" style="border:0;margin:0;padding:0;max-width:100%;height:auto" /></a></div>
 <div class="LC_menus_content hidden">  <div class="LC_menus_content $divclass">
 END  END
         }          }
         unless ($args->{'no_primary_menu'}) {          unless ($args->{'no_primary_menu'}) {
             my ($left,$right) = Apache::lonmenu::primary_menu($crstype,$ltimenu,$menucoll,$menuref,              my ($left,$right) = Apache::lonmenu::primary_menu($crstype,$ltimenu,$menucoll,$menuref,
                                                               $args->{'links_disabled'},                                                                $args->{'links_disabled'},
                                                               $args->{'links_target'},                                                                $args->{'links_target'},
                                                               $args->{'collapsible_header'});                                                                $collapsible);
   
             if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {              if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
                 if ($dc_info) {                  if ($dc_info) {
Line 6960  END Line 7088  END
             $bodytag .= '<hr style="clear:both" />';              $bodytag .= '<hr style="clear:both" />';
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');               $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); 
         }          }
         if ($args->{'collapsible_header'}) {          if ($args->{'collapsible_header'} ne '') {
             $bodytag .= '<div id="LC_collapsible_separator"></div>'.              $bodytag .= $args->{'collapsible_header'}.
                           '<div id="LC_collapsible_separator"></div>'.
                         '</div></div>';                          '</div></div>';
         }          }
         return $bodytag;          return $bodytag;
Line 7157  form, .inline { Line 7286  form, .inline {
 }  }
   
 .LC_menus_content.shown{  .LC_menus_content.shown{
   display: inline;    display: block;
 }  }
   
 .LC_menus_content.hidden {  .LC_menus_content.hidden {
Line 9500  OFFLOAD Line 9629  OFFLOAD
  $title = 'The LearningOnline Network with CAPA';   $title = 'The LearningOnline Network with CAPA';
     }      }
     if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }      if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
     $result .= '<title> LON-CAPA '.$title.'</title>'      if ($title =~ /^LON-CAPA\s+/) {
  .'<link rel="stylesheet" type="text/css" href="'.$url.'"';          $result .= '<title> '.$title.'</title>';
       } else {
           $result .= '<title> LON-CAPA '.$title.'</title>';
       }
       $result .= "\n".'<link rel="stylesheet" type="text/css" href="'.$url.'"';
     if (!$args->{'frameset'}) {      if (!$args->{'frameset'}) {
         $result .= ' /';          $result .= ' /';
     }      }
Line 9516  OFFLOAD Line 9649  OFFLOAD
     }      }
     if ($clientmobile) {      if ($clientmobile) {
         $result .= '          $result .= '
 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta name="apple-mobile-web-app-capable" content="yes" />';  <meta name="apple-mobile-web-app-capable" content="yes" />';
     }      }
     $result .= '<meta name="google" content="notranslate" />'."\n";      $result .= '<meta name="google" content="notranslate" />'."\n";
Line 17958  sub init_user_environment { Line 18091  sub init_user_environment {
                 } else {                  } else {
                     $userenv{'editors'} = 'edit,xml';                      $userenv{'editors'} = 'edit,xml';
                 }                  }
                   if ($userenv{'authorarchive'}) {
                       $userenv{'canarchive'} = 1;
                   } elsif (($userenv{'authorarchive'} eq '') &&
                            ($domdef{'archive'})) {
                       $userenv{'canarchive'} = 1;
                   }
             }              }
   
             $userenv{'canrequest.author'} =              $userenv{'canrequest.author'} =

Removed from v.1.1422  
changed lines
  Added in v.1.1435


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>