--- loncom/interface/londocs.pm 2013/05/27 00:07:52 1.484.2.35 +++ loncom/interface/londocs.pm 2013/03/13 00:29:09 1.536 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.484.2.35 2013/05/27 00:07:52 raeburn Exp $ +# $Id: londocs.pm,v 1.536 2013/03/13 00:29:09 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -323,9 +323,10 @@ 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')); + $name = &mt('Web Page'); } if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) { my $filepath = $1; @@ -340,8 +341,10 @@ sub group_import { } my $initialtext = &mt('Replace with your own content.'); my $newhtml = < + + + $name @@ -350,7 +353,7 @@ $initialtext END $env{'form.output'}=$newhtml; - my $result = + my $result = &Apache::lonnet::finishuserfileupload($coursenum,$coursedom, 'output', "$filepath/$residx/$fname.html"); @@ -364,7 +367,6 @@ END return (&mt('Failed to save new web page.'),1); } } - $url = &LONCAPA::map::qtunescape($url); $LONCAPA::map::resources[$residx] = join(':', ($name, $url, $ext, 'normal', 'res')); } @@ -375,7 +377,7 @@ END removefrommap => \%removefrommap, removeparam => \%removeparam, ); - my ($result,$msgsarray,$lockerror) = + my ($result,$msgsarray,$lockerror) = &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated); if (keys(%import_errors) > 0) { $fixuperrors = @@ -488,7 +490,7 @@ sub docs_change_log { } my $folderpath=$env{'form.folderpath'}; if ($folderpath eq '') { - $folderpath = 'default&'.&escape(&mt('Main Content').':::::'); + $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents').':::::'); } $pathitem = ''; @@ -653,115 +655,57 @@ sub docs_change_log { sub update_paste_buffer { my ($coursenum,$coursedom,$folder) = @_; - my (@possibles,%removals,%cuts); - if ($env{'form.multiremove'}) { - $env{'form.multiremove'} =~ s/,$//; - map { $removals{$_} = 1; } split(/,/,$env{'form.multiremove'}); - } - if (($env{'form.multicopy'}) || ($env{'form.multicut'})) { - if ($env{'form.multicut'}) { - $env{'form.multicut'} =~ s/,$//; - foreach my $item (split(/,/,$env{'form.multicut'})) { - unless ($removals{$item}) { - $cuts{$item} = 1; - push(@possibles,$item.':cut'); - } - } - } - if ($env{'form.multicopy'}) { - $env{'form.multicopy'} =~ s/,$//; - foreach my $item (split(/,/,$env{'form.multicopy'})) { - unless ($removals{$item} || $cuts{$item}) { - push(@possibles,$item.':copy'); - } - } - } - } elsif ($env{'form.markcopy'}) { - @possibles = split(/,/,$env{'form.markcopy'}); - } - return if (@possibles == 0); + return if (!defined($env{'form.markcopy'})); return if (!defined($env{'form.copyfolder'})); + return if ($env{'form.markcopy'} < 0); my ($errtext,$fatal) = &mapread($coursenum,$coursedom, $env{'form.copyfolder'}); - return if ($fatal); - my %curr_groups = &Apache::longroup::coursegroups(); - -# Retrieve current paste buffer suffixes. - my @currpaste = split(/,/,$env{'docs.markedcopies'}); - my (%pasteurls,@newpaste); - -# Construct identifiers for current contents of user's paste buffer - if (@currpaste) { - foreach my $suffix (@currpaste) { - my $cid = $env{'docs.markedcopy_crs_'.$suffix}; - my $url = $env{'docs.markedcopy_url_'.$suffix}; - if (($cid =~ /^$match_domain(?:_)$match_courseid$/) && - ($url ne '')) { - $pasteurls{$cid.'_'.$url}; - } - } - } - -# Mark items for copying (skip any items already in user's paste buffer) - my %addtoenv; - - foreach my $item (@possibles) { - my ($orderidx,$cmd) = split(/:/,$item); - next if ($orderidx =~ /\D/); - next unless (($cmd eq 'cut') || ($cmd eq 'copy') || ($cmd eq 'remove')); - my ($title,$url)=split(':',$LONCAPA::map::resources[$orderidx]); - my %denied = &action_restrictions($coursenum,$coursedom, - &LONCAPA::map::qtescape($url), - $env{'form.folderpath'},\%curr_groups); - next if ($denied{'copy'}); - $url=~s{http(:|:)//https(:|:)//}{https$2//}; - next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url})); - my ($suffix,$errortxt,$locknotfreed) = - &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste'); - push(@newpaste,$suffix); - if ($locknotfreed) { - return $locknotfreed; - last; - } - if (&is_supplemental_title($title)) { - &Apache::lonnet::appenv({'docs.markedcopy_supplemental_'.$suffix => $title}); - ($title) = &Apache::loncommon::parse_supplemental_title($title); - } + return if ($fatal); - $addtoenv{'docs.markedcopy_title_'.$suffix} = $title, - $addtoenv{'docs.markedcopy_url_'.$suffix} = $url, - $addtoenv{'docs.markedcopy_cmd_'.$suffix} = $cmd, - $addtoenv{'docs.markedcopy_crs_'.$suffix} = $env{'request.course.id'}; - - if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) { - my $prefix = $1; - my $subdir =$2; - if ($subdir eq '') { - $subdir = $prefix; +# Mark for copying + my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]); + if (&is_supplemental_title($title)) { + &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title}); + ($title) = &Apache::loncommon::parse_supplemental_title($title); + } elsif ($env{'docs.markedcopy_supplemental'}) { + &Apache::lonnet::delenv('docs.markedcopy_supplemental'); + } + $url=~s{http(:|:)//https(:|:)//}{https$2//}; + + (my $cmd,undef)=split('_',$env{'form.cmd'}); + + my %addtoenv = ( + 'docs.markedcopy_title' => $title, + 'docs.markedcopy_url' => $url, + 'docs.markedcopy_cmd' => $cmd, + ); + &Apache::lonnet::delenv('docs.markedcopy_nested'); + &Apache::lonnet::delenv('docs.markedcopy_nestednames'); + if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) { + my $prefix = $1; + my $subdir =$2; + if ($subdir eq '') { + $subdir = $prefix; + } + my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps); + &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps, + \%hierarchy,\%titles,\%allmaps); + if (ref($hierarchy{$url}) eq 'HASH') { + my ($nested,$nestednames); + &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames); + $nested =~ s/\&$//; + $nestednames =~ s/\Q___&&&___\E$//; + if ($nested ne '') { + $addtoenv{'docs.markedcopy_nested'} = $nested; } - my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps); - &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps, - \%hierarchy,\%titles,\%allmaps); - if (ref($hierarchy{$url}) eq 'HASH') { - my ($nested,$nestednames); - &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames); - $nested =~ s/\&$//; - $nestednames =~ s/\Q___&&&___\E$//; - if ($nested ne '') { - $addtoenv{'docs.markedcopy_nested_'.$suffix} = $nested; - } - if ($nestednames ne '') { - $addtoenv{'docs.markedcopy_nestednames_'.$suffix} = $nestednames; - } + if ($nestednames ne '') { + $addtoenv{'docs.markedcopy_nestednames'} = $nestednames; } } } - if (@newpaste) { - $addtoenv{'docs.markedcopies'} = join(',',(@currpaste,@newpaste)); - } &Apache::lonnet::appenv(\%addtoenv); delete($env{'form.markcopy'}); } @@ -793,200 +737,155 @@ sub recurse_uploaded_maps { sub print_paste_buffer { my ($r,$container,$folder,$coursedom,$coursenum) = @_; - return if (!defined($env{'docs.markedcopies'})); + return if (!defined($env{'docs.markedcopy_url'})); - unless (($env{'form.pastemarked'}) || ($env{'form.clearmarked'})) { - return if ($env{'docs.markedcopies'} eq ''); + my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent); + my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; + if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { + $is_external = 1; } - my @currpaste = split(/,/,$env{'docs.markedcopies'}); - my ($pasteitems,@pasteable); + my ($canpaste,$nopaste,$othercrs,$areachange); + if ($folder =~ /^supplemental/) { + $canpaste = &supp_pasteable($env{'docs.markedcopy_url'}); + unless ($canpaste) { + $nopaste = &mt('Paste into Supplemental Content unavailable for this type of content.'); + } + } else { + $canpaste = 1; + } -# 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 ($canpaste) { - if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { - my $srcdom = $1; - my $srcnum = $2; - my $rem = $3; - if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { - $othercourse = 1; - if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { - if ($canpaste) { - $othercrs = '
'.&mt('(from another course)'); - } - } else { - $canpaste = 0; - $nopaste = &mt('Paste from another course unavailable.'); - } - } - if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) { - my $prefix = $1; - $parent = $2; - if ($folder !~ /^\Q$prefix\E/) { - $areachange = 1; - } - $is_uploaded_map = 1; + if ($canpaste) { + if ($env{'docs.markedcopy_url'} =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { + my $srcdom = $1; + my $srcnum = $2; + my $rem = $3; + if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { + $othercourse = 1; + if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { + if ($canpaste) { + $othercrs = '
'.&mt('(from another course).'); } + } else { + $canpaste = 0; + $nopaste = &mt('Paste from another course unavailable.') } } - if ($canpaste) { - push(@pasteable,$suffix); - } - my $buffer; - if ($is_external) { - $buffer = &mt('External Resource').': '. - &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('. - &LONCAPA::map::qtescape($url).')'; - } else { - my $icon = &Apache::loncommon::icon($extension); - if ($extension eq 'sequence' && - $url =~ m{/default_\d+\.sequence$}x) { - $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL')); - $icon .= '/navmap.folder.closed.gif'; - } - $buffer = ''. - ': '. - &Apache::loncommon::parse_supplemental_title( - &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix})); - } - $pasteitems .= '
'; - my ($options,$onclick); - if (($canpaste) && (!$areachange) && (!$othercourse) && - ($env{'docs.markedcopy_cmd_'.$suffix} eq 'cut')) { - if (($is_uploaded_map) || - ($url =~ /(bulletinboard|smppg)$/) || - ($url =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) { - $options = &paste_options($suffix,$is_uploaded_map,$parent); - $onclick= 'onclick="showOptions(this,'."'$suffix'".');" '; - } - } - $pasteitems .= ''; - if ($nopaste) { - $pasteitems .= $nopaste; - } else { - if ($othercrs) { - $pasteitems .= $othercrs; - } - if ($options) { - $pasteitems .= $options; + if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) { + my $prefix = $1; + $parent = $2; + if ($folder !~ /^\Q$prefix\E/) { + $areachange = 1; } + $is_uploaded_map = 1; } - $pasteitems .= '
'; } } - if ($pasteitems eq '') { - &Apache::lonnet::delenv('docs.markedcopies'); - } - my ($pasteform,$form_start,$buttons,$form_end); - if ($pasteitems) { - $pasteitems .= '
'; - $form_start = '
'; - if (@pasteable) { - $buttons = ''.(' 'x2); - } - $buttons .= ''. - ''; - $form_end = '
'; - } else { - $pasteitems = &mt('Clipboard is empty'); - } - $r->print($form_start - .'
' - .''.&mt('Clipboard').(' ' x2).$buttons.'' - .$pasteitems - .'
' - .$form_end); -} - -sub paste_options { - my ($suffix,$is_uploaded_map,$parent) = @_; - my ($copytext,$movetext); - if ($is_uploaded_map) { - $copytext = &mt('Copy to new folder'); - $movetext = &mt('Move old'); - } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /bulletinboard$/) { - $copytext = &mt('Copy to new board'); - $movetext = &mt('Move (not posts)'); - } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /smppg$/) { - $copytext = &mt('Copy to new page'); - $movetext = &mt('Move'); + + $r->print('
' + .''.&mt('Clipboard').''); + my ($type,$buffer); + if ($is_external) { + $type = &mt('External Resource'); + $buffer = $type.': '. + &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('. + &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')'; } else { - $copytext = &mt('Copy to new file'); - $movetext = &mt('Move'); - } - my $output = '
'. - ''. - ''); + } } - &recurse_print(\$output,$parent,\%deps,\%display); - $output .= '
'; + $r->print('
'.$othercrs); + $r->print(' + +'); + $r->print(''); + } else { + $r->print(&mt('Paste buffer contains:').' '.$buffer. + '

'.$nopaste.'

'); } - $output .= ''; - return $output; + $r->print(''); } sub recurse_print { - my ($outputref,$dir,$deps,$display) = @_; - $$outputref .= $display->{$dir}."\n"; + my ($r,$dir,$deps,$display) = @_; + $r->print($display->{$dir}."\n"); if (ref($deps->{$dir}) eq 'ARRAY') { foreach my $subdir (@{$deps->{$dir}}) { - &recurse_print($outputref,$subdir,$deps,$display); + &recurse_print($r,$subdir,$deps,$display); } } } @@ -1005,485 +904,303 @@ sub supp_pasteable { sub paste_popup_js { my %lt = &Apache::lonlocal::texthash( - show => 'Show Options', - hide => 'Hide Options', - none => 'No items selected from clipboard.', + show => 'Show Paste Options', + hide => 'Hide Paste Options', ); return <<"END"; -function showPasteOptions(suffix) { - document.getElementById('pasteoptions_'+suffix).style.display='block'; - document.getElementById('pasteoptionstext_'+suffix).innerHTML = '    $lt{'hide'}'; +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'}
'; return; } -function hidePasteOptions(suffix) { - document.getElementById('pasteoptions_'+suffix).style.display='none'; - document.getElementById('pasteoptionstext_'+suffix).innerHTML ='    $lt{'show'}'; +function hidePasteOptions() { + document.getElementById('pasteoptions').style.display='none'; + document.getElementById('pasteoptionstext').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; -} - -function validateClipboard() { - var numchk = 0; - if (document.pasteform.pasting.length > 1) { - for (var i=0; i 0) { - return true; - } else { - alert("$lt{'none'}"); - return false; - } -} - 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 (@currpaste == 0) { + if (!$env{'form.pastemarked'}) { 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); } -# Early out if nothing available to paste - if (@topaste == 0) { - return(); - } - - my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate, - %prefixchg,%srcdom,%srcnum,%marktomove,$save_err,$lockerrors,$allresult, - %msgs); - - 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 ($folder =~ /^supplemental/) { + unless (&supp_pasteable($env{'docs.markedcopy_url'})) { + return (&mt('Paste failed: content type is not supported within Supplemental Content')); } - if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/}) { - my $srcd = $1; - my $srcn = $2; + } + +# 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 ($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; # 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 (($srcd ne $coursedom) || ($srcn ne $coursenum)) { - unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) { - $notincrs{$suffix} = 1; - next; - } +# 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.')); } - $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{$suffix} = 'docstosupp'; - } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) { - $prefixchg{$suffix} = 'supptodocs'; - } + 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 pasting an uploaded map, get list of contained uploaded maps. - 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); - } + 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); } - foreach my $item (@nested) { - if ($env{'form.docs.markedcopy_'.$suffix.'_'.$item} eq 'move') { - push(@{$marktomove{$suffix}},$type.'_'.$item); - } + } + foreach my $item (@nested) { + if ($env{'form.docs.markedcopy_'.$item} eq 'move') { + $tomove{$type.'_'.$item} = 1; } } } } -# 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 (%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}) { + my ($oldurl,%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies, + %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls); + $oldurl = $url; + if ($is_map) { # If pasting a map, check if map contains other maps - 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; + 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; } - } - } - 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; + $mapchanges{$url} = 1; } } } - } - 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}; + if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) || + (($newurl ne '') && ($newurl ne $url))) { + unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom, + $coursenum,$srcdom,$srcnum,$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, + $srcdom,$srcnum,$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.')); } } } - $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_'.$suffix}); - } - } else { - if ($folder=~/^supplemental/) { - $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'. - $env{'user.domain'}.'___&&&___'.$title; + } + my $lockerrors; + 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, + ); + my (%lockerr,$msg); + unless ($env{'form.docs.markedcopy_options'} eq 'move') { + 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; + } + return ($result,undef,[$msg],$lockerr{$prefix}); + } + if ($lockerr{$prefix}) { + $lockerrors = $lockerr{$prefix}; } } + } + $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. - unless ($is_map{$suffix}) { - my $newidx; + my $newidx; + unless ($is_map) { # 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; - } + $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) || + ($env{'form.docs.markedcopy_options'} 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') { + return (&mt('Paste failed: an error occurred saving the file.')); + } 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; - $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); + 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,my $msgsarray,my $lockerror) = + &apply_fixups($folder,$is_map,$coursedom,$coursenum,$errors, + \%updated,\%info,\%moves,$prefixchg,$oldurl,$url,'paste'); + $lockerrors .= $lockerror; + if ($result eq 'ok') { + if ($is_map) { + my ($errtext,$fatal) = &mapread($coursenum,$coursedom, + $folder.'.'.$container); + return ($errtext,$save_err,$msgsarray,$lockerrors) 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'}) { + if ($folder !~ /^supplemental/) { + (undef,undef,$title) = + &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'}); + } + } else { + if ($folder=~/^supplemental/) { + $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'. + $env{'user.domain'}.'___&&&___'.$title; + } + } + $LONCAPA::map::resources[$newidx]= $title.':'.$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); - } - } + my ($errtext,$fatal) = + &storemap($coursenum,$coursedom,$folder.'.'.$container,1); + if ($fatal) { + $save_err = $errtext; } } - &clear_from_buffer(\@toclear,\@currpaste); - my $msgsarray; - foreach my $suffix (keys(%msgs)) { - if (ref($msgs{$suffix}) eq 'ARRAY') { - $msgsarray .= join(',',@{$msgs{$suffix}}); - } - } - 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'); + 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'); } - 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; + return ($result,$save_err,$msgsarray,$lockerrors); } sub get_newmap_url { @@ -1553,7 +1270,7 @@ sub dbcopy { if (ref($dbref) eq 'HASH') { if ($url =~ m{/(smppg|bulletinboard)$}) { my $prefix = $1; - if (($dbref->{'cdom'} =~ /^$match_domain$/) && + if (($dbref->{'cdom'} =~ /^$match_domain$/) && ($dbref->{'cnum'} =~ /^$match_courseid$/)) { my $db_name; my $marker = (split(m{/},$url))[4]; @@ -1588,12 +1305,12 @@ sub dbcopy { my $photo = $contents{'uploaded.photourl'}; my ($subdir,$fname) = ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$}); - my $newphoto; + my $newphoto; if ($fname ne '') { my $content = &Apache::lonnet::getfile($photo); unless ($content eq '-1') { $env{'form.'.$suffix.'.photourl'} = $content; - $newphoto = + $newphoto = &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname"); delete($env{'form.'.$suffix.'.photourl'}); } @@ -1610,11 +1327,11 @@ sub dbcopy { } } if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) { - $lockerrorsref->{$prefix} = + $lockerrorsref->{$prefix} = '
'. &mt('There was a problem removing a lockfile.'); if ($prefix eq 'smppg') { - $lockerrorsref->{$prefix} .= + $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional simple pages in this course.'); } else { $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional bulletin boards in this course.'); @@ -1736,7 +1453,7 @@ sub url_paste_fixups { } next if ($token->[2]->{'type'} eq 'external'); if ($token->[2]->{'type'} eq 'zombie') { - next if ($skip); + next if ($skip); $zombies->{$oldurl}{$id} = $ressrc; $changed = 1; } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { @@ -2027,8 +1744,7 @@ sub apply_fixups { if (defined($LONCAPA::map::resources[$idx])) { my $changed; my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$idx]); - if ((exists($toremove{$idx})) && - ($toremove{$idx} eq &LONCAPA::map::qtescape($src))) { + if ((exists($toremove{$idx})) && ($toremove{$idx} eq $src)) { splice(@LONCAPA::map::order,$i,1); if (ref($currparam{$idx}) eq 'ARRAY') { foreach my $name (@{$currparam{$idx}}) { @@ -2067,7 +1783,7 @@ sub apply_fixups { $changed = 1; } if ($changed) { - $LONCAPA::map::resources[$idx] = join(':',($title,&LONCAPA::map::qtunescape($src),$ext,$type)); + $LONCAPA::map::resources[$idx] = join(':',($title,$src,$ext,$type)); } } } @@ -2173,109 +1889,34 @@ my %parameter_type = ( 'randompick' my $valid_parameters_re = join('|',keys(%parameter_type)); # set parameters sub update_parameter { - 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 { - 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); + return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/); - &remember_parms($idx,$which,'del'); - } - return 1; + 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); + } else { + &LONCAPA::map::delparameter($idx,'parameter_'.$which); + + &remember_parms($idx,$which,'del'); } + return 1; } sub handle_edit_cmd { my ($coursenum,$coursedom) =@_; - if ($env{'form.cmd'} eq '') { - return 0; - } 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 'remove') { + if ($cmd eq 'del') { if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && ($url!~/$LONCAPA::assess_page_seq_re/)) { &Apache::lonnet::removeuploadedurl($url); @@ -2297,6 +1938,7 @@ 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]]= @@ -2305,7 +1947,6 @@ sub handle_edit_cmd { # Devalidate title cache my $renamed_url=&LONCAPA::map::qtescape($url); &Apache::lonnet::devalidate_title_cache($renamed_url); - } else { return 0; } @@ -2330,7 +1971,7 @@ sub editor { my $jumpto; unless ($supplementalflag) { - $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container"; + $jumpto = "'uploaded/$coursedom/$coursenum/$folder.$container'"; } unless ($allowed) { @@ -2374,33 +2015,27 @@ sub editor { 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('

'. - join('
',@{$pastemsgarray}). + if (ref($pastemsgarray) eq 'ARRAY') { + if (@{$pastemsgarray} > 0) { + + $r->print('

'. + join('
',@{$pastemsgarray}). + '

'); + } + } + if ($lockerror) { + $r->print('

'. + $lockerror. '

'); } - } - if ($lockerror) { - $r->print('

'. - $lockerror. - '

'); - } - if ($save_error ne '') { - return $save_error; - } - if ($paste_res) { - my %errortext = &Apache::lonlocal::texthash ( - fail => 'Storage of folder contents failed', - failread => 'Reading folder contents failed', - failstore => 'Storage of folder contents failed', - ); - if ($errortext{$paste_res}) { - $r->print('

'.$errortext{$paste_res}.'

'); + if ($save_error ne '') { + return $save_error; } + if ($paste_res ne 'ok') { + $r->print('

'.$paste_res.'

'); } if (keys(%paste_errors) > 0) { - $r->print('

'."\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". '

    '."\n"); foreach my $key (sort(keys(%paste_errors))) { @@ -2408,81 +2043,18 @@ sub editor { } $r->print('

'."\n"); } - } elsif ($env{'form.clearmarked'}) { - my $output = &do_buffer_empty(); - if ($output) { - $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'} =~ m{^(del|cut)_}) { + if ($env{'form.cmd'} =~ /^(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; @@ -2595,17 +2167,8 @@ sub editor { $r->print('
'); } - my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups); - %filters = ( - canremove => [], - cancut => [], - cancopy => [], - hiddenresource => [], - encrypturl => [], - randomorder => [], - randompick => [], - ); - %curr_groups = &Apache::longroup::coursegroups(); + my ($to_show,$output); + &Apache::loncommon::start_data_table_count(); #setup a row counter foreach my $res (@LONCAPA::map::order) { my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); @@ -2613,24 +2176,16 @@ 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, - \%filters,\%curr_groups); + $pathitem,$supplementalflag,$container); $idx++; $shown++; } &Apache::loncommon::end_data_table_count(); - my $need_save; if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) { - my $toolslink; - if ($allowed || &Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { - $toolslink = '' - .'' - .''; + .'' + .''; if ($folder !~ /^supplemental/) { $to_show .= ''; } - $to_show .= &Apache::loncommon::end_data_table_header_row(); - if ($folder !~ /^supplemental/) { - $lists{'canhide'} = join(',',@allidx); - $lists{'canrandomlyorder'} = join(',',@allmapidx); - my @possfilters = ('canremove','cancut','cancopy','hiddenresource','encrypturl', - 'randomorder','randompick'); - foreach my $item (@possfilters) { - if (ref($filters{$item}) eq 'ARRAY') { - if (@{$filters{$item}} > 0) { - $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(). - ''. - ''. - ''. - ''. - ''. - &Apache::loncommon::end_data_table_row(); - $need_save = 1; - } - } - } - $to_show .= $output.' ' + $to_show .= &Apache::loncommon::end_data_table_header_row() + .$output.' ' .&Apache::loncommon::end_data_table() .'
' .&Apache::loncommon::end_scrollbox(); @@ -2704,7 +2223,7 @@ sub editor { } $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll') .'
' - .&mt('Currently empty') + .&mt('Currently no documents.') .'
' .&Apache::loncommon::end_scrollbox(); } @@ -2717,7 +2236,7 @@ sub editor { .''; } else { $to_show = '
' - .&mt('Currently empty') + .&mt('Currently no documents.') .'
' } } @@ -2727,8 +2246,8 @@ sub editor { } if ($allowed) { my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; - $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath, - $jumpto,$readfile,$need_save,"$folder.$container")); + $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, + $readfile)); &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum); } else { $r->print($to_show); @@ -2736,71 +2255,6 @@ sub editor { return; } -sub multiple_check_form { - my ($caller,$listsref) = @_; - return unless (ref($listsref) eq 'HASH'); - my $output = - ''. - ''. - ''.(' 'x2).''. - '
' + my $toolslink = '' @@ -2640,55 +2195,19 @@ sub editor { .'class="LC_toolbarItem" ' .'title="'.&mt('Supplemental Content Editor').'">' .'
' .&Apache::loncommon::help_open_menu('Navigation Screen', 'Navigation_Screen',undef,'RAT') .''.&mt('Tools:').'

'; - } if ($shown) { if ($allowed) { $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll') .&Apache::loncommon::start_data_table(undef,'contentlist') .&Apache::loncommon::start_data_table_header_row() .'
'.&mt('Move').''.&mt('Actions').''.&mt('Document').''.&mt('Actions').''.&mt('Document').''.&mt('Settings').' '. - &multiple_check_form('actions',\%lists). - '  '. - &multiple_check_form('settings',\%lists). - '
'. - ''. - ''. - ''."\n". - ''. - '
'. - ''. - ''. - '
'. - ''. - '
'."\n"; - } else { - $output .= - ''. - ''. - ''."\n". - ''. - '
'. - ''. - ''. - ''. - ''. - ''. - '
'."\n"; - } - $output .= - ''. - ''; - if ($caller eq 'settings') { - $output .= - ''."\n". - ''."\n". - ''."\n". - ''."\n". - ''."\n"; - } elsif ($caller eq 'actions') { - $output .= - ''. - ''. - ''; - } - $output .= - ''. - ''; - return $output; -} - sub process_file_upload { my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_; # upload a file, if present @@ -2960,7 +2414,7 @@ sub is_supplemental_title { sub entryline { my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom, - $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups)=@_; + $crstype,$pathitem,$supplementalflag,$container)=@_; my ($foldertitle,$renametitle); if (&is_supplemental_title($title)) { ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title); @@ -2976,7 +2430,7 @@ sub entryline { $renametitle=~s/\"\;/\\\"/g; $renametitle=~s/ /%20/g; my $line=&Apache::loncommon::start_data_table_row(); - my ($form_start,$form_end,$form_common,$form_param); + my ($form_start,$form_end,$form_common); # Edit commands my ($esc_path, $path, $symb); if ($env{'form.folderpath'}) { @@ -3000,25 +2454,8 @@ sub entryline { &Apache::lonnet::declutter($currurl)); } } - my ($renamelink,%lt,$ishash); - if (ref($filtersref) eq 'HASH') { - $ishash = 1; - } - + my ($renamelink,%lt); if ($allowed) { - $form_start = ' -
-'; - $form_common=(< - -END - $form_param=(< - -END - $form_end = ''; - my $incindex=$index+1; my $selectbox=''; if (($#LONCAPA::map::order>0) && @@ -3054,9 +2491,66 @@ END 'ul' => 'URL', 'ti' => 'Title', ); - my %denied = &action_restrictions($coursenum,$coursedom,$url, - $env{'form.folderpath'}, - $currgroups); + my $nocopy=0; + my $nocut=0; + my $noremove=0; + if ($url=~ m{^/res/.+\.(page|sequence)$}) { + # no copy for published maps + $nocopy=1; + } + if ($url=~/^\/res\/lib\/templates\//) { + $nocopy=1; + $nocut=1; + } + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") { + if ($env{'form.folderpath'} =~ /^default&[^\&]+$/) { + my %curr_groups = &Apache::longroup::coursegroups(); + if (keys(%curr_groups) > 0) { + $noremove=1; + } + $nocut=1; + $nocopy=1; + } + } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) { + my $group = $1; + if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) { + my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); + if (keys(%curr_group) > 0) { + $noremove=1; + } + } + $nocut=1; + $nocopy=1; + } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) { + my $group = $1; + if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) { + my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); + my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group}); + if (keys(%groupsettings) > 0) { + $noremove=1; + } + $nocut=1; + $nocopy=1; + } + } elsif ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) { + my $group = $1; + my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); + if ($url =~ /group_boards_\Q$group\E/) { + my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); + my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group}); + if (keys(%groupsettings) > 0) { + if (ref($groupsettings{'functions'}) eq 'HASH') { + if ($groupsettings{'functions'}{'discussion'} eq 'on') { + $noremove=1; + } + } + } + $nocut=1; + $nocopy=1; + } + } my ($copylink,$cutlink,$removelink); my $skip_confirm = 0; if ( $folder =~ /^supplemental/ @@ -3070,62 +2564,48 @@ END $skip_confirm = 1; } - if ($denied{'copy'}) { - $copylink=(<$lt{'cp'} ENDCOPY } else { - my $formname = 'edit_copy_'.$orderidx; - my $js = "javascript:checkForSubmit(document.forms.renameform,'copy','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');"; $copylink=(< -$form_common -$lt{'cp'} -$form_end +$lt{'cp'} ENDCOPY - if (($ishash) && (ref($filtersref->{'cancopy'}) eq 'ARRAY')) { - push(@{$filtersref->{'cancopy'}},$orderidx); - } } - if ($denied{'cut'}) { + if ($nocut) { $cutlink=(<$lt{'ct'} ENDCUT } else { - my $formname = 'edit_cut_'.$orderidx; - my $js = "javascript:checkForSubmit(document.forms.renameform,'cut','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');"; $cutlink=(< -$form_common - -$lt{'ct'} -$form_end +$lt{'ct'} ENDCUT - if (($ishash) && (ref($filtersref->{'cancut'}) eq 'ARRAY')) { - push(@{$filtersref->{'cancut'}},$orderidx); - } } - if ($denied{'remove'}) { + if ($noremove) { $removelink=(<$lt{'rm'} ENDREM } else { - my $formname = 'edit_remove_'.$orderidx; - my $js = "javascript:checkForSubmit(document.forms.renameform,'remove','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm);"; $removelink=(< -$form_common - -$lt{'rm'} -$form_end +$lt{'rm'} ENDREM - if (($ishash) && (ref($filtersref->{'canremove'}) eq 'ARRAY')) { - push(@{$filtersref->{'canremove'}},$orderidx); - } } - $renamelink=(<$lt{'rn'} ENDREN + } + $form_start = ' +
+'; + $form_common=(< + + + +END + $form_end = ''; $line.=(<
@@ -3141,17 +2621,18 @@ ENDREN $form_start - $form_param $form_common $selectbox $form_end - + $removelink $cutlink $copylink + END + } # Figure out what kind of a resource this is my ($extension)=($url=~/\.(\w+)$/); @@ -3236,35 +2717,22 @@ END my $rpckchk; if ($rpicknum) { $rpckchk = ' checked="checked"'; - if (($ishash) && (ref($filtersref->{'randompick'}) eq 'ARRAY')) { - push(@{$filtersref->{'randompick'}},$orderidx.':'.$rpicknum); - } } - my $formname = 'edit_randompick_'.$orderidx; + my $formname = 'edit_rpick_'.$orderidx; $rand_pick_text = '
'."\n". -$form_param."\n". $form_common."\n". -''; +''; if ($rpicknum ne '') { $rand_pick_text .= ': '.$rpicknum.''; } - $rand_pick_text .= ''. - $form_end; - my $ro_set; - if ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i) { - $ro_set = 'checked="checked"'; - if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) { - push(@{$filtersref->{'randomorder'}},$orderidx); - } - } - my $formname = 'edit_rorder_'.$orderidx; + $rand_pick_text .= '
'; + my $ro_set= + ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':''); $rand_order_text = -'
'."\n". -$form_param."\n". -$form_common."\n". -''. -$form_end; +$form_start. +$form_common.' +
'; } } elsif ($supplementalflag && !$allowed) { $url .= ($url =~ /\?/) ? '&':'?'; @@ -3334,33 +2802,20 @@ $form_end; my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', 'ec' => 'URL hidden'); - my ($enctext,$hidtext); - if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) { - $enctext = ' checked="checked"'; - if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) { - push(@{$filtersref->{'encrypturl'}},$orderidx); - } - } - if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { - $hidtext = ' checked="checked"'; - if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) { - push(@{$filtersref->{'hiddenresource'}},$orderidx); - } - } - my $formhidden = 'edit_hiddenresource_'.$orderidx; - my $formurlhidden = 'edit_encrypturl_'.$orderidx; + my $enctext= + ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':''); + my $hidtext= + ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':''); $line.=(< -
- $form_param + $form_start $form_common - + $form_end
- - $form_param + $form_start $form_common - + $form_end $rand_pick_text
@@ -3371,75 +2826,10 @@ ENDPARMS return $line; } -sub action_restrictions { - my ($cnum,$cdom,$url,$folderpath,$currgroups) = @_; - my %denied = ( - cut => 0, - copy => 0, - remove => 0, - ); - if ($url=~ m{^/res/.+\.(page|sequence)$}) { - # no copy for published maps - $denied{'copy'} = 1; - } elsif ($url=~m{^/res/lib/templates/}) { - $denied{'copy'} = 1; - $denied{'cut'} = 1; - } elsif ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") { - if ($folderpath =~ /^default&[^\&]+$/) { - if ((ref($currgroups) eq 'HASH') && (keys(%{$currgroups}) > 0)) { - $denied{'remove'} = 1; - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } - } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) { - my $group = $1; - if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) { - if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) { - $denied{'remove'} = 1; - } - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) { - my $group = $1; - if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) { - if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) { - my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group}); - if (keys(%groupsettings) > 0) { - $denied{'remove'} = 1; - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } - } - } elsif ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) { - my $group = $1; - if ($url =~ /group_boards_\Q$group\E/) { - if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) { - my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group}); - if (keys(%groupsettings) > 0) { - if (ref($groupsettings{'functions'}) eq 'HASH') { - if ($groupsettings{'functions'}{'discussion'} eq 'on') { - $denied{'remove'} = 1; - } - } - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } - } - } - return %denied; -} - sub new_timebased_suffix { - my ($dom,$num,$type,$area,$container) = @_; + my ($coursedom,$coursenum,$type,$area,$container) = @_; my ($prefix,$namespace,$idtype,$errtext,$locknotfreed); - if ($type eq 'paste') { - $prefix = $type; - $namespace = 'courseeditor'; - } elsif ($type eq 'map') { + if ($type eq 'map') { $prefix = 'docs'; if ($area eq 'supplemental') { $prefix = 'supp'; @@ -3452,11 +2842,10 @@ sub new_timebased_suffix { } $idtype = 'concat'; my ($suffix,$freedlock,$error) = - &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num); + &Apache::lonnet::get_timebased_id($prefix,'num',$namespace, + $coursedom,$coursenum); if (!$suffix) { - if ($type eq 'paste') { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix when adding to the paste buffer.'); - } elsif ($type eq 'map') { + if ($type eq 'map') { $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.'); } elsif ($type eq 'smppg') { $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.'); @@ -3468,12 +2857,10 @@ sub new_timebased_suffix { } } if ($freedlock ne 'ok') { - $locknotfreed = + $locknotfreed = '
'. &mt('There was a problem removing a lockfile.').' '; - if ($type eq 'paste') { - &mt('This will prevent use of the paste buffer until th next log-in.'); - } elsif ($type eq 'map') { + if ($type eq 'map') { &mt('This will prevent creation of additional folders or composite pages in this course.'); } elsif ($type eq 'smppg') { $locknotfreed .= @@ -3482,11 +2869,9 @@ sub new_timebased_suffix { $locknotfreed .= &mt('This will prevent creation of additional bulletin boards in this course.'); } - unless ($type eq 'paste') { - $locknotfreed .= - ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.'); - } - $locknotfreed .= '
'; + $locknotfreed .= + ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.'). + '
'; } return ($suffix,$errtext,$locknotfreed); } @@ -3649,8 +3034,8 @@ sub list_symbs { sub verifycontent { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content')); + $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); $r->print(&startContentScreen('tools')); $r->print('

'.&mt($crstype.' content verification').'

'); $hashtied=0; @@ -3752,7 +3137,7 @@ sub checkversions { &changewarning($r,''); if ($env{'form.timerange'} eq 'all') { # show all documents - $header=&mt('All content in '.$crstype); + $header=&mt('All Documents in '.$crstype); $allsel=' selected="selected"'; foreach my $key (keys(%hash)) { if ($key=~/^ids\_(\/res\/.+)$/) { @@ -4027,9 +3412,10 @@ sub startContentScreen { if (($mode eq 'navmaps') || ($mode eq 'supplemental')) { $output .= '    '.&mt('Content Overview').'    '."\n"; $output .= '     '.&mt('Content Search').'     '."\n"; + $output .= '      '.&mt('Content Index').'      '."\n"; $output .= '
  • '.&mt('Supplemental Content').'
  • '; } else { - $output .= '
  •       '.&mt('Main Content Editor').'      
  • '."\n"; + $output .= '
  •       '.&mt('Content Editor').'      
  • '."\n"; $output .= '
  • '.&mt('Supplemental Content Editor').'
  • '."\n"; $output .= '
  •       '.&mt('Content Utilities').'      
  • '."\n"; '>      '.&mt('Content Utilities').'      '; @@ -4050,7 +3436,7 @@ sub endContentScreen { } sub supplemental_base { - return 'supplemental&'.&escape(&mt('Supplemental Content')); + return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content')); } sub handler { @@ -4149,7 +3535,7 @@ sub handler { # supplementalflag=0: show standard documents # toolsflag=1: show utilities - $env{'form.folderpath'} = &unescape($env{'form.folderpath'}); + my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); if (($env{'form.folderpath'}=~/^default/) || ($env{'form.folderpath'} eq "")) { $supplementalflag=0; @@ -4183,11 +3569,12 @@ sub handler { } } elsif ($env{'form.command'} eq 'editdocs') { $env{'form.folderpath'} = 'default&'. - &escape(&mt('Main Content').':::::'); + &Apache::lonhtmlcommon::entity_encode('Main Course Content'). + ':::::'; &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}}); } elsif ($env{'form.command'} eq 'editsupp') { $env{'form.folderpath'} = 'supplemental&'. - &escape('Supplemental Content'); + &Apache::lonhtmlcommon::entity_encode('Supplemental Content'); &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'}); } elsif ($env{'form.command'} eq 'contents') { &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'}); @@ -4228,8 +3615,8 @@ sub handler { if ($supplementalflag) { $env{'form.folderpath'}=&supplemental_base(); } else { - $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'). - ':::::'); + $env{'form.folderpath'}='default'.&escape(&mt('Main '.$crstype.' Documents')). + ':::::'; } } @@ -4254,7 +3641,8 @@ sub handler { if ($env{'form.folder'} eq '' || $env{'form.folder'} eq 'supplemental') { $folderpath='default&'. - &escape(&mt('Main Content').':::::'); + &escape(&mt('Main '.$crstype.' Documents')). + ':::::'; } } $containertag = ''; @@ -4311,7 +3699,9 @@ sub handler { onload => "javascript:resize_scrollbox('contentscroll','1','1');", }; } - $script .= &paste_popup_js(); + if ($env{'docs.markedcopy_url'}) { + $script .= &paste_popup_js(); + } my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'. &mt('Switch server?'); @@ -4337,6 +3727,7 @@ sub handler { } else { &Apache::lonhtmlcommon::add_breadcrumb({ href=>"/adm/coursedocs",text=>"$crstype Contents"}); + $r->print(&Apache::loncommon::start_page("$crstype Contents", $script, {'add_entries' => $addentries} ) @@ -4422,7 +3813,7 @@ sub handler { 'navc' => 'Table of Contents', 'sipa' => 'Simple Course Page', 'sipr' => 'Simple Problem', - 'webp' => 'Blank Web Page (editable)', + 'webp' => 'Blank Web Page (editable)', 'drbx' => 'Drop Box', 'scuf' => 'External Scores (handgrade, upload, clicker)', 'bull' => 'Discussion Board', @@ -4537,10 +3928,7 @@ SEDFFORM if ($folder eq '') { $folder='default'; } - my $output = &update_paste_buffer($coursenum,$coursedom,$folder); - if ($output) { - $r->print($output); - } + &update_paste_buffer($coursenum,$coursedom,$folder); $r->print(< @@ -4579,7 +3967,7 @@ HIDDENFORM if ($folder eq '' || $supplementalflag) { $folder='default'; $savefolderpath = $env{'form.folderpath'}; - $env{'form.folderpath'}='default&'.&escape(&mt('Main Content')); + $env{'form.folderpath'}='default&'.&escape(&mt('Content')); $pathitem = ''; } @@ -5153,7 +4541,7 @@ sub generate_admin_menu { foreach my $aurole (keys(%outhash)) { unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) { push(@hosts,$outhash{$aurole}); - } + } } if (@hosts == 1) { my $switchto = '/adm/switchserver?otherserver='.$hosts[0]. @@ -5217,8 +4605,7 @@ sub generate_admin_menu { } sub generate_edit_table { - my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile, - $need_save,$copyfolder) = @_; + my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile) = @_; return unless(ref($orderhash_ref) eq 'HASH'); my %orderhash = %{$orderhash_ref}; my $form; @@ -5232,7 +4619,7 @@ sub generate_edit_table { $form = '
    '. '