Diff for /loncom/interface/lonparmset.pm between versions 1.601 and 1.621

version 1.601, 2021/08/04 19:59:10 version 1.621, 2023/12/22 13:38:02
Line 329  use Apache::lonnavmaps; Line 329  use Apache::lonnavmaps;
 use Apache::longroup;  use Apache::longroup;
 use Apache::lonrss;  use Apache::lonrss;
 use HTML::Entities;  use HTML::Entities;
   use Text::Wrap();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   
Line 1252  function validateParms() { Line 1253  function validateParms() {
     var dlKeyRegExp = /^deeplink_key_/;      var dlKeyRegExp = /^deeplink_key_/;
     var dlMenusRegExp = /^deeplink_menus_/;      var dlMenusRegExp = /^deeplink_menus_/;
     var dlCollsRegExp = /^deeplink_colls_/;      var dlCollsRegExp = /^deeplink_colls_/;
       var dlTargetRegExp = /^deeplink_target_/;
       var dlExitRegExp = /^deeplink_exit_/;
       var dlExitTextRegExp = /^deeplink_exittext_/;
     var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;      var patternIP = /[\[\]\*\.a-zA-Z\d\-]+/;
     if ((document.parmform.elements.length != 'undefined')  && (document.parmform.elements.length) != 'null') {      var numelements = document.parmform.elements.length;
         if (document.parmform.elements.length) {      if ((typeof(numelements) != 'undefined') && (numelements != null)) {
             for (i=0; i<document.parmform.elements.length; i++) {          if (numelements) {
               for (i=0; i<numelements; i++) {
                 var name=document.parmform.elements[i].name;                  var name=document.parmform.elements[i].name;
                 if (textRegExp.test(name)) {                  if (textRegExp.test(name)) {
                     var identifier = name.replace(textRegExp,'');                      var identifier = name.replace(textRegExp,'');
Line 1406  function validateParms() { Line 1411  function validateParms() {
                             }                              }
                             document.parmform.elements['set_'+identifier].value += posslinkmenu;                              document.parmform.elements['set_'+identifier].value += posslinkmenu;
                         }                          }
                       } else if (dlTargetRegExp.test(name)) {
                           var identifier =  name.replace(dlTargetRegExp,'');
                           var idx = document.parmform.elements[i].selectedIndex;
                           if (idx > 0) {
                               var linktarget = document.parmform.elements[i].options[idx].value
                               linktarget = linktarget.replace(/^\s+|\s+$/g,'');
                               if (document.parmform.elements['set_'+identifier].value) {
                                   linktarget = ','+linktarget;
                               }
                               document.parmform.elements['set_'+identifier].value += linktarget;
                           }
                       } else if (dlExitRegExp.test(name)) {
                           if (document.parmform.elements[i].checked) {
                               var identifier =  name.replace(dlExitRegExp,'');
                               var posslinkexit = document.parmform.elements[i].value;
                               posslinkexit = posslinkexit.replace(/^\s+|\s+$/g,'');
                               if (document.parmform.elements['set_'+identifier].value) {
                                   posslinkexit = ','+posslinkexit;
                               }
                               document.parmform.elements['set_'+identifier].value += posslinkexit;
                           }
                       } else if (dlExitTextRegExp.test(name)) {
                           var identifier = name.replace(dlExitTextRegExp,'');
                           if ((isRadioSet('deeplink_exit_'+identifier,'yes')) ||
                               (isRadioSet('deeplink_exit_'+identifier,'url'))) {
                               var posstext = document.parmform.elements[i].value;
                               posstext = posstext.replace(/^\s+|\s+$/g,'');
                               var origlength = posstext.length;
                               posstext = posstext.replace(/[:;'",]/g,'');
                               var newlength = posstext.length;
                               if (newlength > 0) {
                                   var change = origlength - newlength;
                                   if (change) {
                                       alert(change+' disallowed character(s) removed from Exit Button text');
                                   }
                                   if (posstext !== 'Exit Tool') {
                                       posstext = ':'+posstext;
                                       document.parmform.elements['set_'+identifier].value += posstext;
                                   }
                               } else {
                                   document.parmform.elements['set_'+identifier].value = '';
                                   if (newlength < origlength) {
                                       alert("An exit link type of 'In use' was selected but the button text value was blank, after removing disallowed characters.\nDisallowed characters are ,\":;'");
                                   } else {
                                       alert("An exit link type of 'In use' was selected but the button text value was blank.\nPlease enter the text to use.");
                                   }
                                   return false;
                               }
                           }
                     }                      }
                 }                  }
             }              }
Line 1461  END Line 1515  END
   
 # Javascript function toggleSecret, for overview mode.  # Javascript function toggleSecret, for overview mode.
 sub done_proctor_js {  sub done_proctor_js {
       my $defaultdone = &mt('Done');
       &js_escape(\$defaultdone);
     return <<"END";      return <<"END";
 function toggleSecret(form,radio,key) {  function toggleSecret(form,radio,key) {
     var radios = form[radio+key];      var radios = form[radio+key];
Line 1477  function toggleSecret(form,radio,key) { Line 1533  function toggleSecret(form,radio,key) {
                         document.getElementById('done_'+key+'_proctorkey').value='';                          document.getElementById('done_'+key+'_proctorkey').value='';
                     }                      }
                 }                  }
                   if (document.getElementById('done_'+key+'_buttontext')) {
                       if (radios[i].value == '') {
                           document.getElementById('done_'+key+'_buttontext').value = '';
                       } else {
                           if (document.getElementById('done_'+key+'_buttontext').value == '') {
                               document.getElementById('done_'+key+'_buttontext').value = '$defaultdone';
                           }
                       }
                   }
             }              }
         }          }
     }      }
Line 1539  function toggleDeepLink(form,item,key) { Line 1604  function toggleDeepLink(form,item,key) {
                             keybox.type = 'hidden';                              keybox.type = 'hidden';
                         }                          }
                     }                      }
                   } else if (item == 'exit') {
                       if (document.getElementById('deeplinkdiv_'+item+'_'+key)) {
                           if (radios[i].value == 'no') {
                               document.getElementById('deeplinkdiv_'+item+'_'+key).style.display = 'none';          
                               if (document.getElementById('deeplink_exittext_'+key)) {
                                   if (document.getElementById('deeplink_exittext_'+key).value != '') {
                                       document.getElementById('deeplink_exittext_'+key).value = '';    
                                   }
                               }
                           } else {
                               document.getElementById('deeplinkdiv_'+item+'_'+key).style.display = 'inline-block';
                               if (document.getElementById('deeplink_exittext_'+key)) {
                                   if (document.getElementById('deeplink_exittext_'+key).value == '') {
                                       document.getElementById('deeplink_exittext_'+key).value = 'Exit Tool';
                                   }
                               }
                           }
                       }
                 }                  }
             }              }
         }          }
