--- loncom/interface/portfolio.pm 2006/11/06 20:02:58 1.171 +++ loncom/interface/portfolio.pm 2008/11/28 18:18:39 1.199 @@ -1,7 +1,7 @@ # The LearningOnline Network # portfolio browser # -# $Id: portfolio.pm,v 1.171 2006/11/06 20:02:58 rezaferry Exp $ +# $Id: portfolio.pm,v 1.199 2008/11/28 18:18:39 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -87,57 +87,71 @@ sub display_common { my $groupitem = &group_form_data(); my $iconpath= $r->dir_config('lonIconsURL') . "/"; - my %text=&Apache::lonlocal::texthash( + my %lt=&Apache::lonlocal::texthash( 'upload' => 'Upload', - 'upload_label' => - 'Upload file to current directory:', + 'upload_label' => 'Upload file to current directory', 'createdir' => 'Create Subdirectory', 'createdir_label' => - 'Create subdirectory in current directory:'); + 'Create subdirectory in current directory', + 'parse' => 'If HTML file, upload embedded images/multimedia/css/linked files' + ); my $escuri = &HTML::Entities::encode($r->uri,'&<>"'); my $help_fileupload = &Apache::loncommon::help_open_topic('Portfolio AddFiles'); my $help_createdir = &Apache::loncommon::help_open_topic('Portfolio CreateDirectory'); # FIXME: This line should be deleted once Portfolio uses breadcrumbs - $r->print(&Apache::loncommon::help_open_topic('Portfolio About', 'Help on the portfolio')); + $r->print(&Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio'))); + + my $parse_check; + if (!&suppress_embed_prompt()) { + $parse_check = <<"END"; + <br /> + <span class="LC_nobreak"> + <label>$lt{'parse'} + <input type="checkbox" name="parserflag" checked="checked" /> + </label> + </span> +END + } + + $r->print('<div>'); + # Upload File + $r->print('<div class="LC_left_float">' + .'<form method="post" enctype="multipart/form-data" action="'.$escuri.'">' + .'<fieldset>' + .'<legend>'.$lt{'upload_label'}.'</legend>' + .$groupitem + .'<input name="uploaddoc" type="file" />' + .'<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="'.$lt{'upload'}.'" />' + .$help_fileupload + .$parse_check + .'</fieldset>' + .'</form>' + .'</div>' + ); + # Create Subdirectory + $r->print('<div class="LC_left_float">' + .'<form method="post" action="'.$escuri.'">' + .'<fieldset>' + .'<legend>'.$lt{'createdir_label'}.'</legend>' + .'<input name="newdir" type="input" />'.$groupitem + .'<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="'.$lt{'createdir'}.'" />' + .$help_createdir + .'</fieldset>' + .'</form>' + .'</div>' + ); + $r->print('</div>'); + } # end "if can_upload" - - $r->print(<<"TABLE"); -<table id="LC_portfolio_actions"> - <tr id="LC_portfolio_upload"> - <td class="LC_label"> - $text{'upload_label'} - </td> - <td class="LC_value"> - <form method="post" enctype="multipart/form-data" action="$escuri"> - $groupitem - <input name="uploaddoc" type="file" /> - <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="$text{'upload'}" />$help_fileupload - </form> - </td> - </tr> - <tr id="LC_portfolio_createdir"> - <td class="LC_label"> - $text{'createdir_label'} - </td> - <td class="LC_value"> - <form method="post" action="$escuri"> - <input name="newdir" type="input" />$groupitem - <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="$text{'createdir'}" />$help_createdir - </form> - </td> - </tr> -</table> -TABLE - } my @tree = split (/\//,$current_path); my %anchor_fields = ( 'selectfile' => $port_path, @@ -148,12 +162,12 @@ TABLE ); $r->print('<span class="LC_current_location">'.&make_anchor($url,\%anchor_fields,$port_path).'/'); if (@tree > 1){ - my $newCurrentPath = ''; + my $newCurrentPath = '/'; for (my $i = 1; $i< @tree; $i++){ $newCurrentPath .= $tree[$i].'/'; my %anchor_fields = ( 'selectfile' => $tree[$i], - 'currentpath' => '/', + 'currentpath' => $newCurrentPath, 'mode' => $env{"form.mode"}, 'fieldname' => $env{"form.fieldname"}, 'continue' => $env{"form.continue"} @@ -177,14 +191,14 @@ sub display_directory_line { $href_location, $url, $current_path, $access_admin_text, $versions)=@_; my $fullpath = &prepend_group($current_path.$filename); - $r->print('<tr class="'.$css_class.'">'); + $r->print(&Apache::loncommon::start_data_table_row()); $r->print($line); # contains first two cells of table my $lock_info; if ($version_flag) { # versioned can't be versioned, so TRUE when root file $r->print('<td><img alt="" src="'.&Apache::loncommon::icon($filename).'" /></td>'); $r->print('<td>'.$version_flag.'</td>'); } else { # this is a graded or handed back file - my ($user,$domain) = &get_name_dom(); + my ($user,$domain) = &get_name_dom($env{'form.group'}); my $permissions_hash = &Apache::lonnet::get_portfile_permissions($domain,$user); if (defined($$permissions_hash{$fullpath})) { foreach my $array_item (@{$$permissions_hash{$fullpath}}) { @@ -213,15 +227,19 @@ sub display_directory_line { $r->print('<td>'.$size.'</td>'); $r->print('<td>'.&Apache::lonlocal::locallocaltime($mtime).'</td>'); if ($select_mode ne 'true') { - $r->print('<td><span style="white-space: nowrap">'. - &mt($curr_access).' '); + $r->print('<td class="'.$css_class.'"> </td>'); # Display status + $r->print('<td><span class="LC_nobreak">' + .&mt($curr_access).' ' + ); my %anchor_fields = ( 'access' => $filename, 'currentpath' => $current_path ); $r->print(&make_anchor($url, \%anchor_fields, $access_admin_text).'</span></td>'); + } else { + $r->print('<td class="'.$css_class.'"> </td>'); # Display status } - $r->print('</tr>'.$/); + $r->print(&Apache::loncommon::end_data_table_row().$/); } sub display_directory { @@ -232,7 +250,7 @@ sub display_directory { my $select_mode; my $checked_files; my $port_path = &get_port_path(); - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $access_admin_text = &mt('View Status'); if ($can_setacl) { $access_admin_text = &mt('View/Change Status'); @@ -253,7 +271,9 @@ sub display_directory { $display_out = '<form method="post" action="'.$url.'">'. &group_form_data(). '<input type="hidden" name="action" value="deletedir" />'. + '<p>'. '<input type="submit" name="deletedir" value="'.&mt("Delete Directory").'" />'. + '</p>'. '<input type="hidden" name="selectfile" value="" />'. '<input type="hidden" name="currentpath" value="'.$current_path.'" />'. '</form>'; @@ -263,20 +283,30 @@ sub display_directory { } if ($select_mode eq 'true') { $r->print('<form method="post" name="checkselect" action="'.$url.'">'); - $r->print('<table id="LC_browser">'. - '<tr><th>Select</th><th> </th><th> </th><th>Name</th><th>Size</th><th>Last Modified</th></tr>'); + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'<th>'.&mt('Select').'</th>' + .'<th> </th><th> </th>' + .'<th>'.&mt('Name').'</th>' + .'<th>'.&mt('Size').'</th>' + .'<th>'.&mt('Last Modified').'</th>' + .'<th> </th>' + .&Apache::loncommon::end_data_table_header_row() + ); } else { $r->print('<form method="post" action="'.$url.'">'); $r->print(&Apache::loncommon::help_open_topic('Portfolio FileList', - 'Using the portfolio file list')); - $r->print('<table id="LC_browser">'. - '<tr><th colspan="2">Actions'. - &Apache::loncommon::help_open_topic('Portfolio FileAction'). - '</th><th> </th><th> </th><th>Name'. - &Apache::loncommon::help_open_topic('Portfolio OpenFile'). - '</th><th>Size</th><th>Last Modified</th><th>Current Access Status'. - &Apache::loncommon::help_open_topic('Portfolio ShareFile'). - '</th></tr>'); + &mt('Using the portfolio file list'))); + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'<th colspan="2">'.&mt('Actions'). &Apache::loncommon::help_open_topic('Portfolio FileAction').'</th>' + .'<th> </th><th> </th>' + .'<th>'.&mt('Name').&Apache::loncommon::help_open_topic('Portfolio OpenFile').'</th>' + .'<th>'.&mt('Size').'</th>' + .'<th>'.&mt('Last Modified').'</th>' + .'<th> </th>' + .'<th>'.&mt('Current Access Status').&Apache::loncommon::help_open_topic('Portfolio ShareFile').'</th>' + .&Apache::loncommon::end_data_table_header_row()); } $r->print("\n".&group_form_data()."\n"); @@ -290,8 +320,6 @@ sub display_directory { my ($bfile)=split('&',$b,2); return (lc($afile) cmp lc($bfile)); } (@$dir_list)) { - #$strip holds directory/file name - #$dom my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$dir_line,16); $filename =~ s/\s+$//; my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename); @@ -336,12 +364,17 @@ sub display_directory { $version_flag = ' '; } if ($dirptr&$testdir) { - my $colspan='colspan="2"'; + my $colspan_folder=''; + my $colspan_fill=''; if ($select_mode eq 'true'){ - undef($colspan); + $colspan_fill=' colspan="3"'; + } else { + $colspan_folder=' colspan="2"'; + $colspan_fill=' colspan="4"'; } - $r->print('<tr class="LC_browser_folder"><td '.$colspan.'><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_closed.gif" /></td>'); - $r->print('<td>Go to ...</td>'); + $r->print('<tr class="LC_browser_folder">'); + $r->print('<td'.$colspan_folder.'><img alt="'.&mt('closed folder').'" src="'.$iconpath.'folder_closed.gif" /></td>' + .'<td>'.&mt('Go to ...').'</td>'); my %anchor_fields = ( 'selectfile' => $filename.'/', 'currentpath' => $current_path.$filename.'/', @@ -349,7 +382,9 @@ sub display_directory { 'fieldname' => $env{"form.fieldname"}, 'continue' => $env{"form.continue"} ); - $r->print('<td>'.$version_flag.'</td><td>'.&make_anchor($url,\%anchor_fields,$filename.'/').'</td>'); + $r->print('<td>'.$version_flag.'</td>' + .'<td>'.&make_anchor($url,\%anchor_fields,$filename.'/').'</td>'); + $r->print('<td'.$colspan_fill.'> </td>'); $r->print('</tr>'); } else { my $css_class = 'LC_browser_file'; @@ -357,7 +392,7 @@ sub display_directory { if ($select_mode eq 'true') { $line='<td><input type="checkbox" name="checkfile" value="'.$filename.'"'; if ($$checked_files{$filename} eq 'selected') { - $line.=" checked "; + $line.=' checked="checked" '; } $line.=' /></td>'; } else { @@ -365,7 +400,7 @@ sub display_directory { my %anchor_fields = ( 'lockinfo' => $fullpath ); - $line.='<td colspan="2">'.&make_anchor($url,\%anchor_fields,'Locked').'</td>'; + $line.='<td colspan="2">'.&make_anchor($url,\%anchor_fields,&mt('Locked')).'</td>'; $css_class= 'LC_browser_file_locked'; } else { if (!$can_modify) { @@ -383,7 +418,7 @@ sub display_directory { 'rename' => $filename, currentpath => $current_path ); - $line .= &make_anchor($url,\%anchor_fields,'Rename'); + $line .= &make_anchor($url,\%anchor_fields,&mt('Rename')); $line .= '</td><td>'.&make_anchor($href_edit_location.$filename.'.meta',\%anchor_fields,$cat); # '<a href="'.$href_edit_location.$filename.'.meta">'.$cat.'</a>'; } @@ -440,20 +475,24 @@ sub display_directory { } } if ($select_mode eq 'true') { - $r->print('</table> + $r->print(&Apache::loncommon::end_data_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" /> + <p> + <input type="submit" name="submit" value="'.&mt('Select checked files, and continue selecting').'" /><br /> + <input type="button" name="doit" onClick= "finishSelect();" value="'.&mt('Select checked files, and close window').'" /> + </p> <input type="hidden" name="currentpath" value="'.$current_path.'" /> </form>'); } else { - $r->print('</table>'); + $r->print(&Apache::loncommon::end_data_table()); if ($can_delete) { $r->print(' - <input type="submit" name="doit" value="Delete Checked Files" />'. + <p> + <input type="submit" name="doit" value="'.&mt('Delete Selected').'" />'. &Apache::loncommon::help_open_topic('Portfolio DeleteFile').' + </p> <input type="hidden" name="action" value="delete" /> <input type="hidden" name="currentpath" value="'.$current_path.'" /> </form>' @@ -533,19 +572,19 @@ sub done { } sub delete { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my @check; my $file_name = $env{'form.currentpath'}.$env{'form.selectfile'}; $file_name = &prepend_group($file_name); my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { - $r->print("The file is locked and cannot be deleted.<br />"); + $r->print(&mt('The file is locked and cannot be deleted.').'<br />'); $r->print(&done('Back',$url)); } else { if (scalar(@files)) { &open_form($r,$url); - $r->print('<p>'.&mt('Delete').' '.&display_file(undef,\@files).'?</p>'); + $r->print('<p>'.&mt('Delete [_1]?',&display_file(undef,\@files)).'</p>'); &close_form($r,$url); } else { $r->print("No file was checked to delete.<br />"); @@ -558,7 +597,7 @@ sub delete_confirmed { my ($r,$url,$group)=@_; my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); my $result; - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path(); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); @@ -567,10 +606,10 @@ sub delete_confirmed { $env{'form.currentpath'}. $delete_file); if ($result ne 'ok') { - $r->print('<span class="LC_error">'. - &mt('An error occured ([_1]) while trying to delete - [_2].',$result,&display_file(undef, $delete_file)). - '</span><br /><br />'); + $r->print('<span class="LC_error">' + .&mt('An error occurred ([_1]) while trying to delete [_2].' + ,$result,&display_file(undef, $delete_file)) + .'</span><br /><br />'); } else { $r->print(&mt('File: [_1] deleted.', &display_file(undef,$delete_file))); @@ -589,7 +628,7 @@ sub delete_confirmed { &Apache::lonnet::modify_access_controls($file_name,\%changes, $udom,$uname); if ($outcome ne 'ok') { - $r->print('<br />'.&mt("An error occured ([_1]) while ". + $r->print('<br />'.&mt("An error occurred ([_1]) while ". "trying to delete access controls for the file.",$outcome). '</span><br /><br />'); } else { @@ -597,7 +636,7 @@ sub delete_confirmed { $r->print('<br />'.&mt('Access controls also deleted for the file.').'<br /><br />'); } else { $r->print('<span class="LC_error">'.'<br />'. - &mt("An error occured ([_1]) while ". + &mt("An error occurred ([_1]) while ". "trying to delete access controls for the file.",$deloutcome). '</span><br /><br />'); } @@ -612,30 +651,29 @@ sub delete_confirmed { sub delete_dir { my ($r,$url)=@_; &open_form($r,$url); - $r->print('<p>'.&mt('Delete').' '.&display_file().'?</p>'); + $r->print('<p>'.&mt('Delete [_1]?',&display_file()).'</p>'); &close_form($r,$url); } sub delete_dir_confirmed { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my $directory_name = $env{'form.currentpath'}; $directory_name =~ s|/$||; # remove any trailing slash - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $namespace = &get_namespace(); my $port_path = &get_port_path(); my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path. $directory_name); if ($result ne 'ok') { - $r->print('<span class="LC_error"> An error occured (dir) ('.$result. - ') while trying to delete '.$directory_name.'</span><br />'); + $r->print('<span class="LC_error">' + .&mt('An error occurred (dir) ([_1]) while trying to delete [_2].' + ,$result,$directory_name) + .'</span><br />'); } else { # now remove from recent -# $r->print('<br /> removing '.$directory_name.'<br /'); &Apache::lonhtmlcommon::remove_recent($namespace,[$directory_name.'/']); my @dirs = split m!/!, $directory_name; - -# $directory_name =~ m/^(\/*\/)(\/*.)$/; $directory_name='/'; for (my $i=1; $i < (@dirs - 1); $i ++){ $directory_name .= $dirs[$i].'/'; @@ -646,17 +684,17 @@ sub delete_dir_confirmed { } sub rename { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my $file_name = $env{'form.currentpath'}.$env{'form.rename'}; - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); $file_name = &prepend_group($file_name); if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { $r->print("The file is locked and cannot be renamed.<br />"); $r->print(&done(undef,$url)); } else { &open_form($r,$url); - $r->print('<p>'.&mt('Rename').' '.&display_file().' to - <input name="filenewname" type="input" size="50" />?</p>'); + $r->print('<p>'.&mt('Rename [_1] to [_2]?', &display_file() + , '<input name="filenewname" type="input" size="50" />').'</p>'); &close_form($r,$url); } } @@ -664,7 +702,7 @@ sub rename { sub rename_confirmed { my ($r,$url,$group)=@_; my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'}); - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path(); if ($filenewname eq '') { $r->print('<span class="LC_error">'. @@ -682,9 +720,9 @@ sub rename_confirmed { $chg_access = &access_for_renamed($filenewname,$group,$udom,$uname); } else { $r->print('<span class="LC_error">'. - &mt('An error occured ([_1]) while trying to rename [_2]' - .' to [_3]',$result,&display_file(), - &display_file('',$filenewname)).'</span><br />'); + &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].' + ,$result,&display_file(),&display_file('',$filenewname)) + .'</span><br />'); return; } if ($filenewname ne $env{'form.filenewname'}) { @@ -719,13 +757,13 @@ sub access_for_renamed { &Apache::lonnet::modify_access_controls($oldfile,\%change_old, $udom,$uname); if ($outcome ne 'ok') { - $chg_text ='<br /><br />'.&mt("An error occured ([_1]) while ". + $chg_text ='<br /><br />'.&mt("An error occurred ([_1]) while ". "trying to delete access control records for the old name.",$outcome). '</span><br />'; } else { if ($deloutcome ne 'ok') { $chg_text = '<br /><br /><span class="LC_error"><br />'. - &mt("An error occured ([_1]) while ". + &mt("An error occurred ([_1]) while ". "trying to delete access control records for the old name.",$deloutcome). '</span><br />'; } @@ -735,7 +773,7 @@ sub access_for_renamed { $udom,$uname); if ($outcome ne 'ok') { $chg_text .= '<br /><br />'. - &mt("An error occured ([_1]) while ". + &mt("An error occurred ([_1]) while ". "trying to update access control records for the new name.",$outcome). '</span><br />'; } @@ -748,7 +786,7 @@ sub access_for_renamed { sub display_access { my ($r,$url,$group,$can_setacl,$port_path,$action) = @_; - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $file_name = $env{'form.currentpath'}.$env{'form.access'}; $file_name = &prepend_group($file_name); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, @@ -762,9 +800,16 @@ sub display_access { $info .= '<br /><ul><li>'.&mt('Public files are available to anyone without the need for login.'); $info .= '</li><li>'.&mt('Passphrase-protected files do not require log-in, but will require the viewer to enter the passphrase you set.'); $info .= '</li><li>'.&explain_conditionals(); - $info .= '</li></ul>'; + $info .= '</li></ul>'. + &mt('A listing of files viewable without log-in is available at: ')."<a href=\"/adm/$udom/$uname/aboutme/portfolio\">http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme/portfolio</a>.<br />"; if ($group eq '') { - $info .= (&mt("A listing of files viewable without log-in is available at: <a href='/adm/$udom/$uname/aboutme/portfolio'>http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme/portfolio</a>.<br />For logged in users a 'Display file listing' link will also appear (when there are viewable files) on your personal information page:<br /><a href='/adm/$udom/$uname/aboutme'>http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme</a><br />")); + $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on your personal information page:"); + } else { + $info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on the course information page:"); + } + $info .= "<br /><a href=\"/adm/$udom/$uname/aboutme\">http://$ENV{'SERVER_NAME'}/adm/$udom/$uname/aboutme</a><br />"; + if ($group ne '') { + $info .= &mt("Users with privileges to edit course contents may add a course information page to a course using the 'Course Info' button in DOCS").'<br />'; } } else { $header = '<h3>'.&mt('Conditional access controls for file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'</h3>'. @@ -773,14 +818,14 @@ sub display_access { if ($can_setacl) { &open_form($r,$url); $r->print($header.$info); - $r->print('<br />'.&Apache::loncommon::help_open_topic('Portfolio ShareFile SetAccess', 'Help on setting up share access')); - $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile ChangeSetting', 'Help on changing settings')); - $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile StopAccess', 'Help on removing share access')); + $r->print('<br />'.&Apache::loncommon::help_open_topic('Portfolio ShareFile SetAccess', &mt('Help on setting up share access'))); + $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile ChangeSetting', &mt('Help on changing settings'))); + $r->print(&Apache::loncommon::help_open_topic('Portfolio ShareFile StopAccess', &mt('Help on removing share access'))); &access_setting_table($r,$url,$file_name,$access_controls{$file_name}, $action); my $button_text = { 'continue' => &mt('Proceed'), - 'cancel' => &mt('Back to directory listing'), + 'cancel' => &mt('Return to directory'), }; &close_form($r,$url,$button_text); } else { @@ -808,7 +853,7 @@ sub view_access_settings { $todisplay{$scope}{$key} = $$access_controls{$key}; } if ($aclcount) { - $r->print(&mt('<h4>Current access controls defined for this file:</h4>')); + $r->print('<h4>'.&mt('Current access controls defined for this file:').'</h4>'); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print('<th>'.&mt('Access control').'</th><th>'.&mt('Dates available'). @@ -819,12 +864,12 @@ sub view_access_settings { &build_access_summary($r,$count,$chg,%todisplay); $r->print(&Apache::loncommon::end_data_table()); } else { - $r->print(&mt('No access control settings currently exist for this file.<br />' )); + $r->print(&mt('No access control settings currently exist for this file.').'<br />'); } my %anchor_fields = ( 'currentpath' => $env{'form.currentpath'} ); - $r->print('<br />'.&make_anchor($url, \%anchor_fields, &mt('Return to directory listing'))); + $r->print('<br />'.&make_anchor($url, \%anchor_fields, &mt('Return to directory'))); return; } @@ -874,7 +919,7 @@ sub build_access_summary { if ($scope eq 'guest') { $r->print(&mt('Passphrase').': '.$content->{'password'}); } elsif ($scope eq 'course') { - $r->print('<table><tr>'); + $r->print('<table width="100%"><tr>'); $r->print('<th>'.&mt('Roles').'</th><th>'. &mt('Access').'</th><th>'. &mt('Sections').'</th>'); @@ -955,7 +1000,7 @@ sub update_access { $r->print('<h3>'.&mt('Allowing others to retrieve file: [_1]', $port_path.$file_name).'</h3>'."\n"); $file_name = &prepend_group($file_name); - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my ($errors,$outcome,$deloutcome,$new_values,$translation); if ($totalprocessed) { ($outcome,$deloutcome,$new_values,$translation) = @@ -1008,7 +1053,7 @@ sub update_access { } else { if ((@{$processing{'activate'}} > 0) || (@{$processing{'update'}} > 0)) { $errors .= '<span class="LC_error">'. - &mt('A problem occurred storing access control settings: [_1]',$outcome). + &mt('A problem occurred saving access control settings: [_1]',$outcome). '</span>'; } } @@ -1029,7 +1074,7 @@ sub update_access { &open_form($r,$url); foreach my $newitem ('course','domains','users') { if ($env{'form.new'.$newitem} > 0) { - $r->print('<br />'.&mt('Add new <b>[_1]-based</b> access control for portfolio file: <b>[_2]</b>',$newitem,$env{'form.currentpath'}.$env{'form.selectfile'}).'<br /><br />'); + $r->print('<br />'.&mt('Add new <b>[_1]-based</b> access control for portfolio file: <b>[_2]</b>',&mt($newitem),$env{'form.currentpath'}.$env{'form.selectfile'}).'<br /><br />'); $firstitem = $totalnew; $lastitem = $totalnew + $env{'form.new'.$newitem}; $totalnew = $lastitem; @@ -1049,7 +1094,7 @@ sub update_access { ); $r->print('<br />'.&make_anchor($url, \%anchor_fields, &mt('Display all access settings for this file'))); delete $anchor_fields{'access'}; - $r->print(' '.&make_anchor($url,\%anchor_fields,&mt('Return to directory listing'))); + $r->print(' '.&make_anchor($url,\%anchor_fields,&mt('Return to directory'))); } return; } @@ -1197,7 +1242,7 @@ sub access_setting_table { sub standard_settings { my ($r,$now,$then,$url,$filename,$acl_count,$start,$end,$public,$publicnum, $publictext,$guest,$guestnum,$guesttext,$access_controls,%conditionals)=@_; - $r->print('<h3>'.&mt('Public access: [_1]',$publictext).'</h3>'); + $r->print('<h3>'.&mt('Public access: [_1]',&mt($publictext)).'</h3>'); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available').'</th>'); @@ -1213,7 +1258,7 @@ sub standard_settings { $r->print(&Apache::loncommon::end_data_table_row()); $r->print(&Apache::loncommon::end_data_table()); $r->print('</td><td width="40"> </td><td valign="top">'); - $r->print('<h3>'.&mt('Passphrase-protected access: [_1]',$guesttext).'</h3>'); + $r->print('<h3>'.&mt('Passphrase-protected access: [_1]',&mt($guesttext)).'</h3>'); $r->print(&Apache::loncommon::start_data_table()); $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Dates available'). @@ -1259,7 +1304,7 @@ sub standard_settings { 'action' => 'chgconditions', 'currentpath' => $env{'form.currentpath'}, ); - $r->print('<h3>'.&mt('Conditional access: [_1]',$conditionstext).'</h3>'); + $r->print('<h3>'.&mt('Conditional access: [_1]',&mt($conditionstext)).'</h3>'); if ($numconditionals > 0) { my $count = 1; my $chg = 'none'; @@ -1309,7 +1354,7 @@ sub access_element { my $title = $type; $title =~ s/s$//; $title =~ s/^(\w)/uc($1)/e; - $r->print('<h3>'.&mt('[_1]-based conditional access: ',$title)); + $r->print('<h3>'.&mt('[_1]-based conditional access: ',&mt($title))); if ($$acl_count{$type}) { $r->print($$acl_count{$type}.' '); if ($$acl_count{$type} > 1) { @@ -1336,12 +1381,12 @@ sub display_access_row { $r->print(&Apache::loncommon::start_data_table_header_row()); $r->print('<th>'.&mt('Action?').'</th><th>'.&mt($uctype).'</th><th>'. &mt('Dates available').'</th>'); - if ($type eq 'course') { + if ($type eq 'course' && $status eq 'old') { $r->print('<th>'.&mt('Allowed [_1] member affiliations',$type). '</th>'); $colspan ++; } elsif ($type eq 'domains') { - @all_doms = &Apache::loncommon::get_domains(); + @all_doms = sort(&Apache::lonnet::all_domains()); } $r->print(&Apache::loncommon::end_data_table_header_row()); foreach my $key (@{$items}) { @@ -1364,8 +1409,8 @@ sub display_access_row { } $r->print(&Apache::loncommon::end_data_table()); } else { - $r->print(&mt('No [_1]-based conditions defined.<br />',$type). - &additional_item($type)); + $r->print(&mt('No [_1]-based conditions defined.',&mt($type)).'<br />' + .&additional_item($type)); } return; } @@ -1373,34 +1418,37 @@ sub display_access_row { sub course_js { return qq| <script type="text/javascript"> -function setRoleOptions(caller,num,cdom,cnum,type) { - addIndexnum = getCallerIndex(caller); - updateIndexnum = getIndex('update',num); - if (caller.checked) { - document.portform.elements[updateIndexnum].checked = true; - var url = '/adm/portfolio?action=rolepicker&setroles='+addIndexnum+'&cnum='+cnum+'&cdom='+cdom+'&type='+type; +function setRoleOptions(num,roleid,cdom,cnum,type) { + updateIndexNum = getIndexByValue('update',num); + var addItem = 'add_role_'+num; + var addIndexNum = getIndexByName(addItem); + if (document.portform.elements[addItem].checked) { + document.portform.elements[updateIndexNum].checked = true; + var url = '/adm/portfolio?action=rolepicker&setroles='+num+'_'+roleid+'&cnum='+cnum+'&cdom='+cdom+'&type='+type; var title = 'Roles_Chooser'; var options = 'scrollbars=1,resizable=1,menubar=0'; options += ',width=700,height=600'; rolebrowser = open(url,title,options,'1'); rolebrowser.focus(); } else { - for (var j=0;j<5;j++) { - document.portform.elements[addIndexnum+j].value = ''; + addArray = new Array ('role','access','section','group'); + for (var j=0;j<addArray.length;j++) { + var itemIndex = getIndexByName(addArray[j]+'_'+num+'_'+roleid); + document.portform.elements[itemIndex].value = ''; } } } -function getCallerIndex(caller) { +function getIndexByName(item) { for (var i=0;i<document.portform.elements.length;i++) { - if (document.portform.elements[i] == caller) { + if (document.portform.elements[i].name == item) { return i; } } return -1; } -function getIndex(name,value) { +function getIndexByValue(name,value) { for (var i=0;i<document.portform.elements.length;i++) { if (document.portform.elements[i].name == name && document.portform.elements[i].value == value) { return i; @@ -1433,33 +1481,53 @@ sub course_row { my %course_description = &Apache::lonnet::coursedescription($cid); $r->print('<td><input type="hidden" name="crsdom_'.$num.'" value="'.$content->{'domain'}.'" /><input type="hidden" name="crsnum_'.$num.'" value="'.$content->{'number'}.'" />'.$course_description{'description'}.'</td>'); } elsif ($status eq 'new') { - $r->print('<td>'.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,undef,undef,$uctype).' <input type="text" name="description_'.$num.'" size="30" /><input type="hidden" name="crsdom_'.$num.'" /><input type="hidden" name="crsnum_'.$num.'" /></td>'); + $r->print('<td>'.&Apache::loncommon::selectcourse_link('portform','crsnum_'.$num,'crsdom_'.$num,'description_'.$num,$num.'_1',undef,$uctype).' <input type="text" name="description_'.$num.'" size="30" /><input type="hidden" name="crsdom_'.$num.'" /><input type="hidden" name="crsnum_'.$num.'" /></td>'); } - $r->print('<td>'.&dateboxes($num,$start,$end).'</td>'); - $r->print('<td><table><tr>'); - $r->print('<th>'.&mt('Action').'</th><th>'.&mt('Roles').'</th><th>'. - &mt('Access').'</th><th>'.&mt('Sections').'</th><th>'. - &mt('Groups').'</th></tr>'); + $r->print('<td>'.&dateboxes($num,$start,$end)); + my $newrole_id = 1; if ($status eq 'old') { + $r->print('</td><td>'); my $max_id = 0; - foreach my $role_id (sort(keys(%{$content->{'roles'}}))) { - if ($role_id > $max_id) { - $max_id = $role_id; - } - $max_id ++; - my $role_selects = &role_selectors($num,$role_id,$status,$type,$content,'display'); - $r->print('<tr><td><span style="white-space: nowrap"><label><input type="checkbox" name="delete_role_'.$num.'" value="'.$role_id.'" />'.&mt('Delete').'</label></span><br /><input type="hidden" name="preserve_role_'.$num.'" value="'.$role_id.'" /></td>'.$role_selects.'</tr>'); - } - $r->print('</table><br />'.&mt('Add a roles-based condition').' <input type="checkbox" name ="add_role_'.$num.'" onClick="javascript:setRoleOptions(this,'."'$num','$content->{'domain'}','$content->{'number'}','$uctype'".')" value="'.$max_id.'" /><input type="hidden" name="role_'.$num.'_'.$max_id.'" /><input type="hidden" name="access_'.$num.'_'.$max_id.'" /><input type="hidden" name="section_'.$num.'_'.$max_id.'" /><input type="hidden" name="group_'.$num.'_'.$max_id.'" /></td>'); - } elsif ($status eq 'new') { - my $role_id = 1; - my $role_selects = &role_selectors($num,$role_id,$status,$type,undef,'display'); - $r->print('<tr><td><input type="checkbox" name="add_role_'.$num.'" value="'.$role_id.'" checked="checked" />'.&mt('Add').'<input type="hidden" name="grplist_'.$num.'_'.$role_id.'" /></td>'.$role_selects); - $r->print('</tr></table></td>'); + if (keys(%{$content->{'roles'}}) > 0) { + $r->print('<table><tr><th>'.&mt('Action').'</th>'. + '<th>'.&mt('Roles').'</th>'. + '<th>'.&mt('Access').'</th>'. + '<th>'.&mt('Sections').'</th>'. + '<th>'.&mt('Groups').'</th></tr>'); + foreach my $role_id (sort(keys(%{$content->{'roles'}}))) { + if ($role_id > $max_id) { + $max_id = $role_id; + } + $max_id ++; + my $role_selects = &role_selectors($num,$role_id,$type,$content,'display'); + $r->print('<tr><td><span style="white-space: nowrap"><label><input type="checkbox" name="delete_role_'.$num.'" value="'.$role_id.'" />'.&mt('Delete').'</label></span><br /><input type="hidden" name="preserve_role_'.$num.'" value="'.$role_id.'" /></td>'.$role_selects.'</tr>'); + } + $r->print('</table>'); + } + $r->print('<br />'.&mt('Add a roles-based condition'). + ' <input type="checkbox" name ="add_role_'. + $num.'" onClick="javascript:setRoleOptions('."'$num', + '$max_id','$content->{'domain'}','$content->{'number'}', + '$uctype'".')" value="" />'); + $newrole_id = $max_id; + } else { + $r->print('<input type="hidden" name ="add_role_'.$num.'" value="" />'); } + $r->print(&add_course_role($num,$newrole_id)); + $r->print('</td>'); return; } +sub add_course_role { + my ($num,$max_id) = @_; + my $output; + $output .='<input type="hidden" name="role_'.$num.'_'.$max_id.'" />'. + '<input type="hidden" name="access_'.$num.'_'.$max_id.'" />'. + '<input type="hidden" name="section_'.$num.'_'.$max_id.'" />'. + '<input type="hidden" name="group_'.$num.'_'.$max_id.'" />'; + return $output; +} + sub domains_row { my ($r,$status,$item,$all_doms,$access_controls,$now,$then) = @_; my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then, @@ -1501,7 +1569,7 @@ sub users_row { sub additional_item { my ($type) = @_; - my $output = &mt('Add new [_1] condition(s)?',$type).' '.&mt('Number to add: ').'<input type="text" name="new'.$type.'" size="3" value="0" />'; + my $output = &mt('Add new [_1] condition(s)?',&mt($type)).' '.&mt('Number to add: ').'<input type="text" name="new'.$type.'" size="3" value="0" />'; return $output; } @@ -1562,21 +1630,12 @@ sub set_identifiers { } sub role_selectors { - my ($num,$role_id,$status,$type,$content,$caller) = @_; + my ($num,$role_id,$type,$content,$caller) = @_; my ($output,$cdom,$cnum,$longid); if ($caller eq 'display') { $longid = '_'.$num.'_'.$role_id; - if ($status eq 'new') { - foreach my $item ('role','access','section','group') { - $output .= '<td><select name="'.$item.$longid.'">'. - '<option value="">'.&mt('Pick [_1] first',$type). - '</option></select></td>'; - } - return $output; - } else { - $cdom = $$content{'domain'}; - $cnum = $$content{'number'}; - } + $cdom = $$content{'domain'}; + $cnum = $$content{'number'}; } elsif ($caller eq 'rolepicker') { $cdom = $env{'form.cdom'}; $cnum = $env{'form.cnum'}; @@ -1614,7 +1673,7 @@ sub role_selectors { 'role' => $allroles, 'access' => \@allaccesses, 'section' => $sections, - 'group' => $groups, + 'group' => $groups, ); foreach my $item ('role','access','section','group') { $output .= '<td><select name="'.$item.$longid.'" multiple="true" size="4">'."\n"; @@ -1638,16 +1697,21 @@ sub role_selectors { sub role_options_window { my ($r) = @_; - my $cdom = $env{'form.cdom'}; - my $cnum = $env{'form.cnum'}; my $type = $env{'form.type'}; - my $addindex = $env{'form.setroles'}; - my $role_selects = &role_selectors(1,1,'new',$type,undef,'rolepicker'); + my $rolenum = $env{'form.setroles'}; + my ($num,$role_id) = ($rolenum =~ /^([\d_]+)_(\d+)$/); + my $role_elements; + foreach my $item ('role','access','section','group') { + $role_elements .= "'".$item.'_'.$rolenum."',"; + } + $role_elements =~ s/,$//; + my $role_selects = &role_selectors($num,$role_id,$type,undef, + 'rolepicker'); $r->print(<<"END_SCRIPT"); <script type="text/javascript"> function setRoles() { - var addidx = $addindex+1; - for (var i=0; i<4; i++) { + var role_elements = new Array($role_elements); + for (var i=0; i<role_elements.length; i++) { var copylist = ''; for (var j=0; j<document.rolepicker.elements[i].length; j++) { if (document.rolepicker.elements[i].options[j].selected) { @@ -1655,10 +1719,23 @@ function setRoles() { } } copylist = copylist.substr(0,copylist.length-1); - opener.document.portform.elements[addidx+i].value = copylist; + var openerItem = getIndexByName(role_elements[i]); + opener.document.portform.elements[openerItem].value = copylist; } + var roleAdder = getIndexByName('add_role_$num'); + opener.document.portform.elements[roleAdder].value = '$role_id'; self.close(); } + +function getIndexByName(item) { + for (var i=0;i<opener.document.portform.elements.length;i++) { + if (opener.document.portform.elements[i].name == item) { + return i; + } + } + return -1; +} + </script> END_SCRIPT $r->print(&mt('Select roles, course status, section(s) and group(s) for users who will be able to access the portfolio file.')); @@ -1695,49 +1772,53 @@ ENDSMP fileList = fileList + document.forms.checkselect.currentpath.value + document.forms.checkselect[i].value + "," ; } } - opener.document.forms.lonhomework.$env{'form.fieldname'}.value=fileList; + var hwfield = opener.document.getElementsByName('$env{'form.fieldname'}'); + hwfield[0].value = fileList; self.close(); } </script> ENDSMP $r->print($javascript); - $r->print("<h1>Select portfolio files</h1> - Check as many as you wish in response to the problem.<br />"); + $r->print("<h1>".&mt('Select portfolio files')."</h1>"); my @otherfiles=&Apache::lonnet::files_not_in_path($env{'user.name'}, $env{'form.currentpath'}); if (@otherfiles) { - $r->print("<strong>Files selected from other directories:</strong><br />"); + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'<th>'.&mt('Files selected from other directories:')."</th>" + .&Apache::loncommon::end_data_table_header_row() + ); foreach my $file (@otherfiles) { - $r->print($file."<br />"); + $r->print(&Apache::loncommon::start_data_table_row() + .'<td>'.$file."</td>" + .&Apache::loncommon::end_data_table_row() + ); } + $r->print(&Apache::loncommon::end_data_table() + .'<br />' + ); } + $r->print('<div>' + .&mt('Check as many files as you wish in response to the problem:') + .'</div>' + ); } -sub upload { - my ($r,$url,$group)=@_; - my $fname=$env{'form.uploaddoc.filename'}; - my $filesize = (length($env{'form.uploaddoc'})) / 1000; #express in k (1024?) - my $disk_quota = 20000; # expressed in k - if (defined($group)) { - my $grp_quota = &get_group_quota($group); # quota expressed in k - if ($grp_quota ne '') { - $disk_quota = $grp_quota; - } else { - $disk_quota = 0; - } - } - $fname=&Apache::lonnet::clean_filename($fname); - my $portfolio_root=&get_portfolio_root(); - my ($uname,$udom) = &get_name_dom(); +sub check_for_upload { + my ($path,$fname,$group,$element) = @_; + my $disk_quota = &get_quota($group); + my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?) + my $portfolio_root = &get_portfolio_root(); my $port_path = &get_port_path(); + my ($uname,$udom) = &get_name_dom($group); # Fixme --- Move the checking for existing file to LOND error return - my @dir_list=&get_dir_list($portfolio_root); + my @dir_list=&get_dir_list($portfolio_root,$path,$group); my $found_file = 0; my $locked_file = 0; foreach my $line (@dir_list) { my ($file_name)=split(/\&/,$line,2); if ($file_name eq $fname){ - $file_name = $env{'form.currentpath'}.$file_name; + $file_name = $path.$file_name; $file_name = &prepend_group($file_name); $found_file = 1; if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { @@ -1745,38 +1826,93 @@ sub upload { } } } - my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root); + my $getpropath = 1; + my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath); + if (($current_disk_usage + $filesize) > $disk_quota){ - $r->print('<span class="LC_error">Unable to upload <strong>'.$fname.' (size = '.$filesize.' kilobytes)</strong>. Disk quota will be exceeded.</span>'. - '<br />Disk quota is '.$disk_quota.' kilobytes. Your current disk usage is '.$current_disk_usage.' kilobytes.'); - $r->print(&done('Back',$url)); - } - elsif ($found_file){ - if ($locked_file){ - $r->print('<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a <strong>locked</strong> file by that name was found in <strong>'.$port_path.$env{'form.currentpath'}.'</strong></span>'. - '<br />You will be able to rename or delete existing '.$fname.' after a grade has been assigned.'); - $r->print(&done('Back',$url)); - } else { - $r->print('<span class="LC_error">'.'Unable to upload <strong>'.$fname.'</strong>, a file by that name was found in <strong>'.$port_path.$env{'form.currentpath'}.'</strong></span>'. - '<br />To upload, rename or delete existing '.$fname.' in '.$port_path.$env{'form.currentpath'}); - $r->print(&done('Back',$url)); - } - } else { - my $result=&Apache::lonnet::userfileupload('uploaddoc','', - $port_path.$env{'form.currentpath'}); - if ($result !~ m|^/uploaded/|) { - $r->print('<span class="LC_error">'.'An errror occured ('.$result. - ') while trying to upload '.&display_file().'</span><br />'); - $r->print(&done('Back',$url)); - } else { - $r->print(&done(undef,$url)); + my $msg = '<span class="LC_error">'. + &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.','<span class="LC_filename">'.$fname.'</span>',$filesize).'</span>'. + '<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage); + return ('will_exceed_quota',$msg); + } elsif ($found_file) { + if ($locked_file) { + my $msg = '<span class="LC_error">'; + $msg .= &mt('Unable to upload [_1]. A locked file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>','<span class="LC_filename">'.$port_path.$env{'form.currentpath'}.'</span>'); + $msg .= '</span><br />'; + $msg .= &mt('You will be able to rename or delete existing [_1] after a grade has been assigned.','<span class="LC_filename">'.$fname.'</span>'); + return ('file_locked',$msg); + } else { + my $msg = '<span class="LC_error">'; + $msg .= &mt('Unable to upload [_1]. A file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$port_path.$env{'form.currentpath'}); + $msg .= '</span>'; + $msg .= '<br />'; + $msg .= &mt('To upload, rename or delete existing [_1] in [_2].','<span class="LC_filename">'.$fname.'</span>', $port_path.$env{'form.currentpath'}); + return ('file_exists',$msg); + } + } +} + +sub upload { + my ($r,$url,$group)=@_; + my $fname=&Apache::lonnet::clean_filename($env{'form.uploaddoc.filename'}); + my $disk_quota = &get_quota($group); + my $portfolio_root = &get_portfolio_root(); + my $port_path = &get_port_path(); + my ($uname,$udom) = &get_name_dom($group); + my $getpropath = 1; + my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath); + my ($state,$msg) = + &Apache::loncommon::check_for_upload($env{'form.currentpath'},$fname, + $group,'uploaddoc',$portfolio_root, + $port_path,$disk_quota, + $current_disk_usage,$uname,$udom); + if ($state eq 'will_exceed_quota' + || $state eq 'file_locked' + || $state eq 'file_exists' ) { + $r->print($msg.&done('Back',$url)); + return; + } + + my (%allfiles,%codebase,$mode); + if ($env{'form.uploaddoc.filename'} =~ m/(\.htm|\.html|\.shtml)$/i) { + if ($env{'form.parserflag'}) { + $mode = 'parse'; } } + my $result= + &Apache::lonnet::userfileupload('uploaddoc','', + $port_path.$env{'form.currentpath'}, + $mode,\%allfiles,\%codebase); + if ($result !~ m|^/uploaded/|) { + $r->print('<span class="LC_error">'.&mt('An error occurred ([_1]) while trying to upload [_2].' + ,$result,&display_file()).'</span><br />'); + $r->print(&done('Back',$url)); + } else { + if (%allfiles) { + if (!&suppress_embed_prompt()) { + my $state = <<STATE; + <input type="hidden" name="action" value="upload_embedded" /> + <input type="hidden" name="currentpath" value="$env{'form.currentpath'}" /> + <input type="hidden" name="fieldname" value="$env{'form.fieldname'}" /> + <input type="hidden" name="mode" value="$env{'form.mode'}" /> +STATE + $r->print("<h2>".&mt("Reference Warning")."</h2>"); + $r->print("<p>".&mt("Completed upload of the file. This file contained references to other files. You must upload the referenced files or else the uploaded file may not work properly.")."</p>"); + $r->print("<p>".&mt("Please select the locations from which the referenced files are to be uploaded.")."</p>"); + $r->print(&Apache::loncommon::ask_for_embedded_content('/adm/portfolio',$state,\%allfiles,\%codebase, + {'error_on_invalid_names' => 1, + 'ignore_remote_references' => 1,})); + $r->print('<p>Or '.&done('Return to directory',$url).'</p>'); + } + } else { + $r->print(&done(undef,$url)); + } + } } sub lock_info { my ($r,$url,$group) = @_; - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); my $file_name = $env{'form.lockinfo'}; @@ -1809,17 +1945,16 @@ sub lock_info { my %course_description = &Apache::lonnet::coursedescription($$array_item[1]); if ( $course_description{'description'} ne '') { - $r->print(&mt('In the course: <strong>[_1]</strong><br />', - $course_description{'description'})); + $r->print(&mt('In the course:').' <strong>'.$course_description{'description'}.'</strong><br />'); } } } - $r->print(&done('Back',$url)); + $r->print(&done(&mt('Back'),$url)); return 'ok'; } sub createdir { - my ($r,$url)=@_; + my ($r,$url,$group)=@_; my $newdir=&Apache::lonnet::clean_filename($env{'form.newdir'}); if ($newdir eq '') { $r->print('<span class="LC_error">'. @@ -1829,7 +1964,7 @@ sub createdir { return; } my $portfolio_root = &get_portfolio_root(); - my @dir_list=&get_dir_list($portfolio_root); + my @dir_list=&get_dir_list($portfolio_root,undef,$group); my $found_file = 0; foreach my $line (@dir_list) { my ($filename)=split(/\&/,$line,2); @@ -1838,20 +1973,24 @@ sub createdir { } } if ($found_file){ - $r->print('<span class="LC_error">'.'Unable to create a directory named <strong>'.$newdir. - ' </strong>a file or directory by that name already exists.</span><br />'); + $r->print('<span class="LC_error">' + .&mt('Unable to create a directory named [_1].','<strong>'.$newdir.'</strong>') + .' '.&mt('A file or directory by that name already exists.').'</span><br />'); } else { - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path(); my $result=&Apache::lonnet::mkdiruserfile($uname,$udom, $port_path.$env{'form.currentpath'}.$newdir); if ($result ne 'ok') { - $r->print('<span class="LC_error">'.'An errror occured ('.$result. - ') while trying to create a new directory '.&display_file().'</span><br />'); + $r->print('<span class="LC_error">' + .&mt('An error occurred ([_1]) while trying to create a new directory [_2].' + ,$result,&display_file()) + .'</span><br />'); } } if ($newdir ne $env{'form.newdir'}) { - $r->print("The new directory name was changed from:<br /><strong>".$env{'form.newdir'}."</strong> to <strong>$newdir </strong>"); + $r->print(&mt('The new directory name was changed from [_1] to [_2].' + ,'<strong>'.$env{'form.newdir'}.'</strong>','<strong>'.$newdir.'</strong>')); } $r->print(&done(undef,$url)); } @@ -1859,7 +1998,7 @@ sub createdir { sub get_portfolio_root { my ($udom,$uname,$group) = @_; if (!(defined($udom)) || !(defined($uname))) { - ($uname,$udom) = &get_name_dom(); + ($uname,$udom) = &get_name_dom($group); } my $path = '/userfiles/portfolio'; if (!defined($group)) { @@ -1870,7 +2009,7 @@ sub get_portfolio_root { if (defined($group)) { $path = '/userfiles/groups/'.$group.'/portfolio'; } - return (&Apache::loncommon::propath($udom,$uname).$path); + return $path; } sub get_group_quota { @@ -1885,21 +2024,23 @@ sub get_group_quota { $group_quota = $group_info{'quota'}; #expressed in Mb if ($group_quota) { $group_quota = 1000 * $group_quota; #expressed in k - } + } } return $group_quota; -} +} sub get_dir_list { - my ($portfolio_root) = @_; - my ($uname,$udom) = &get_name_dom(); - return &Apache::lonnet::dirlist($env{'form.currentpath'}, - $udom,$uname,$portfolio_root); + my ($portfolio_root,$path,$group) = @_; + $path ||= $env{'form.currentpath'}; + my ($uname,$udom) = &get_name_dom($group); + my $getpropath = 1; + return &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname,$getpropath); } sub get_name_dom { + my ($group) = @_; my ($uname,$udom); - if (defined($env{'form.group'})) { + if (defined($group)) { $udom = $env{'course.'.$env{'request.course.id'}.'.domain'}; $uname = $env{'course.'.$env{'request.course.id'}.'.num'}; } else { @@ -1920,7 +2061,7 @@ sub prepend_group { sub get_namespace { my $namespace = 'portfolio'; if (defined($env{'form.group'})) { - my ($uname,$udom) = &get_name_dom(); + my ($uname,$udom) = &get_name_dom($env{'form.group'}); $namespace .= '_'.$udom.'_'.$uname.'_'.$env{'form.group'}; } return $namespace; @@ -1952,7 +2093,7 @@ sub missing_priv { $rtnlink .= '?'; } $rtnlink .= 'currentpath='.$escpath; - $r->print(&mt('<h3>Action disallowed</h3>')); + $r->print('<h3>'.&mt('Action disallowed').'</h3>'); $r->print(&mt('You do not have sufficient privileges to [_1] ', $longtext->{$priv})); if (defined($env{'form.group'})) { @@ -1961,7 +2102,7 @@ sub missing_priv { } else { $r->print(&mt('in this portfolio.')); } - $rtnlink .= '">'.&mt('Return to directory listing page').'</a>'; + $rtnlink .= '">'.&mt('Return to directory').'</a>'; $r->print('<br />'.$rtnlink); $r->print(&Apache::loncommon::end_page()); return; @@ -1990,6 +2131,34 @@ sub coursegrp_portfolio_header { return $output; } +sub get_quota { + my ($group) = @_; + my $disk_quota; + if (defined($group)) { + my $grp_quota = &get_group_quota($group); # quota expressed in k + if ($grp_quota ne '') { + $disk_quota = $grp_quota; + } else { + $disk_quota = 0; + } + } else { + $disk_quota = &Apache::loncommon::get_user_quota($env{'user.name'}, + $env{'user.domain'}); #expressed in Mb + $disk_quota = 1000 * $disk_quota; # convert from Mb to kb + } + return $disk_quota; +} + +sub suppress_embed_prompt { + my $suppress_prompt = 0; + if (($env{'request.role'} =~ /^st/) && ($env{'request.course.id'} ne '')) { + if ($env{'course.'.$env{'request.course.id'}.'.suppress_embed_prompt'} eq 'yes') { + $suppress_prompt = 1; + } + } + return $suppress_prompt; +} + sub handler { # this handles file management @@ -2017,8 +2186,8 @@ sub handler { &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); $env{'form.group'} =~ s/\W//g; $group = $env{'form.group'}; - if ($group) { - ($uname,$udom) = &get_name_dom(); + if ($group ne '') { + ($uname,$udom) = &get_name_dom($group); my %curr_groups = &Apache::longroup::coursegroups($udom,$uname, $group); if (%curr_groups) { @@ -2029,16 +2198,16 @@ sub handler { $env{'request.course.id'}.'/'.$group))) { $portfolio_root = &get_portfolio_root(); } else { - $r->print('You do not have the privileges required to access the shared files space for this group.'); + $r->print(&mt('You do not have the privileges required to access the shared files space for this group.')); $earlyout = 1; } } else { - $r->print('Not a valid group for this course'); + $r->print(&mt('Not a valid group for this course')); $earlyout = 1; } - $title = &mt('Group files').' for '.$group; + $title = &mt('Group files for [_1]', $group); } else { - $r->print('Invalid group'); + $r->print(&mt('Invalid group')); $earlyout = 1; } if ($earlyout) { return OK; } @@ -2086,17 +2255,22 @@ sub handler { $r->print(&Apache::loncommon::start_page($title)); } $r->rflush(); + my ($blocked,$blocktext) = + &Apache::loncommon::blocking_status('port',$uname,$udom); + if ($blocked) { + $r->print($blocktext); + $r->print(&Apache::loncommon::end_page()); + return OK; + } if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){ - $r->print('<span class="LC_error">'. - 'No file was selected to upload.'. - 'To upload a file, click <strong>Browse...</strong>'. - ', select a file, then click <strong>Upload</strong>.'. - '</span>'); + $r->print('<span class="LC_error">'); + $r->print(&mt('No file was selected to upload.').' '); + $r->print(&mt('To upload a file, click <strong>Browse...</strong> and select a file, then click <strong>Upload</strong>.')); + $r->print('</span>'); } if ($env{'form.meta'}) { &open_form($r,$url); -# $r->print(&edit_meta_data($r, $env{'form.currentpath'}.$env{'form.selectfile'})); - $r->print('Edit the meta data<br />'); + $r->print(&mt('Edit the meta data').'<br />'); &close_form($r,$url); } if ($env{'form.store'}) { @@ -2108,6 +2282,19 @@ sub handler { } else { &missing_priv($r,$url,'upload'); } + } elsif ($env{'form.action'} eq 'upload_embedded') { + if ($can_upload) { + my $disk_quota = &get_quota($group); + my $getpropath = 1; + my $current_disk_usage = + &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath); + $r->print( + &Apache::loncommon::upload_embedded('portfolio',$port_path,$uname,$udom, + $group,$portfolio_root,$group,$disk_quota,$current_disk_usage)); + $r->print(&done(undef,$url)); + } else { + &missing_priv($r,$url,'upload'); + } } elsif ($env{'form.action'} eq 'delete' && $env{'form.confirmed'}) { if ($can_delete) { &delete_confirmed($r,$url,$group); @@ -2116,13 +2303,13 @@ sub handler { } } elsif ($env{'form.action'} eq 'delete') { if ($can_delete) { - &delete($r,$url); + &delete($r,$url,$group); } else { &missing_priv($r,$url,'delete'); } } elsif ($env{'form.action'} eq 'deletedir' && $env{'form.confirmed'}) { if ($can_delete) { - &delete_dir_confirmed($r,$url); + &delete_dir_confirmed($r,$url,$group); } else { &missing_priv($r,$url,'delete'); } @@ -2142,7 +2329,7 @@ sub handler { $env{'form.selectfile'} = $env{'form.rename'}; $env{'form.action'} = 'rename'; if ($can_modify) { - &rename($r,$url); + &rename($r,$url,$group); } else { &missing_priv($r,$url,'rename'); } @@ -2167,7 +2354,7 @@ sub handler { } } elsif ($env{'form.createdir'}) { if ($can_upload) { - &createdir($r,$url); + &createdir($r,$url,$group); } else { &missing_priv($r,$url,'upload'); } @@ -2182,7 +2369,7 @@ sub handler { &Apache::lonhtmlcommon::clear_breadcrumbs(); $r->print(&coursegrp_portfolio_header($udom,$uname,$grp_desc)); } - my @dir_list=&get_dir_list($portfolio_root); + my @dir_list=&get_dir_list($portfolio_root,$current_path,$group); if ($dir_list[0] eq 'no_such_dir'){ # two main reasons for this: # 1) never been here, so directory structure not created @@ -2198,8 +2385,7 @@ sub handler { $current_path = '/'; # force it back to the root } # now grab the directory list again, for the first time - @dir_list=&Apache::lonnet::dirlist($current_path, - $udom,$uname,$portfolio_root); + @dir_list=&get_dir_list($portfolio_root,$current_path,$group); } # need to know if directory is empty so it can be removed if desired my $is_empty=(@dir_list == 2);