[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /interface lonblockingmenu.pm

raeburn raeburn at source.lon-capa.org
Sun Oct 23 13:06:49 EDT 2016


raeburn		Sun Oct 23 17:06:49 2016 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	lonblockingmenu.pm 
  Log:
  - For 2.11
    - Backport 1.19, 1.20, 1.21, 1.22, 1.23, 1.24
  
  
-------------- next part --------------
Index: loncom/interface/lonblockingmenu.pm
diff -u loncom/interface/lonblockingmenu.pm:1.14.2.2 loncom/interface/lonblockingmenu.pm:1.14.2.3
--- loncom/interface/lonblockingmenu.pm:1.14.2.2	Wed Jan 27 03:05:37 2016
+++ loncom/interface/lonblockingmenu.pm	Sun Oct 23 17:06:49 2016
@@ -2,7 +2,7 @@
 # Routines for configuring blocking of access to collaborative functions, 
 # and specific resources during an exam
 #
-# $Id: lonblockingmenu.pm,v 1.14.2.2 2016/01/27 03:05:37 raeburn Exp $
+# $Id: lonblockingmenu.pm,v 1.14.2.3 2016/10/23 17:06:49 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -105,6 +105,19 @@
 
 =over
 
+=item &get_permission()
+
+Returns information about permission user has to set/modify exam
+blocking events.
+
+Inputs: None
+
+Outputs: 2
+    $readonly - true if modification of blocking events is prohibited.
+
+    $allowed  - true if blocking events information can be shown.
+
+
 =item &get_timed_items()
 
 Provides perl data structure with information about timed interval
@@ -222,7 +235,7 @@
 Generates web form elements used to display, cancel, or modify 
 existing blocking events. 
 
-Inputs: 7 
+Inputs: 8 
       - $r - Apache request object
 
       - $records - Reference to hash of current blocks
@@ -238,6 +251,9 @@
 
       - $blockcount - number of existing blocking events in course
 
+      - $readonly - if true, modification not allowed.
+
+
 Output: None
 
 Side Effects: prints web form elements (in a table) for current blocks. 
@@ -302,13 +318,16 @@
 items in the course for use in an exam block of type: "Triggered by 
 Activating Timer".
 
-Inputs: 7 (three required, last four optional)
+Inputs: 8 (four required, last four optional)
    - $intervals - Reference to hash of parameters for timed intervals
 
    - $parmcount - numeric ID of current block
 
    - $navmap - navmaps object
 
+   - $context - this will be "accesstimes" if called by lonaccesstimes.pm,
+                or "blocking" if called internally by lonblockingmenu.pm
+
    - $currkey - current interval (where this is a block already using
                 an interval-based trigger).  
 
@@ -323,6 +342,34 @@
 Outputs: 1 - $intervalform - web form elements used to select a time interval
 
 
+=item &interval_details()
+
+Creates name/scope of current interval and expandable/collapsible
+showing which interval parameters apply to the current folder/resource
+
+Inputs: 6
+
+    - $item - course, map url, or resource symb
+
+    - $type - course, map, or resource
+
+    - $url  - url of item (null if item is course).
+
+    - $navmap - navmaps object
+
+    - $intervals - Reference to hash of parameters for timed intervals
+
+    - $parmcount - unique ID for current element.
+
+
+Outputs: 2
+
+   - $itemname - name/scope of interval (timer) parameter
+
+   - $iteminfo - Expandable/collapsible block showing which interval
+                 (timer) parameters affect the current folder or resource.
+
+
 =item &trigger_details_toggle()
  
 Creates link used to expand item showing information about timer for current
@@ -332,6 +379,7 @@
 
 Outputs: 1 - returns HTML for link to display contents of information item 
 
+
 =item &show_timer_path()
 
 Display hierarchy of names of folders/sub-folders containing the current
@@ -376,12 +424,21 @@
 
 =item *  for action to take -- add or modify block
 
-=item *  for display of detailed information about intervals 
-
 =back
 
 
-=back  
+=item &details_javascript()
+
+Create Javascript to toggle visibility of unordered list item
+containing details about item with timed interval parameter.
+
+Inputs: none
+
+Output: 1 Javascript (with <script></script> tags) for functions used to:
+          toggle visibility of unordered list for display of detailed
+          information about intervals.
+
+=back
 
 =cut
 
@@ -422,11 +479,10 @@
 
 # ----------------------------------------------------------- Permissions check
 
-    unless ((&Apache::lonnet::allowed('dcm',$env{'request.course.id'})) ||
-            (&Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
-                                      '/'.$env{'request.course.sec'}))) {
+    my ($readonly,$allowed) = &get_permission();
+    unless ($allowed) {
         $env{'user.error.msg'}=
-     "/adm/setblock:dcm:0:0:Cannot set blocking of communications in a course";
+     "/adm/setblock:dcm:0:0:Cannot view/set blocking of communications in a course";
         return HTTP_NOT_ACCEPTABLE;
     }
 
@@ -471,7 +527,7 @@
             $r->print(&Apache::loncourserespicker::create_picker($navmap,
                                      'examblock','resourceblocks',$crstype,
                                      \%blockedmaps,\%blockedresources,
-                                     $env{'form.block'}));
+                                     $env{'form.block'},'','',undef,$readonly));
         } else {
             $r->print($errormsg);
         }
