--- loncom/interface/slotrequest.pm 2021/01/18 21:46:09 1.143 +++ loncom/interface/slotrequest.pm 2023/07/12 15:48:23 1.147 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for requesting to have slots added to a students record # -# $Id: slotrequest.pm,v 1.143 2021/01/18 21:46:09 raeburn Exp $ +# $Id: slotrequest.pm,v 1.147 2023/07/12 15:48:23 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -50,18 +50,18 @@ sub fail { } else { $r->print('<p>'.&mt('Failed.').'</p>'); } - + &return_link($r); &end_page($r); } sub start_page { - my ($r,$title,$brcrum,$bread_crumbs_component,$js)=@_; + my ($r,$title,$brcrum,$bread_crumbs_component,$js,$mgr)=@_; my $args; if (ref($brcrum) eq 'ARRAY') { $args = {bread_crumbs => $brcrum}; - if ($bread_crumbs_component) { - $args->{bread_crumbs_component} = $bread_crumbs_component; + if ($bread_crumbs_component) { + $args->{bread_crumbs_component} = $bread_crumbs_component; } } if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { @@ -74,6 +74,31 @@ sub start_page { $args = { 'add_entries' => \%loaditems }; } } + unless (($env{'form.context'} eq 'usermanage') || (($mgr eq 'F') && + (($env{'form.command'} eq 'release') || + ($env{'form.command'} eq 'remove_registration')))) { + if ($env{'form.symb'}) { + my $symb=&unescape($env{'form.symb'}); + my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb); + if ($resurl =~ /ext\.tool$/) { + my $target; + my ($marker,$exttool) = (split(m{/},$resurl))[3,4]; + $marker=~s/\D//g; + if (($marker) && ($exttool) && ($env{'request.course.id'})) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my ($idx,$crstool,$is_tool,%toolhash,%toolsettings); + if ($resurl eq "adm/$cdom/$cnum/$marker/$exttool") { + my %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum); + $target = $toolsettings{'target'}; + } + } + if ($target eq 'iframe') { + $args->{'only_body'} = 1; + } + } + } + } $r->print(&Apache::loncommon::start_page($title,$js,$args)); } @@ -259,7 +284,7 @@ function uncheckSlotRadio() { } if (slotpicks.length) { for (var i=0; i<slotpicks.length; i++) { - slotpicks[i].checked = false; + slotpicks[i].checked = false; } } } @@ -308,7 +333,7 @@ function toggleSlotMap(maprownum,rownum) for (var i=0; i<resrows.length; i++) { resrows[i].style.display = rowdisplay; if (rowdisplay == 'table-row') { - mapbgidx ++; + mapbgidx ++; var bgcolnew = mapbgidx % 2; var bgcolold = (mapbgidx+1) % 2; var k = i+parseInt(rownum)+1; @@ -343,7 +368,7 @@ function toggleSlotMap(maprownum,rownum) if (table.rows[i].style.display != 'none') { idx ++; var bgcolnew = idx % 2; - var bgcolold = (idx+1) % 2; + var bgcolold = (idx+1) % 2; j = i+1; if (document.getElementById('LC_slotmaprow_'+j)) { document.getElementById('LC_slotmaprow_'+j).className = rowclasses[bgcolnew]; @@ -387,7 +412,7 @@ sub get_course { sub get_reservation_ids { my ($slot_name)=@_; - + my ($cnum,$cdom)=&get_course(); my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, @@ -432,7 +457,7 @@ sub check_for_reservation { || &Apache::lonnet::error($course) || &Apache::lonnet::error(%slots)) { return 'error: Unable to determine current status'; - } + } my @got; my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime'); foreach my $slot_name (@sorted_slots) { @@ -567,7 +592,7 @@ sub make_reservation { foreach my $other_slot (split(/:/, $value)) { if ($other_slot eq $slot_name) { my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom, - $cnum, "^$slot_name\0"); + $cnum, "^$slot_name\0"); if (&Apache::lonnet::error($value)) { return 'error: Unable to determine current status'; } @@ -593,14 +618,14 @@ sub make_reservation { my $num=(split('\0',$id))[1]; if ($num > $last) { $last=$num; } } - + my $wanted=$last+1; &Apache::lonxml::debug("wanted $wanted<br />"); if (scalar(@ids) >= $max) { # full up return undef; } - + my %reservation=('name' => $env{'user.name'}.':'.$env{'user.domain'}, 'timestamp' => time, 'symb' => $symb_for_db); @@ -679,7 +704,7 @@ sub remove_registration { sub remove_registration_user { my ($r) = @_; - + my $slot_name = $env{'form.slotname'}; my $name = &Apache::loncommon::plainname($env{'form.uname'}, @@ -689,7 +714,7 @@ sub remove_registration_user { my $msg = &mt('Remove [_1] from slot [_2] for [_3]', $name,$slot_name,$title); - + &remove_registration_confirmation($r,$msg,['uname','udom','slotname', 'entry','symb','context']); } @@ -725,14 +750,14 @@ END_CONFIRM sub release_all_slot { my ($r,$mgr)=@_; - + my $slot_name = $env{'form.slotname'}; my ($cnum,$cdom)=&get_course(); my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, "^$slot_name\0"); - + $r->print('<p>'.&mt('Releasing reservations').'</p>'); foreach my $entry (sort { $consumed{$a}{'name'} cmp @@ -776,7 +801,7 @@ sub release_slot { } else { $r->print("<p>$msg</p>"); } - + if ($mgr eq 'F') { $r->print('<p><a href="/adm/slotrequest?command=showslots">'. &mt('Return to slot list').'</a></p>'); @@ -1138,15 +1163,32 @@ sub delete_slot { sub return_link { my ($r) = @_; + my $target = &return_target(); if (($env{'form.command'} eq 'manageresv') || ($env{'form.context'} eq 'usermanage')) { - $r->print('<p><a href="/adm/slotrequest?command=manageresv">'. - &mt('Return to reservations')); + $r->print('<p><a href="/adm/slotrequest?command=manageresv" target="'.$target.'">'. + &mt('Return to reservations').'</a></p>'); } else { - $r->print('<p><a href="/adm/flip?postdata=return:">'. + $r->print('<p><a href="/adm/flip?postdata=return:" target="'.$target.'">'. &mt('Return to last resource').'</a></p>'); } } +sub return_target { + my ($target,$ltitarget,$deeplinktarget); + if ($env{'request.lti.login'}) { + $ltitarget = $env{'request.lti.target'}; + } + if ($env{'request.deeplink.login'}) { + $deeplinktarget = $env{'request.deeplink.target'}; + } + if (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) { + $target = '_self'; + } else { + $target = '_top'; + } + return $target; +} + sub get_slot { my ($r,$symb,$conflictable_slot,$inhibit_return_link)=@_; @@ -1298,7 +1340,7 @@ sub allowed_slot { if (($slot->{'endreserve'}) && ($slot->{'endreserve'} < time)) { return 0; - } + } &Apache::lonxml::debug("$slot_name reserve good"); my $userallowed=0; @@ -1406,7 +1448,8 @@ sub show_choices { if (!@{$available}) { $output = '<span class="LC_info">'.&mt('No available times.').'</span>'; if ($env{'form.command'} ne 'manageresv') { - $output .= ' <a href="/adm/flip?postdata=return:">'. + my $target = &return_target(); + $output .= ' <a href="/adm/flip?postdata=return:" target="'.$target.'">'. &mt('Return to last resource').'</a>'; } if ($class) { @@ -1444,7 +1487,7 @@ sub show_choices { ); foreach my $option (@options) { my $onclick = "toggleSlotDisplay(this.form,'$num');"; - if (($option eq 'show') && ($env{'form.command'} eq 'manageresv')) { + if (($option eq 'show') && ($env{'form.command'} eq 'manageresv')) { $onclick .= "currSlotDisplay$num(this.form,'$num');"; } $output .= '<span class="LC_nobreak"><label>'. @@ -1464,7 +1507,7 @@ sub show_choices { // <![CDATA[ function currSlotDisplay$num() { var currslot = new Array($numreserved); -$js +$js for (var j=0; j<$numreserved; j++) { if (document.getElementById('LC_slotrow_$num\_'+currslot[j])) { document.getElementById('LC_slotrow_$num\_'+currslot[j]).style.display = ''; @@ -1627,7 +1670,7 @@ sub to_show { } return 0; } - + return 1; } @@ -1687,7 +1730,7 @@ sub show_table { ); return; } - + my %Saveable_Parameters = ('show' => 'array', 'when' => 'scalar', 'order' => 'scalar', @@ -1777,7 +1820,7 @@ sub show_table { my $name_filter = {'type' => $name_filter_type, 'value' => $env{'form.name_filter_value'},}; - + #deleted slot filtering #default to hide if no value $env{'form.deleted'} ||= 'hide'; @@ -1857,7 +1900,7 @@ sub show_table { return lc($a) cmp lc($b); } } elsif ($env{'form.order'} eq 'uniqueperiod') { - + if ($slots{$a}->{'uniqueperiod'}[0] ne $slots{$b}->{'uniqueperiod'}[0]) { return ($slots{$a}->{'uniqueperiod'}[0] @@ -1891,7 +1934,7 @@ sub show_table { } my $description=&get_description($slot,$slots{$slot}); my ($id_count,$ids); - + if (exists($show{'scheduled'}) || exists($show{'space'}) ) { my $re_str = "$slot\0"; my @this_slot = grep(/^\Q$re_str\E/,keys(%consumed)); @@ -2331,7 +2374,7 @@ sub manage_reservations { $container{$currcontainer} = $resource; $container_title{$currcontainer} = $resource->compTitle(); } - if (($resource->is_problem() || $resource->is_tool)) { + if ($resource->is_problem() || $resource->is_tool()) { next unless (exists($output{$symb})); $reservable ++; $rownum ++; @@ -2445,7 +2488,7 @@ sub slot_chooser { } } } - next if ($exclude); + next if ($exclude); } } } @@ -2873,7 +2916,7 @@ sub display_filter { my (%titles,%maptitles); my $output = '<br /><table><tr><td valign="top">'. '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b><br />'. - &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + &Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef, (&mt('all'),5,10,20,50,100,1000,10000)). '</td><td> </td>'; my $startform = @@ -2981,7 +3024,7 @@ sub slot_change_messaging { } sub upload_start { - my ($r)=@_; + my ($r)=@_; $r->print( &Apache::grades::checkforfile_js() .'<h2>'.&mt('Upload a file containing the slot definitions').'</h2>' @@ -3434,7 +3477,7 @@ sub handler { if (ref($brcrum) eq 'ARRAY') { push(@{$brcrum},{href=>"/adm/slotrequest?command=showresv",text=>$title}); } - } elsif (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { + } elsif (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { if ($env{'form.command'} eq 'manageresv') { $title = 'Manage Reservations'; $brcrum =[{href=>"/adm/slotrequest?command=manageresv",text=>$title}]; @@ -3476,7 +3519,7 @@ sub handler { if (($env{'form.requestattempt'}) || ($env{'form.command'} eq 'manageresv')) { $js = &reservation_js(\%slots,$consumed_uniqueperiods,$available,$got_slots,$symb); } - &start_page($r,$title,$brcrum,$bread_crumbs_component,$js); + &start_page($r,$title,$brcrum,$bread_crumbs_component,$js,$mgr); if ($env{'form.command'} eq 'manageresv') { $allavailable = $available;