--- loncom/homework/bridgetask.pm	2015/10/05 02:35:40	1.265
+++ loncom/homework/bridgetask.pm	2025/03/31 13:55:08	1.274
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.265 2015/10/05 02:35:40 raeburn Exp $
+# $Id: bridgetask.pm,v 1.274 2025/03/31 13:55:08 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -32,12 +32,14 @@ package Apache::bridgetask;
 
 use strict;
 use Apache::lonnet;
+use Apache::loncommon;
 use Apache::File();
 use Apache::lonmenu;
 use Apache::lonlocal;
 use Apache::lonxml;
 use Apache::slotrequest();
 use Apache::structuretags();
+use HTML::Entities();
 use Time::HiRes qw( gettimeofday tv_interval );
 use LONCAPA;
  
@@ -65,6 +67,7 @@ sub initialize_bridgetask {
 sub proctor_check_auth {
     my ($slot_name,$slot,$type)=@_;
     my $user=$env{'form.proctorname'};
+    $user =~ s/^\s+|\s+$//g;
     my $domain=$env{'form.proctordomain'};
     
     my @allowed=split(",",$slot->{'proctor'});
@@ -97,7 +100,7 @@ sub proctor_check_auth {
 sub check_in {
     my ($type,$user,$domain,$slot_name,$needsiptied) = @_;
     my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
-    my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'};
+    my $ip=$ENV{'REMOTE_ADDR'} || $env{'request.host'};
     if ( $useslots eq 'map_map') {
 	my $result = &check_in_sequence($user,$domain,$slot_name,$ip,$needsiptied);
         if ($result =~ /^error: /) {
@@ -123,7 +126,7 @@ sub check_in_sequence {
     my ($symb) = &Apache::lonnet::whichuser();
     my ($map)  = &Apache::lonnet::decode_symb($symb);
     my @resources = 
-	$navmap->retrieveResources($map, sub { $_[0]->is_problem() },0,0);
+	$navmap->retrieveResources($map, sub { $_[0]->is_problem() || $_[0]->is_tool() },0,0);
     my %old_history = %Apache::lonhomework::history;
     my %old_results = %Apache::lonhomework::results;
 
@@ -131,7 +134,14 @@ sub check_in_sequence {
     foreach my $res (@resources) {
 	&Apache::lonxml::debug("doing ".$res->src);
 	&Apache::structuretags::initialize_storage($res->symb);
-	my $type = ($res->is_task()) ? 'Task' : 'problem';
+	my $type;
+        if ($res->is_task()) {
+            $type = 'Task';
+        } elsif ($res->is_tool) {
+            $type = 'tool';
+        } else {
+            $type = 'problem';
+        }
 	my $result = &create_new_version($type,$user,$domain,$slot_name,$res->symb,$ip,$needsiptied);
         if ($result eq 'ok') {
 	    &Apache::structuretags::finalize_storage($res->symb);
@@ -187,7 +197,7 @@ sub create_new_version {
 	    $domain = $env{'user.domain'};
 	}
 	
-    } elsif ($type eq 'problem') {
+    } elsif (($type eq 'problem') || ($type eq 'tool')) {
 	&Apache::lonxml::debug("authed $slot_name");
     }
     if (!defined($user) || !defined($domain)) {
@@ -711,7 +721,8 @@ sub start_Task {
         $target eq 'tex') {
         if ($env{'form.markaccess'}) {
             my @interval=&Apache::lonnet::EXT("resource.0.interval");
-            &Apache::lonnet::set_first_access($interval[1],$interval[0]);
+            my ($timelimit) = ($interval[0] =~ /^(\d+)/);
+            &Apache::lonnet::set_first_access($interval[1],$timelimit);
         }
     }
 
@@ -1443,7 +1454,7 @@ DONEBUTTON
             if ($canstore) {
 	        &Apache::structuretags::finalize_storage();
                 my @interval = &Apache::lonnet::EXT("resource.0.interval");
-                if ($interval[0] =~ /^\d+$/ && $interval[1] eq 'resource') {
+                if ($interval[0] =~ /^\d+/ && $interval[1] eq 'resource') {
                     my $key=$courseid."\0".$symb;
                     my %times=&Apache::lonnet::get('firstaccesstimes',
                                                    [$key],$domain,$name);
@@ -3269,14 +3280,8 @@ sub proctor_validation_screen {
     my ($slot) = @_;
     my (undef,undef,$domain,$user) = &Apache::lonnet::whichuser();
     my $url=&Apache::lonnet::studentphoto($domain,$user,'jpg');
-    if ($url ne '/adm/lonKaputt/lonlogo_broken.gif') {
-	$url = "<tr><td colspan=\"2\"><img src=\"$url\" /></td></tr>";
-    } else {
-	undef($url);
-    }
-
     my $name=&Apache::loncommon::plainname($user,$domain);
-    
+
     my $msg;
     if ($env{'form.proctorpassword'}) {
 	$msg.='<p><span class="LC_warning">'
@@ -3304,43 +3309,77 @@ sub proctor_validation_screen {
     my %lt = &Apache::lonlocal::texthash(
                             'prva' => "Proctor Validation",
                             'yoro' => "Your room's proctor needs to validate your access to this resource.",
-                            'prus'  => "Proctor's Username:",
-                            'pasw'  => "Password:",
-                            'prdo'  => "Proctor's Domain:",
+                            'prus'  => "Proctor's Username",
+                            'pasw'  => "Password",
+                            'prdo'  => "Proctor's Domain",
                             'vali'  => 'Validate',
                             'stui'  => "Student who should be logged in is:",
-                            'name'  => "Name:",
+                            'name'  => "Name",
                             'sid'   => "Student/Employee ID",
-                            'unam'  => "Username:",
+                            'unam'  => "Username",
+                            'phot'  => "Photo", 
                            );
-    my $result= (<<ENDCHECKOUT);
-<h2>$lt{'prva'}</h2>
-    <p>$lt{'yoro'}</p>
-    $msg
+    my $proctortable =
+        &Apache::lonhtmlcommon::start_pick_box()."\n".
+        &Apache::lonhtmlcommon::row_title('<label for="proctorname">'.$lt{'prus'}.'</label>').
+        '<input type="text" name="proctorname" value="'.$env{'form.proctorname'}.'" '.
+        'id="proctorname" autocomplete="new-password" />'.
+        &Apache::lonhtmlcommon::row_closure()."\n".
+        &Apache::lonhtmlcommon::row_title('<label for="proctorpassword">'.$lt{'pasw'}.'</label>').
+        '<input type="password" name="proctorpassword" value="" '.
+        'id="proctorpassword" autocomplete="new-password" />'.
+        &Apache::lonhtmlcommon::row_closure()."\n".
+        &Apache::lonhtmlcommon::row_title('<label for="proctordomain">'.$lt{'prdo'}.'</label>').
+        '<input type="text" name="proctordomain" value="'.$env{'form.proctordomain'}.'" '.
+        'id="proctordomain" autocomplete="off" />'.
+        &Apache::lonhtmlcommon::row_closure(1)."\n".
+        &Apache::lonhtmlcommon::end_pick_box()."\n";
+
+    my $studenttable =
+        &Apache::loncommon::start_data_table('LC_manage_reservations').
+        &Apache::loncommon::start_data_table_row().
+        '<th>'.$lt{'name'}.':</th><td>'.$name.'</td>'.
+        &Apache::loncommon::end_data_table_row()."\n".
+        &Apache::loncommon::start_data_table_row().
+        '<th>'.$lt{'sid'}.':</th><td>'.$env{'environment.id'}.'</td>'.
+        &Apache::loncommon::end_data_table_row()."\n".
+        &Apache::loncommon::start_data_table_row().
+        '<th>'.$lt{'unam'}.':</th><td>'.$user.':'.$domain.'</td>'.
+        &Apache::loncommon::end_data_table_row();
+    if ($url ne '/adm/lonKaputt/lonlogo_broken.gif') {
+        $studenttable .= &Apache::loncommon::start_data_table_row().
+                         '<th valign="top">'.$lt{'phot'}.'</th>'.
+                         '<td valign="top"><img src="'.&HTML::Entities::encode($url,'&<>"').'" '.
+                         'alt="'.&mt('Photo of [_1]',$name).'" /></td>'.
+                         &Apache::loncommon::end_data_table_row()."\n";
+    }
+    $studenttable .= &Apache::loncommon::end_data_table()."\n";
+    if ($msg ne '') {
+        $msg = "<p>$msg</p>";
+    } else {
+        $msg = '<br /><br />';
+    }
+    return (<<ENDCHECKOUT);
+<div style="padding:0;clear:both;margin:0;border:0">
+<h2 class="LC_heading_2">$lt{'prva'}</h2><hr />
+<div class="LC_left_float">
+$lt{'yoro'}
+$msg
 <form name="checkout" method="post" action="$uri">
 <input type="hidden" name="validate" value="yes" />
 <input type="hidden" name="submitted" value="yes" />
-<table>
-  <tr><td>$lt{'prus'}</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr>
-  <tr><td>$lt{'pasw'}</td><td><input type="password" name="proctorpassword" value="" /></td></tr>
-  <tr><td>$lt{'prdo'}</td><td><input type="string" name="proctordomain" value="$env{'form.proctordomain'}" /></td></tr>
-</table>
-<input type="submit" name="checkoutbutton" value="$lt{'vali'}"  /><br />
-<table border="1">
-  <tr><td>
-    <table>
-      <tr><td colspan="2">$lt{'stui'}</td></tr>
-      <tr><td>$lt{'name'}</td><td>$name</td></tr>
-      <tr><td>$lt{'sid'}</td><td>$env{'environment.id'}</td></tr>
-      <tr><td>$lt{'unam'}</td><td>$user:$domain</td></tr>
-      $url
-    </table>
-  </tr></td>
-</table>
+$proctortable
+<br />
+<input type="submit" name="checkoutbutton" value="$lt{'vali'}" />
 </form>
+</div>
+<div class="LC_left_float">
+$lt{'stui'}
+<br /><br />
+$studenttable
+</div>
+</div>
 ENDCHECKOUT
-
-    return $result;
 }
 
 1;