Diff for /loncom/interface/lonpickcourse.pm between versions 1.122 and 1.123

version 1.122, 2016/11/02 22:41:18 version 1.123, 2017/01/02 19:44:06
Line 37  use Apache::lonnet; Line 37  use Apache::lonnet;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::longroup;  use Apache::longroup;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   use JSON::DWIW;
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
       if ($env{'form.context'} eq 'adhoc') {
           &Apache::loncommon::content_type($r,'application/json');
           $r->send_http_header;
           my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($env{'form.cid'});
           if ((ref($possroles) eq 'ARRAY') && (ref($description) eq 'HASH')) {
               my $response = [];
               if (@{$possroles}) {
                   foreach my $role (@{$possroles}) {
                       push(@{$response},
                                         { name => $role,
                                           desc => $description->{$role},
                                         });
                   }
               }
               $r->print(JSON::DWIW->to_json({roles => $response}));
           }
           return OK;
       }
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
       
 # ------------------------------------------------------------ Print the screen  # ------------------------------------------------------------ Print the screen
   
     # Get parameters from query string      # Get parameters from query string
Line 53  sub handler { Line 72  sub handler {
                                'multiple','type','setroles','fixeddom','cloner',                                 'multiple','type','setroles','fixeddom','cloner',
                                'crscode','crsdom']);                                 'crscode','crsdom']);
     my ($type,$title,$jscript,$multelement,$multiple,$roleelement,$typeelement,      my ($type,$title,$jscript,$multelement,$multiple,$roleelement,$typeelement,
         $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom,$crscode,$crsdom);          $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom,$crscode,
           $crsdom,$rolechooser);
   
     # Get course type - Course, Community or Placement.      # Get course type - Course, Community or Placement.
     $type = $env{'form.type'};      $type = $env{'form.type'};
Line 75  sub handler { Line 95  sub handler {
         $roleelement = '<input type="hidden" name="roleelement" value="'.$env{'form.roleelement'}.'" />';          $roleelement = '<input type="hidden" name="roleelement" value="'.$env{'form.roleelement'}.'" />';
         $submitopener = &processpick();          $submitopener = &processpick();
         $autosubmit = 'process_pick("'.$roledom.'","'.$rolename.'")';          $autosubmit = 'process_pick("'.$roledom.'","'.$rolename.'")';
           if ($rolename eq 'dh') {
               my %lt = &Apache::lonlocal::texthash(
                        title    => 'Ad hoc role selection',
                        preamble => 'Please choose an ad hoc role in the course.',
                        cancel   => 'Click "OK" to enter the course, or "Cancel" to choose a different course.',
               );
   
               $rolechooser = <<"END";
   <div id="LC_adhocrole_chooser" title="$lt{'title'}">
     <p>$lt{'preamble'}</p>
     <form name="LChelpdeskadhoc" id="LChelpdeskpicker" action="">
       <div id="LC_choose_adhoc">
       </div>
       <input type="submit" tabindex="-1" style="position:absolute; top:-1000px" />
     </form>
     <p>$lt{'cancel'}</p>
   </div>
   END
           }
     }      }
     if ($env{'form.typeelement'} ne '') {      if ($env{'form.typeelement'} ne '') {
         $typeelement = '<input type="hidden" name="typeelement" value="'.$env{'form.typeelement'}.'" />';          $typeelement = '<input type="hidden" name="typeelement" value="'.$env{'form.typeelement'}.'" />';
Line 149  sub handler { Line 188  sub handler {
     # print javascript functions for choosing a course       # print javascript functions for choosing a course 
     if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) ||       if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) || 
         $onlyown) {          $onlyown) {
         $r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction));          $r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction,
                                          $rolename,$rolechooser));
     }      }
     $r->print(&Apache::lonhtmlcommon::scripttag($jscript));      $r->print(&Apache::lonhtmlcommon::scripttag($jscript));
     $r->print($submitopener);      $r->print($submitopener);
