--- loncom/interface/lonpickcourse.pm 2016/11/02 22:41:18 1.122 +++ loncom/interface/lonpickcourse.pm 2017/01/02 19:44:06 1.123 @@ -1,7 +1,7 @@ # The LearningOnline Network # Pick a course # -# $Id: lonpickcourse.pm,v 1.122 2016/11/02 22:41:18 raeburn Exp $ +# $Id: lonpickcourse.pm,v 1.123 2017/01/02 19:44:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,13 +37,32 @@ use Apache::lonnet; use Apache::lonlocal; use Apache::longroup; use LONCAPA qw(:DEFAULT :match); +use JSON::DWIW; sub handler { 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'); $r->send_http_header; return OK if $r->header_only; - + # ------------------------------------------------------------ Print the screen # Get parameters from query string @@ -53,7 +72,8 @@ sub handler { 'multiple','type','setroles','fixeddom','cloner', 'crscode','crsdom']); 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. $type = $env{'form.type'}; @@ -75,6 +95,25 @@ sub handler { $roleelement = ''; $submitopener = &processpick(); $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"; +
+

$lt{'preamble'}

+
+
+
+ +
+

$lt{'cancel'}

+
+END + } } if ($env{'form.typeelement'} ne '') { $typeelement = ''; @@ -149,7 +188,8 @@ sub handler { # print javascript functions for choosing a course if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) || $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($submitopener); @@ -803,7 +843,7 @@ sub course_chooser { } sub gochoose_javascript { - my ($type,$multiple,$autosubmit,$lastaction) = @_; + my ($type,$multiple,$autosubmit,$lastaction,$rolename,$rolechooser) = @_; my %elements = ( 'Course' => { name => 'coursepick', @@ -821,9 +861,24 @@ sub gochoose_javascript { 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) { var openerForm = "$env{'form.form'}"; + var openerRole = "$rolename"; courseCount = 0; var courses = ''; |; @@ -899,16 +954,210 @@ ENDNAMECODE } |; } - $output .= qq| + $output .= <"+data.roles[i].desc+"  ") + .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; + }); + } + } + } } -|; - return &Apache::lonhtmlcommon::scripttag($output); +http.send(params); + } 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; @@ -1038,9 +1287,9 @@ Side Effects: None =item * X -B: +B: -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 EscriptEE/scriptE tags