--- loncom/interface/portfolio.pm 2010/02/02 07:09:41 1.212.2.3 +++ loncom/interface/portfolio.pm 2019/08/07 16:08:04 1.260 @@ -1,7 +1,7 @@ # The LearningOnline Network # portfolio browser # -# $Id: portfolio.pm,v 1.212.2.3 2010/02/02 07:09:41 raeburn Exp $ +# $Id: portfolio.pm,v 1.260 2019/08/07 16:08:04 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,7 +38,7 @@ use Apache::lonnet; use Apache::longroup; use Apache::lonhtmlcommon; use HTML::Entities; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); sub group_args { my $output; @@ -63,7 +63,7 @@ sub group_form_data { return $output; } -# receives a file name and path stub from username/userfiles/portfolio/ +# receives a filename and path stub from username/userfiles/portfolio/ # returns an anchor tag consisting encoding filename and currentpath sub make_anchor { my ($url, $anchor_fields, $inner_text) = @_; @@ -88,40 +88,44 @@ sub display_common { my $iconpath= $r->dir_config('lonIconsURL') . "/"; my %lt=&Apache::lonlocal::texthash( - 'upload' => 'Upload', - 'upload_label' => 'Upload file to current directory', - 'createdir' => 'Create Subdirectory', - 'createdir_label' => - 'Create subdirectory in current directory', - 'parse' => 'If HTML file, upload embedded images/multimedia/css/linked files' - ); + 'upload' => 'Upload', + 'upload_label' => 'Upload file to current directory', + 'createdir' => 'Create Subdirectory', + 'createdir_label' => 'Create subdirectory in current directory', + 'parse' => 'Upload embedded images/multimedia/css/linked files if HTML file', + ); 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'); my $help_portfolio = &Apache::loncommon::help_open_topic('Portfolio About', &mt('Help on the portfolio')); - $r->print(&display_usage($group)); + $r->print(&display_portfolio_usage($group,$help_portfolio)); my $parse_check; if (!&suppress_embed_prompt()) { $parse_check = <<"END";
- END } - $r->print('
'.$help_portfolio); + # Find space available before uploading + my $free_space = &free_space($group); + # Upload File $r->print('
' .'
' .'
' .''.$lt{'upload_label'}.'' .$groupitem - .'' + .'' + .'' .'' .'' + .'' .'' .'' .'' @@ -139,6 +143,7 @@ END .''.$groupitem .'' .'' + .'' .'' .'' .'' @@ -147,7 +152,6 @@ END .'' .'
' ); - $r->print('
'); } # end "if can_upload" my @tree = split (/\//,$current_path); @@ -155,6 +159,7 @@ END 'selectfile' => $port_path, 'currentpath' => '/', 'mode' => $env{"form.mode"}, + 'symb' => $env{"form.symb"}, 'fieldname' => $env{"form.fieldname"}, 'continue' => $env{"form.continue"} ); @@ -168,6 +173,7 @@ END 'selectfile' => $tree[$i], 'currentpath' => $newCurrentPath, 'mode' => $env{"form.mode"}, + 'symb' => $env{"form.symb"}, 'fieldname' => $env{"form.fieldname"}, 'continue' => $env{"form.continue"} ); @@ -177,53 +183,29 @@ END $r->print(''); $r->print(&Apache::loncommon::help_open_topic('Portfolio ChangeDirectory')); &Apache::lonhtmlcommon::store_recent($namespace,$current_path,$current_path); - $r->print('
print('">'. &Apache::lonhtmlcommon::select_recent($namespace,'currentpath', 'this.form.submit();')); $r->print("
"); } -sub display_usage { - my ($group) = @_; +sub display_portfolio_usage { + my ($group,$helpitem) = @_; my $disk_quota = &get_quota($group); my $getpropath = 1; my $portfolio_root = &get_portfolio_root(); my ($uname,$udom) = &get_name_dom($group); my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$portfolio_root,$getpropath); - my $usage = $current_disk_usage/1000; - my $quota = $disk_quota/1000; - my $percent; - if ($disk_quota == 0) { - $percent = 100.0; - } else { - $percent = 100*($current_disk_usage/$disk_quota); - } - $usage = sprintf("%.2f",$usage); - $quota = sprintf("%.2f",$quota); - $percent = sprintf("%.0f",$percent); - my ($color,$cssclass); - if ($percent <= 60) { - $color = '#00A000'; - } elsif ($percent > 60 && $percent < 90) { - $color = '#FFD300'; - $cssclass = 'class="LC_warning"'; - } elsif( $percent >= 90) { - $color = '#FF0000'; - $cssclass = 'class="LC_error"'; - } - my $prog_width = $percent; - if ($prog_width > 100) { - $prog_width = 100; - } - my $disk_meter = ' -
'.&mt('Currently using [_1] of the [_2] available.',$usage.' MB ('.$percent.'%)',$quota.' MB')."\n". -'
'."\n". -'
'."\n". -'
'."\n". -'
'; - return $disk_meter; + return &Apache::loncommon::head_subbox( + '
' + .$helpitem + .'
' + .'
' + .&Apache::lonhtmlcommon::display_usage($current_disk_usage, + $disk_quota,'portfolio') + .'
'); } sub display_directory_line { @@ -236,7 +218,7 @@ sub display_directory_line { $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(''); + $r->print(''); $r->print(''.$version_flag.''); } else { # this is a graded or handed back file my ($user,$domain) = &get_name_dom($env{'form.group'}); @@ -255,7 +237,7 @@ sub display_directory_line { if ($lock_info) { my %anchor_fields = ('lockinfo' => $fullpath); if ($versions) { # hold the folder open - my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($fullpath); + my ($fname,$version,$extension) = &Apache::lonnet::file_name_version_ext($fullpath); $fname =~ s|^/||; $anchor_fields{'showversions'} = $fname.'.'.$extension; } @@ -287,7 +269,6 @@ sub display_directory { my ($r,$url,$current_path,$is_empty,$dir_list,$group,$can_upload, $can_modify,$can_delete,$can_setacl)=@_; my $iconpath= $r->dir_config('lonIconsURL') . "/"; - my $display_out; my $select_mode; my $checked_files; my $port_path = &get_port_path(); @@ -304,30 +285,17 @@ sub display_directory { my %access_controls = &Apache::lonnet::get_access_controls($current_permissions,$group); my $now = time; if ($env{"form.mode"} eq 'selectfile') { - &select_files($r); - $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'}); - $select_mode = 'true'; - } - if ($is_empty && ($current_path ne '/') && $can_delete) { - $display_out = '
'. - &group_form_data(). - ''. - '

'. - ''. - '

'. - ''. - ''. - '
'; - - $r->print($display_out); - return; + &select_files($r,$dir_list); + $checked_files =&Apache::lonnet::files_in_path($uname,$env{'form.currentpath'}); + $select_mode = 'true'; } if ($select_mode eq 'true') { $r->print('
'); $r->print(&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() .''.&mt('Select').'' - .'  ' + .' ' + .' ' .''.&mt('Name').'' .''.&mt('Size').'' .''.&mt('Last Modified').'' @@ -336,12 +304,18 @@ sub display_directory { ); } else { $r->print(''); - $r->print(&Apache::loncommon::help_open_topic('Portfolio FileList', - &mt('Using the portfolio file list'))); + $r->print( + '

' + .&Apache::loncommon::help_open_topic( + 'Portfolio FileList', + &mt('Using the portfolio file list')) + .'

' + ); $r->print(&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() .''.&mt('Actions'). &Apache::loncommon::help_open_topic('Portfolio FileAction').'' - .'  ' + .' ' + .' ' .''.&mt('Name').&Apache::loncommon::help_open_topic('Portfolio OpenFile').'' .''.&mt('Size').'' .''.&mt('Last Modified').'' @@ -349,32 +323,67 @@ sub display_directory { .''.&mt('Current Access Status').&Apache::loncommon::help_open_topic('Portfolio ShareFile').'' .&Apache::loncommon::end_data_table_header_row()); } + + # Empty directory? + if ($is_empty && ($current_path ne '/') && $can_delete) { + my $cols = ($select_mode eq 'true') ? 7 : 9; + # Empty message + $r->print( + &Apache::loncommon::start_data_table_row() + .'' + .'

' + .&mt('This directory is empty.') + .'

' + .'' + .&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table() + .'
' + ); + # Delete button + $r->print( + '
'. + &group_form_data(). + ''. + '

'. + ''. + '

'. + ''. + ''. + '
' + ); + # Directory is empty, so nothing else to display + return; + } + $r->print("\n".&group_form_data()."\n"); my $href_location="/uploaded/$udom/$uname/$port_path".$current_path; my $href_edit_location="/editupload/$udom/$uname/$port_path".$current_path; my @dir_lines; my %versioned; - foreach my $dir_line (sort - { - my ($afile)=split('&',$a,2); - my ($bfile)=split('&',$b,2); - return (lc($afile) cmp lc($bfile)); - } (@$dir_list)) { - 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); - if ($version) { - my $fullpath = &prepend_group($current_path.$fname.'.'.$extension); - push(@{ $versioned{$fullpath} }, - [$filename,$dom,$testdir,$size,$mtime,$obs,]); - } else { - push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]); - } + if (ref($dir_list) eq 'ARRAY') { + foreach my $dir_line (sort + { + my ($afile)=split('&',$a,2); + my ($bfile)=split('&',$b,2); + return (lc($afile) cmp lc($bfile)); + } (@{$dir_list})) { + 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::lonnet::file_name_version_ext($filename); + if ($version) { + my $fullpath = &prepend_group($current_path.$fname.'.'.$extension); + push(@{ $versioned{$fullpath} }, + [$filename,$dom,$testdir,$size,$mtime,$obs,]); + } else { + push(@dir_lines, [$filename,$dom,$testdir,$size,$mtime,$obs]); + } + } } + my $zerobyte; foreach my $dir_line (@dir_lines) { my ($filename,$dom,$testdir,$size,$mtime,$obs) = @$dir_line; - my ($fname,$version,$extension) = &Apache::grades::file_name_version_ext($filename); + my ($fname,$version,$extension) = &Apache::lonnet::file_name_version_ext($filename); if (($filename ne '.') && ($filename ne '..') && ($filename !~ /\.meta$/ ) && ($filename !~ /(.*)\.(\d+)\.([^\.]*)$/)) { my $version_flag; my $show_versions; @@ -414,12 +423,13 @@ sub display_directory { $colspan_fill=' colspan="4"'; } $r->print(''); - $r->print(''.&mt('closed folder').'' + $r->print(''.&mt('closed folder').'' .''.&mt('Go to ...').''); my %anchor_fields = ( 'selectfile' => $filename.'/', 'currentpath' => $current_path.$filename.'/', 'mode' => $env{"form.mode"}, + 'symb' => $env{"form.symb"}, 'fieldname' => $env{"form.fieldname"}, 'continue' => $env{"form.continue"} ); @@ -431,11 +441,16 @@ sub display_directory { my $css_class = 'LC_browser_file'; my $line; if ($select_mode eq 'true') { - $line=' 0) { + $line='print(&Apache::loncommon::end_data_table().' + $r->print(&Apache::loncommon::end_data_table()); + if ($zerobyte) { + $r->print('

'.&mt('[quant,_1,file] in list not selectable as file size is 0 bytes.',$zerobyte).'

'); + } + $r->print(' +


- +

'); @@ -597,17 +617,19 @@ sub display_file { } sub done { - my ($message,$url)=@_; - unless (defined $message) { - $message='Done'; + my ($linktext,$url)=@_; + unless (defined($linktext)) { + $linktext='Return to directory'; } my %anchor_fields = ( 'showversions' => $env{'form.showversions'}, 'currentpath' => $env{'form.currentpath'}, 'fieldname' => $env{'form.fieldname'}, + 'symb' => $env{'form.symb'}, 'mode' => $env{'form.mode'} ); - my $result = '

'.&make_anchor($url,\%anchor_fields,&mt($message)).'

'; + my $result = &Apache::lonhtmlcommon::actionbox( + [&make_anchor($url,\%anchor_fields,&mt($linktext))]); return $result; } @@ -619,15 +641,19 @@ sub delete { my @files=&Apache::loncommon::get_env_multiple('form.selectfile'); my ($uname,$udom) = &get_name_dom($group); if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { - $r->print(&mt('The file is locked and cannot be deleted.').'
'); - $r->print(&done('Back',$url)); + $r->print( + '

' + .&mt('The file is locked and cannot be deleted.') + .'

' + .&done(undef,$url) + ); } else { if (scalar(@files)) { &open_form($r,$url); $r->print('

'.&mt('Delete [_1]?',&display_file(undef,\@files)).'

'); &close_form($r,$url); } else { - $r->print("No file was checked to delete.
"); + $r->print('

'.&mt('No file was checked to delete.').'

'); $r->print(&done(undef,$url)); } } @@ -641,18 +667,21 @@ sub delete_confirmed { my $port_path = &get_port_path(); my $current_permissions = &Apache::lonnet::get_portfile_permissions($udom, $uname); + my @msg; foreach my $delete_file (@files) { - $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path. - $env{'form.currentpath'}. - $delete_file); + $result = + &Apache::lonnet::removeuserfile( + $uname,$udom,$port_path. + $env{'form.currentpath'}. + $delete_file); if ($result ne 'ok') { - $r->print('' - .&mt('An error occurred ([_1]) while trying to delete [_2].' - ,$result,&display_file(undef, $delete_file)) - .'

'); - } else { - $r->print(&mt('File: [_1] deleted.', - &display_file(undef,$delete_file))); + push(@msg, &Apache::lonhtmlcommon::confirm_success( + &mt('An error occurred ([_1]) while trying to delete [_2].' + ,$result,&display_file(undef, $delete_file)),1)); + } else { + push(@msg, &Apache::lonhtmlcommon::confirm_success( + &mt('File: [_1] deleted.' + ,&display_file(undef,$delete_file)))); my $file_name = $env{'form.currentpath'}.$delete_file; $file_name = &prepend_group($file_name); my %access_controls = @@ -668,23 +697,24 @@ sub delete_confirmed { &Apache::lonnet::modify_access_controls($file_name,\%changes, $udom,$uname); if ($outcome ne 'ok') { - $r->print('
'.&mt("An error occurred ([_1]) while ". - "trying to delete access controls for the file.",$outcome). - '

'); + push(@msg, &Apache::lonhtmlcommon::confirm_success( + &mt('An error occurred ([_1]) while '. + 'trying to delete access controls for the file.',$outcome),1)); } else { if ($deloutcome eq 'ok') { - $r->print('
'.&mt('Access controls also deleted for the file.').'

'); + push(@msg, &mt('Access controls also deleted for the file.')); # FIXME: Does the user really need this message? } else { - $r->print(''.'
'. - &mt("An error occurred ([_1]) while ". - "trying to delete access controls for the file.",$deloutcome). - '


'); + push(@msg, &Apache::lonhtmlcommon::confirm_success( + &mt('An error occurred ([_1]) while '. + 'trying to delete access controls for the file.' + ,$deloutcome),1)); } } } } } } + $r->print(&Apache::loncommon::confirmwrapper(join('
',@msg))); $r->print(&done(undef,$url)); } @@ -704,12 +734,15 @@ sub delete_dir_confirmed { my $port_path = &get_port_path(); my $result=&Apache::lonnet::removeuserfile($uname,$udom,$port_path. $directory_name); - + if ($result ne 'ok') { - $r->print('' - .&mt('An error occurred (dir) ([_1]) while trying to delete [_2].' - ,$result,$directory_name) - .'
'); + $r->print( + &Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('An error occurred (dir) ([_1]) while trying to delete [_2].' + ,$result,$directory_name),1))); + $r->print(&done(undef,$url)); + return; } else { # now remove from recent &Apache::lonhtmlcommon::remove_recent($namespace,[$directory_name.'/']); @@ -720,6 +753,10 @@ sub delete_dir_confirmed { } $env{'form.currentpath'} = $directory_name; } + $r->print( + &Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('Directory successfully deleted')))); $r->print(&done(undef,$url)); } @@ -729,7 +766,11 @@ sub rename { 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.
"); + $r->print( + '

' + .&mt('The file is locked and cannot be renamed.') + .'

' + ); $r->print(&done(undef,$url)); } else { &open_form($r,$url); @@ -744,13 +785,32 @@ sub rename_confirmed { my $filenewname=&Apache::lonnet::clean_filename($env{'form.filenewname'}); my ($uname,$udom) = &get_name_dom($group); my $port_path = &get_port_path(); + + # Display warning in case of filename cleaning has changed the filename + if ($filenewname ne $env{'form.filenewname'}) { + $r->print( + '

' + .&mt('Invalid characters') + .'
' + .&mt('The new filename was changed from [_1] to [_2].' + ,''.&display_file('',$env{'form.filenewname'}).'' + ,''.&display_file('',$filenewname).'') + .'

' + ); + + } + + # Filename empty? if ($filenewname eq '') { - $r->print(''. - &mt("Error: no valid filename was provided to rename to."). - '
'); - $r->print(&done(undef,$url)); - return; + $r->print( + &Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('Error: no valid filename was provided to rename to.'),1))); + $r->print(&done(undef,$url)); + return; } + + # Rename the file my $chg_access; my $result= &Apache::lonnet::renameuserfile($uname,$udom, @@ -759,18 +819,20 @@ sub rename_confirmed { if ($result eq 'ok') { $chg_access = &access_for_renamed($filenewname,$group,$udom,$uname); } else { - $r->print(''. - &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].' - ,$result,&display_file(),&display_file('',$filenewname)) - .'
'); + $r->print( + &Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('An error occurred ([_1]) while trying to rename [_2] to [_3].' + ,$result,&display_file(),&display_file('',$filenewname)) + ,1))); + $r->print(&done(undef,$url)); return; } - if ($filenewname ne $env{'form.filenewname'}) { - $r->print(&mt("The new file name was changed from:
[_1] to [_2]", - ''.&display_file('',$env{'form.filenewname'}).'', - ''.&display_file('',$filenewname).'')); - } $r->print($chg_access); + $r->print( + &Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success( + &mt('File successfully renamed')))); $r->print(&done(undef,$url)); } @@ -835,7 +897,13 @@ sub display_access { my $aclcount = keys(%access_controls); my ($header,$info); if ($action eq 'chgaccess') { - $header = '

'.&mt('Allowing others to retrieve file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'

'; + $header = + '

' + .&mt('Allowing others to retrieve file: [_1]' + ,'' + .$port_path.$env{'form.currentpath'}.$env{'form.access'} + .'') + .'

'; $info .= &mt('Access to this file by others can be set to be one or more of the following types: public, passphrase-protected or conditional.'); $info .= '