Line 1667  sub print_row { Line 1750  sub print_row {
     if ($automatic) {      if ($automatic) {
         $parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';          $parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';
     }      }
       my $advice;
       if ((ref($name) eq 'HASH') && ($name->{$which} eq 'mapalias') &&
           (ref($symbp) eq 'HASH') && ($parmlev eq 'full')) {
           if ($symbp->{$rid} =~ m{^uploaded/}) {
               if ($result == 14) {
                   $advice = &mt('Use Course Editor to modify this.');
               } else {
                   $advice = &mt('Use Course Editor to set this.');
               }
           } else {
               if ($result == 14) {
                   $advice = &mt('Use Resource Assembly Tool to modify this.');
               } else {
                   $advice = &mt('Use Resource Assembly Tool to set this.');
               }
           }
           $parm .= '<br /><span class="LC_fontsize_small LC_cusr_emph">'.$advice.'</span>';
       }
     $r->print('<td>'.$parm.'</td>');      $r->print('<td>'.$parm.'</td>');
   
     my $thismarker=$which;      my $thismarker=$which;
Line 1736  sub print_row { Line 1837  sub print_row {
         my ($domltistr,$crsltistr);          my ($domltistr,$crsltistr);
         my %lti =          my %lti =
             &Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'},              &Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'},
                                             'provider');                                              'linkprot');
         if (keys(%lti)) {          if (keys(%lti)) {
             foreach my $item (sort { $a <=> $b }  (keys(%lti))) {              foreach my $item (sort { $a <=> $b }  (keys(%lti))) {
                 if (ref($lti{$item}) eq 'HASH') {                  if (($item =~ /^\d+$/) && (ref($lti{$item}) eq 'HASH')) {
                     unless ($lti{$item}{'requser'}) {                      $domltistr .= $item.':'.&escape(&escape($lti{$item}{'name'})).',';
                         $domltistr .= $item.':'.&escape(&escape($lti{$item}{'consumer'})).',';  
                     }  
                 }                  }
             }              }
             $domltistr =~ s/,$//;              $domltistr =~ s/,$//;
Line 1750  sub print_row { Line 1849  sub print_row {
                 $extra = 'ltid_'.$domltistr;                  $extra = 'ltid_'.$domltistr;
             }              }
         }          }
         my %courselti = &Apache::lonnet::get_course_lti($cnum,$cdom);          my %courselti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider');
         if (keys(%courselti)) {          if (keys(%courselti)) {
             foreach my $item (sort { $a <=> $b } keys(%courselti)) {              foreach my $item (sort { $a <=> $b } keys(%courselti)) {
                 if (($item =~ /^\d+$/) && (ref($courselti{$item}) eq 'HASH')) {                  if (($item =~ /^\d+$/) && (ref($courselti{$item}) eq 'HASH')) {
Line 2076  sub parm_control_group { Line 2175  sub parm_control_group {
 # @param {hash reference} $uris - hash resource/map id -> resource src  # @param {hash reference} $uris - hash resource/map id -> resource src
 # @param {hash reference} $keyorder - hash parameter key -> appearance rank for this parameter when looking through every resource and every parameter, starting at 100 (integer)  # @param {hash reference} $keyorder - hash parameter key -> appearance rank for this parameter when looking through every resource and every parameter, starting at 100 (integer)
 # @param {hash reference} $defkeytype - hash parameter name -> parameter type  # @param {hash reference} $defkeytype - hash parameter name -> parameter type
   # @param {string} $pssymb - resource symb (when a single resource is selected)
 sub extractResourceInformation {  sub extractResourceInformation {
     my $ids = shift;      my $ids = shift;
     my $typep = shift;      my $typep = shift;
Line 2089  sub extractResourceInformation { Line 2189  sub extractResourceInformation {
     my $uris=shift;      my $uris=shift;
     my $keyorder=shift;      my $keyorder=shift;
     my $defkeytype=shift;      my $defkeytype=shift;
       my $pssymb=shift;
   
     my $keyordercnt=100;      my $keyordercnt=100;
   
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);      return unless(ref($navmap));
       my @allres;
       if ($pssymb ne '') {
           my $res = $navmap->getBySymb($pssymb);
           if (ref($res)) {
               @allres = ($res);
           }
       }
       if (!@allres) { 
           @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
       }
     foreach my $resource (@allres) {      foreach my $resource (@allres) {
         my $id=$resource->id();          my $id=$resource->id();
         my ($mapid,$resid)=split(/\./,$id);          my ($mapid,$resid)=split(/\./,$id);
Line 2217  sub isdateparm { Line 2328  sub isdateparm {
   
 sub is_specialstring {  sub is_specialstring {
     my $type=shift;      my $type=shift;
     return (($type=~/^string_/) && (($type ne 'string_yesno')));      return (($type=~/^string_/) && ($type ne 'string_yesno'));
 }  }
   
 # Prints the HTML and Javascript to select parameters, with various shortcuts.  # Prints the HTML and Javascript to select parameters, with various shortcuts.
Line 2371  sub lookUpTableParameter { Line 2482  sub lookUpTableParameter {
         'lenient' => 'grading',          'lenient' => 'grading',
         'retrypartial' => 'tries',          'retrypartial' => 'tries',
         'discussvote'  => 'misc',          'discussvote'  => 'misc',
           'texdisplay' => 'misc',
         'examcode' => 'high_level_randomization',          'examcode' => 'high_level_randomization',
     );      );
 }  }
Line 2460  sub parmboxes { Line 2572  sub parmboxes {
         &whatIsMyCategory($tempparameter, \%categoryList);          &whatIsMyCategory($tempparameter, \%categoryList);
     }      }
     #part to print the parm-list      #part to print the parm-list
       $Text::Wrap::columns=60;
       $Text::Wrap::separator='<br />';
     foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) {      foreach my $key (sort { $category_order{$a} <=> $category_order{$b} } keys(%categoryList)) {
         next if (@{$categoryList{$key}} == 0);          next if (@{$categoryList{$key}} == 0);
         next if ($key eq '');          next if ($key eq '');
Line 2473  sub parmboxes { Line 2587  sub parmboxes {
             if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {              if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                 $r->print( ' checked="checked"');                  $r->print( ' checked="checked"');
             }              }
             $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}              $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? 
                                                       : $tempkey)                               Text::Wrap::wrap('','&nbsp;'x4,$$allparms{$tempkey})
                                : $tempkey)
                      .'</label></span><br />'."\n");                       .'</label></span><br />'."\n");
         }          }
         $r->print('</div>');          $r->print('</div>');
Line 2733  sub displaymenu { Line 2848  sub displaymenu {
 # @param {string} $pschp - selected map pc, or 'all'  # @param {string} $pschp - selected map pc, or 'all'
 # @param {hash reference} $maptitles - hash map id or src -> map title  # @param {hash reference} $maptitles - hash map id or src -> map title
 # @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' or resource symb  # @param {hash reference} $symbp - hash map pc or resource/map id -> map src.'___(all)' or resource symb
   # @param {string} $parmlev - parameter level (Resource:'full', Map:'map', Course:'general')
 sub mapmenu {  sub mapmenu {
     my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;      my ($r,$allmaps,$pschp,$maptitles,$symbp,$parmlev)=@_;
     my %allmaps_inverted = reverse %$allmaps;      my %allmaps_inverted = reverse %$allmaps;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my $tree=[];      my $tree=[];
Line 2782  sub mapmenu { Line 2898  sub mapmenu {
         }          }
     }      }
 # Show it ...      # Show it ...    
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',' id="mapmenu"'));      my $rowattr = ' id="mapmenu"';
       if ($parmlev eq 'general') {
           $rowattr .= ' style="display:none"';
       }
       $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',$rowattr));
     if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {      if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {
         my $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';          my $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';
         my $whitespace =          my $whitespace =
Line 3024  sub keysindisplayorder { Line 3144  sub keysindisplayorder {
 #  #
 # @param {Apache2::RequestRec} $r - the Apache request  # @param {Apache2::RequestRec} $r - the Apache request
 # @param {string} $sortorder - realmstudent|studentrealm  # @param {string} $sortorder - realmstudent|studentrealm
   # @param {string} $context - newoverview|overview
 sub sortmenu {  sub sortmenu {
     my ($r,$sortorder)=@_;      my ($r,$sortorder,$context)=@_;
     $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');      my %text;
     if ($sortorder eq 'realmstudent') {      if ($context eq 'newoverview') {
        $r->print(' checked="checked"');          %text = &Apache::lonlocal::texthash (
                      realmstudent => 'Sort by location in course first, then student (group/section)',
                      studentrealm => 'Sort by student (group/section) first, then location in course',
           );
       } else {
           %text = &Apache::lonlocal::texthash (
                      realmstudent => 'Sort by realm first, then student (group/section)',
                      studentrealm => 'Sort by student (group/section) first, then realm',
           );
     }      }
     $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));      my %sortchecked = (
     $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');         realmstudent => ' checked="checked"',
          studentrealm => '',
       );
     if ($sortorder eq 'studentrealm') {      if ($sortorder eq 'studentrealm') {
        $r->print(' checked="checked"');          $sortchecked{'studentrealm'} = $sortchecked{'realmstudent'};
           $sortchecked{'realmstudent'} = '';
       }
       foreach my $sorttype ('realmstudent','studentrealm') {
           $r->print('<br /><label><input type="radio" name="sortorder" value="'.$sorttype.'"'.$sortchecked{$sorttype}.' />'.
                     $text{$sorttype}.'</label>');
     }      }
     $r->print(' />'.&mt('Sort by student (group/section) first, then realm').  
           '</label>');  
 }  }
   
 # Returns a hash parameter key -> order (integer) giving the order for some parameters.  # Returns a hash parameter key -> order (integer) giving the order for some parameters.
Line 3366  sub assessparms { Line 3500  sub assessparms {
 # --------------------------------------------------------- Get all assessments  # --------------------------------------------------------- Get all assessments
     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,      &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
                 \%mapp, \%symbp,\%maptitles,\%uris,                  \%mapp, \%symbp,\%maptitles,\%uris,
                 \%keyorder);                  \%keyorder,undef,$pssymb);
   
     %allmaps_inverted = reverse(%allmaps);      %allmaps_inverted = reverse(%allmaps);
   
Line 3383  sub assessparms { Line 3517  sub assessparms {
         my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};          my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
         my ($got_chostname,$chostname,$cmajor,$cminor);          my ($got_chostname,$chostname,$cmajor,$cminor);
         my $totalstored = 0;          my $totalstored = 0;
           my $totalskippeduser = 0;
         my $now = time;          my $now = time;
         for (my $i=0;$i<=$#markers;$i++) {          for (my $i=0;$i<=$#markers;$i++) {
             my ($needsrelease,$needsnewer,$name,$namematch);              my ($needsrelease,$needsnewer,$name,$namematch);
Line 3391  sub assessparms { Line 3526  sub assessparms {
             }              }
             if ($markers[$i] =~ /\&(8|7|6|5)$/) {              if ($markers[$i] =~ /\&(8|7|6|5)$/) {
                 next if ($noeditgrp);                  next if ($noeditgrp);
               } elsif ($markers[$i] =~ /\&(4|3|2|1)$/) {
                   if ($uname eq '') {
                       $totalskippeduser ++;
                       next;
                   }
             }              }
             if ($markers[$i] =~ /\&(17|11|7|3)$/) {              if ($markers[$i] =~ /\&(17|11|7|3)$/) {
                 $namematch = 'maplevelrecurse';                  $namematch = 'maplevelrecurse';
Line 3529  sub assessparms { Line 3669  sub assessparms {
 # ---------------------------------------------------------------- Done storing  # ---------------------------------------------------------------- Done storing
         if ($totalstored) {          if ($totalstored) {
             $message.='<p class="LC_warning">'              $message.='<p class="LC_warning">'
                        .&mt('Changes for [quant,_1,parameter] saved.',$totalstored)
                        .'<br />'
                      .&mt('Changes can take up to 10 minutes before being active for all students.')                       .&mt('Changes can take up to 10 minutes before being active for all students.')
                      .&Apache::loncommon::help_open_topic('Caching')                       .&Apache::loncommon::help_open_topic('Caching')
                      .'</p>';                       .'</p>';
           } else {
               $message.='<p class="LC_info">'.&mt('No parameter changes saved.').'</p>';
           }
           if ($totalskippeduser) {
               $message .= '<p class="LC_warning">';
               if ($uhome eq 'no_host') {
                   $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the username or ID was invalid.',
                                   $totalskippeduser);
               } elsif ($env{'form.userroles'} eq 'any') {
                   $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user does not have a course role.',
                                   $totalskippeduser);
               } else {
                   $message .= &mt('Changes for [quant,_1,user-specific parameter] not saved because the user is not a student.',
                                   $totalskippeduser);
               }
               $message .= '</p>';
         }          }
     }      }
   
Line 3554  sub assessparms { Line 3712  sub assessparms {
             'date_interval','int','float','string','string_lenient',              'date_interval','int','float','string','string_lenient',
             'string_examcode','string_deeplink','string_discussvote',              'string_examcode','string_deeplink','string_discussvote',
             'string_useslots','string_problemstatus','string_ip',              'string_useslots','string_problemstatus','string_ip',
             'string_questiontype') {              'string_questiontype','string_tex') {
         $r->print('<input type="hidden" value="'.          $r->print('<input type="hidden" value="'.
             &HTML::Entities::encode($env{'form.recent_'.$item},'"&<>').              &HTML::Entities::encode($env{'form.recent_'.$item},'"&<>').
             '" name="recent_'.$item.'" />');              '" name="recent_'.$item.'" />');
Line 3562  sub assessparms { Line 3720  sub assessparms {
   
     # ----- Start Parameter Selection      # ----- Start Parameter Selection
   
     # Hide parm selection?      # Hide parm selection and possibly table?
       my ($tablejs,$tabledivsty);
       if (((($env{'form.uname'} ne '') || ($env{'form.id'} ne '')) && ($uname eq '')) &&
           ($env{'form.dis'}) && ($pssymb eq '')) {
           $tablejs = 'document.getElementById('."'parmtable'".').style.display = "";';
           $tabledivsty = ' style="display:none"';
       }
     $r->print(<<ENDPARMSELSCRIPT);      $r->print(<<ENDPARMSELSCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function parmsel_show() {  function parmsel_show() {
     document.getElementById('parmsel').style.display = "";      document.getElementById('parmsel').style.display = "";
     document.getElementById('parmsellink').style.display = "none";      document.getElementById('parmsellink').style.display = "none";
       $tablejs
 }  }
 // ]]>  // ]]>
 </script>  </script>
Line 3595  ENDPARMSELSCRIPT Line 3760  ENDPARMSELSCRIPT
         $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));          $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
         &levelmenu($r,\%alllevs,$parmlev);          &levelmenu($r,\%alllevs,$parmlev);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
         &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);          &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
         &partmenu($r,\%allparts,\@psprt);          &partmenu($r,\%allparts,\@psprt);
Line 3675  ENDPARMSELSCRIPT Line 3840  ENDPARMSELSCRIPT
         if ($parm_permission->{'edit'}) {          if ($parm_permission->{'edit'}) {
             undef($readonly);               undef($readonly); 
         }          }
           $r->print('<div id="parmtable"'.$tabledivsty.'>');
   
         if ($parmlev eq 'full') {          if ($parmlev eq 'full') {
 #  #
Line 3891  ENDTABLEHEADFOUR Line 4057  ENDTABLEHEADFOUR
   
 #-------------------------------------------- for each map, gather information  #-------------------------------------------- for each map, gather information
             my $mapid;              my $mapid;
             foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys(%maplist)) {              foreach $mapid (sort { $a <=> $b } keys(%maplist)) {
                 my $maptitle = $maplist{$mapid};                  my $maptitle = $maplist{$mapid};
   
 #-----------------------  loop through ids and get all parameter types for map  #-----------------------  loop through ids and get all parameter types for map
Line 4108  ENDMAPONE Line 4274  ENDMAPONE
                      .'</center>'                       .'</center>'
             );              );
         } # end of $parmlev eq general          } # end of $parmlev eq general
           $r->print('</div>');
     }      }
     $r->print('</form>');      $r->print('</form>');
     if ($numreclinks) {      if ($numreclinks) {
Line 4306  sub storedata { Line 4473  sub storedata {
                         if ($thiskey =~ /\.retrypartial$/) {                          if ($thiskey =~ /\.retrypartial$/) {
                             $name = 'retrypartial';                              $name = 'retrypartial';
                         }                          }
                       } elsif ($typeof eq 'string_tex') {
                           $name = 'texdisplay';
                     }                      }
                 } elsif ($cmd eq 'datepointer') {                  } elsif ($cmd eq 'datepointer') {
                     $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});                      $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
Line 4645  sub parse_listdata_key { Line 4814  sub parse_listdata_key {
 # @param {string} $caller - name of the calling sub (overview|newoverview)  # @param {string} $caller - name of the calling sub (overview|newoverview)
 # @param {hash reference} $classlist - from loncoursedata::get_classlist  # @param {hash reference} $classlist - from loncoursedata::get_classlist
 # @param {boolean} $readonly - true if editing not allowed  # @param {boolean} $readonly - true if editing not allowed
   # @param {string} $parmlev - full|map
   # @param {hash reference} $hash_for_realm - keys: realm, values: numeric order  
   # @param {string} $pschp - selected map pc, or 'all'
 # @returns{integer} - number of $listdata parameters processed  # @returns{integer} - number of $listdata parameters processed
 sub listdata {  sub listdata {
     my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly)=@_;      my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly,$parmlev,$hash_for_realm,$pschp)=@_;
           
 # Start list output  # Start list output
   
Line 4673  sub listdata { Line 4845  sub listdata {
     foreach my $key (sort {      foreach my $key (sort {
         my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);          my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
         my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);          my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
           my ($aid,$bid);
           if ($caller eq 'newoverview') {
               if (ref($hash_for_realm) eq 'HASH') {
                   if (($parmlev eq 'map') && ($pschp eq 'all')) {
                       my ($aurl) = ($ares =~ /^(.+\.(?:sequence|page))___\(all\)$/);
                       my ($burl) = ($bres =~ /^(.+\.(?:sequence|page))___\(all\)$/);
                       $aid = $hash_for_realm->{$aurl};
                       $bid = $hash_for_realm->{$burl};
                   } elsif ($parmlev eq 'full') {
                       $aid = $hash_for_realm->{$ares};
                       $bid = $hash_for_realm->{$bres};
                   }
               }
           }
   
         # get the numerical order for the param          # get the numerical order for the param
         $aparm=$keyorder{'parameter_0_'.$aparm};          $aparm=$keyorder{'parameter_0_'.$aparm};
Line 4682  sub listdata { Line 4868  sub listdata {
   
         if ($sortorder eq 'realmstudent') {          if ($sortorder eq 'realmstudent') {
             if ($ares     ne $bres    ) {              if ($ares     ne $bres    ) {
                 $result = ($ares     cmp $bres);                  if ($caller eq 'newoverview') {
                       if (ref($hash_for_realm) eq 'HASH') {
                           if (($parmlev eq 'map') && ($pschp eq 'all')) {
                               $result = ($aid <=> $bid);
                           } elsif ($parmlev eq 'full') {
                               $result = ($aid <=> $bid);
                           } else {
                               $result = ($ares cmp $bres);
                           }
                       } else {
                           $result = ($ares cmp $bres);
                       }
                   } else {
                       $result = ($ares cmp $bres);
                   }
             } elsif ($astudent ne $bstudent) {              } elsif ($astudent ne $bstudent) {
                 $result = ($astudent cmp $bstudent);                  $result = ($astudent cmp $bstudent);
             } elsif ($apart    ne $bpart   ) {              } elsif ($apart    ne $bpart   ) {
Line 4692  sub listdata { Line 4892  sub listdata {
             if      ($astudent ne $bstudent) {              if      ($astudent ne $bstudent) {
                 $result = ($astudent cmp $bstudent);                  $result = ($astudent cmp $bstudent);
             } elsif ($ares     ne $bres    ) {              } elsif ($ares     ne $bres    ) {
                 $result = ($ares     cmp $bres);                  if ($caller eq 'newoverview') {
                       if (ref($hash_for_realm) eq 'HASH') {
                           if (($parmlev eq 'map') && ($pschp eq 'all')) {
                               $result = ($aid <=> $bid);
                           } elsif ($parmlev eq 'full') {
                               $result = ($aid <=> $bid);
                           } else {
                               $result = ($ares cmp $bres);
                           }
                       } else {
                           $result = ($ares cmp $bres);
                       }
                   } else {
                       $result = ($ares cmp $bres);
                   }
             } elsif ($apart    ne $bpart   ) {              } elsif ($apart    ne $bpart   ) {
                 $result = ($apart    cmp $bpart);                  $result = ($apart    cmp $bpart);
             }              }
Line 4772  sub listdata { Line 4986  sub listdata {
             }              }
             if ($is_map) {              if ($is_map) {
                 my $leveltitle = &mt('Folder/Map');                  my $leveltitle = &mt('Folder/Map');
                   my $title = &Apache::lonnet::gettitle($mapurl);
                   if (ref($hash_for_realm) eq 'HASH') {
                       if ($hash_for_realm->{$mapurl} eq '1') {
                           $title = &mt('Main Content');
                       }
                   }
                 unless (($name eq 'hiddenresource') || ($name eq 'encrypturl')) {                     unless (($name eq 'hiddenresource') || ($name eq 'encrypturl')) {   
                     if ($caller eq 'newoverview') {                      if ($caller eq 'newoverview') {
                         my $altkey = $thiskey;                          my $altkey = $thiskey;
Line 4788  sub listdata { Line 5008  sub listdata {
                         $is_recursive = 1;                          $is_recursive = 1;
                     }                      }
                 }                  }
                 $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';                  $realm='<span class="LC_parm_scope_folder">'.$leveltitle.': '.$title.' <br /><span class="LC_parm_folder">('.$mapurl.')</span></span>';
             } elsif ($middle) {              } elsif ($middle) {
                 my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);                  my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   next if (($url =~ /\.(page|sequence)$/) && ($parmlev eq 'full') && ($caller eq 'newoverview'));
                 $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').                  $realm='<span class="LC_parm_scope_resource">'.&mt('Resource').
                     ': '.&Apache::lonnet::gettitle($middle).                      ': '.&Apache::lonnet::gettitle($middle).
                     ' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.                      ' <br /><span class="LC_parm_symb">('.$url.' in '.$map.' id: '.
Line 4828  sub listdata { Line 5049  sub listdata {
     # Ready to print      # Ready to print
     #      #
             my $parmitem = &standard_parameter_names($name);              my $parmitem = &standard_parameter_names($name);
               my $advice;
               if (($name eq 'mapalias') && ($middle) && (!$is_map)) {
                   if ($middle =~ m{^uploaded/}) {
                       $advice = &mt('Use Course Editor to set this.');
                   } else {
                       $advice = &mt('Use Resource Assembly Tool to set this.');
                   }
                   $advice = '<br /><span class="LC_fontsize_small LC_cusr_emph">'.$advice.'</span>';
               }
             $r->print(&tablestart($readonly,$is_map).              $r->print(&tablestart($readonly,$is_map).
                 &Apache::loncommon::start_data_table_row().                  &Apache::loncommon::start_data_table_row().
                 '<td><b>'.&mt($parmitem).                  '<td><b>'.&mt($parmitem).
                 '</b></td>');                  '</b>'.$advice.'</td>');
             unless ($readonly) {              unless ($readonly) {
                 my $disabled;                  my $disabled;
                 if (($name eq 'availablestudent') &&                  if (($name eq 'availablestudent') &&
                     (($showval eq '') || ($userscope))) {                      (($showval eq '') || ($userscope))) {
                     $disabled = ' disabled="disabled"';                      $disabled = ' disabled="disabled"';
                   } elsif (($name eq 'mapalias') && ($showval eq '')) {
                       $disabled = ' disabled="disabled"';
                 }                  }
                 $r->print('<td><input type="checkbox" name="del_'.                  $r->print('<td><input type="checkbox" name="del_'.
                         $thiskey.'"'.$disabled.' /></td>');                          $thiskey.'"'.$disabled.' /></td>');
Line 4869  sub listdata { Line 5101  sub listdata {
             } elsif ($thistype =~ m/^string/) {              } elsif ($thistype =~ m/^string/) {
                 if ($name eq 'availablestudent') {                  if ($name eq 'availablestudent') {
                     $readonly = 1;                      $readonly = 1;
                   } elsif (($name eq 'mapalias') && ($showval eq '')) {
                       $readonly = 1;
                 }                  }
                 $r->print(&string_selector($thistype,$thiskey,                  $r->print(&string_selector($thistype,$thiskey,
                           $showval,$name,$readonly));                            $showval,$name,$readonly));
Line 4912  sub listdata { Line 5146  sub listdata {
 sub get_date_interval_from_form {  sub get_date_interval_from_form {
     my ($key) = @_;      my ($key) = @_;
     my $seconds = 0;      my $seconds = 0;
       my $numnotnull = 0;
     foreach my $which (['days', 86400],      foreach my $which (['days', 86400],
                ['hours', 3600],                 ['hours', 3600],
                ['minutes', 60],                 ['minutes', 60],
                ['seconds',  1]) {                 ['seconds',  1]) {
         my ($name, $factor) = @{ $which };          my ($name, $factor) = @{ $which };
         if (defined($env{'form.'.$name.'_'.$key})) {          if (defined($env{'form.'.$name.'_'.$key})) {
             $seconds += $env{'form.'.$name.'_'.$key} * $factor;              unless ($env{'form.'.$name.'_'.$key} eq '') {
                   $numnotnull ++;
                   $seconds += $env{'form.'.$name.'_'.$key} * $factor;
               }
         }          }
     }      }
     if (($key =~ /\.interval$/) &&      if (($key =~ /\.interval$/) &&
Line 4937  sub get_date_interval_from_form { Line 5175  sub get_date_interval_from_form {
             $seconds .= '_'.$env{'form.done_'.$key.'_proctorkey'};              $seconds .= '_'.$env{'form.done_'.$key.'_proctorkey'};
         }          }
     }      }
       return if (!$numnotnull);
     return $seconds;      return $seconds;
 }  }
   
Line 5024  sub string_ip_selector { Line 5263  sub string_ip_selector {
   
 sub string_deeplink_selector {  sub string_deeplink_selector {
     my ($thiskey, $showval, $readonly) = @_;      my ($thiskey, $showval, $readonly) = @_;
     my (@components,%values,@current,%titles,%options,%optiontext,%defaults,      my (@tables,%values,@current,%titles,%options,%optiontext,%defaults,
         %selectnull,%domlti,%crslti,@possmenus);          %selectnull,%domlti,%crslti,@possmenus,%components);
     @components = ('state','others','listing','scope','protect','menus');      @tables = ('upper','lower');
       %components = (
                       upper => ['state','others','listing','scope'],
                       lower => ['protect','menus','target','exit'],
                     );   
     %titles = &Apache::lonlocal::texthash (      %titles = &Apache::lonlocal::texthash (
                   state   => 'Access status',                    state   => 'Access status',
                   others  => 'Hide other resources',                    others  => 'Hide other resources',
Line 5034  sub string_deeplink_selector { Line 5277  sub string_deeplink_selector {
                   scope   => 'Access scope for link',                    scope   => 'Access scope for link',
                   protect => 'Link protection',                    protect => 'Link protection',
                   menus   => 'Menu Items Displayed',                    menus   => 'Menu Items Displayed',
                     target  => 'Embedded?',
                     exit    => 'Exit Tool Button?',
               );                );
     %options = (      %options = (
                    state   => ['only','off','both'],                     state   => ['only','off','both'],
Line 5042  sub string_deeplink_selector { Line 5287  sub string_deeplink_selector {
                    scope   => ['res','map','rec'],                     scope   => ['res','map','rec'],
                    protect => ['none','key','ltid','ltic'],                     protect => ['none','key','ltid','ltic'],
                    menus   => ['std','colls'],                     menus   => ['std','colls'],
                      target  => ['_self','_top'],
                      exit    => ['no','yes','url'],
                );                 );
     %optiontext = &Apache::lonlocal::texthash (      %optiontext = &Apache::lonlocal::texthash (
                     only       => 'deep only',                      only       => 'deep only',
Line 5063  sub string_deeplink_selector { Line 5310  sub string_deeplink_selector {
                     ltid       => 'LTI access (domain)' ,                      ltid       => 'LTI access (domain)' ,
                     std        => 'Standard (all menus)',                      std        => 'Standard (all menus)',
                     colls      => 'Numbered collection',                      colls      => 'Numbered collection',
                       _self      => 'Embedded',
                       _top       => 'Not embedded',
                       no         => 'Not in use',
                       yes        => 'In use, no URL redirect',
                       url        => 'In use, redirect to URL',  
                   );                    );
     %selectnull = &Apache::lonlocal::texthash (      %selectnull = &Apache::lonlocal::texthash (
                     ltic => 'Select Launcher',                      ltic => 'Select Launcher',
Line 5078  sub string_deeplink_selector { Line 5330  sub string_deeplink_selector {
         ($values{'scope'}) = ($current[3] =~ /^(res|map|rec)$/);          ($values{'scope'}) = ($current[3] =~ /^(res|map|rec)$/);
         ($values{'protect'}) = ($current[4] =~ /^(key:[a-zA-Z\d_.!\@#\$%^&*()+=-]+|ltic:\d+|ltid:\d+)$/);          ($values{'protect'}) = ($current[4] =~ /^(key:[a-zA-Z\d_.!\@#\$%^&*()+=-]+|ltic:\d+|ltid:\d+)$/);
         ($values{'menus'}) = ($current[5] =~ /^(\d+)$/);          ($values{'menus'}) = ($current[5] =~ /^(\d+)$/);
           ($values{'target'}) = ($current[6] =~ /^(_self|_top)$/);
           ($values{'exit'}) = ($current[7] =~ /^((?:(?:yes|url)(?:|\:[^:;"',]+))|no)$/);
     } else {      } else {
         $defaults{'state'} = 'off',          $defaults{'state'} = 'off',
         $defaults{'others'} = 'unhide',          $defaults{'others'} = 'unhide',
Line 5085  sub string_deeplink_selector { Line 5339  sub string_deeplink_selector {
         $defaults{'scope'} = 'res';          $defaults{'scope'} = 'res';
         $defaults{'protect'} = 'none';          $defaults{'protect'} = 'none';
         $defaults{'menus'} = '0';          $defaults{'menus'} = '0';
           $defaults{'target'} = '_top';
           $defaults{'exit'} = 'yes';
     }      }
     my $disabled;      my $disabled;
     if ($readonly) {      if ($readonly) {
Line 5092  sub string_deeplink_selector { Line 5348  sub string_deeplink_selector {
     }      }
     my %courselti =      my %courselti =
         &Apache::lonnet::get_course_lti($env{'course.'.$env{'request.course.id'}.'.num'},          &Apache::lonnet::get_course_lti($env{'course.'.$env{'request.course.id'}.'.num'},
                                         $env{'course.'.$env{'request.course.id'}.'.domain'});                                          $env{'course.'.$env{'request.course.id'}.'.domain'},
                                           'provider');
     foreach my $item (keys(%courselti)) {      foreach my $item (keys(%courselti)) {
         if (ref($courselti{$item}) eq 'HASH') {          if (ref($courselti{$item}) eq 'HASH') {
             $crslti{$item} = $courselti{$item}{'name'};              $crslti{$item} = $courselti{$item}{'name'};
Line 5100  sub string_deeplink_selector { Line 5357  sub string_deeplink_selector {
     }      }
     my %lti =      my %lti =
         &Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'},          &Apache::lonnet::get_domain_lti($env{'course.'.$env{'request.course.id'}.'.domain'},
                                         'provider');                                          'linkprot');
     foreach my $item (keys(%lti)) {      foreach my $item (keys(%lti)) {
         if (ref($lti{$item}) eq 'HASH') {          if (($item =~ /^\d+$/) && (ref($lti{$item}) eq 'HASH')) {
             unless ($lti{$item}{'requser'}) {              $domlti{$item} = $lti{$item}{'name'};
                 $domlti{$item} = $lti{$item}{'consumer'};  
             }  
         }          }
     }      }
     if ($env{'course.'.$env{'request.course.id'}.'.menucollections'}) {      if ($env{'course.'.$env{'request.course.id'}.'.menucollections'}) {
Line 5117  sub string_deeplink_selector { Line 5372  sub string_deeplink_selector {
         }          }
     }      }
   
     my $output = '<input type="hidden" name="set_'.$thiskey.'" /><table><tr>';      my $output = '<input type="hidden" name="set_'.$thiskey.'" />';
     foreach my $item (@components) {      foreach my $table ('upper','lower') {
         $output .= '<th>'.$titles{$item}.'</th>';          next unless (ref($components{$table}) eq 'ARRAY');
     }          $output .= '<table width="100%"><tr>';
     $output .= '</tr><tr>';          foreach my $item (@{$components{$table}}) {
     foreach my $item (@components) {              $output .= '<th>'.$titles{$item}.'</th>';
         $output .= '<td>';          }
         if (($item eq 'protect') || ($item eq 'menus')) {          $output .= '</tr><tr>';
             my $selected = $values{$item};          foreach my $item (@{$components{$table}}) {
             foreach my $option (@{$options{$item}}) {              $output .= '<td>';
                 if ($item eq 'protect') {               if (($item eq 'protect') || ($item eq 'menus') || ($item eq 'exit')) {
                     if ($option eq 'ltid') {                  my $selected = $values{$item};
                         next unless (keys(%domlti));                  foreach my $option (@{$options{$item}}) {
                     } elsif ($option eq 'ltic') {                      if ($item eq 'protect') { 
                         next unless (keys(%crslti));                          if ($option eq 'ltid') {
                     }                              next unless (keys(%domlti));
                 } elsif (($item eq 'menus') && ($option eq 'colls')) {                          } elsif ($option eq 'ltic') {
                     next unless (@possmenus);                              next unless (keys(%crslti));
                 }                          }
                 my $checked;                      } elsif (($item eq 'menus') && ($option eq 'colls')) {
                 if ($item eq 'menus') {                          next unless (@possmenus);
                     if (($selected =~ /^\d+$/) && (@possmenus) &&                      }
                         (grep(/^\Q$selected\E$/,@possmenus))) {                      my $checked;
                         if ($option eq 'colls') {                      if ($item eq 'menus') {
                           if (($selected =~ /^\d+$/) && (@possmenus) &&
                               (grep(/^\Q$selected\E$/,@possmenus))) {
                               if ($option eq 'colls') {
                                   $checked = ' checked="checked"';
                               }
                           } elsif (($option eq 'std') && ($selected == 0) && ($selected ne '')) {
                             $checked = ' checked="checked"';                              $checked = ' checked="checked"';
                         }                          }
                     } elsif (($option eq 'std') && ($selected == 0) && ($selected ne '')) {                      } elsif ($selected =~ /^\Q$option\E/) {
                         $checked = ' checked="checked"';                          $checked = ' checked="checked"';
                     }                      }
                 } elsif ($selected =~ /^\Q$option\E/) {                      my $onclick;
                     $checked = ' checked="checked"';                      unless ($readonly) {
                 }                          my $esc_key = &js_escape($thiskey);
                 my $onclick;                          $onclick = ' onclick="toggleDeepLink(this.form,'."'$item','$esc_key'".');"';
                 unless ($readonly) {                      }
                     my $esc_key = &js_escape($thiskey);                      $output .= '<span class="LC_nobreak"><label>'.
                     $onclick = ' onclick="toggleDeepLink(this.form,'."'$item','$esc_key'".');"';                                 '<input type="radio" name="deeplink_'.$item.'_'.$thiskey.'" value="'.$option.'"'.$onclick.$disabled.$checked.' />'."\n".
                 }                                 $optiontext{$option}.'</label>';
                 $output .= '<span class="LC_nobreak"><label>'.                      if (($item eq 'protect') && ($option eq 'key')) {
                            '<input type="radio" name="deeplink_'.$item.'_'.$thiskey.'" value="'.$option.'"'.$onclick.$disabled.$checked.' />'."\n".                          my $visibility="hidden";
                            $optiontext{$option}.'</label>';                          my $currkey;
                 if (($item eq 'protect') && ($option eq 'key')) {                          if ($checked) {
                     my $visibility="hidden";                              $visibility = "text";
                     my $currkey;                              $currkey = (split(/\:/,$values{$item}))[1];
                     if ($checked) {                          }
                         $visibility = "text";                          $output .= '&nbsp;'.
                         $currkey = (split(/\:/,$values{$item}))[1];                                     '<input type="'.$visibility.'" name="deeplink_'.$option.'_'.$thiskey.'" id="deeplink_'.$option.'_'.$item.'_'.$thiskey.'" value="'.$currkey.'" size="10"'.$disabled.' />';
                     }                      } elsif (($option eq 'ltic') || ($option eq 'ltid') || ($option eq 'colls')) {
                     $output .= '&nbsp;'.                          my $display="none";
                         '<input type="'.$visibility.'" name="deeplink_'.$option.'_'.$thiskey.'" id="deeplink_'.$option.'_'.$item.'_'.$thiskey.'" value="'.$currkey.'" size="10"'.$disabled.' />';                          my ($current,$blankcheck,@possibles);
                 } elsif (($option eq 'ltic') || ($option eq 'ltid') || ($option eq 'colls')) {                          if ($checked) {
                     my $display="none";                              $display = 'inline-block';
                     my ($current,$blankcheck,@possibles);                              if (($option eq 'ltic') || ($option eq 'ltid'))  {
                     if ($checked) {                                  $current = (split(/\:/,$selected))[1];
                         $display = 'inline-block';                              } else {
                         if (($option eq 'ltic') || ($option eq 'ltid'))  {                                  $current = $selected;
                             $current = (split(/\:/,$selected))[1];                              }
                         } else {                          } else {
                             $current = $selected;                              $blankcheck = ' selected="selected"';
                         }                          }
                     } else {  
                         $blankcheck = ' selected="selected"';  
                     }  
                     if ($option eq 'ltid') {  
                         @possibles = keys(%domlti);  
                     } elsif ($option eq 'ltic') {  
                         @possibles = keys(%crslti);   
                     } else {  
                         @possibles = @possmenus;  
                     }  
                     $output .= '<div id="deeplinkdiv_'.$option.'_'.$item.'_'.$thiskey.'"'.  
                                ' style="display: '.$display.'">&nbsp;<select name="'.  
                                'deeplink_'.$option.'_'.$thiskey.'"'.$disabled.'>';  
                     if (@possibles > 1) {  
                         $output .= '<option value=""'.$blankcheck.'>'.$selectnull{$option}.  
                                    '</option>'."\n";  
                     }  
                     foreach my $poss (sort { $a <=> $b } @possibles) {  
                         my $selected;  
                         if (($poss == $current) || (scalar(@possibles) ==1)) {  
                             $selected = ' selected="selected"';  
                         }  
                         my $shown = $poss;  
                         if ($option eq 'ltid') {                          if ($option eq 'ltid') {
                             $shown = $domlti{$poss};                              @possibles = keys(%domlti);
                         } elsif ($option eq 'ltic') {                          } elsif ($option eq 'ltic') {
                             $shown = $crslti{$poss};                              @possibles = keys(%crslti); 
                           } else {
                               @possibles = @possmenus;
                           }
                           $output .= '<div id="deeplinkdiv_'.$option.'_'.$item.'_'.$thiskey.'"'.
                                      ' style="display: '.$display.'">&nbsp;<select name="'.
                                      'deeplink_'.$option.'_'.$thiskey.'"'.$disabled.'>';
                           if (@possibles > 1) {
                               $output .= '<option value=""'.$blankcheck.'>'.$selectnull{$option}.
                                          '</option>'."\n";
                           }
                           foreach my $poss (sort { $a <=> $b } @possibles) {
                               my $selected;
                               if (($poss == $current) || (scalar(@possibles) ==1)) {
                                   $selected = ' selected="selected"';
                               }
                               my $shown = $poss;
                               if ($option eq 'ltid') {
                                   $shown = $domlti{$poss};
                               } elsif ($option eq 'ltic') {
                                   $shown = $crslti{$poss};
                               }
                               $output .= '<option value="'.$poss.'"'.$selected.'>'.$shown.'</option>';
                           }
                           $output .= '</select></div>';
                       }
                       $output .= '</span> ';
                   }
                   if ($item eq 'exit') {
                       my $exitsty = 'none';
                       my $displayval;
                       if ($values{$item} =~ /^(yes|url)/) { 
                           $exitsty = 'inline-block';
                           my $currval = (split(/\:/,$values{$item}))[1];
                           if ($currval eq '') {
                               $displayval = 'Exit Tool';
                           } else {
                               $displayval = $currval;
                         }                          }
                         $output .= '<option value="'.$poss.'"'.$selected.'>'.$shown.'</option>';  
                     }                      }
                     $output .= '</select></div>';                      $output .= '<div id="deeplinkdiv_'.$item.'_'.$thiskey.'"'.
                                  ' style="display: '.$exitsty.'"><br />'.&mt('Button text').': '.
                                  '<input type="text" name="deeplink_exittext_'.$thiskey.'"'.
                                  ' id="deeplink_exittext_'.$thiskey.'" value="'.$displayval.'"'.
                                  ' size="10"'.$disabled.' /></div>';
                 }                  }
                 $output .= '</span> ';              } else {
             }                  my $selected = $values{$item};
         } else {                  my $defsel;
             my $selected = $values{$item};                  if ($selected eq '') {
             my $defsel;                      $defsel = ' selected="selected"';
             if ($selected eq '') {                  }
                 $defsel = ' selected="selected"';                  $output .= '<select name="deeplink_'.$item.'_'.$thiskey.'"'.$disabled.'>'."\n".
             }                             '<option value=""'.$defsel.'>'.&mt('Please select').'</option>'."\n";
             $output .= '<select name="deeplink_'.$item.'_'.$thiskey.'"'.$disabled.'>'."\n".                  foreach my $option (@{$options{$item}}) {
                        '<option value=""'.$defsel.'>'.&mt('Please select').'</option>'."\n";                      $output .= '<option value="'.$option.'"';
             foreach my $option (@{$options{$item}}) {                      if ($option eq $selected) {
                 $output .= '<option value="'.$option.'"';                          $output .= ' selected="selected"';
                 if ($option eq $selected) {                      }
                     $output .= ' selected="selected"';                      $output .= '>'.$optiontext{$option}.'</option>';
                 }                  }
                 $output .= '>'.$optiontext{$option}.'</option>';                  $output .= '</select>';
             }              }
             $output .= '</select>';              $output .= '</td>';
           }
           $output .= '</tr></table>'."\n";
           if ($table eq 'upper') {
               $output .= '<br />';
         }          }
         $output .= '</td>';  
     }      }
     $output .= '</tr></table>'."\n";  
     return $output;      return $output;
 }  }
   
Line 5268  my %strings = Line 5548  my %strings =
              => [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],               => [['_allowfrom_','Hostname(s), or IP(s) from which access is allowed'],
                  ['_denyfrom_','Hostname(s) or IP(s) from which access is disallowed']],                    ['_denyfrom_','Hostname(s) or IP(s) from which access is disallowed']], 
      'string_deeplink'       'string_deeplink'
              => [['on','Set choices for link protection, resource listing, access scope, and shown menu items']],               => [['on','Set choices for link protection, resource listing, access scope, shown menu items, embedding, and exit link']],
        'string_tex'
                => [['tth', 'tth (TeX to HTML)'],
                    ['mathjax', 'MathJax']],
     );      );
         
   
Line 5279  my %stringmatches = ( Line 5562  my %stringmatches = (
               => [['_allowfrom_','[^\!]+'],                => [['_allowfrom_','[^\!]+'],
                   ['_denyfrom_','\!']],                    ['_denyfrom_','\!']],
          'string_deeplink'           'string_deeplink'
               => [['on','^(full|absent|grades|details|datestatus)\,(res|map|rec)\,(any|only|key\:\w+|lti\:\d+)\,(\d+|)$']],                => [['on','^(only|off|both)\,(hide|unhide)\,(full|absent|grades|details|datestatus)\,(res|map|rec)\,(none|key\:\w+|ltic\:\d+|ltid\:\d+)\,(\d+|)\,_(self|top),(yes|url|no)(|:[^:;\'",]+)$']],
     );      );
   
 my %stringtypes = (  my %stringtypes = (
Line 5290  my %stringtypes = ( Line 5573  my %stringtypes = (
                     examcode     => 'string_examcode',                      examcode     => 'string_examcode',
                     acc          => 'string_ip',                      acc          => 'string_ip',
                     deeplink     => 'string_deeplink',                      deeplink     => 'string_deeplink',
                       texdisplay   => 'string_tex',
                   );                    );
   
 # Returns the possible values and titles for a given string type, or undef if there are none.  # Returns the possible values and titles for a given string type, or undef if there are none.
Line 5350  sub string_selector { Line 5634  sub string_selector {
             ($thistype eq 'string_discussvote') ||              ($thistype eq 'string_discussvote') ||
             ($thistype eq 'string_ip') ||              ($thistype eq 'string_ip') ||
             ($thistype eq 'string_deeplink') ||              ($thistype eq 'string_deeplink') ||
               ($thistype eq 'string_tex') ||
             ($name eq 'retrypartial')) {              ($name eq 'retrypartial')) {
         my ($got_chostname,$chostname,$cmajor,$cminor);           my ($got_chostname,$chostname,$cmajor,$cminor); 
         foreach my $possibilities (@{ $strings{$thistype} }) {          foreach my $possibilities (@{ $strings{$thistype} }) {
Line 5599  sub date_interval_selector { Line 5884  sub date_interval_selector {
         $showval  %= $factor;          $showval  %= $factor;
         my %select = ((map {$_ => $_} (0..$max)),          my %select = ((map {$_ => $_} (0..$max)),
                 'select_form_order' => [0..$max]);                  'select_form_order' => [0..$max]);
           if ($currval eq '') {
               unshift(@{$select{'select_form_order'}},'');
               $select{''} = '';
               $amount = '';
           }
         $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,          $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
                             \%select,'',$readonly);                              \%select,'',$readonly);
         $result .= ' '.&mt($name);          $result .= ' '.&mt($name);
Line 5606  sub date_interval_selector { Line 5896  sub date_interval_selector {
     if ($name eq 'interval') {      if ($name eq 'interval') {
         unless ($skipval{'done'}) {          unless ($skipval{'done'}) {
             my $checkedon = '';              my $checkedon = '';
               my $checkedoff = '';
             my $checkedproc = '';              my $checkedproc = '';
             my $currproctorkey = '';              my $currproctorkey = '';
             my $currprocdisplay = 'hidden';              my $currprocdisplay = 'hidden';
             my $currdonetext = &mt('Done');              my $currdonetext = &mt('Done');
             my $checkedoff = ' checked="checked"';  
             if ($currval =~ /^(?:\d+)_done$/) {              if ($currval =~ /^(?:\d+)_done$/) {
                 $checkedon = ' checked="checked"';                  $checkedon = ' checked="checked"';
                 $checkedoff = '';  
             } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:$/) {              } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:$/) {
                 $currdonetext = $1;                  $currdonetext = $1;
                 $checkedon = ' checked="checked"';                  $checkedon = ' checked="checked"';
                 $checkedoff = '';  
             } elsif ($currval =~ /^(?:\d+)_done_proctor_(.+)$/) {              } elsif ($currval =~ /^(?:\d+)_done_proctor_(.+)$/) {
                 $currproctorkey = $1;                  $currproctorkey = $1;
                 $checkedproc = ' checked="checked"';                  $checkedproc = ' checked="checked"';
                 $checkedoff = '';  
                 $currprocdisplay = 'text';                  $currprocdisplay = 'text';
             } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:_proctor_(.+)$/) {              } elsif ($currval =~ /^(?:\d+)_done\:([^\:]+)\:_proctor_(.+)$/) {
                 $currdonetext = $1;                  $currdonetext = $1;
                 $currproctorkey = $2;                  $currproctorkey = $2;
                 $checkedproc = ' checked="checked"';                  $checkedproc = ' checked="checked"';
                 $checkedoff = '';  
                 $currprocdisplay = 'text';                  $currprocdisplay = 'text';
               } elsif ($currval ne '') {
                   $checkedoff = ' checked="checked"';
               } else {
                   $currdonetext = '';
             }              }
             my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';              my $onclick = ' onclick="toggleSecret(this.form,'."'done_','$thiskey'".');"';
             my $disabled;              my $disabled;
Line 5645  sub date_interval_selector { Line 5935  sub date_interval_selector {
                        '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.                         '<input type="'.$currprocdisplay.'" id="done_'.$thiskey.'_proctorkey" '.
                        'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.                         'name="done_'.$thiskey.'_proctorkey" value="'.&HTML::Entities::encode($currproctorkey,'"<>&').'"'.$disabled.' /></span><br />'.
                        '<span class="LC_nobreak">'.&mt('Button text').': '.                         '<span class="LC_nobreak">'.&mt('Button text').': '.
                        '<input type="text" name="done_'.$thiskey.'_buttontext" value="'.&HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';                         '<input type="text" name="done_'.$thiskey.'_buttontext" id="done_'.$thiskey.'_buttontext" value="'.
                          &HTML::Entities::encode($currdonetext,'"<>&').'"'.$disabled.' /></span>';
         }          }
     }      }
     unless ($readonly) {      unless ($readonly) {
Line 5886  ENDOVER Line 6177  ENDOVER
   
     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,      &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
                 \%mapp, \%symbp,\%maptitles,\%uris,                  \%mapp, \%symbp,\%maptitles,\%uris,
                 \%keyorder,\%defkeytype);                  \%keyorder,\%defkeytype,$pssymb);
   
     if (grep {$_ eq 'all'} (@psprt)) {      if (grep {$_ eq 'all'} (@psprt)) {
         @psprt = keys(%allparts);          @psprt = keys(%allparts);
Line 5898  ENDOVER Line 6189  ENDOVER
     $r->print('<div>');      $r->print('<div>');
     $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));      $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
     &levelmenu($r,\%alllevs,$parmlev);      &levelmenu($r,\%alllevs,$parmlev);
     if ($parmlev ne 'general') {      $r->print(&Apache::lonhtmlcommon::row_closure());
         $r->print(&Apache::lonhtmlcommon::row_closure());      &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp,$parmlev);
         &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp);  
     }  
     $r->print(&Apache::lonhtmlcommon::row_closure(1));      $r->print(&Apache::lonhtmlcommon::row_closure(1));
     $r->print(&Apache::lonhtmlcommon::end_pick_box());      $r->print(&Apache::lonhtmlcommon::end_pick_box());
     $r->print('</div></div>');      $r->print('</div></div>');
Line 5939  ENDOVER Line 6228  ENDOVER
     $r->print('<div>');      $r->print('<div>');
     my $sortorder=$env{'form.sortorder'};      my $sortorder=$env{'form.sortorder'};
     unless ($sortorder) { $sortorder='realmstudent'; }      unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder);      &sortmenu($r,$sortorder,'newoverview');
     $r->print('</div></div>');      $r->print('</div></div>');
   
     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');      $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
Line 5964  ENDOVER Line 6253  ENDOVER
   
 # List data  # List data
   
         &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly);          my $hash_for_realm;
           if (($parmlev eq 'map') && (keys(%allmaps))) {
               %{$hash_for_realm} = reverse(%allmaps);
           } elsif (($parmlev eq 'full') && (keys(%symbp))) {
               for (my $i=0; $i<@ids; $i++) {
                   $hash_for_realm->{$symbp{$ids[$i]}} = $i;
               }
           }
           &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly,$parmlev,$hash_for_realm,$pschp);
     }      }
     $r->print(&tableend());      $r->print(&tableend());
     unless ($readonly) {      unless ($readonly) {
Line 6071  sub overview { Line 6368  sub overview {
   
     my $sortorder=$env{'form.sortorder'};      my $sortorder=$env{'form.sortorder'};
     unless ($sortorder) { $sortorder='realmstudent'; }      unless ($sortorder) { $sortorder='realmstudent'; }
     &sortmenu($r,$sortorder);      &sortmenu($r,$sortorder,'overview');
   
     my $submitbutton = '<input type="submit" value="'.&mt('Save').'" />';      my $submitbutton = '<input type="submit" value="'.&mt('Save').'" />';
   

Removed from v.1.601  
changed lines
  Added in v.1.621


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