--- loncom/interface/portfolio.pm	2004/11/02 14:35:42	1.53
+++ loncom/interface/portfolio.pm	2004/12/12 01:35:44	1.65
@@ -33,8 +33,8 @@ use Apache::lonlocal;
 # receives a file name and path stub from username/userfiles/portfolio/
 # returns an anchor tag consisting encoding filename and currentpath
 sub make_anchor {
-    my ($filename, $current_path) = @_;
-    my $anchor = '<a href="/adm/portfolio?selectfile='.$filename.'&currentpath='.$current_path.'">'.$filename.'</a>';
+    my ($filename, $current_path, $current_mode, $field_name) = @_;
+    my $anchor = '<a href="/adm/portfolio?selectfile='.$filename.'&currentpath='.$current_path.'&mode='.$current_mode.'&fieldname='.$field_name.'">'.$filename.'</a>';
     return $anchor;
 }
 my $dirptr=16384;
@@ -48,6 +48,7 @@ sub display_common {
         '<input type="hidden" name="currentpath" value="'.$current_path.'" />'.
         '<input type="hidden" name="action" value="'.$ENV{"form.action"}.'" />'.
         '<input type="hidden" name="fieldname" value="'.$ENV{"form.fieldname"}.'" />'.
+        '<input type="hidden" name="mode" value="'.$ENV{"form.mode"}.'" />'. 
         '<input type="submit" name="storeupl" value="Upload" />'.
         '</form>';
     $r->print($displayOut);
@@ -57,23 +58,23 @@ sub display_common {
         '<input type="hidden" name="currentpath" value="'.$current_path.'" />'.
         '<input type="hidden" name="action" value="'.$ENV{"form.action"}.'" />'.
         '<input type="hidden" name="fieldname" value="'.$ENV{"form.fieldname"}.'" />'.
+        '<input type="hidden" name="mode" value="'.$ENV{"form.mode"}.'" />'. 
         '<input type="submit" name="createdir" value="'.&mt("Create Directory").'" />'.
         '</form>';
     $r->print($displayOut);
     $r->print('</td></tr></table>');
     my @tree = split (/\//,$current_path);
-    $r->print('<font size="+2">'.&make_anchor('portfolio','/').'/');
+    $r->print('<font size="+2">'.&make_anchor('portfolio','/',$ENV{"form.mode"},$ENV{"form.fieldname"}).'/');
     if (@tree > 1){
         my $newCurrentPath = '';
         for (my $i = 1; $i< @tree; $i++){
             $newCurrentPath .= $tree[$i].'/';
-            $r->print(&make_anchor($tree[$i],'/'.$newCurrentPath).'/');
+            $r->print(&make_anchor($tree[$i],'/'.$newCurrentPath, $ENV{"form.mode"},$ENV{"form.fieldname"}).'/');
         }
     }
     $r->print('</font>');
     &Apache::lonhtmlcommon::store_recent('portfolio',$current_path,$current_path);
-    #Fixme -- remove from recent those paths that are deleted
-    $r->print('<br /><form method=post action="/adm/portfolio">'.
+    $r->print('<br /><form method=post action="/adm/portfolio?mode='.$ENV{"form.mode"}.'&fieldname='.$ENV{"form.fieldname"}.'">'.
 	      &Apache::lonhtmlcommon::select_recent('portfolio','currentpath',
 						    'this.form.submit();'));
     $r->print("</form>");
@@ -82,12 +83,7 @@ sub display_directory {
     my ($r,$current_path,$is_empty,$dir_list)=@_;
     my $iconpath= $r->dir_config('lonIconsURL') . "/";
     my $display_out;
-    my %locked_files=&Apache::lonnet::dump('file_permissions',
-                                  $ENV{'user.domain'},$ENV{'user.name'});
-    my $locked_file;
-    foreach my $key (keys %locked_files) {
-        $locked_file .= $locked_files{$key}.':';
-    }
+    my %locked_files = &Apache::lonnet::get_marked_as_readonly_hash ($ENV{'user.domain'},$ENV{'user.name'});
     if ($is_empty && ($current_path ne '/')) {
         $display_out = '<form method="post" action="/adm/portfolio">'.
         '<input type="hidden" name="action" value="deletedir" />'.
@@ -102,6 +98,7 @@ sub display_directory {
     $r->print('<table border="0" cellspacing="2" cellpadding="2">'.
             '<tr><th>Actions</th><th>&nbsp;</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>');
     my $href_location="/uploaded/$ENV{'user.domain'}/$ENV{'user.name'}/portfolio$current_path";
+    $r->print('<form method="post" action="/adm/portfolio">');
     foreach my $line (sort 
 		      { 
 			  my ($afile)=split('&',$a,2);
@@ -111,33 +108,21 @@ sub display_directory {
     	#$strip holds directory/file name
     	#$dom 
     	my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); 
-    	if ($Apache::lonhomework::results{"resource.$ENV{'user.domain'}.$ENV{'user.name'}.$filename"}eq'true'){
-    	    &Apache::lonnet::logthis("found submitted file");
-    	    &Apache::lonnet::logthis("resource.$ENV{'user.domain'}.$ENV{'user.name'}.$filename");
-    	} else {
-    	    &Apache::lonnet::logthis("$filename not found submitted file");
-    	    &Apache::lonnet::logthis("resource.$ENV{'user.domain'}.$ENV{'user.name'}.$filename");
-    	}
     	if (($filename ne '.') && ($filename ne '..')) {
             if ($dirptr&$testdir) {
                 $r->print('<tr bgcolor="#FFAA99"><td><img src="'.$iconpath.'folder_closed.gif"></td>');
                 $r->print('<td>Go to ...</td>');
-                $r->print('<td>'.&make_anchor($filename.'/',$current_path.$filename.'/').'</td>'); 
+                $r->print('<td>'.&make_anchor($filename.'/',$current_path.$filename.'/',$ENV{'form.mode'},$ENV{"form.fieldname"}).'</td>'); 
                 $r->print('</tr>'); 
             } else {
                 $r->print('<tr bgcolor="#CCCCFF">');
-                $r->print('<td>
-                    <form method="post" action="/adm/portfolio">
-                    <select name="action">
-                        <option value=""></option>
-                        <option value="delete">'.&mt("Delete").'</option>
-                        <option value="rename">'.&mt("Rename").'</option>
-                    </select>
-                    <input type="submit" name="doit" value="Go" />
-                    <input type="hidden" name="selectfile" value="'.$filename.'" />
-                    <input type="hidden" name="currentpath" value="'.$current_path.'" />
-                    </form>
-                    </td>');
+                if (exists $locked_files{$current_path.$filename}){
+                    $r->print('<td>Locked</td>');
+                } else {
+                    $r->print('<td>Delete<input type="checkbox" name="selectfile" value="'.$filename.'" />
+                        <a href="/adm/portfolio?rename='.$filename.'&amp;currentpath='.$current_path.'">Rename</a>                        
+                        </td>');
+                }
                 $r->print('<td><img src="'.$iconpath.'unknown.gif"></td>');
                 $r->print('<td><a href="'.$href_location.$filename.'">'.
 			    $filename.'</a></td>'); 
@@ -152,12 +137,20 @@ sub display_directory {
 #   $r->print(&display_directory($current_path, $currentFile, @dir_list));
 #    $r->print('</td>><td>');
 #   $r->print(&display_actions($current_path, $currentFile, $isEmpty));
-    $r->print('</table></form>');
+    $r->print('</table>
+    <input type="submit" name="doit" value="Delete Checked Files" />
+    <input type="hidden" name="action" value="delete" />
+    <input type="hidden" name="currentpath" value="'.$current_path.'" />
+    </form>');
 }
 sub display_file_select {
     my ($r,$current_path,$is_empty,$dir_list)=@_;
     my $iconpath= $r->dir_config('lonIconsURL') . "/";
     my $display_out;
+    my $checked_files = &Apache::lonnet::files_in_path($ENV{'user.name'}, $ENV{'form.currentpath'});
+    foreach my $key (keys %$checked_files) {
+        &Apache::lonnet::logthis("a key is $key $$checked_files{$key} is the value");
+    }
     if ($is_empty && ($current_path ne '/')) {
         $display_out = '<form method="post" action="/adm/portfolio">'.
         '<input type="hidden" name="action" value="deletedir" />'.
@@ -183,17 +176,23 @@ sub display_file_select {
     	#$strip holds directory/file name
     	#$dom 
     	my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); 
+    	$filename =~ s/\s+$//;
     	if (($filename ne '.') && ($filename ne '..')) {
             if ($dirptr&$testdir) {
                 $r->print('<tr bgcolor="#FFAA99"><td><img src="'.$iconpath.'folder_closed.gif"></td>');
                 $r->print('<td>Go to ...</td>');
-                $r->print('<td>'.&make_anchor($filename.'/',$current_path.$filename.'/').'</td>'); 
+                $r->print('<td>'.&make_anchor($filename.'/',$current_path.$filename.'/',$ENV{'form.mode'},$ENV{"form.fieldname"}).'</td>'); 
                 $r->print('</tr>'); 
             } else {
                 $r->print('<tr bgcolor="#CCCCFF">');
-                $r->print('<td>
-                        <input type="checkbox" name="selectedfile" value="'.$filename.'" >
-                    </td>');
+                $r->print('<td><input type="checkbox" name="selectfile" value="'.$filename.'"'); 
+                if ($$checked_files{$filename} eq 'selected') {
+                    $r->print("CHECKED");
+                    &Apache::lonnet::logthis("checked");
+                } else {
+                    &Apache::lonnet::logthis("not checked $$checked_files{$filename} $filename");
+                }
+                $r->print('></td>');
                 $r->print('<td><img src="'.$iconpath.'unknown.gif"></td>');
                 $r->print('<td><a href="'.$href_location.$filename.'">'.
 			    $filename.'</a></td>'); 
@@ -204,6 +203,10 @@ sub display_file_select {
         }
     }
     $r->print('</table>
+            <input type="hidden" name="continue" value="true">
+            <input type="hidden" name="fieldname" value="'.$ENV{'form.fieldname'}.'">
+            <input type="hidden" name="mode" value="selectfile">
+            <input type="submit" name="submit" value="Select checked files, and continue selecting." /><br />
             <input type="button" name="doit" onClick= "finishSelect();" value="Select checked files, and close window" />
             <input type="hidden" name="currentpath" value="'.$current_path.'" />
     </form>');
@@ -211,12 +214,15 @@ sub display_file_select {
 
 sub open_form {
     my ($r)=@_;
+    my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
     $r->print('<form method="post" action="/adm/portfolio">');
     $r->print('<input type="hidden" name="action" value="'.
 	      $ENV{'form.action'}.'" />');
     $r->print('<input type="hidden" name="confirmed" value="1" />');
-    $r->print('<input type="hidden" name="selectfile" value="'.
-	      $ENV{'form.selectfile'}.'" />');
+    foreach (@files) {
+        $r->print('<input type="hidden" name="selectfile" value="'.
+	      $_.'" />');
+    }
     $r->print('<input type="hidden" name="currentpath" value="'.
 	      $ENV{'form.currentpath'}.'" />');
 }
@@ -236,34 +242,58 @@ sub close_form {
 
 sub display_file {
     my ($path,$filename)=@_;
+    my $display_file_text;
     if (!defined($path)) { $path=$ENV{'form.currentpath'}; }
-    if (!defined($filename)) { $filename=$ENV{'form.selectfile'}; }
-    return '<tt>'.$path.$filename.'</tt>';
+    if (!defined($filename)) { 
+        $filename=$ENV{'form.selectfile'};
+        $display_file_text = '<tt>'.$path.$filename.'</tt>';
+    } elsif (ref($filename) eq "ARRAY") {
+        foreach (@$filename) {
+            $display_file_text .= '<tt>'.$path.$_.'</tt>';
+        }
+    } elsif (ref($filename) eq "SCALAR") {
+        $display_file_text = '<tt>'.$path.$filename.'</tt>';        
+    }
+    return $display_file_text;
 }
 
 sub done {
     return ('<h3><a href="/adm/portfolio?currentpath='.
 	    $ENV{'form.currentpath'}.
 	    '&fieldname='.$ENV{'form.fieldname'}.
+	    '&mode='.$ENV{'form.mode'}.
 	    '">'.&mt('Done').'</a></h3>');
 }
 
 sub delete {
     my ($r)=@_;
-    &open_form($r);
-    $r->print('<p>'.&mt('Delete').' '.&display_file().'?</p>');
-    &close_form($r);
+    my @check;
+    my $file_name = $ENV{'form.currentpath'}.$ENV{'form.selectfile'};
+    my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
+    if (&Apache::lonnet::is_locked($file_name,$ENV{'user.domain'},$ENV{'user.name'} ) eq 'true') {
+        $r->print ("The file is locked and cannot be deleted.<br />");
+        $r->print(&done());
+    } else {
+        &open_form($r);
+        $r->print('<p>'.&mt('Delete').' '.&display_file(undef,\@files).'?</p>');
+        &close_form($r);
+    }
 } 
 
 sub delete_confirmed {
     my ($r)=@_;
-    my $result=&Apache::lonnet::removeuserfile($ENV{'user.name'},
+    my @files=&Apache::loncommon::get_env_multiple('form.selectfile');
+    my $result;
+    foreach my $delete_file (@files) {
+        &Apache::lonnet::logthis("trying to delete $delete_file");
+        $result=&Apache::lonnet::removeuserfile($ENV{'user.name'},
 					       $ENV{'user.domain'},'portfolio'.
 					       $ENV{'form.currentpath'}.
-					       $ENV{'form.selectfile'});
-    if ($result ne 'ok') {
+					       $delete_file);
+        if ($result ne 'ok') {
 	$r->print('<font color="red"> An error occured ('.$result.
-		  ') while trying to delete '.&display_file().'</font><br />');
+		  ') while trying to delete '.&display_file(undef, $delete_file).'</font><br />');
+        }
     }
     $r->print(&done());
 }
@@ -305,10 +335,16 @@ sub delete_dir_confirmed {
 
 sub rename {
     my ($r)=@_;
-    &open_form($r);
-    $r->print('<p>'.&mt('Rename').' '.&display_file().' to 
-               <input name="filenewname" type="input" size="50" />?</p>');
-    &close_form($r);
+    my $file_name = $ENV{'form.currentpath'}.$ENV{'form.rename'};
+    if (&Apache::lonnet::is_locked($file_name,$ENV{'user.domain'},$ENV{'user.name'}) eq 'true') {
+        $r->print ("The file is locked and cannot be renamed.<br />");
+        $r->print(&done());
+    } else {
+        &open_form($r);
+        $r->print('<p>'.&mt('Rename').' '.&display_file().' to 
+                   <input name="filenewname" type="input" size="50" />?</p>');
+        &close_form($r);
+    }
 }
 
 sub rename_confirmed {
@@ -324,7 +360,7 @@ sub rename_confirmed {
     my $result=
 	&Apache::lonnet::renameuserfile($ENV{'user.name'},$ENV{'user.domain'},
             'portfolio'.$ENV{'form.currentpath'}.$ENV{'form.selectfile'},
-            'portfolio'.$ENV{'form.currentpath'}.$ENV{'form.filenewname'});
+            'portfolio'.$ENV{'form.currentpath'}.$filenewname);
     if ($result ne 'ok') {
 	$r->print('<font color="red"> An errror occured ('.$result.
 		  ') while trying to rename '.&display_file().' to '.
@@ -334,27 +370,49 @@ sub rename_confirmed {
 }
 sub select_files {
     my ($r)=@_;
-    my $java_script =(<<ENDSMP);
+    if ($ENV{'form.continue'} eq 'true') {
+        # here we update the selections for the currentpath
+        # eventually, have to handle removing those not checked, but . . . 
+        my @items=&Apache::loncommon::get_env_multiple('form.selectfile');
+        &Apache::lonnet::save_selected_files($ENV{'user.name'}, $ENV{'form.currentpath'}, @items);
+    } else {
+        if ($ENV{'form.currentpath'} eq '/') {
+            #empty the file for a fresh start
+            # &Apache::lonnet::clear_selected_files($ENV{'user.name'});
+        }
+    }
+    my @files = &Apache::lonnet::files_not_in_path($ENV{'user.name'}, $ENV{'form.currentpath'});
+    my $java_files = join ",", @files;
+    if ($java_files) {
+        $java_files.=',';
+    }
+    my $javascript =(<<ENDSMP);
         <script language='javascript'>
         function finishSelect() {
-            fileList = "";
+ENDSMP
+    $javascript .= 'fileList = "'.$java_files.'";';
+    $javascript .= (<<ENDSMP);
             for (i=0;i<document.forms.checkselect.length;i++) { 
                 if (document.forms.checkselect[i].checked){
-                    fileList = fileList + document.forms.checkselect[i].value + "," ;
+                    fileList = fileList + document.forms.checkselect.currentpath.value + document.forms.checkselect[i].value + "," ;
                 }
             }
             opener.document.forms.lonhomework.
 ENDSMP
-    $java_script .= $ENV{'form.fieldname'};
-    $java_script .= (<<ENDSMP);
+    $javascript .= $ENV{'form.fieldname'};
+    $javascript .= (<<ENDSMP);
         .value=fileList;
             self.close();
         }
         </script>
 ENDSMP
-    $r->print($java_script);
+    $r->print($javascript);
     $r->print("<h1>Select portfolio files</h1>
                 Check as many as you wish in response to the essay problem.<br />");
+    $r->print("<strong>Files selected from other directories:</strong><br />");
+    foreach (&Apache::lonnet::files_not_in_path($ENV{'user.name'}, $ENV{'form.currentpath'})) {
+        $r->print($_."<br />");
+    }
 }
 sub upload {
     my ($r)=@_;
@@ -449,7 +507,7 @@ sub handler {
     $r->rflush();
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['selectfile','currentpath',
-					     'currentfile','action','fieldname','mode']);
+					     'currentfile','action','fieldname','mode','rename']);
 	if (($ENV{'form.storeupl'} eq 'Upload') & (!$ENV{'form.uploaddoc.filename'})){
    	    $r->print('<font color="red"> No file was selected to upload.'.
    	            'To upload a file, click <strong>Browse...</strong>'.
@@ -467,7 +525,9 @@ sub handler {
 	&delete_dir($r);
     } elsif ($ENV{'form.action'} eq 'rename' && $ENV{'form.confirmed'}) {
 	&rename_confirmed($r);
-    } elsif ($ENV{'form.action'} eq 'rename') {
+    } elsif ($ENV{'form.rename'}) {
+        $ENV{'form.selectfile'} = $ENV{'form.rename'};
+        $ENV{'form.action'} = 'rename';
 	&rename($r);
     } elsif ($ENV{'form.createdir'}) {
 	&createdir($r);