@@ -480,10 +536,12 @@
 
 # -------------------------- Store changes and retrieve latest block information
     my $storeresult;
-    if ($env{'form.action'} eq 'store') {
-        (my $numchanges,$storeresult) = &blockstore($r,$crstype,$blockcount,\%records);
-        if ($numchanges > 0) {
-            $blockcount = &get_blockdates(\%records);
+    unless ($readonly) {
+        if ($env{'form.action'} eq 'store') {
+            (my $numchanges,$storeresult) = &blockstore($r,$crstype,$blockcount,\%records);
+            if ($numchanges > 0) {
+                $blockcount = &get_blockdates(\%records);
+            }
         }
     }
 
@@ -503,7 +561,8 @@
         ({href=>'/adm/setblock',
           text=>'Blocking communication/content access'});
 
-    my $js = &blockingmenu_javascript($blockcount);
+    my $js = &blockingmenu_javascript($blockcount).
+             &details_javascript();
 
     $r->print(
         &Apache::loncommon::start_page('Blocking communication/content access',$js).
@@ -569,8 +628,10 @@
 
 # ------------------------ Choose between modifying existing block or adding new
     $r->print('<form name="blockform" method="post" action="/adm/setblock?action=store">');
-    if ($blockcount > 0) {
-         $r->print(<<"END");
+
+    unless ($readonly) {
+        if ($blockcount > 0) {
+            $r->print(<<"END");
 <div class="LC_left_float">
 <fieldset><legend>$lt{'actt'}</legend>
 <span class="LC_nobreak">
@@ -587,33 +648,61 @@
 <br clear="all" />
 <div id="showadd" style="display:none">
 END
-    } else {
-        $r->print($lt{'ncbc'}.'<br /><br />'.
-                  '<h4>'.$lt{'addn'}.'</h4>'.
-                  '<input type="hidden" name="blockaction" value="add" />');
+        } else {
+            $r->print($lt{'ncbc'}.'<br /><br />'.
+                      '<h4>'.$lt{'addn'}.'</h4>'.
+                      '<input type="hidden" name="blockaction" value="add" />');
+        }
     }
     my ($navmap,$errormsg) =
         &Apache::loncourserespicker::get_navmap_object($crstype,'examblock');
 
 # --------------------------------------------- Interface for adding a new block
-    &display_addblocker_table($r,$blockcount,\%ltext,\%intervals,
-                              $navmap,$errormsg);
-
-# ------------------------------------------------- Interface for existig blocks
-    if ($blockcount > 0) {
-        $r->print('</div>');
+    unless ($readonly) {
+        &display_addblocker_table($r,$blockcount,\%ltext,\%intervals,
+                                  $navmap,$errormsg);
+        if ($blockcount > 0) {
+            $r->print('</div>');
+        }
+    }
+# ------------------------------------------------ Interface for existing blocks
+    if (!$blockcount) {
+        if ($readonly) {
+            $r->print($lt{'ncbc'}.'<br />');
+        }
+    } else {
         &display_blocker_status($r,\%records,\%ltext,\%intervals,
-                                $navmap,$errormsg,$blockcount);
+                                $navmap,$errormsg,$blockcount,$readonly);
     }
-    $r->print(<<"END");
+    unless ($readonly) {
+        $r->print(<<"END");
 <br />
 <input type ="submit" value="$lt{'stor'}" />
-</form>
 END
-    $r->print(&Apache::loncommon::end_page());
+    }
+    $r->print('</form>'.
+              &Apache::loncommon::end_page());
     return OK;
 }
 
+sub get_permission {
+    my %permission;
+    my $allowed = 0;
+    my $readonly = 0;
+    return ($readonly,$allowed) unless ($env{'request.course.id'});
+    if ((&Apache::lonnet::allowed('dcm',$env{'request.course.id'})) ||
+        (&Apache::lonnet::allowed('dcm',$env{'request.course.id'}.'/'.
+                  $env{'request.course.sec'}))) {
+        $allowed = 1;
+    } elsif ((&Apache::lonnet::allowed('vcb',$env{'request.course.id'})) ||
+             (&Apache::lonnet::allowed('vcb',$env{'request.course.id'}.'/'.
+                  $env{'request.course.sec'}))) {
+        $readonly = 1;
+        $allowed = 1;
+    }
+    return ($readonly,$allowed);
+}
+
 sub get_timed_items {
     my ($cdom,$cnum) = @_;
     my ($cid,%intervals);
@@ -630,7 +719,7 @@
     my $resourcedata=&Apache::lonparmset::readdata($cnum,$cdom);
     if (ref($resourcedata) eq 'HASH') {
         foreach my $key (keys(%{$resourcedata})) {
-            if ($key =~ /^\Q$cid\E(.+)\.0\.interval$/) {
+            if ($key =~ /^\Q$cid\E(.*)\.0\.interval$/) {
                 my $middle = $1;
                 if ($middle eq '') {
                     $intervals{'course'}{'all'} = $resourcedata->{$key};
@@ -975,9 +1064,9 @@
 }
 
 sub display_blocker_status {
-    my ($r,$records,$ltext,$intervals,$navmap,$errormsg,$blockcount) = @_;
+    my ($r,$records,$ltext,$intervals,$navmap,$errormsg,$blockcount,$readonly) = @_;
     my $parmcount = 0;
-    my (%map_url,%resource_symb,%titles,%lookups);
+    my (%map_url,%resource_symb,%titles,%lookups,$disabled);
     &Apache::loncourserespicker::enumerate_course_contents($navmap,\%map_url,\%resource_symb,\%titles,'examblock');
     %{$lookups{'maps'}} = reverse(%map_url);
     %{$lookups{'resources'}} = reverse(%resource_symb);
@@ -987,10 +1076,13 @@
         'noch' => 'No change',
     );
     $r->print('<div id="showmodify" style="display:block">'.
-              &Apache::loncommon::start_data_table());
+              &Apache::loncommon::start_data_table().'<tr>');
+    if ($readonly) {
+        $disabled = ' disabled="disabled"';
+    } else {
+        $r->print('<th></th>');
+    }
     $r->print(<<"END");
-  <tr>
-    <th></th>
     <th>$ltext->{'type'}</th>
     <th>$ltext->{'even'}</th>
     <th>$ltext->{'blck'}</th>
@@ -1009,8 +1101,12 @@
            &Apache::loncommon::aboutmewrapper(
                            &Apache::loncommon::plainname($setuname,$setudom),
                            $setuname,$setudom);
+        my $state = '';
         $r->print(&Apache::loncommon::start_data_table_row());
-        $r->print(<<"ACT");
+        if ($readonly) {
+            $state = 'disabled';
+        } else {
+            $r->print(<<"ACT");
 
         <td valign="middle"><span class="LC_nobreak"><label>
         <input type="radio" name="action_$parmcount" value="modify" />$lt{'modi'}
@@ -1024,19 +1120,21 @@
         </label></span>
         </td>
 ACT
+        }
         my ($start,$end,$startform,$endform); 
         if ($record =~ /^(\d+)____(\d+)$/) {
             ($start,$end) = split(/____/,$record);
             $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.
-                                                             $parmcount,$start,$onchange);
+                                                             $parmcount,$start,$onchange,
+                                                             undef,$state);
             $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.
-                                                           $parmcount,$end,$onchange);
+                                                           $parmcount,$end,$onchange,
+                                                           undef,$state);
             $r->print('<td><fieldset><legend>'.$ltext->{'defs'}.'</legend>'.
                       $ltext->{'star'}.': '.$startform.'<br />'.
                       $ltext->{'endd'}.':  '.$endform.'</fieldset></td>');
         } elsif ($record =~ /^firstaccess____(.+)$/) {
             my $item = $1;
-            my ($itemname,$iteminfo,$skipdetails);
             my $type = 'map';
             my $url;
             if ($item eq 'course') {
@@ -1048,130 +1146,20 @@
                 $url = $item;
             }
             $r->print('<td><fieldset><legend>'.$ltext->{'trig'}.'</legend>');
-            if ($type eq 'course') {
-                $itemname = &mt('Timer for all items in course.');
-            } else {
-                if (&Apache::lonnet::is_on_map($url)) { 
-                    if ($type eq 'map') {
-                        if (ref($navmap)) {
-                            my $title;
-                            my $resobj = $navmap->getResourceByUrl($item);
-                            if (ref($resobj)) { 
-                                $title = $resobj->compTitle();
-                            } else {
-                                $title = &Apache::lonnet::gettitle($item);
-                            }
-                            $itemname = &mt('Timer for all items in folder: [_1]',
-                                            '<span style="font-style:italic">'.
-                                            $title.'</span>');
-                        }
-                    } else {
-                        if (ref($navmap)) {
-                            my $title;
-                            my $resobj = $navmap->getBySymb($item);
-                            if (ref($resobj)) {
-                                $title = $resobj->compTitle();
-                            } else {
-                                $title = &Apache::lonnet::gettitle($item);
-                            }
-                            $itemname = &mt('Timer for resource: [_1]',
-                                             '<span style="font-style:italic">'.
-                                             $title.'</span>');
-                        }
-                    }
-                    if (ref($navmap)) {
-                        my $path = &show_timer_path($type,$item);
-                        if ($path) {
-                            $iteminfo  = ' <span style="font-size:90%;">'.
-                                         &mt('(in: [_1])',$path).
-                                         '</span>';
-                        }
-                    }
-                } else {
-                    $skipdetails = 1;
-                    $itemname = '<span style="LC_warning">'.
-                                &mt('Timer folder/resource not in course').
-                                '</span>';  
-                }
-            }
-            if ((!$skipdetails) && (ref($intervals) eq 'HASH')) {
-                if (ref($intervals->{$type}) eq 'HASH') {
-                    $iteminfo .= &trigger_details_toggle($parmcount).
-                                '<ul id="trigdetails_'.$parmcount.'" style="display:none">';
-                    if ($type eq 'course') {
-                        foreach my $scope (keys(%{$intervals->{$type}})) {
-                            if ($scope eq 'all') {
-                                $iteminfo .= '<li>'.&mt('All users -- time limit: [_1]',
-                                         &convlim($intervals->{$type}->{$scope})).'</li>';
-                            } elsif ($scope eq 'secgrp') {
-                                if (ref($intervals->{$type}->{$scope}) eq 'HASH') {
-                                    $iteminfo .= '<li>'.&mt('Sections/groups').'<ul>';
-                                    foreach my $item (sort(keys(%{$intervals->{$type}->{$scope}}))) {
-                                        $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',$item,
-                                                     &convlim($intervals->{$type}->{$scope}->{$item})).
-                                                     '</li>';
-                                    }
-                                    $iteminfo .= '</ul></li>';
-                                }
-                            } elsif ($scope eq 'users') {
-                                if (ref($intervals->{$type}->{$scope}) eq 'HASH') {
-                                    $iteminfo .= '<li>'.&mt('Users').'<ul>'; 
-                                    foreach my $item (sort(keys(%{$intervals->{$type}->{$scope}}))) {
-                                        $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',
-                                                     &convlim($item,$intervals->{$type}->{$scope}->{$item})).
-                                                     '</li>';
-                                    }
-                                    $iteminfo .= '</ul></li>';
-                                }
-                            }
-                        }
-                    } elsif (($type eq 'map') || ($type eq 'resource')) {
-                        if (ref($intervals->{$type}->{$item}) eq 'HASH') { 
-                            foreach my $scope (keys(%{$intervals->{$type}->{$item}})) {
-                                if ($scope eq 'all') {
-                                    $iteminfo .= '<li>'.&mt('All users -- time limit: [_1]',
-                                                  &convlim($intervals->{$type}->{$item}->{$scope})).
-                                                  '</li>';
-                                } elsif ($scope eq 'secgrp') {
-                                    if (ref($intervals->{$type}->{$item}->{$scope}) eq 'HASH') {
-                                        $iteminfo .= '<li>'.&mt('Sections/groups').'<ul>';
-                                        foreach my $sec (sort(keys(%{$intervals->{$type}->{$item}->{$scope}}))) {
-                                            $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',$sec,
-                                                         &convlim($intervals->{$type}->{$item}->{$scope}->{$sec})).
-                                                         '</li>';
-                                        }
-                                        $iteminfo .= '</ul></li>'; 
-                                    }
-                                } elsif ($scope eq 'users') {
-                                    if (ref($intervals->{$type}->{$item}->{$scope}) eq 'HASH') {
-                                        $iteminfo .= '<li>'.&mt('Users').'<ul>';
-                                        foreach my $user (sort(keys(%{$intervals->{$type}->{$item}->{$scope}}))) {
-                                            $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',$user,
-                                                         &convlim($intervals->{$type}->{$item}->{$scope}->{$user})).
-                                                         '</li>';
-                                        }
-                                        $iteminfo .= '</ul></li>';
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    $iteminfo .= '</ul>';
-                }
-            }
-            $r->print(&create_interval_form($intervals,$parmcount,$navmap,$item,$jschg,
-                                            $itemname,$iteminfo).'</fieldset></td>');
+            my ($itemname,$iteminfo) = &interval_details($item,$type,$url,$navmap,$intervals,$parmcount);
+            $r->print(&create_interval_form($intervals,$parmcount,$navmap,'blocking',$item,$jschg,
+                                            $itemname,$iteminfo,$disabled).'</fieldset></td>');
         }
         $r->print(<<"END");
         <td>
-         <input type="text" name="title_$parmcount" size="15" value="$title" onfocus="$jschg" />
+         <input type="text" name="title_$parmcount" size="15" value="$title" onfocus="$jschg" $disabled />
          <input type="hidden" name="key_$parmcount" value="$blockid" />
          <br />
          <br />
          $ltext->{'setb'}: $settername
         </td>
 END
-        $r->print('<td>'.&blocker_checkboxes($parmcount,$blocks,$jschg,\%lookups).'</td>'.
+        $r->print('<td>'.&blocker_checkboxes($parmcount,$blocks,$jschg,\%lookups,$disabled).'</td>'.
                   &Apache::loncommon::end_data_table_row());
         $parmcount++;
     }
@@ -1223,7 +1211,7 @@
     my %lt = &Apache::lonlocal::texthash(
         'exam' => 'e.g., Exam 1',
     );
-    my $intervalform = &create_interval_form($intervals,$parmcount,$navmap);
+    my $intervalform = &create_interval_form($intervals,$parmcount,$navmap,'blocking');
     if ($intervalform ne '') {
         $intervalform = '<fieldset>'.
                         '<legend>'.$ltext->{'chtr'}.'</legend>'.
@@ -1261,7 +1249,7 @@
 }
 
 sub blocker_checkboxes {
-    my ($parmcount,$blocks,$jschg,$lookups) = @_;
+    my ($parmcount,$blocks,$jschg,$lookups,$disabled) = @_;
     my ($typeorder,$types) = &blocktype_text();
     my $numinrow = 2;
     my %currdocs;
@@ -1328,7 +1316,7 @@
         } 
         $output .= '<span class="LC_nobreak"><label>'."\n".
                    '<input type="checkbox" id="'.$item.'" name="'.$item.'"'.
-                   $blockstatus.$clickaction.' value="1" />'.
+                   $blockstatus.$clickaction.' value="1"'.$disabled.' />'.
                    $types->{$block}.'</label></span>'."\n";
         if ($block eq 'docs') {
             if ($blockstatus ne '') {
@@ -1347,9 +1335,10 @@
 }
 
 sub create_interval_form {
-    my ($intervals,$parmcount,$navmap,$currkey,$jschg,$itemname,$iteminfo) = @_;
+    my ($intervals,$parmcount,$navmap,$context,$currkey,$jschg,$itemname,$iteminfo,$disabled) = @_;
     return unless ((ref($intervals) eq 'HASH') && (ref($navmap)));
     my $intervalform;
+    my $counter = 0;
     if (keys(%{$intervals}) > 0) {
         foreach my $type (sort(keys(%{$intervals}))) {
             if ($type eq 'course') {
@@ -1360,7 +1349,7 @@
                     $clickaction = ' onclick="'.$jschg.'"';
                 }
                 $intervalform .= '<label><input type="radio" name="firstaccess_'.$parmcount.
-                                 '" value="course"'.$checked.$clickaction.' />';
+                                 '" value="course"'.$checked.$clickaction.$disabled.' />';
                 if ($currkey eq 'course') {
                     $intervalform .= $itemname;
                 } else {
@@ -1369,8 +1358,14 @@
                 $intervalform .= '</label>';
                 if ($currkey eq 'course') {
                     $intervalform .= $iteminfo;
+                } elsif ($context eq 'accesstimes') {
+                    (undef,$iteminfo) = &interval_details('course',$type,'',$navmap,$intervals,$counter);
+                    if ($iteminfo) {
+                        $intervalform .= ' '.$iteminfo;
+                    }
                 }
                 $intervalform .= '<br />';
+                $counter ++;
             } elsif ($type eq 'map') {
                 if (ref($intervals->{$type}) eq 'HASH') {
                     if (ref($navmap)) {
@@ -1385,7 +1380,7 @@
                             }
                             $intervalform .= '<label><input type="radio" name="firstaccess_'.$parmcount.
                                              '" value="'.&HTML::Entities::encode($map,'"<>&').'"'.
-                                             $checked.$clickaction.' />';
+                                             $checked.$clickaction.$disabled.' />';
                             if ($currkey eq $map) {
                                 $intervalform .= $itemname.'</label>'.$iteminfo;
                             } else {
@@ -1405,8 +1400,15 @@
                                 $intervalform .= &mt('Timer for all items in folder: [_1]',
                                                      '<i>'.$title.'</i>').
                                                  '</label>'.$path;
+                                if ($context eq 'accesstimes') {
+                                    (undef,$iteminfo) = &interval_details($map,$type,$map,$navmap,$intervals,$counter);
+                                    if ($iteminfo) {
+                                        $intervalform .= ' '.$iteminfo;
+                                    }
+                                }
                             }
                             $intervalform .= '<br />';
+                            $counter ++;
                         }
                     }
                 }
@@ -1426,14 +1428,15 @@
                             }
                             $intervalform .= '<label><input type="radio" name="firstaccess_'.$parmcount.
                                              '" value="'.&HTML::Entities::encode($resource,'"<>&').'"'.
-                                             $checked.$clickaction.' />';
+                                             $checked.$clickaction.$disabled.' />';
                             if ($currkey eq $resource) {
                                 $intervalform .= $itemname.'</label>'.$iteminfo;
                             } else {
                                 my ($title,$path,$hierarchy);
                                 if (ref($resobj)) {
                                     $title = $resobj->compTitle();
-                                } else {
+                                }
+                                if ($title eq '') {
                                     $title = &Apache::lonnet::gettitle($resource);
                                 }
                                 $hierarchy = &show_timer_path($type,$resource,$navmap);
@@ -1445,8 +1448,19 @@
                                 $intervalform .= &mt('Timer for resource: [_1]','<i>'.$title.'</i>').
                                                  '</label>'.
                                                  $path;
+                                if ($context eq 'accesstimes') {
+                                    if (ref($resobj)) {
+                                        my $url = $resobj->src();
+                                        if ($url eq '') {
+                                            (my $map, my $resid, $url) = &Apache::lonnet::decode_symb($resource);
+                                        }
+                                        ($itemname,$iteminfo) = &interval_details($resource,$type,$url,$navmap,$intervals,$counter);
+                                        $intervalform .= ' '.$iteminfo;
+                                    }
+                                }
                             }
                             $intervalform .= '<br />';
+                            $counter ++;
                         }
                     }
                 }
@@ -1456,7 +1470,7 @@
         if ($currkey ne '') {
             $intervalform = '<input type="radio" name="firstaccess_'.$parmcount.
                             '" checked="checked" value="'.
-                            &HTML::Entities::encode($currkey,'"<>&').' />'.
+                            &HTML::Entities::encode($currkey,'"<>&').'"'.$disabled.' />'.
                             $itemname.'<br />';
         } else {
             $intervalform = &mt('No timed items defined.').' '.
@@ -1474,6 +1488,121 @@
            'style="text-decoration: none;"><b>'.&mt('(More ...)').'</b></a></span>';
 }
 
+sub interval_details {
+    my ($item,$type,$url,$navmap,$intervals,$parmcount) = @_;
+    my ($itemname,$iteminfo,$skipdetails);
+    if ($type eq 'course') {
+        $itemname = &mt('Timer for all items in course.');
+    } else {
+        if (&Apache::lonnet::is_on_map($url)) {
+            if ($type eq 'map') {
+                if (ref($navmap)) {
+                    my $title;
+                    my $resobj = $navmap->getResourceByUrl($item);
+                    if (ref($resobj)) {
+                        $title = $resobj->compTitle();
+                    } else {
+                        $title = &Apache::lonnet::gettitle($item);
+                    }
+                    $itemname = &mt('Timer for all items in folder: [_1]',
+                                    '<span style="font-style:italic">'.
+                                    $title.'</span>');
+                }
+            } else {
+                if (ref($navmap)) {
+                    my $title;
+                    my $resobj = $navmap->getBySymb($item);
+                    if (ref($resobj)) {
+                        $title = $resobj->compTitle();
+                    } else {
+                        $title = &Apache::lonnet::gettitle($item);
+                    }
+                    $itemname = &mt('Timer for resource: [_1]',
+                                    '<span style="font-style:italic">'.
+                                    $title.'</span>');
+                }
+            }
+            if (ref($navmap)) {
+                my $path = &show_timer_path($type,$item);
+                if ($path) {
+                   $iteminfo  = ' <span style="font-size:90%;">'.
+                                  &mt('(in: [_1])',$path).
+                                  '</span>';
+                }
+            }
+        } else {
+            $skipdetails = 1;
+            $itemname = '<span style="LC_warning">'.
+                        &mt('Timer folder/resource not in course').
+                        '</span>';
+        }
+    }
+    if ((!$skipdetails) && (ref($intervals) eq 'HASH') && (ref($intervals->{$type}) eq 'HASH')) {
+        $iteminfo = &trigger_details_toggle($parmcount).
+                    '<ul id="trigdetails_'.$parmcount.'" style="display:none">';
+        if ($type eq 'course') {
+            foreach my $scope (keys(%{$intervals->{$type}})) {
+                if ($scope eq 'all') {
+                    $iteminfo .= '<li>'.&mt('All users -- time limit: [_1]',
+                                 &convlim($intervals->{$type}->{$scope})).'</li>';
+                } elsif ($scope eq 'secgrp') {
+                    if (ref($intervals->{$type}->{$scope}) eq 'HASH') {
+                        $iteminfo .= '<li>'.&mt('Sections/groups').'<ul>';
+                        foreach my $item (sort(keys(%{$intervals->{$type}->{$scope}}))) {
+                            $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',$item,
+                                         &convlim($intervals->{$type}->{$scope}->{$item})).
+                                         '</li>';
+                        }
+                        $iteminfo .= '</ul></li>';
+                    }
+                } elsif ($scope eq 'users') {
+                    if (ref($intervals->{$type}->{$scope}) eq 'HASH') {
+                        $iteminfo .= '<li>'.&mt('Users').'<ul>';
+                        foreach my $item (sort(keys(%{$intervals->{$type}->{$scope}}))) {
+                            $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',
+                                         &convlim($item,$intervals->{$type}->{$scope}->{$item})).
+                                         '</li>';
+                        }
+                        $iteminfo .= '</ul></li>';
+                    }
+                }
+            }
+        } elsif (($type eq 'map') || ($type eq 'resource')) {
+            if (ref($intervals->{$type}->{$item}) eq 'HASH') {
+                foreach my $scope (keys(%{$intervals->{$type}->{$item}})) {
+                    if ($scope eq 'all') {
+                        $iteminfo .= '<li>'.&mt('All users -- time limit: [_1]',
+                                     &convlim($intervals->{$type}->{$item}->{$scope})).
+                                     '</li>';
+                    } elsif ($scope eq 'secgrp') {
+                        if (ref($intervals->{$type}->{$item}->{$scope}) eq 'HASH') {
+                            $iteminfo .= '<li>'.&mt('Sections/groups').'<ul>';
+                            foreach my $sec (sort(keys(%{$intervals->{$type}->{$item}->{$scope}}))) {
+                                $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',$sec,
+                                             &convlim($intervals->{$type}->{$item}->{$scope}->{$sec})).
+                                            '</li>';
+                            }
+                            $iteminfo .= '</ul></li>';
+                        }
+                    } elsif ($scope eq 'users') {
+                        if (ref($intervals->{$type}->{$item}->{$scope}) eq 'HASH') {
+                            $iteminfo .= '<li>'.&mt('Users').'<ul>';
+                            foreach my $user (sort(keys(%{$intervals->{$type}->{$item}->{$scope}}))) {
+                                $iteminfo .= '<li>'.&mt('[_1] -- time limit: [_2]',$user,
+                                             &convlim($intervals->{$type}->{$item}->{$scope}->{$user})).
+                                             '</li>';
+                            }
+                            $iteminfo .= '</ul></li>';
+                        }
+                    }
+                }
+            }
+        }
+        $iteminfo .= '</ul>';
+    }
+    return ($itemname,$iteminfo);
+}
+
 sub show_timer_path {
     my ($type,$item,$navmap) = @_;
     return unless(ref($navmap));
@@ -1510,10 +1639,6 @@
 
 sub blockingmenu_javascript {
     my ($blockcount) = @_;
-    my %lt = &Apache::lonlocal::texthash (
-                                           more => 'More ...',
-                                           less => 'Less ...',
-                                         );
     return <<ENDSCRIPT;
 <script type="text/javascript">
 // <![CDATA[
@@ -1569,6 +1694,22 @@
     return;
 }
 
+// ]]>
+</script>
+ENDSCRIPT
+
+}
+
+sub details_javascript {
+    my %lt = &Apache::lonlocal::texthash (
+                                           more => 'More ...',
+                                           less => 'Less ...',
+                                         );
+    return <<ENDSCRIPT;
+
+<script type="text/javascript">
+// <![CDATA[
+
 function showTriggerDetails(item) {
     document.getElementById('trigdetails_'+item).style.display='block';
     document.getElementById('trigdetails_'+item).style.textAlign='left';


More information about the LON-CAPA-cvs mailing list