Line 803  sub course_chooser { Line 843  sub course_chooser {
 }  }
   
 sub gochoose_javascript {  sub gochoose_javascript {
     my ($type,$multiple,$autosubmit,$lastaction) = @_;      my ($type,$multiple,$autosubmit,$lastaction,$rolename,$rolechooser) = @_;
     my %elements = (      my %elements = (
                      'Course' => {                       'Course' => {
                                  name  => 'coursepick',                                   name  => 'coursepick',
Line 821  sub gochoose_javascript { Line 861  sub gochoose_javascript {
                                  list  => 'courselist',                                   list  => 'courselist',
                                  },                                   },
                     );                      );
     my $output = qq|  
       my %lt = &Apache::lonlocal::texthash (
           none => 'You are not eligible to use an ad hoc role for the selected course',
           ok => 'OK',
           exit => 'Cancel',       
       );
       &js_escape(\%lt);
   
       my $output;
       if ($rolechooser) {
           $output .= qq|
   \$( "#LC_adhocrole_chooser" ).dialog({ autoOpen: false });
   |;
       }
       $output .= qq|
 function gochoose(cname,cdom,cdesc) {  function gochoose(cname,cdom,cdesc) {
     var openerForm = "$env{'form.form'}";      var openerForm = "$env{'form.form'}";
       var openerRole = "$rolename";
     courseCount = 0;      courseCount = 0;
     var courses = '';      var courses = '';
 |;  |;
Line 899  ENDNAMECODE Line 954  ENDNAMECODE
         }          }
 |;  |;
     }      }
     $output .= qq|      $output .= <<ENDJS;
     if (openerForm == 'portform') {      if (openerForm == 'portform') {
         document.courselist.cnum.value = cname;          document.courselist.cnum.value = cname;
         document.courselist.cdom.value = cdom;          document.courselist.cdom.value = cdom;
     }      }
     $autosubmit      if ((openerForm == 'rolechoice') && (openerRole == 'dh')) {
     $lastaction  \$("#LC_choose_adhoc").empty();
   var http = new XMLHttpRequest();
   var url = "/adm/pickcourse";
   var params = "cid="+cdom+"_"+cname+"&context=adhoc";
   http.open("POST", url, true);
   http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   http.onreadystatechange = function() {
       if(http.readyState == 4 && http.status == 200) {
           var data = \$.parseJSON(http.responseText);
           var len = data.roles.length;
           if (len == '' || len == null || len == 0) {
               alert('$lt{none}');  
           } else {
               if (len == 1) {
                   process_pick(cdom,data.roles[0].name);
                   $lastaction;
               } else {
                   var str = '';
                   for (var i=0; i<data.roles.length; i++) { 
                       \$("<label><input type='radio' value='"+data.roles[i].name+"' name='LC_get_role' id='LC_get_role_"+i+"' />"+data.roles[i].desc+"</label><span>&nbsp;&nbsp;</span>")
                       .appendTo("#LC_choose_adhoc");
                   }
                   \$( "#LC_get_role_0").prop("checked", true);
                   \$( "#LC_adhocrole_chooser" ).dialog({ autoOpen: false });
                   \$( "#LC_adhocrole_chooser" ).dialog("open");
                   \$( "#LC_adhocrole_chooser" ).dialog({
                    height: 400,
                    width: 500,
                    modal: true,
                    resizable: false,
                    buttons: [
                          {
                            text: "$lt{'ok'}",
                            click: function() {
                                        var rolename = \$('input[name=LC_get_role]:checked', '#LChelpdeskpicker').val();
                                        process_pick(cdom,rolename);
                                        \$("#LC_adhocrole_chooser").dialog( "close" );
                                        $lastaction;
                                   } 
                          },
                          {
                            text: "$lt{'exit'}",
                            click: function() {
                                        \$("#LC_adhocrole_chooser").dialog( "close" );
                                   }
                          }
                        ],
                   });
                   \$( "#LC_adhocrole_chooser" ).find( "form" ).on( "submit", function( event ) {
                      event.preventDefault();
                      var rolename = \$('input[name=LC_get_role]:checked', '#LChelpdeskpicker').val()
                      process_pick(cdom,rolename);
                      \$("#LC_adhocrole_chooser").dialog( "close" );
                      $lastaction;
                      });
               }
           }
       }
 }  }
 |;  http.send(params);
     return &Apache::lonhtmlcommon::scripttag($output);      } else {
           $autosubmit
           $lastaction
       }
   }
   
   ENDJS
       return $rolechooser.&Apache::lonhtmlcommon::scripttag($output);
   }
   
   sub get_my_adhocroles {
       my (@okroles,%description);
       if ($env{'form.cid'} =~ /^($match_domain)_($match_courseid)$/) {
           my $cdom = $1;
           my $cnum = $2;
           if ($env{"user.role.dh./$cdom/"}) {
               my $then=$env{'user.login.time'};
               my $update=$env{'user.update.time'};
               my $liverole = 1;
               my ($tstart,$tend)=split(/\./,$env{'user.role.dh./'.$cdom});
               my $limit = $update;
               if ($env{'request.role'} eq 'dh./'.$cdom.'/') {
                   $limit = $then;
               }
               if ($tstart && $tstart>$limit) { $liverole = 0; }
               if ($tend   && $tend  <$limit) { $liverole = 0; }
               if ($liverole) {
                   if (&Apache::lonnet::homeserver($cnum,$cdom) ne 'no_host') {
                       my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
                       if (ref($domdefaults{'adhocroles'}) eq 'HASH') {
                           my $count = 0;
                           my %domcurrent = %{$domdefaults{'adhocroles'}};
                           my (%ordered,%access_in_dom);
                           foreach my $role (sort(keys(%{$domdefaults{'adhocroles'}}))) {
                               my ($order,$desc,$access_in_dom);
                               if (ref($domcurrent{$role}) eq 'HASH') {
                                   $order = $domcurrent{$role}{'order'};
                                   $desc = $domcurrent{$role}{'desc'};
                                   $access_in_dom{$role} = $domcurrent{$role}{'access'};
                               }
                               if ($order eq '') {
                                   $order = $count;
                               }
                               $ordered{$order} = $role;
                               if ($desc ne '') {
                                   $description{$role} = $desc;
                               } else {
                                   $description{$role}= $role;
                               }
                               $count++;
                           }
                           my @roles_by_num = ();
                           foreach my $item (sort {$a <=> $b } (keys(%ordered))) {
                               push(@roles_by_num,$ordered{$item});
                           }
                           if (@roles_by_num) {
                               my %settings = &Apache::lonnet::dump('environment',$cdom,$cnum,'internal\.adhoc');
                               my %setincrs;
                               if ($settings{'internal.adhocaccess'}) {
                                   map { $setincrs{$_} = 1; } split(/,/,$settings{'internal.adhocaccess'});
                               }
                               my @statuses;
                               if ($env{'environment.inststatus'}) {
                                   @statuses = split(/,/,$env{'environment.inststatus'});
                               }
                               my $user = $env{'user.name'}.':'.$env{'user.domain'};
                               foreach my $role (@roles_by_num) {
                                   my ($curraccess,@okstatus,@personnel);
                                   if ($setincrs{$role}) {
                                       ($curraccess,my $rest) = split(/=/,$settings{'internal.adhoc.'.$role});
                                       if ($curraccess eq 'none') {
                                           next;
                                       } elsif ($curraccess eq 'all') {
                                           push(@okroles,$role);
                                       } elsif ($curraccess eq 'status') {
                                           @okstatus = split(/\&/,$rest);
                                       } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
                                           @personnel = split(/\&/,$rest);
                                       }
                                   } else {
                                       $curraccess = $access_in_dom{$role};
                                       if ($curraccess eq 'status') {
                                           if (ref($domcurrent{$role}{$curraccess}) eq 'ARRAY') {
                                               @okstatus = @{$domcurrent{$role}{$curraccess}};
                                           }
                                       } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
                                           if (ref($domcurrent{$role}{$curraccess}) eq 'ARRAY') {
                                               @personnel = @{$domcurrent{$role}{$curraccess}};
                                           }
                                       }
                                   }
                                   if ($curraccess eq 'none') {
                                       next;
                                   } elsif ($curraccess eq 'all') {
                                       push(@okroles,$role);
                                   } elsif ($curraccess eq 'status') {
                                       if (@okstatus) {
                                           if (!@statuses) {
                                               if (grep(/^default$/,@okstatus)) {
                                                   push(@okroles,$role);
                                               }
                                           } else {
                                               foreach my $status (@okstatus) {
                                                   if (grep(/^\Q$status\E$/,@statuses)) {
                                                       push(@okroles,$role);
                                                       last;
                                                   }
                                               }
                                           }
                                       }
                                   } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
                                       if (grep(/^\Q$user\E$/,@personnel)) {
                                           if ($curraccess eq 'exc') {
                                               push(@okroles,$role);
                                           }
                                       } elsif ($curraccess eq 'inc') {
                                           push(@okroles,$role);
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
           }
       }
   
       my $response = [];
       if (@okroles) {
           foreach my $role (@okroles) {
               push(@{$response},
                                 { name => $role,
                                   desc => $description{$role},
                                 });
           }
       }
       my $json = JSON::DWIW->to_json({roles => $response});
       return $json;
 }  }
   
 1;  1;
Line 1038  Side Effects: None Line 1287  Side Effects: None
   
 =item *  =item *
 X<gochoose_javascript()>  X<gochoose_javascript()>
 B<gochoose_javascript($type,$multiple,$autosubmit,$lastaction)>:  B<gochoose_javascript($type,$multiple,$autosubmit,$lastaction,$rolename)>:
   
 Input: 4 - course type; single (0) or multiple courses (1); in context of DC selecting a CC role in a course: javascript code from &processpick(); final action to take after user chooses course(s):  either close window, or submit form for display of next page etc.  Input: 5 - course type; single (0) or multiple courses (1); in context of DC selecting a CC role in a course: javascript code from &processpick(); final action to take after user chooses course(s):  either close window, or submit form for display of next page etc.; rolename (e.g., dh) of user's current role.
   
 Output: 1  $output - javascript wrapped in E<lt>scriptE<gt>E<lt>/scriptE<gt> tags  Output: 1  $output - javascript wrapped in E<lt>scriptE<gt>E<lt>/scriptE<gt> tags
   

Removed from v.1.122  
changed lines
  Added in v.1.123


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