--- loncom/publisher/lonpubdir.pm 2005/04/07 06:56:26 1.78 +++ loncom/publisher/lonpubdir.pm 2007/04/20 01:17:24 1.102 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construction Space Directory Lister # -# $Id: lonpubdir.pm,v 1.78 2005/04/07 06:56:26 albertel Exp $ +# $Id: lonpubdir.pm,v 1.102 2007/04/20 01:17:24 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,10 +36,12 @@ use Apache::Constants qw(:common :http : use Apache::loncacc; use Apache::loncommon(); use Apache::lonhtmlcommon(); +use Apache::londiff(); use Apache::lonlocal; use Apache::lonmsg; use Apache::lonmenu; use Apache::lonnet; +use LONCAPA; sub handler { @@ -104,14 +106,14 @@ sub handler { # Start off the directory table. $r->print('

Directory Contents:

'); - $r->print(''. - ''. - ''. - ''. - ''. - ''. - ''); + $r->print('
'.&mt('Type').''.&mt('Actions').''.&mt('Name').''.&mt('Title').''.&mt('Status').''.&mt('Last Modified'). - '
'. + ''. + ''. + ''. + ''. + ''. + ''."\n"); my $filename; my $dirptr=16384; # Mask indicating a directory in stat.cmode. @@ -137,7 +139,7 @@ sub handler { } closedir(DIR); - $r->print('
'.&mt('Type').''.&mt('Actions').''.&mt('Name').''.&mt('Title').''.&mt('Status').''.&mt('Last Modified'). + '
'); + $r->print(''.&Apache::loncommon::end_page()); return OK; } # @@ -156,7 +158,7 @@ sub getEffectiveUrl { # $fn=~s/^http\:\/\/[^\/]+\///; $fn=~s/^\///; - $fn=~s/\~(\w+)/\/home\/$1\/public_html/; + $fn=~s{~($LONCAPA::username_re)}{/home/$1/public_html}; # Remove trailing / strings (?) @@ -169,7 +171,7 @@ sub getEffectiveUrl { #internal authentication, needs fixup. $fn = $r->uri(); # non users do not get the full path request # through SCRIPT_FILENAME - $fn=~s|^/~(\w+)|/home/$1/public_html|; + $fn=~s{^/~($LONCAPA::username_re)}{/home/$1/public_html}; } } $fn=~s/\/+/\//g; @@ -191,13 +193,10 @@ sub startpage { my $currdir = '/priv/'.$uname.$thisdisfn; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $html=&Apache::lonxml::xmlbegin(); - $r->print($html.'LON-CAPA Construction Space'); - my $pagetitle; my $formaction='/priv/'.$uname.$thisdisfn.'/'; - $formaction=~s/\/+/\//g; - $pagetitle .= &Apache::loncommon::help_open_menu('','','','',3,'Authoring'). + $formaction=~s|/+|/|g; + my $pagetitle .= &Apache::loncommon::help_open_menu('','',3,'Authoring'). 'Construction Space: '. '
'. @@ -208,27 +207,29 @@ sub startpage { &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction); if ($env{'environment.remote'} eq 'off') { $env{'request.noversionuri'}=$currdir.'/'; - $r->print(&Apache::loncommon::bodytag('Construction Space',undef,undef,undef,undef,undef,$pagetitle)); + $r->print(&Apache::loncommon::start_page('Construction Space',undef, + {'body_title' => + $pagetitle,})); } else { + $r->print(&Apache::loncommon::start_page('Construction Space',undef, + { 'only_body' => 1,})); $r->print($pagetitle); } + + my $esc_thisdisfn = &Apache::loncommon::escape_single($thisdisfn); my $pubdirscript=(< -top.document.title = '$thisdisfn/ - LON-CAPA Construction Space'; +top.document.title = '$esc_thisdisfn/ - LON-CAPA Construction Space'; // Store directory location for menu bar to find -parent.lastknownpriv='/~$uname$thisdisfn/'; +parent.lastknownpriv='/~$uname$esc_thisdisfn/'; // Confirmation dialogues function currdiract(theform) { if (theform.dirtask.options[theform.dirtask.selectedIndex].value == 'publish') { - document.publishdir.filename.value = theform.filename.value - pubdir(document.publishdir) - } - if (theform.dirtask.options[theform.dirtask.selectedIndex].value == 'publishsub') { - document.publishdir.filename.value = theform.filename.value - pubrecdir(document.publishdir) + document.publishdir.filename.value = theform.filename.value; + document.publishdir.submit(); } if (theform.dirtask.options[theform.dirtask.selectedIndex].value == 'editcat') { top.location=theform.filename.value+'default.meta' @@ -237,28 +238,13 @@ parent.lastknownpriv='/~$uname$thisdisfn document.printdir.postdata.value=theform.filename.value document.printdir.submit(); } - } - - function pubdir(theform) { - if (confirm('Publish complete directory?')) { - forcepub(theform) - theform.submit(); - } - } - function pubrecdir(theform) { - if (confirm('Publish directory and all subdirectories?')) { - forcepub(theform); - theform.pubrec.value='1'; - theform.submit(); + if (theform.dirtask.options[theform.dirtask.selectedIndex].value == "delete") { + var delform = document.delresource + delform.filename.value = theform.filename.value + delform.submit() } } - - function forcepub(theform) { - if (confirm('Force publication of unmodified files? - Cancel=No; OK=yes.')) { - theform.forcerepub.value="ON"; - } - } - + function checkUpload(theform) { if (theform.file == '') { alert("Please use 'Browse..' to choose a file first, before uploading") @@ -273,10 +259,7 @@ parent.lastknownpriv='/~$uname$thisdisfn return } if (theform.diraction.options[theform.diraction.selectedIndex].value == "publish") { - pubdir(theform) - } - if (theform.diraction.options[theform.diraction.selectedIndex].value == "publishsub") { - pubrecdir(theform) + theform.submit(); } if (theform.diraction.options[theform.diraction.selectedIndex].value == "editcat") { top.location=theform.filename.value+'default.meta' @@ -286,6 +269,11 @@ parent.lastknownpriv='/~$uname$thisdisfn theform.postdata.value = theform.filename.value theform.submit() } + if (theform.diraction.options[theform.diraction.selectedIndex].value == "delete") { + var delform = document.delresource + delform.filename.value = theform.filename.value + delform.submit() + } return } function SetResChoice(theform) { @@ -306,7 +294,7 @@ parent.lastknownpriv='/~$uname$thisdisfn if (activity == 'obsolete') { var pubform = document.pubresource pubform.filename.value = theform.filename.value - alert("You will be taken to the publication page.\\nCheck the 'Obsolete' checkbox at the bottom of the page, and click 'Finalize Publication'.") + pubform.makeobsolete.value=1; pubform.submit() } if (activity == 'print') { @@ -317,11 +305,16 @@ parent.lastknownpriv='/~$uname$thisdisfn document.retrieveres.filename.value = theform.filename.value document.retrieveres.submit() } + if (activity == 'cleanup') { + document.cleanup.filename.value = theform.filename.value + document.cleanup.submit() + } return } function changename(theform,activity) { - var newname=prompt('New Name'); - if (newname == "" || !newname) { + var oldname=theform.dispfilename.value; + var newname=prompt('New Name',oldname); + if (newname == "" || !newname || newname == oldname) { return } document.moveresource.newfilename.value = newname @@ -342,57 +335,89 @@ ENDPUBDIRSCRIPT sub dircontrols { my ($r,$uname,$udom,$thisdisfn) = @_; + my %lt=&Apache::lonlocal::texthash( + cnpd => 'Cannot publish directory', + cnrd => 'Cannot retrieve directory', + mcdi => 'Must create new subdirectory inside a directory', + pubr => 'Publish this Resource', + pubd => 'Publish this Directory', + dedr => 'Delete Directory', + rtrv => 'Retrieve Old Version', + list => 'List Directory', + uplo => 'Upload file', + dele => 'Delete', + edit => 'Edit Catalog Information', + sela => 'Select Action', + nfil => 'New file', + nhtm => 'New HTML file', + nprb => 'New problem', + npag => 'New assembled page', + nseq => 'New assembled sequence', + ncrf => 'New custom rights file', + nsty => 'New style file', + nlib => 'New library file', + nsub => 'New subdirectory', + renm => 'Rename current file to', + move => 'Move current file to', + copy => 'Copy current file to', + type => 'Type Name Here', + go => 'Go', + prnt => 'Print contents of directory', + crea => 'Create a new directory or LON-CAPA document', + acti => 'Actions for current directory', + updc => 'Upload a new document' + ); $r->print(< + - - - + + + - - - @@ -405,13 +430,8 @@ sub pubbuttons { $r->print(''. '
Actions for current directoryUpload a new documentCreate a new directory or LON-CAPA document$lt{'acti'}$lt{'updc'}$lt{'crea'}
+ - + + + + +
-
+
- +
+
- + - + + + + + + + + + +    - +
'. - ''. - ''. - ''. - ''. -''. +'
'); } @@ -429,9 +449,8 @@ sub resourceactions {
- - +
@@ -439,6 +458,9 @@ sub resourceactions {
+
+ +
END } @@ -495,9 +517,9 @@ sub putdirectory { %Apache::lonpublisher::metadatafields=(); %Apache::lonpublisher::metadatakeys=(); my $construct=$here; - $construct=~s:^/priv/(\w+)$:/home/$1/public_html:; + $construct=~s{^/priv/($LONCAPA::username_re)$}{/home/$1/public_html}; my $dirpath = $here; - $dirpath=~s:^/priv/:/~:; + $dirpath=~s{^/priv/}{/~}; &Apache::lonpublisher::metaeval(&Apache::lonnet::getfile( $construct.'/'.$dirname.'/default.meta' )); @@ -508,31 +530,33 @@ sub putdirectory { $actionitem = '
'. - ''. ''. ''. ''. - ''. ''. ''. + ''. ''. - ''. + ''. ''. - ''. - ''. ''. '
'; $$numdir ++; } - $r->print(''. + $r->print(''. ''. + $Apache::lonnet::perlvar{'lonIconsURL'}.'/folder_closed.gif" alt="folder" />'. ''.$actionitem.''. - ''. - $disfilename.''. - ''.($kaputt?&Apache::lonhtmlcommon::authorbombs($resdir.'/'.$disfilename.'/'):'').$Apache::lonpublisher::metadatafields{'title'}.' '. - $Apache::lonpublisher::metadatafields{'subject'}.' '. - $Apache::lonpublisher::metadatafields{'keywords'}.''. + ''. + $disfilename.''. + ''.($kaputt?&Apache::lonhtmlcommon::authorbombs($resdir.'/'.$disfilename.'/'):'').$Apache::lonpublisher::metadatafields{'title'}); + if ($Apache::lonpublisher::metadatafields{'subject'} ne '') { + $r->print(' '. + $Apache::lonpublisher::metadatafields{'subject'}. + ' '); + } + $r->print($Apache::lonpublisher::metadatafields{'keywords'}.''. ''.&Apache::lonlocal::locallocaltime($modtime).''. "\n"); } @@ -545,55 +569,87 @@ sub putresource { my ($r, $udom, $uname, $filename, $thisdisfn, $resdir, $targetdir, $linkdir, $cmtime,$bombs,$numres) = @_; + &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename); my $pubstatus = 'unpublished'; my $status=&mt('Unpublished'); - my $bgcolor='#FFAA99'; + my $css_class='LC_browser_file'; my $title=' '; my $publish_button=&mt('Publish'); + my $cstr_dir = '/home/'.$uname.'/public_html/'.$thisdisfn.'/'; # my $action_buttons= # '
'. # &mt('Delete').''; if (-e $resdir.'/'.$filename) { + my $same=0; my ($rdev,$rino,$rmode,$rnlink, $ruid,$rgid,$rrdev,$rsize, $ratime,$rmtime,$rctime, $rblksize,$rblocks)=stat($resdir.'/'.$filename); + if ($rmtime>=$cmtime) { + $same=1; + } else { + if (&Apache::londiff::are_different_files($resdir.'/'.$filename, + $cstr_dir.'/'.$filename)) { + $same=0; + } else { + $same=1; + } + } + my $meta_cmtime = (stat($cstr_dir.'/'.$filename.'.meta'))[9]; + my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9]; + my $meta_same = 1; + if ($meta_rmtime < $meta_cmtime + && &Apache::londiff::are_different_files($resdir.'/'.$filename.'.meta', + $cstr_dir.'/'.$filename.'.meta')) { + $meta_same = 0; + } $publish_button=&mt('Re-publish'); - if ($rmtime>=$cmtime) { - $pubstatus = 'published'; - $status=&mt('Published').'
'. - &mt(&getCopyRightString($targetdir.'/'.$filename)).' '. - &mt(&getSourceRightString($targetdir.'/'.$filename)); - $bgcolor='#CCFF88'; + my $rights_status = + &mt(&getCopyRightString($targetdir.'/'.$filename)).' '. + &mt(&getSourceRightString($targetdir.'/'.$filename)); + $title = ''. + &getTitleString($targetdir.'/'.$filename).''; + if ($same) { if (&Apache::lonnet::metadata($targetdir.'/'.$filename,'obsolete')) { $pubstatus = 'obsolete'; $status=&mt('Obsolete'); - $bgcolor='#AAAAAA'; - } + } else { + if (!$meta_same) { + $pubstatus = 'metamodified'; + } else { + $pubstatus = 'published'; + } + $status=&mt('Published'). + '
'. $rights_status; + } # } else { # $action_buttons=''; # } - $title=''. - &getTitleString($targetdir.'/'.$filename).''; } else { $pubstatus = 'modified'; - $status=&mt('Modified').'
'. - &mt(&getCopyRightString($targetdir.'/'.$filename)).' '. - &mt(&getSourceRightString($targetdir.'/'.$filename)); - $bgcolor='#FFFF77'; + $status=&mt('Modified'). + '
'. $rights_status; # $action_buttons=''; - $title=''. - &getTitleString($targetdir.'/'.$filename).''; if (&Apache::loncommon::fileembstyle(($filename=~/\.(\w+)$/)) eq 'ssi') { $status.='
'.&mt('Diffs').''; } - } + } + $title.="\n".'
'. - ($$bombs{$targetdir.'/'.$filename}?'':'Edit Metadata').''; + ($$bombs{$targetdir.'/'.$filename}?'bomb':'Edit Metadata').''; + + if (!$meta_same) { + $title = &mt('Metadata Modified').'
'.$title. + '
'.&mt('Metadata Diffs').''; + $title.="\n".'
'.&mt('Retrieve Metadata').''; + } $status.="\n".'
'.&mt('Retrieve').''; } @@ -606,19 +662,23 @@ sub putresource { $editlink=' ('.&mt('EditXML').')'; $editlink2='
('.&mt('Edit').')'; } + if ($filename=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm|sty)$/) { + $editlink.=' ('.&mt('Clean Up').')'; + } if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) { $editlink=' ('.&mt('Decompress').')'; } my $pub_select = ''; &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres); - $r->print(''. + $r->print(''. ''.($filename=~/[\#\~]$/?' ': - ''). + '').''. ''.$pub_select.''. - ''. + ' '. ''. - $filename.''.$editlink2.$editlink. + $filename.''.$editlink2.$editlink. ''. ''.$title.''. ''.$status.''. @@ -631,7 +691,7 @@ sub create_pubselect { my ($r,$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres) = @_; $$pub_select = '
- '. ''; if ($pubstatus eq 'obsolete' || $pubstatus eq 'unpublished') { @@ -651,10 +711,13 @@ sub create_pubselect { } $$pub_select .= ' '. +''. ''. '
'; + &HTML::Entities::encode($uname.$thisdisfn.'/'.$filename,'<>&"').'" /> + '; $$numres ++; }