--- loncom/interface/londocs.pm 2013/01/14 23:14:59 1.484.2.25
+++ loncom/interface/londocs.pm 2013/04/01 19:39:13 1.539
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.484.2.25 2013/01/14 23:14:59 raeburn Exp $
+# $Id: londocs.pm,v 1.539 2013/04/01 19:39:13 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -289,7 +289,7 @@ sub group_import {
$env{'form.output'}=$newmapstr;
my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
'output',$1.$2);
- if ($result != m|^/uploaded/|) {
+ if ($result !~ m{^/uploaded/}) {
$errtext.='Map not saved: A network error occurred when trying to save the new map. ';
$fatal = 2;
}
@@ -300,7 +300,7 @@ sub group_import {
if ($url) {
if (($caller eq 'londocs') &&
($folder =~ /^default/)) {
- unless ($donechk) {
+ if (($url =~ /\.(page|sequence)$/) && (!$donechk)) {
my $chome = &Apache::lonnet::homeserver($coursenum,$coursedom);
my $cid = $coursedom.'_'.$coursenum;
$allmaps =
@@ -323,8 +323,50 @@ sub group_import {
}
my $ext = 'false';
if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
- $url = &LONCAPA::map::qtunescape($url);
$name = &LONCAPA::map::qtunescape($name);
+ if ($name eq '') {
+ $name = &LONCAPA::map::qtunescape(&mt('Web Page'));
+ }
+ if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {
+ my $filepath = $1;
+ my $fname = $name;
+ if ($fname =~ /^\W+$/) {
+ $fname = 'web';
+ } else {
+ $fname =~ s/\W/_/g;
+ }
+ if (length($fname > 15)) {
+ $fname = substr($fname,0,14);
+ }
+ my $initialtext = &mt('Replace with your own content.');
+ my $newhtml = < '."\n".
@@ -346,6 +389,18 @@ sub group_import {
}
$fixuperrors .= ' '.
+ join(' '.
+ $lockerror.
+ ' '.
+ join(' '.
+ $lockerror.
+ ' '.$paste_res.' '.$paste_res.' '."\n".
+ $r->print(' '."\n".
&mt('The following files are either dependencies of a web page or references within a folder and/or composite page which could not be copied during the paste operation:')."\n".
'
',@{$msgsarray}).
+ '
'.&mt('(from another course).');
- }
- } else {
- $canpaste = 0;
- $nopaste = &mt('Paste from another course unavailable.')
+# Construct identifiers for current contents of user's paste buffer
+ foreach my $suffix (@currpaste) {
+ next if ($suffix =~ /\D/);
+ my $cid = $env{'docs.markedcopy_crs_'.$suffix};
+ my $url = $env{'docs.markedcopy_url_'.$suffix};
+ if (($cid =~ /^$match_domain\_$match_courseid$/) &&
+ ($url ne '')) {
+ my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,
+ $canpaste,$nopaste,$othercrs,$areachange);
+ my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];
+ if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) {
+ $is_external = 1;
+ }
+ if ($folder =~ /^supplemental/) {
+ $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix});
+ unless ($canpaste) {
+ $nopaste = &mt('Paste into Supplemental Content unavailable.');
}
+ } else {
+ $canpaste = 1;
}
- if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {
- my $prefix = $1;
- $parent = $2;
- if ($folder !~ /^\Q$prefix\E/) {
- $areachange = 1;
- }
- $is_uploaded_map = 1;
- }
- }
- }
-
- $r->print('');
+ my $output = '
'.
+ ''.
+ ' ';
+ return $output;
}
sub recurse_print {
- my ($r,$dir,$deps,$display) = @_;
- $r->print($display->{$dir}."\n");
+ my ($outputref,$dir,$deps,$display) = @_;
+ $$outputref .= $display->{$dir}."\n";
if (ref($deps->{$dir}) eq 'ARRAY') {
foreach my $subdir (@{$deps->{$dir}}) {
- &recurse_print($r,$subdir,$deps,$display);
+ &recurse_print($outputref,$subdir,$deps,$display);
}
}
}
@@ -832,22 +1007,34 @@ sub supp_pasteable {
sub paste_popup_js {
my %lt = &Apache::lonlocal::texthash(
- show => 'Show Paste Options',
- hide => 'Hide Paste Options',
+ show => 'Show Options',
+ hide => 'Hide Options',
);
return <<"END";
-function showPasteOptions() {
- document.getElementById('pasteoptions').style.display='block';
- document.getElementById('pasteoptions').style.textAlign='left';
- document.getElementById('pasteoptions').style.textFace='normal';
- document.getElementById('pasteoptionstext').innerHTML ='$lt{'hide'}
';
+function showPasteOptions(suffix) {
+ document.getElementById('pasteoptions_'+suffix).style.display='block';
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML = ' $lt{'hide'}';
return;
}
-function hidePasteOptions() {
- document.getElementById('pasteoptions').style.display='none';
- document.getElementById('pasteoptionstext').innerHTML ='$lt{'show'}';
+function hidePasteOptions(suffix) {
+ document.getElementById('pasteoptions_'+suffix).style.display='none';
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML =' $lt{'show'}';
+ return;
+}
+
+function showOptions(caller,suffix) {
+ if (document.getElementById('pasteoptionstext_'+suffix)) {
+ if (caller.checked) {
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML =' $lt{'show'}';
+ } else {
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML ='';
+ }
+ if (document.getElementById('pasteoptions_'+suffix)) {
+ document.getElementById('pasteoptions_'+suffix).style.display='none';
+ }
+ }
return;
}
@@ -859,235 +1046,257 @@ END
sub do_paste_from_buffer {
my ($coursenum,$coursedom,$folder,$container,$errors) = @_;
+# Array of items in paste buffer
+ my (@currpaste,%pastebuffer,%allerrors);
+ @currpaste = split(/,/,$env{'docs.markedcopies'});
+
# Early out if paste buffer is empty
- if (!$env{'form.pastemarked'}) {
+ if (@currpaste == 0) {
return ();
+ }
+ map { $pastebuffer{$_} = 1; } @currpaste;
+
+# Array of items selected items to paste
+ my @reqpaste = &Apache::loncommon::get_env_multiple('form.pasting');
+
+# Early out if nothing selected to paste
+ if (@reqpaste == 0) {
+ return();
+ }
+ my @topaste;
+ foreach my $suffix (@reqpaste) {
+ next if ($suffix =~ /\D/);
+ next unless (exists($pastebuffer{$suffix}));
+ push(@topaste,$suffix);
}
-# Supplemental content may only include certain types of content
-# Early out if pasted content is not supported in Supplemental area
- if ($folder =~ /^supplemental/) {
- unless (&supp_pasteable($env{'docs.markedcopy_url'})) {
- return (&mt('Paste failed: content type is not supported within Supplemental Content'));
- }
+# Early out if nothing available to paste
+ if (@topaste == 0) {
+ return();
}
-# Prepare to paste resource at end of list
- my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
- my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});
+ my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,
+ %prefixchg,%srcdom,%srcnum,%marktomove,$save_err,$lockerrors,$allresult,
+ %msgs);
- my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove);
- if ($url=~/\.(page|sequence)$/) {
- $is_map = 1;
- }
- if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) {
- $srcdom = $1;
- $srcnum = $2;
- my $oldprefix = $3;
+ foreach my $suffix (@topaste) {
+ my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
+# Supplemental content may only include certain types of content
+# Early out if pasted content is not supported in Supplemental area
+ if ($folder =~ /^supplemental/) {
+ unless (&supp_pasteable($url)) {
+ $notinsupp{$suffix} = 1;
+ next;
+ }
+ }
+ if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/}) {
+ my $srcd = $1;
+ my $srcn = $2;
# When paste buffer was populated using an active role in a different course
-# check for mdc privilege in the course from which the resource was pasted
- if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
- unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
- return (&mt('Paste failed: Item is from a different course which you do not have rights to edit.'));
+# check for mdc privilege in the course from which the resource was pasted
+ if (($srcd ne $coursedom) || ($srcn ne $coursenum)) {
+ unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) {
+ $notincrs{$suffix} = 1;
+ next;
+ }
}
+ $srcdom{$suffix} = $srcd;
+ $srcnum{$suffix} = $srcn;
}
+
+ push(@dopaste,$suffix);
+ if ($url=~/\.(page|sequence)$/) {
+ $is_map{$suffix} = 1;
+ }
+
+ if ($url =~ m{^/uploaded/$match_domain/$match_courseid/([^/]+)}) {
+ my $oldprefix = $1;
# When pasting content from Main Content to Supplemental Content and vice versa
# URLs will contain different paths (which depend on whether pasted item is
# a folder/page or a document.
- if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {
- $prefixchg = 1;
- %before = ( map => 'default',
- doc => 'docs');
- %after = ( map => 'supplemental',
- doc => 'supplemental' );
- } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {
- $prefixchg = 1;
- %before = ( map => 'supplemental',
- doc => 'supplemental');
- %after = ( map => 'default',
- doc => 'docs');
- }
+ if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {
+ $prefixchg{$suffix} = 'docstosupp';
+ } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {
+ $prefixchg{$suffix} = 'supptodocs';
+ }
# If pasting an uploaded map, get list of contained uploaded maps.
- my @nested;
- if ($env{'docs.markedcopy_nested'}) {
- my ($type) = ($oldprefix =~ /^(default|supplemental)/);
- my @items = split(/\&/,$env{'docs.markedcopy_nested'});
- my @deps = map { /\d+:([\d,]+$)/ } @items;
- foreach my $dep (@deps) {
- if ($dep =~ /,/) {
- push(@nested,split(/,/,$dep));
- } else {
- push(@nested,$dep);
+ if ($env{'docs.markedcopy_nested_'.$suffix}) {
+ my @nested;
+ my ($type) = ($oldprefix =~ /^(default|supplemental)/);
+ my @items = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix});
+ my @deps = map { /\d+:([\d,]+$)/ } @items;
+ foreach my $dep (@deps) {
+ if ($dep =~ /,/) {
+ push(@nested,split(/,/,$dep));
+ } else {
+ push(@nested,$dep);
+ }
}
- }
- foreach my $item (@nested) {
- if ($env{'form.docs.markedcopy_'.$item} eq 'move') {
- $tomove{$type.'_'.$item} = 1;
+ foreach my $item (@nested) {
+ if ($env{'form.docs.markedcopy_'.$suffix.'_'.$item} eq 'move') {
+ push(@{$marktomove{$suffix}},$type.'_'.$item);
+ }
}
}
}
}
+# Early out if nothing available to paste
+ if (@dopaste == 0) {
+ return ();
+ }
+
+# Populate message hash and hashes used for main content <=> supplemental content
+# changes
+
+ %msgs = &Apache::lonlocal::texthash (
+ notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
+ notincrs => 'Paste failed: Item is from a different course which you do not have rights to edit.',
+ duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
+ );
+
+ %before = (
+ docstosupp => {
+ map => 'default',
+ doc => 'docs',
+ },
+ supptodocs => {
+ map => 'supplemental',
+ doc => 'supplemental',
+ },
+ );
+
+ %after = (
+ docstosupp => {
+ map => 'supplemental',
+ doc => 'supplemental'
+ },
+ supptodocs => {
+ map => 'default',
+ doc => 'docs',
+ },
+ );
+
+# Retrieve information about all course maps in main content area
+
+ my $allmaps = {};
+ if ($folder =~ /^default/) {
+ $allmaps =
+ &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
+ $env{"course.$env{'request.course.id'}.home"},
+ $env{'request.course.id'});
+ }
+
+ my (@toclear,%mapurls,%lockerrs,%msgerrs,%results);
+
+# Loop over the items to paste
+ foreach my $suffix (@dopaste) {
# Maps need to be copied first
- my ($oldurl,%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,
- %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls);
- $oldurl = $url;
- if ($is_map) {
+ my (%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,
+ %dbcopies,%zombies,%params,%docmoves,%mapmoves,%mapchanges,%newsubdir,
+ %newurls,%tomove);
+ if (ref($marktomove{$suffix}) eq 'ARRAY') {
+ map { $tomove{$_} = 1; } @{$marktomove{$suffix}};
+ }
+ my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
+ my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});
+ my $oldurl = $url;
+ if ($is_map{$suffix}) {
# If pasting a map, check if map contains other maps
- my ($allmaps,%hierarchy,%titles);
- $allmaps = {};
- if ($folder =~ /^default/) {
- $allmaps =
- &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
- $env{"course.$env{'request.course.id'}.home"},
- $env{'request.course.id'});
- }
- &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
- \%addedmaps,\%hierarchy,\%titles,$allmaps);
- if ($url=~ m{^/uploaded/}) {
- my $newurl;
- unless ($env{'form.docs.markedcopy_options'} eq 'move') {
- ($newurl,my $error) =
- &get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum,
- $srcdom,$srcnum,\$title,$allmaps,\%newurls);
- if ($error) {
- return ($error);
- }
- if ($newurl ne '') {
- if ($newurl ne $url) {
- if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {
- $newsubdir{$url} = $1;
+ my (%hierarchy,%titles);
+ &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
+ \%addedmaps,\%hierarchy,\%titles,$allmaps);
+ if ($url=~ m{^/uploaded/}) {
+ my $newurl;
+ unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
+ ($newurl,my $error) =
+ &get_newmap_url($url,$folder,$prefixchg{$suffix},$coursedom,
+ $coursenum,$srcdom{$suffix},$srcnum{$suffix},
+ \$title,$allmaps,\%newurls);
+ if ($error) {
+ $allerrors{$suffix} = $error;
+ next;
+ }
+ if ($newurl ne '') {
+ if ($newurl ne $url) {
+ if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {
+ $newsubdir{$url} = $1;
+ }
+ $mapchanges{$url} = 1;
}
- $mapchanges{$url} = 1;
}
}
- }
- if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||
- (($newurl ne '') && ($newurl ne $url))) {
- unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,
- $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,
- \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,
- \%newsubdir,\%newurls)) {
- $mapmoves{$url} = 1;
- }
- $url = $newurl;
- } elsif ($env{'docs.markedcopy_nested'}) {
- &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,$allmaps,\%rewrites,
- \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,
- \%mapchanges,\%tomove,\%newsubdir,\%newurls);
- }
- } elsif ($url=~m {^/res/}) {
-# published maps can only exists once, so remove it from paste buffer when done
- &Apache::lonnet::delenv('docs.markedcopy');
-# if pasting published map (main content are only) check map is not already in course
- if ($folder =~ /^default/) {
- if ((ref($allmaps) eq 'HASH') && ($allmaps->{$url})) {
- return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'));
+ if (($srcdom{$suffix} ne $coursedom) ||
+ ($srcnum{$suffix} ne $coursenum) ||
+ ($prefixchg{$suffix}) || (($newurl ne '') && ($newurl ne $url))) {
+ unless (&url_paste_fixups($url,$folder,$prefixchg{$suffix},
+ $coursedom,$coursenum,$srcdom{$suffix},
+ $srcnum{$suffix},$allmaps,\%rewrites,
+ \%retitles,\%copies,\%dbcopies,
+ \%zombies,\%params,\%mapmoves,
+ \%mapchanges,\%tomove,\%newsubdir,
+ \%newurls)) {
+ $mapmoves{$url} = 1;
+ }
+ $url = $newurl;
+ } elsif ($env{'docs.markedcopy_nested_'.$suffix}) {
+ &url_paste_fixups($url,$folder,$prefixchg{$suffix},$coursedom,
+ $coursenum,$srcdom{$suffix},$srcnum{$suffix},
+ $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,
+ \%zombies,\%params,\%mapmoves,\%mapchanges,
+ \%tomove,\%newsubdir,\%newurls);
+ }
+ } elsif ($url=~m {^/res/}) {
+# published map can only exists once, so remove from paste buffer when done
+ push(@toclear,$suffix);
+# if pasting published map (main content area only) check map not already in course
+ if ($folder =~ /^default/) {
+ if ((ref($allmaps) eq 'HASH') && ($allmaps->{$url})) {
+ $duplicate{$suffix} = 1;
+ next;
+ }
}
}
}
- }
- if ($url=~ m{/smppg$}) {
- my $db_name = &Apache::lonsimplepage::get_db_name($url);
- if ($db_name =~ /^smppage_/) {
- #simple pages, need to copy the db contents to a new one.
- my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
- my $now = time();
- $db_name =~ s{_\d*$ }{_$now}x;
- my $dbresult=&Apache::lonnet::put($db_name,\%contents,
- $coursedom,$coursenum);
- if ($dbresult eq 'ok') {
- $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
- $title=&mt('Copy of').' '.$title;
- } else {
- return (&mt('Paste failed: An error occurred when copying the simple page.'));
- }
- }
- }
- $title = &LONCAPA::map::qtunescape($title);
- my $ext='false';
- if ($url=~m{^http(|s)://}) { $ext='true'; }
- $url = &LONCAPA::map::qtunescape($url);
-
-# For uploaded files (excluding pages/sequences) path in copied file is changed
-# if paste is from Main to Supplemental (or vice versa), or if pasting between
-# courses.
-
- my $newidx;
- unless ($is_map) {
-# Now insert the URL at the bottom
- $newidx = &LONCAPA::map::getresidx($url);
- if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {
- my $relpath = $1;
- if ($relpath ne '') {
- my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});
- my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);
- my $newprefix = $newloc;
- if ($newloc eq 'default') {
- $newprefix = 'docs';
- }
- if ($newdocsdir eq '') {
- $newdocsdir = 'default';
- }
- if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
- my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
- $url =
- &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
- &Apache::lonnet::getfile($oldurl));
- if ($url eq '/adm/notfound.html') {
- return (&mt('Paste failed: an error occurred saving the file.'));
- } else {
- my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});
- $newsubpath =~ s{/+$}{/};
- $docmoves{$oldurl} = $newsubpath;
+ if ($url=~ m{/(bulletinboard|smppg)$}) {
+ my $prefix = $1;
+ #need to copy the db contents to a new one, unless this is a move.
+ my %info = (
+ src => $url,
+ cdom => $coursedom,
+ cnum => $coursenum,
+ );
+ unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
+ my (%lockerr,$msg);
+ my ($newurl,$result,$errtext) =
+ &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);
+ if ($result eq 'ok') {
+ $url = $newurl;
+ $title=&mt('Copy of').' '.$title;
+ } else {
+ if ($prefix eq 'smppg') {
+ $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;
+ } elsif ($prefix eq 'bulletinboard') {
+ $msg = &mt('Paste failed: An error occurred when copying the bulletin board.').' '.$errtext;
}
+ $results{$suffix} = $result;
+ $msgerrs{$suffix} = $msg;
+ $lockerrs{$suffix} = $lockerr{$prefix};
+ next;
+ }
+ if ($lockerr{$prefix}) {
+ $lockerrs{$suffix} = $lockerr{$prefix};
}
}
}
- }
-# Apply any changes to maps, or copy dependencies for uploaded HTML pages
- my ($result,$save_err);
- my %updated = (
- rewrites => \%rewrites,
- zombies => \%zombies,
- removefrommap => \%removefrommap,
- removeparam => \%removeparam,
- dbcopies => \%dbcopies,
- retitles => \%retitles,
- );
- my %info = (
- newsubdir => \%newsubdir,
- params => \%params,
- before => \%before,
- after => \%after,
- );
- my %moves = (
- copies => \%copies,
- docmoves => \%docmoves,
- mapmoves => \%mapmoves,
- );
- $result =
- &apply_fixups($folder,$is_map,$coursedom,$coursenum,$errors,
- \%updated,\%info,\%moves,$prefixchg,$oldurl,$url,'paste');
- if ($result eq 'ok') {
- if ($is_map) {
- my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
- $folder.'.'.$container);
- return $errtext if ($fatal);
-
- if ($#LONCAPA::map::order<1) {
- my $idx=&LONCAPA::map::getresidx();
- if ($idx<=0) { $idx=1; }
- $LONCAPA::map::order[0]=$idx;
- $LONCAPA::map::resources[$idx]='';
- }
- $newidx = &LONCAPA::map::getresidx($url);
- }
- if ($env{'docs.markedcopy_supplemental'}) {
+ $title = &LONCAPA::map::qtunescape($title);
+ my $ext='false';
+ if ($url=~m{^http(|s)://}) { $ext='true'; }
+ if ($env{'docs.markedcopy_supplemental_'.$suffix}) {
if ($folder !~ /^supplemental/) {
(undef,undef,$title) =
- &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'});
+ &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental_'.$suffix});
}
} else {
if ($folder=~/^supplemental/) {
@@ -1095,23 +1304,165 @@ sub do_paste_from_buffer {
$env{'user.domain'}.'___&&&___'.$title;
}
}
- $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';
- push(@LONCAPA::map::order, $newidx);
+# For uploaded files (excluding pages/sequences) path in copied file is changed
+# if paste is from Main to Supplemental (or vice versa), or if pasting between
+# courses.
+
+ unless ($is_map{$suffix}) {
+ my $newidx;
+# Now insert the URL at the bottom
+ $newidx = &LONCAPA::map::getresidx(&LONCAPA::map::qtunescape($url));
+ if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {
+ my $relpath = $1;
+ if ($relpath ne '') {
+ my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});
+ my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);
+ my $newprefix = $newloc;
+ if ($newloc eq 'default') {
+ $newprefix = 'docs';
+ }
+ if ($newdocsdir eq '') {
+ $newdocsdir = 'default';
+ }
+ if (($prefixchg{$suffix}) ||
+ ($srcdom{$suffix} ne $coursedom) ||
+ ($srcnum{$suffix} ne $coursenum) ||
+ ($env{'form.docs.markedcopy_options_'.$suffix} ne 'move')) {
+ my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
+ $url =
+ &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
+ &Apache::lonnet::getfile($oldurl));
+ if ($url eq '/adm/notfound.html') {
+ $msgs{$suffix} = &mt('Paste failed: an error occurred saving the file.');
+ next;
+ } else {
+ my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});
+ $newsubpath =~ s{/+$}{/};
+ $docmoves{$oldurl} = $newsubpath;
+ }
+ }
+ }
+ }
+ $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url).
+ ':'.$ext.':normal:res';
+ push(@LONCAPA::map::order,$newidx);
# Store the result
- my ($errtext,$fatal) =
- &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
- if ($fatal) {
- $save_err = $errtext;
+ my ($errtext,$fatal) =
+ &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
+ if ($fatal) {
+ $save_err .= $errtext;
+ $allresult = 'fail';
+ }
+ }
+
+# Apply any changes to maps, or copy dependencies for uploaded HTML pages
+ unless ($allresult eq 'fail') {
+ my %updated = (
+ rewrites => \%rewrites,
+ zombies => \%zombies,
+ removefrommap => \%removefrommap,
+ removeparam => \%removeparam,
+ dbcopies => \%dbcopies,
+ retitles => \%retitles,
+ );
+ my %info = (
+ newsubdir => \%newsubdir,
+ params => \%params,
+ );
+ if ($prefixchg{$suffix}) {
+ $info{'before'} = $before{$prefixchg{$suffix}};
+ $info{'after'} = $after{$prefixchg{$suffix}};
+ }
+ my %moves = (
+ copies => \%copies,
+ docmoves => \%docmoves,
+ mapmoves => \%mapmoves,
+ );
+ (my $result,$msgs{$suffix},my $lockerror) =
+ &apply_fixups($folder,$is_map{$suffix},$coursedom,$coursenum,$errors,
+ \%updated,\%info,\%moves,$prefixchg{$suffix},$oldurl,
+ $url,'paste');
+ $lockerrors .= $lockerror;
+ if ($result eq 'ok') {
+ if ($is_map{$suffix}) {
+ my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
+ $folder.'.'.$container);
+ if ($fatal) {
+ $allresult = 'failread';
+ } else {
+ if ($#LONCAPA::map::order<1) {
+ my $idx=&LONCAPA::map::getresidx();
+ if ($idx<=0) { $idx=1; }
+ $LONCAPA::map::order[0]=$idx;
+ $LONCAPA::map::resources[$idx]='';
+ }
+ my $newidx = &LONCAPA::map::getresidx(&LONCAPA::map::qtunescape($url));
+ $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url).
+ ':'.$ext.':normal:res';
+ push(@LONCAPA::map::order,$newidx);
+
+# Store the result
+ my ($errtext,$fatal) =
+ &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
+ if ($fatal) {
+ $save_err .= $errtext;
+ $allresult = 'failstore';
+ }
+ }
+ }
+ if ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
+ push(@toclear,$suffix);
+ }
+ }
}
}
-
- if ($env{'form.docs.markedcopy_options'} eq 'move') {
- &Apache::lonnet::delenv('docs.markedcopy');
- &Apache::lonnet::delenv('docs.markedcopy_nested');
- &Apache::lonnet::delenv('docs.markedcopy_nestednames');
+ &clear_from_buffer(\@toclear,\@currpaste);
+ my $msgsarray;
+ foreach my $suffix (keys(%msgs)) {
+ if (ref($msgs{$suffix}) eq 'ARRAY') {
+ $msgsarray .= join(',',@{$msgs{$suffix}});
+ }
}
- return ($result,$save_err);
+ return ($allresult,$save_err,$msgsarray,$lockerrors);
+}
+
+sub do_buffer_empty {
+ my @currpaste = split(/,/,$env{'docs.markedcopies'});
+ if (@currpaste == 0) {
+ return &mt('Clipboard is already empty');
+ }
+ my @toclear = &Apache::loncommon::get_env_multiple('form.pasting');
+ if (@toclear == 0) {
+ return &mt('Nothing selected to clear from clipboard');
+ }
+ my $numdel = &clear_from_buffer(\@toclear,\@currpaste);
+ if ($numdel) {
+ return &mt('[quant,_1,item] cleared from clipboard',$numdel);
+ } else {
+ return &mt('Clipboard unchanged');
+ }
+ return;
+}
+
+sub clear_from_buffer {
+ my ($toclear,$currpaste) = @_;
+ return unless ((ref($toclear) eq 'ARRAY') && (ref($currpaste) eq 'ARRAY'));
+ my %pastebuffer;
+ map { $pastebuffer{$_} = 1; } @{$currpaste};
+ my $numdel = 0;
+ foreach my $suffix (@{$toclear}) {
+ next if ($suffix =~ /\D/);
+ next unless (exists($pastebuffer{$suffix}));
+ my $regexp = 'docs.markedcopy_[a-z]+_'.$suffix;
+ if (&Apache::lonnet::delenv($regexp,1) eq 'ok') {
+ delete($pastebuffer{$suffix});
+ $numdel ++;
+ }
+ }
+ my $newbuffer = join(',',sort(keys(%pastebuffer)));
+ &Apache::lonnet::appenv({'docs.markedcopies' => $newbuffer});
+ return $numdel;
}
sub get_newmap_url {
@@ -1175,20 +1526,96 @@ sub get_newmap_url {
}
sub dbcopy {
- my ($url,$coursedom,$coursenum) = @_;
- if ($url=~ m{/smppg$}) {
- my $db_name = &Apache::lonsimplepage::get_db_name($url);
- if ($db_name =~ /^smppage_/) {
- #simple pages, need to copy the db contents to a new one.
- my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
- my $now = time();
- $db_name =~ s{_\d*$ }{_$now}x;
- my $result=&Apache::lonnet::put($db_name,\%contents,
- $coursedom,$coursenum);
- $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
+ my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;
+ my ($url,$result,$errtext);
+ my $url = $dbref->{'src'};
+ if (ref($dbref) eq 'HASH') {
+ if ($url =~ m{/(smppg|bulletinboard)$}) {
+ my $prefix = $1;
+ if (($dbref->{'cdom'} =~ /^$match_domain$/) &&
+ ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
+ my $db_name;
+ my $marker = (split(m{/},$url))[4];
+ $marker=~s/\D//g;
+ if ($dbref->{'src'} =~ m{/smppg$}) {
+ $db_name =
+ &Apache::lonsimplepage::get_db_name($url,$marker,
+ $dbref->{'cdom'},
+ $dbref->{'cnum'});
+ } else {
+ $db_name = 'bulletinpage_'.$marker;
+ }
+ my ($suffix,$freedlock,$error) =
+ &Apache::lonnet::get_timebased_id($prefix,'num','templated',
+ $coursedom,$coursenum,
+ 'concat');
+ if (!$suffix) {
+ if ($prefix eq 'smppg') {
+ $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);
+ } else {
+ $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a bulletin board [_1].',$url);
+ }
+ if ($error) {
+ $errtext .= '
'.$error;
+ }
+ } else {
+ #need to copy the db contents to a new one.
+ my %contents=&Apache::lonnet::dump($db_name,
+ $dbref->{'cdom'},
+ $dbref->{'cnum'});
+ if (exists($contents{'uploaded.photourl'})) {
+ my $photo = $contents{'uploaded.photourl'};
+ my ($subdir,$fname) =
+ ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$});
+ my $newphoto;
+ if ($fname ne '') {
+ my $content = &Apache::lonnet::getfile($photo);
+ unless ($content eq '-1') {
+ $env{'form.'.$suffix.'.photourl'} = $content;
+ $newphoto =
+ &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname");
+ delete($env{'form.'.$suffix.'.photourl'});
+ }
+ }
+ if ($newphoto =~ m{^/uploaded/}) {
+ $contents{'uploaded.photourl'} = $newphoto;
+ }
+ }
+ $db_name =~ s{_\d*$ }{_$suffix}x;
+ $result=&Apache::lonnet::put($db_name,\%contents,
+ $coursedom,$coursenum);
+ if ($result eq 'ok') {
+ $url =~ s{/(\d*)/(smppg|bulletinboard)$}{/$suffix/$2}x;
+ }
+ }
+ if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
+ $lockerrorsref->{$prefix} =
+ '
',values(%lockerrors));
+ }
my $storefn;
if ($key eq $oldurl) {
$storefn = $url;
@@ -1627,12 +2082,12 @@ sub apply_fixups {
&LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);
if ($errtext) {
if ($caller eq 'paste') {
- return &mt('Paste failed: an error occurred saving the folder or page.');
+ return (&mt('Paste failed: an error occurred saving the folder or page.'));
}
}
}
}
- return 'ok';
+ return ('ok',\@msgs,$lockmsg);
}
sub copy_dependencies {
@@ -1697,34 +2152,107 @@ my %parameter_type = ( 'randompick'
my $valid_parameters_re = join('|',keys(%parameter_type));
# set parameters
sub update_parameter {
-
- return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
-
- my $which = $env{'form.changeparms'};
- my $idx = $env{'form.setparms'};
- if ($env{'form.'.$which.'_'.$idx}) {
- my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx}
- : 'yes';
- &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
- $parameter_type{$which});
- &remember_parms($idx,$which,'set',$value);
+ if ($env{'form.changeparms'} eq 'all') {
+ my (@allidx,@allmapidx,%allchecked,%currchecked);
+ %allchecked = (
+ 'hiddenresource' => {},
+ 'encrypturl' => {},
+ 'randompick' => {},
+ 'randomorder' => {},
+ );
+ foreach my $which (keys(%allchecked)) {
+ $env{'form.all'.$which} =~ s/,$//;
+ if ($which eq 'randompick') {
+ foreach my $item (split(/,/,$env{'form.all'.$which})) {
+ my ($res,$value) = split(/:/,$item);
+ if ($value =~ /^\d+$/) {
+ $allchecked{$which}{$res} = $value;
+ }
+ }
+ } else {
+ if ($env{'form.all'.$which}) {
+ map { $allchecked{$which}{$_} = 1; } split(/,/,$env{'form.all'.$which});
+ }
+ }
+ }
+ my $haschanges = 0;
+ foreach my $res (@LONCAPA::map::order) {
+ my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
+ $name=&LONCAPA::map::qtescape($name);
+ $url=&LONCAPA::map::qtescape($url);
+ next unless ($name && $url);
+ my $is_map;
+ if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {
+ $is_map = 1;
+ }
+ foreach my $which (keys(%allchecked)) {
+ if (($which eq 'randompick' || $which eq 'randomorder')) {
+ next if (!$is_map);
+ }
+ my $oldvalue = 0;
+ my $newvalue = 0;
+ if ($allchecked{$which}{$res}) {
+ $newvalue = $allchecked{$which}{$res};
+ }
+ my $current = (&LONCAPA::map::getparameter($res,'parameter_'.$which))[0];
+ if ($which eq 'randompick') {
+ if ($current =~ /^(\d+)$/) {
+ $oldvalue = $1;
+ }
+ } else {
+ if ($current =~ /^yes$/i) {
+ $oldvalue = 1;
+ }
+ }
+ if ($oldvalue ne $newvalue) {
+ $haschanges = 1;
+ if ($newvalue) {
+ my $storeval = 'yes';
+ if ($which eq 'randompick') {
+ $storeval = $newvalue;
+ }
+ &LONCAPA::map::storeparameter($res,'parameter_'.$which,
+ $storeval,
+ $parameter_type{$which});
+ &remember_parms($res,$which,'set',$storeval);
+ } elsif ($oldvalue) {
+ &LONCAPA::map::delparameter($res,'parameter_'.$which);
+ &remember_parms($res,$which,'del');
+ }
+ }
+ }
+ }
+ return $haschanges;
} else {
- &LONCAPA::map::delparameter($idx,'parameter_'.$which);
+ return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
+
+ my $which = $env{'form.changeparms'};
+ my $idx = $env{'form.setparms'};
+ if ($env{'form.'.$which.'_'.$idx}) {
+ my $value = ($which eq 'randompick') ? $env{'form.rpicknum_'.$idx}
+ : 'yes';
+ &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
+ $parameter_type{$which});
+ &remember_parms($idx,$which,'set',$value);
+ } else {
+ &LONCAPA::map::delparameter($idx,'parameter_'.$which);
- &remember_parms($idx,$which,'del');
+ &remember_parms($idx,$which,'del');
+ }
+ return 1;
}
- return 1;
}
sub handle_edit_cmd {
my ($coursenum,$coursedom) =@_;
+ return if ($env{'form.cmd'} eq '');
my ($cmd,$idx)=split('_',$env{'form.cmd'});
my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
my ($title, $url, @rrest) = split(':', $ratstr);
- if ($cmd eq 'del') {
+ if ($cmd eq 'remove') {
if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
($url!~/$LONCAPA::assess_page_seq_re/)) {
&Apache::lonnet::removeuploadedurl($url);
@@ -1746,7 +2274,6 @@ sub handle_edit_cmd {
@LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1];
} elsif ($cmd eq 'rename') {
-
my $comment = &LONCAPA::map::qtunescape($env{'form.title'});
if ($comment=~/\S/) {
$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
@@ -1755,6 +2282,7 @@ sub handle_edit_cmd {
# Devalidate title cache
my $renamed_url=&LONCAPA::map::qtescape($url);
&Apache::lonnet::devalidate_title_cache($renamed_url);
+
} else {
return 0;
}
@@ -1820,17 +2348,30 @@ sub editor {
if ($env{'form.pastemarked'}) {
my %paste_errors;
- my ($paste_res,$save_error) =
+ my ($paste_res,$save_error,$pastemsgarray,$lockerror) =
&do_paste_from_buffer($coursenum,$coursedom,$folder,$container,
\%paste_errors);
+ if (ref($pastemsgarray) eq 'ARRAY') {
+ if (@{$pastemsgarray} > 0) {
+
+ $r->print('
',@{$pastemsgarray}).
+ ''."\n");
foreach my $key (sort(keys(%paste_errors))) {
@@ -1838,28 +2379,91 @@ sub editor {
}
$r->print('
'.$output.'
'); + } + } $r->print($upload_output); +# Rename, cut, copy or remove a single resource if (&handle_edit_cmd()) { my $contentchg; - if ($env{'form.cmd'} =~ /^(del|cut)_/) { + if ($env{'form.cmd'} =~ m{^(del|cut)_}) { $contentchg = 1; } ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg); return $errtext if ($fatal); } + +# Cut, copy and/or remove multiple resources + if ($env{'form.multichange'}) { + my %allchecked = ( + cut => {}, + remove => {}, + ); + my $needsupdate; + foreach my $which (keys(%allchecked)) { + $env{'form.multi'.$which} =~ s/,$//; + if ($env{'form.multi'.$which}) { + map { $allchecked{$which}{$_} = 1; } split(/,/,$env{'form.multi'.$which}); + if (ref($allchecked{$which}) eq 'HASH') { + $needsupdate += scalar(keys(%{$allchecked{$which}})); + } + } + } + if ($needsupdate) { + my $haschanges = 0; + my %curr_groups = &Apache::longroup::coursegroups(); + my $total = scalar(@LONCAPA::map::order) - 1; + for (my $i=$total; $i>=0; $i--) { + my $res = $LONCAPA::map::order[$i]; + my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); + $name=&LONCAPA::map::qtescape($name); + $url=&LONCAPA::map::qtescape($url); + next unless ($name && $url); + my %denied = + &action_restrictions($coursenum,$coursedom,$url, + $env{'form.folderpath'},\%curr_groups); + foreach my $which (keys(%allchecked)) { + next if ($denied{$which}); + next unless ($allchecked{$which}{$res}); + if ($which eq 'remove') { + if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && + ($url!~/$LONCAPA::assess_page_seq_re/)) { + &Apache::lonnet::removeuploadedurl($url); + } else { + &LONCAPA::map::makezombie($res); + } + splice(@LONCAPA::map::order,$i,1); + $haschanges ++; + } elsif ($which eq 'cut') { + &LONCAPA::map::makezombie($res); + splice(@LONCAPA::map::order,$i,1); + $haschanges ++; + } + } + } + if ($haschanges) { + ($errtext,$fatal) = + &storemap($coursenum,$coursedom,$folder.'.'.$container,1); + return $errtext if ($fatal); + } + } + } + # Group import/search if ($env{'form.importdetail'}) { my @imports; foreach my $item (split(/\&/,$env{'form.importdetail'})) { if (defined($item)) { my ($name,$url,$residx)= - map {&unescape($_)} split(/\=/,$item); - if ($url=~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) { - my ($suffix,$errortxt,$locknotfreed) = - &newmap_suffix($1,$2,$coursedom,$coursenum); + map { &unescape($_); } split(/\=/,$item); + if ($url =~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) { + my ($suffix,$errortxt,$locknotfreed) = + &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2); if ($locknotfreed) { $r->print($locknotfreed); } @@ -1868,6 +2472,34 @@ sub editor { } else { return $errortxt; } + } elsif ($url =~ m{^/adm/$match_domain/$match_username/new/(smppg|bulletinboard)$}) { + my $type = $1; + my ($suffix,$errortxt,$locknotfreed) = + &new_timebased_suffix($coursedom,$coursenum,$type); + if ($locknotfreed) { + $r->print($locknotfreed); + } + if ($suffix) { + $url =~ s{^(/adm/$match_domain/$match_username)/new}{$1/$suffix}; + } else { + return $errortxt; + } + } elsif ($url =~ m{^/uploaded/$coursedom/$coursenum/(docs|supplemental)/(default|\d+)/new.html$}) { + if ($supplementalflag) { + next unless ($1 eq 'supplemental'); + if ($folder eq 'supplemental') { + next unless ($2 eq 'default'); + } else { + next unless ($folder eq 'supplemental_'.$2); + } + } else { + next unless ($1 eq 'docs'); + if ($folder eq 'default') { + next unless ($2 eq 'default'); + } else { + next unless ($folder eq 'default_'.$2); + } + } } push(@imports, [$name, $url, $residx]); } @@ -1934,8 +2566,13 @@ sub editor { $r->print(''); } - my ($to_show,$output); - + my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups); + %filters = ( + canremove => [], + cancut => [], + cancopy => [], + ); + %curr_groups = &Apache::longroup::coursegroups(); &Apache::loncommon::start_data_table_count(); #setup a row counter foreach my $res (@LONCAPA::map::order) { my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); @@ -1943,14 +2580,20 @@ sub editor { $url=&LONCAPA::map::qtescape($url); unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $idx++; next; } + push(@allidx,$res); + if ($url =~ m{/uploaded/.+\.(page|sequence)$}) { + push(@allmapidx,$res); + } $output .= &entryline($idx,$name,$url,$folder,$allowed,$res, $coursenum,$coursedom,$crstype, - $pathitem,$supplementalflag,$container); + $pathitem,$supplementalflag,$container, + \%filters,\%curr_groups); $idx++; $shown++; } &Apache::loncommon::end_data_table_count(); + my $need_save; if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) { my $toolslink = '' .&Apache::loncommon::help_open_menu('Navigation Screen', @@ -1968,13 +2611,44 @@ sub editor { .&Apache::loncommon::start_data_table(undef,'contentlist') .&Apache::loncommon::start_data_table_header_row() .' | '.&mt('Move').' | ' - .''.&mt('Actions').' | ' - .''.&mt('Document').' | '; + .''.&mt('Actions').' | ' + .''.&mt('Document').' | '; if ($folder !~ /^supplemental/) { $to_show .= ''.&mt('Settings').' | '; } - $to_show .= &Apache::loncommon::end_data_table_header_row() - .$output.' ' + $to_show .= &Apache::loncommon::end_data_table_header_row(); + if ($folder !~ /^supplemental/) { + $lists{'canhide'} = join(',',@allidx); + $lists{'canrandomlyorder'} = join(',',@allmapidx); + foreach my $item ('canremove','cancut','cancopy') { + if (ref($filters{$item}) eq 'ARRAY') { + $lists{$item} = join(',',@{$filters{$item}}); + } + } + if (@allidx > 0) { + my $path; + if ($env{'form.folderpath'}) { + $path = + &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + } + if (@allidx > 1) { + $to_show .= + &Apache::loncommon::continue_data_table_row(). + ''. + ' | '. + &multiple_check_form('actions',\%lists). + ' | '. + ''. + ' | '. + ' | '. + &multiple_check_form('settings',\%lists). + ' | '. + &Apache::loncommon::end_data_table_row(); + $need_save = 1; + } + } + } + $to_show .= $output.' ' .&Apache::loncommon::end_data_table() .'
---|