--- loncom/publisher/lonpublisher.pm 2013/12/01 21:29:15 1.287 +++ loncom/publisher/lonpublisher.pm 2024/12/30 17:13:26 1.295.2.4 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Publication Handler # -# $Id: lonpublisher.pm,v 1.287 2013/12/01 21:29:15 raeburn Exp $ +# $Id: lonpublisher.pm,v 1.295.2.4 2024/12/30 17:13:26 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -200,12 +200,12 @@ sub metaeval { if (defined($token->[2]->{'name'})) { $unikey.="\0".$token->[2]->{'name'}; } - foreach (@{$token->[3]}) { - $metadatafields{$unikey.'.'.$_}=$token->[2]->{$_}; + foreach my $item (@{$token->[3]}) { + $metadatafields{$unikey.'.'.$item}=$token->[2]->{$item}; if ($metadatakeys{$unikey}) { - $metadatakeys{$unikey}.=','.$_; + $metadatakeys{$unikey}.=','.$item; } else { - $metadatakeys{$unikey}=$_; + $metadatakeys{$unikey}=$item; } } my $newentry=$parser->get_text('/'.$entry); @@ -293,8 +293,8 @@ sub coursedependencies { my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain, $aauthor,$regexp); my %courses=(); - foreach (keys %evaldata) { - if ($_=~/^([a-zA-Z0-9]+_[a-zA-Z0-9]+)___.+___course$/) { + foreach my $item (keys(%evaldata)) { + if ($item=~/^([a-zA-Z0-9]+_[a-zA-Z0-9]+)___.+___course$/) { $courses{$1}=1; } } @@ -318,8 +318,12 @@ string which presents the form field (fo =item B<textfield> +=item B<text_with_browse_field> + =item B<hiddenfield> +=item B<checkbox> + =item B<selectbox> =back @@ -367,7 +371,7 @@ sub hiddenfield { sub checkbox { my ($name,$text)=@_; - return "\n<br /><label><input type='checkbox' name='$name' /> ". + return "\n<label><input type='checkbox' name='$name' /> ". &mt($text)."</label>"; } @@ -382,12 +386,12 @@ sub selectbox { } my $selout="\n".&Apache::lonhtmlcommon::row_title($title) .'<select name="'.$name.'">'; - foreach (@idlist) { - $selout.='<option value="'.$_.'"'; - if ($_ eq $value) { + foreach my $id (@idlist) { + $selout.='<option value="'.$id.'"'; + if ($id eq $value) { $selout.=' selected="selected"'; } - $selout.='>'.&{$functionref}($_).'</option>'; + $selout.='>'.&{$functionref}($id).'</option>'; } $selout.='</select>'.&Apache::lonhtmlcommon::row_closure(); return $selout; @@ -399,6 +403,58 @@ sub select_level_form { if (!defined($value)) { $env{'form.'.$name}=0; } return &Apache::loncommon::select_level_form($value,$name); } + +sub common_access { + my ($name,$text,$options)=@_; + return unless (ref($options) eq 'ARRAY'); + my $formname = 'pubdirpref'; + my $chkname = 'common'.$name; + my $chkid = 'LC_'.$chkname; + my $divid = $chkid.'div'; + my $customdivid = 'LC_customfile'; + my $selname = $chkname.'select'; + my $selid = $chkid.'select'; + my $selonchange; + if ($name eq 'dist') { + $selonchange = ' onchange="showHideCustom(this,'."'$customdivid'".');"'; + } + my %lt = &Apache::lonlocal::texthash( + 'default' => 'System wide - can be used for any courses system wide', + 'domain' => 'Domain only - use limited to courses in the domain', + 'custom' => 'Customized right of use ...', + 'public' => 'Public - no authentication or authorization required for use', + 'closed' => 'Closed - XML source is closed to everyone', + 'open' => 'Open - XML source is open to people who want to use it', + 'sel' => 'Select', + ); + my $output = <<"END"; +<span class="LC_nobreak"> +<label> +<input type="checkbox" name="commonaccess" value="$name" id="$chkid" +onclick="showHideAccess(this,'$divid');" /> +$text</label></span> +<div id="$divid" style="padding:0;clear:both;margin:0;border:0;display:none"> +<select name="$selname" id="$selid" $selonchange> +<option value="" selected="selected">$lt{'sel'}</option> +END + foreach my $val (@{$options}) { + $output .= '<option value="'.$val.'">'.$lt{$val}.'</option>'."\n"; + } + $output .= ' +</select>'; + if ($name eq 'dist') { + $output .= <<"END"; +<div id="$customdivid" style="padding:0;clear:both;margin:0;border:0;display:none"> +<input type="text" name="commoncustomrights" size="60" value="" /> +<a href="javascript:openbrowser('$formname','commoncustomrights','rights');"> +$lt{'sel'}</a></div> +END + } + $output .= ' +</div> +'; +} + ######################################### ######################################### @@ -468,7 +524,7 @@ Currently undocumented ######################################### ######################################### sub set_allow { - my ($allow,$logfile,$target,$tag,$oldurl)=@_; + my ($allow,$logfile,$target,$tag,$oldurl,$type)=@_; my $newurl=&urlfixup($oldurl,$target); my $return_url=$oldurl; print $logfile 'GUYURL: '.$tag.':'.$oldurl.' - '.$newurl."\n"; @@ -480,6 +536,11 @@ sub set_allow { ($newurl !~ /^mailto:/i) && ($newurl !~ /^(?:http|https|ftp):/i) && ($newurl !~ /^\#/)) { + if (($type eq 'src') || ($type eq 'href')) { + if ($newurl =~ /^([^?]+)\?[^?]*$/) { + $newurl = $1; + } + } $$allow{&absoluteurl($newurl,$target)}=1; } return $return_url; @@ -721,9 +782,11 @@ sub fix_ids_and_indices { foreach my $type ('src','href','background','bgimg') { foreach my $key (keys(%parms)) { if ($key =~ /^$type$/i) { + next if (($lctag eq 'img') && ($type eq 'src') && + ($parms{$key} =~ m{^data\:image/gif;base64,})); $parms{$key}=&set_allow(\%allow,$logfile, $target,$tag, - $parms{$key}); + $parms{$key},$type); } } } @@ -780,12 +843,12 @@ sub fix_ids_and_indices { } my $newparmstring=''; my $endtag=''; - foreach (keys %parms) { - if ($_ eq '/') { + foreach my $parkey (keys(%parms)) { + if ($parkey eq '/') { $endtag=' /'; } else { - my $quote=($parms{$_}=~/\"/?"'":'"'); - $newparmstring.=' '.$_.'='.$quote.$parms{$_}.$quote; + my $quote=($parms{$parkey}=~/\"/?"'":'"'); + $newparmstring.=' '.$parkey.'='.$quote.$parms{$parkey}.$quote; } } if (!$endtag) { if ($token->[4]=~m:/>$:) { $endtag=' /'; }; } @@ -818,6 +881,14 @@ sub fix_ids_and_indices { # my $spritesheet = $1.'express_show/spritesheet.png'; $allow{&absoluteurl($spritesheet,$target)}=1; + +# +# Camtasia 8.4: skins/express_show/spritesheet.min.css needed, and included in zip archive. +# Not referenced directly in <main>.html or <main>_player.html files, +# so add this file to %allow (where <main> is name user gave to file/archive). +# + my $spritecss = $1.'express_show/spritesheet.min.css'; + $allow{&absoluteurl($spritecss,$target)}=1; } } elsif ($srctype eq 'PosterImageSrc') { if ($url =~ m{^(.+)_First_Frame\.png$}) { @@ -836,7 +907,39 @@ sub fix_ids_and_indices { } } } - $outstring .= $script + if ($script =~ m{\.addMediaSrc\((["'])((?!\1).+)\1\);}) { + my $src = $2; + if ($src) { + my $url = &urlfixup($src); + unless ($url=~m{^(?:http|https|ftp)://}) { + $allow{&absoluteurl($url,$target)}=1; + } + } + } + if ($script =~ /\(document,\s*(['"])script\1,\s*\[([^\]]+)\]\);/s) { + my $scriptslist = $2; + my @srcs = split(/\s*,\s*/,$scriptslist); + foreach my $src (@srcs) { + if ($src =~ /(["'])(?:(?!\1).)+\.js\1/) { + my $quote = $1; + my ($url) = ($src =~ m/\Q$quote\E([^$quote]+)\Q$quote\E/); + $url = &urlfixup($url); + unless ($url=~m{^(?:http|https|ftp)://}) { + $allow{&absoluteurl($url,$target)}=1; + } + } + } + } + if ($script =~ m{loadScript\(\s*(['"])((?:(?!\1).)+\.js)\1,\s*function}is) { + my $src = $2; + if ($src) { + my $url = &urlfixup($src); + unless ($url=~m{^(?:http|https|ftp)://}) { + $allow{&absoluteurl($url,$target)}=1; + } + } + } + $outstring .= $script; } } } elsif ($token->[0] eq 'E') { @@ -1150,9 +1253,9 @@ sub publish { # ------------------- Clear out parameters and stores (there should not be any) - foreach (keys %metadatafields) { - if (($_=~/^parameter/) || ($_=~/^stores/)) { - delete $metadatafields{$_}; + foreach my $field (keys(%metadatafields)) { + if (($field=~/^parameter/) || ($field=~/^stores/)) { + delete $metadatafields{$field}; } } @@ -1161,23 +1264,21 @@ sub publish { $scrout.=&metaread($logfile,$source.'.meta'); - foreach (keys %metadatafields) { - if (($_=~/^parameter/) || ($_=~/^stores/)) { - $oldparmstores{$_}=1; - delete $metadatafields{$_}; + foreach my $field (keys(%metadatafields)) { + if (($field=~/^parameter/) || ($field=~/^stores/)) { + $oldparmstores{$field}=1; + delete $metadatafields{$field}; } } # ------------------------------------------------------------- Save some stuff my %savemeta=(); - foreach ('title') { - if ($metadatafields{$_}) { $savemeta{$_}=$metadatafields{$_}; } - } + if ($metadatafields{'title'}) { $savemeta{'title'}=$metadatafields{'title'}; } # ------------------------------------------ See if anything new in file itself $allmeta=&parseformeta($source,$style); # ----------------------------------------------------------- Restore the stuff - foreach (keys %savemeta) { - $metadatafields{$_}=$savemeta{$_}; + foreach my $item (keys(%savemeta)) { + $metadatafields{$item}=$savemeta{$item}; } } @@ -1185,11 +1286,11 @@ sub publish { # ---------------- Find and document discrepancies in the parameters and stores my $chparms=''; - foreach (sort keys %metadatafields) { - if (($_=~/^parameter/) || ($_=~/^stores/)) { - unless ($_=~/\.\w+$/) { - unless ($oldparmstores{$_}) { - my $disp_key = $_; + foreach my $field (sort(keys(%metadatafields))) { + if (($field=~/^parameter/) || ($field=~/^stores/)) { + unless ($field=~/\.\w+$/) { + unless ($oldparmstores{$field}) { + my $disp_key = $field; $disp_key =~ tr/\0/_/; print $logfile ('New: '.$disp_key."\n"); $chparms .= $disp_key.' '; @@ -1203,11 +1304,11 @@ sub publish { } $chparms=''; - foreach (sort keys %oldparmstores) { - if (($_=~/^parameter/) || ($_=~/^stores/)) { - unless (($metadatafields{$_.'.name'}) || - ($metadatafields{$_.'.package'}) || ($_=~/\.\w+$/)) { - my $disp_key = $_; + foreach my $olditem (sort(keys(%oldparmstores))) { + if (($olditem=~/^parameter/) || ($olditem=~/^stores/)) { + unless (($metadatafields{$olditem.'.name'}) || + ($metadatafields{$olditem.'.package'}) || ($olditem=~/\.\w+$/)) { + my $disp_key = $olditem; $disp_key =~ tr/\0/_/; print $logfile ('Obsolete: '.$disp_key."\n"); $chparms.=$disp_key.' '; @@ -1284,7 +1385,7 @@ sub publish { &hiddenfield('phase','two'). &hiddenfield('filename',$env{'form.filename'}). &hiddenfield('allmeta',&escape($allmeta)). - &hiddenfield('dependencies',join(',',keys %allow)); + &hiddenfield('dependencies',join(',',keys(%allow))); unless ($env{'form.makeobsolete'}) { $intr_scrout.= &textfield('Title','title',$metadatafields{'title'}). @@ -1529,6 +1630,8 @@ Returns: 0: fail 1: success +=back + =cut #'stupid emacs @@ -1582,7 +1685,33 @@ sub phasetwo { %metadatakeys=(); &metaeval(&unescape($env{'form.allmeta'})); - + + if ($batch) { + my %commonaccess; + map { $commonaccess{$_} = 1; } &Apache::loncommon::get_env_multiple('form.commonaccess'); + if ($commonaccess{'dist'}) { + unless ($style eq 'prv') { + if ($env{'form.commondistselect'} eq 'custom') { + unless ($source =~ /\.rights$/) { + if ($env{'form.commoncustomrights'} =~ m{^/res/.+\.rights$}) { + $env{'form.customdistributionfile'} = $env{'form.commoncustomrights'}; + $env{'form.copyright'} = $env{'form.commondistselect'}; + } + } + } elsif ($env{'form.commondistselect'} =~ /^default|domain|public$/) { + $env{'form.copyright'} = $env{'form.commondistselect'}; + } + } + } + unless ($style eq 'prv') { + if ($commonaccess{'source'}) { + if (($env{'form.commonsourceselect'} eq 'open') || ($env{'form.commonsourceselect'} eq 'closed')) { + $env{'form.sourceavail'} = $env{'form.commonsourceselect'}; + } + } + } + } + $metadatafields{'title'}=$env{'form.title'}; $metadatafields{'author'}=$env{'form.author'}; $metadatafields{'subject'}=$env{'form.subject'}; @@ -1643,17 +1772,17 @@ sub phasetwo { '</span>'); return 0; } - foreach (sort keys %metadatafields) { - unless ($_=~/\./) { - my $unikey=$_; + foreach my $field (sort(keys(%metadatafields))) { + unless ($field=~/\./) { + my $unikey=$field; $unikey=~/^([A-Za-z]+)/; my $tag=$1; $tag=~tr/A-Z/a-z/; print $mfh "\n\<$tag"; - foreach (split(/\,/,$metadatakeys{$unikey})) { - my $value=$metadatafields{$unikey.'.'.$_}; + foreach my $item (split(/\,/,$metadatakeys{$unikey})) { + my $value=$metadatafields{$unikey.'.'.$item}; $value=~s/\"/\'\'/g; - print $mfh ' '.$_.'="'.$value.'"'; + print $mfh ' '.$item.'="'.$value.'"'; } print $mfh '>'. &HTML::Entities::encode($metadatafields{$unikey},'<>&"') @@ -1795,11 +1924,7 @@ sub phasetwo { # ------------------------------------------------------------- Trigger updates push(@{$modified_urls},[$target,$source]); - unless ($registered_cleanup) { - my $handlers = $r->get_handlers('PerlCleanupHandler'); - $r->set_handlers('PerlCleanupHandler' => [\¬ify,@{$handlers}]); - $registered_cleanup=1; - } + ¬ify_in_cleanup($r); # ---------------------------------------------------------- Clear local caches my $thisdistarget=$target; @@ -1835,39 +1960,51 @@ sub phasetwo { return 1; } +sub notify_in_cleanup { + my ($r) = @_; + unless ($registered_cleanup) { + my $handlers = $r->get_handlers('PerlCleanupHandler'); + $r->set_handlers('PerlCleanupHandler' => [\¬ify,@{$handlers}]); + $registered_cleanup=1; + } +} + # =============================================================== Notifications sub notify { # --------------------------------------------------- Send update notifications - foreach my $targetsource (@{$modified_urls}){ - my ($target,$source)=@{$targetsource}; - my $logfile=Apache::File->new('>>'.$source.'.log'); - print $logfile "\nCleanup phase: Notifications\n"; - my @subscribed=&get_subscribed_hosts($target); - foreach my $subhost (@subscribed) { - print $logfile "\nNotifying host ".$subhost.':'; - my $reply=&Apache::lonnet::critical('update:'.$target,$subhost); - print $logfile $reply; - } + if (ref($modified_urls) eq 'ARRAY') { + foreach my $targetsource (@{$modified_urls}){ + my ($target,$source)=@{$targetsource}; + my $logfile=Apache::File->new('>>'.$source.'.log'); + print $logfile "\nCleanup phase: Notifications\n"; + my @subscribed=&get_subscribed_hosts($target); + foreach my $subhost (@subscribed) { + print $logfile "\nNotifying host ".$subhost.':'; + my $reply=&Apache::lonnet::critical('update:'.$target,$subhost); + print $logfile $reply; + } # ---------------------------------------- Send update notifications, meta only - my @subscribedmeta=&get_subscribed_hosts("$target.meta"); - foreach my $subhost (@subscribedmeta) { - print $logfile "\nNotifying host for metadata only ".$subhost.':'; - my $reply=&Apache::lonnet::critical('update:'.$target.'.meta', - $subhost); - print $logfile $reply; - } + my @subscribedmeta=&get_subscribed_hosts("$target.meta"); + foreach my $subhost (@subscribedmeta) { + print $logfile "\nNotifying host for metadata only ".$subhost.':'; + my $reply=&Apache::lonnet::critical('update:'.$target.'.meta', + $subhost); + print $logfile $reply; + } # --------------------------------------------------- Notify subscribed courses - my %courses=&coursedependencies($target); - my $now=time; - foreach (keys %courses) { - print $logfile "\nNotifying course ".$_.':'; - my ($cdom,$cname)=split(/\_/,$_); - my $reply=&Apache::lonnet::cput - ('versionupdate',{$target => $now},$cdom,$cname); - print $logfile $reply; - } - print $logfile "\n============ Done ============\n"; - $logfile->close(); + my %courses=&coursedependencies($target); + my $now=time; + foreach my $course (keys(%courses)) { + print $logfile "\nNotifying course ".$course.':'; + my ($cdom,$cname)=split(/\_/,$course); + my $reply=&Apache::lonnet::cput + ('versionupdate',{$target => $now},$cdom,$cname); + print $logfile $reply; + } + print $logfile "\n============ Done ============\n"; + $logfile->close(); + } + $modified_urls = []; } if ($lock) { &Apache::lonnet::remove_lock($lock); } return OK; @@ -1926,37 +2063,63 @@ sub publishdirectory { my $thisdisresdir=$thisdisfn; $thisdisresdir=~s/^\/priv\//\/res\//; my $resdir = $r->dir_config('lonDocRoot').$thisdisresdir; - $r->print(&Apache::lonhtmlcommon::start_pick_box() + $r->print('<form name="pubdirpref" method="post" action="">' + .&Apache::lonhtmlcommon::start_pick_box() .&Apache::lonhtmlcommon::row_title(&mt('Directory')) .'<span class="LC_filename">'.$thisdisfn.'</span>' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title(&mt('Target')) .'<span class="LC_filename">'.$thisdisresdir.'</span>' ); + my %reasons = &Apache::lonlocal::texthash( + mod => 'Authoring Space file postdates published file', + modmeta => 'Authoring Space metadata file postdates published file', + unpub => 'Resource is unpublished', + ); my $dirptr=16384; # Mask indicating a directory in stat.cmode. unless ($env{'form.phase'} eq 'two') { # ask user what they want $r->print(&Apache::lonhtmlcommon::row_closure() - .&Apache::lonhtmlcommon::row_title(&mt('Options')) - ); - $r->print('<form name="pubdirpref" method="post" action="">'. - &hiddenfield('phase','two'). + .&Apache::lonhtmlcommon::row_title(&mt('Options') + .&Apache::loncommon::help_open_topic('Publishing_Directory_Options'))); + $r->print(&hiddenfield('phase','two'). &hiddenfield('filename',$env{'form.filename'}). - &checkbox('pubrec','include subdirectories'). - &checkbox('forcerepub','force republication of previously published files'). - &checkbox('obsolete','make file(s) obsolete'). - &checkbox('forceoverride','force directory level metadata over existing'). - '<br /><input type="submit" value="'.&mt('Publish Directory').'" /></form>'); + '<fieldset><legend>'.&mt('Recurse').'</legend>'. + &checkbox('pubrec','include subdirectories'). + '</fieldset>'. + '<fieldset><legend>'.&mt('Force').'</legend>'. + &checkbox('forcerepub','force republication of previously published files').'<br />'. + &checkbox('forceoverride','force directory level metadata over existing'). + '</fieldset>'. + '<fieldset><legend>'.&mt('Exclude').'</legend>'. + &checkbox('excludeunpub','exclude currently unpublished files').'<br />'. + &checkbox('excludemod','exclude modified files').'<br />'. + &checkbox('excludemodmeta','exclude files with modified metadata'). + '</fieldset>'. + '<fieldset><legend>'.&mt('Actions').'</legend>'. + &checkbox('obsolete','make file(s) obsolete').'<br />'. + &common_access('dist',&mt('apply common copyright/distribution'), + ['default','domain','public','custom']).'<br />'. + &common_access('source',&mt('apply common source availability'), + ['closed','open']). + '</fieldset>' + ); $r->print(&Apache::lonhtmlcommon::row_closure(1) .&Apache::lonhtmlcommon::end_pick_box() + .'<br /><input type="submit" value="'.&mt('Publish Directory').'" /></form>' ); $lock=0; } else { $r->print(&Apache::lonhtmlcommon::row_closure(1) .&Apache::lonhtmlcommon::end_pick_box() ); + my %commonaccess; + map { $commonaccess{$_} = 1; } &Apache::loncommon::get_env_multiple('form.commonaccess'); unless ($lock) { $lock=&Apache::lonnet::set_lock(&mt('Publishing [_1]',$fn)); } + if ($lock) { + ¬ify_in_cleanup($r); + } # actually publish things opendir(DIR,$fn); my @files=sort(readdir(DIR)); @@ -1965,7 +2128,7 @@ sub publishdirectory { $cuid,$cgid,$crdev,$csize, $catime,$cmtime,$cctime, $cblksize,$cblocks)=stat($fn.'/'.$filename); - + my $extension=''; if ($filename=~/\.(\w+)$/) { $extension=$1; } if ($cmode&$dirptr) { @@ -1974,8 +2137,9 @@ sub publishdirectory { } } elsif ((&Apache::loncommon::fileembstyle($extension) ne 'hdn') && ($filename!~/^[\#\.]/) && ($filename!~/\~$/)) { -# find out publication status and/or exiting metadata +# find out publication status and/or existing metadata my $publishthis=0; + my $skipthis; if (-e $resdir.'/'.$filename) { my ($rdev,$rino,$rmode,$rnlink, $ruid,$rgid,$rrdev,$rsize, @@ -1983,22 +2147,72 @@ sub publishdirectory { $rblksize,$rblocks)=stat($resdir.'/'.$filename); if (($rmtime<$cmtime) || ($env{'form.forcerepub'})) { # previously published, modified now - $publishthis=1; - } - my $meta_cmtime = (stat($fn.'/'.$filename.'.meta'))[9]; - my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9]; - if ( $meta_rmtime<$meta_cmtime ) { - $publishthis=1; + if ($env{'form.excludemod'}) { + $skipthis='mod'; + } else { + $publishthis=1; + } } + unless ($skipthis) { + my $meta_cmtime = (stat($fn.'/'.$filename.'.meta'))[9]; + my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9]; + if ( $meta_rmtime<$meta_cmtime ) { + if ($env{'form.excludemodmeta'}) { + $skipthis='modmeta'; + $publishthis=0; + } else { + $publishthis=1; + } + } else { + unless (&Apache::loncommon::fileembstyle($extension) eq 'prv') { + if ($commonaccess{'dist'}) { + my ($currdist,$currdistfile,$currsourceavail); + my $currdist = &Apache::lonnet::metadata($thisdisresdir.'/'.$filename,'copyright'); + if ($currdist eq 'custom') { + $currdistfile = &Apache::lonnet::metadata($thisdisresdir.'/'.$filename,'customdistributionfile'); + } + if ($env{'form.commondistselect'} eq 'custom') { + if ($env{'form.commoncustomrights'} =~ m{^/res/.+\.rights$}) { + if ($currdist eq 'custom') { + unless ($env{'form.commoncustomrights'} eq $currdistfile) { + $publishthis=1; + } + } else { + $publishthis=1; + } + } + } elsif ($env{'form.commondistselect'} =~ /^default|domain|public$/) { + unless ($currdist eq $env{'form.commondistselect'}) { + $publishthis=1; + } + } + } + } + } + } } else { # never published - $publishthis=1; + if ($env{'form.excludeunpub'}) { + $skipthis='unpub'; + } else { + $publishthis=1; + } } if ($publishthis) { &batchpublish($r,$fn.'/'.$filename,$resdir.'/'.$filename); } else { - $r->print('<br />'.&mt('Skipping').' '.$filename.'<br />'); + my $reason; + if ($skipthis) { + $reason = $reasons{$skipthis}; + } else { + $reason = &mt('No changes needed to published resource or metadata'); + } + $r->print('<br />'.&mt('Skipping').' '.$filename); + if ($reason) { + $r->print(' ('.$reason.')'); + } + $r->print('<br />'); } $r->rflush(); } @@ -2199,7 +2413,53 @@ sub handler { my $js='<script type="text/javascript">'. &Apache::loncommon::browser_and_searcher_javascript(). '</script>'; - $r->print(&Apache::loncommon::start_page('Resource Publication',$js) + my $startargs = {}; + if ($fn=~/\/$/) { + unless ($env{'form.phase'} eq 'two') { + $startargs->{'add_entries'} = { onload => 'javascript:setDefaultAccess();' }; + $js .= <<"END"; +<script type="text/javascript"> +// <![CDATA[ +function showHideAccess(caller,div) { + if (document.getElementById(div)) { + if (caller.checked) { + document.getElementById(div).style.display='inline-block'; + } else { + document.getElementById(div).style.display='none'; + } + } +} + +function showHideCustom(caller,divid) { + if (document.getElementById(divid)) { + if (caller.options[caller.selectedIndex].value == 'custom') { + document.getElementById(divid).style.display="inline-block"; + } else { + document.getElementById(divid).style.display="none"; + } + } +} +function setDefaultAccess() { + var chkids = Array('LC_commondist','LC_commonsource'); + for (var i=0; i<chkids.length; i++) { + if (document.getElementById(chkids[i])) { + document.getElementById(chkids[i]).checked = false; + } + if (document.getElementById(chkids[i]+'select')) { + document.getElementById(chkids[i]+'select').selectedIndex = 0; + } + if (document.getElementById(chkids[i]+'div')) { + document.getElementById(chkids[i]+'div').style.display = 'none'; + } + } +} +// ]]> +</script> + +END + } + } + $r->print(&Apache::loncommon::start_page('Resource Publication',$js,$startargs) .&Apache::lonhtmlcommon::breadcrumbs() .&Apache::loncommon::head_subbox( &Apache::loncommon::CSTR_pageheader($docroot.$fn)) @@ -2213,7 +2473,10 @@ sub handler { if ($fn=~/\/$/) { # -------------------------------------------------------- This is a directory &publishdirectory($r,$docroot.$fn,$thisdisfn); - $r->print('<hr /><a href="'.$thisdisfn.'">'.&mt('Return to Directory').'</a>'); + $r->print( + '<br /><br />'. + &Apache::lonhtmlcommon::actionbox([ + '<a href="'.$thisdisfn.'">'.&mt('Return to Directory').'</a>'])); } else { # ---------------------- Evaluate individual file, and then output information. $fn=~/\.(\w+)$/; @@ -2305,7 +2568,5 @@ __END__ =back -=back - =cut