[LON-CAPA-cvs] cvs: loncom /interface londocs.pm
raeburn
raeburn at source.lon-capa.org
Sun Mar 31 18:36:01 EDT 2013
raeburn Sun Mar 31 22:36:01 2013 EDT
Modified files:
/loncom/interface londocs.pm
Log:
- Bug 4900 (second, and final part).
- Checkboxes for remove, cut, copy can be selected for multiple items
in a folder and submitted all at once.
- Clipboard can contain multiple items
- Clipboard now has "Paste selected" and "Clear selected" buttons
(clear removes checked items from clipboard).
- Clipboard contents stored in user's %env, persist across role
changes, but eliminated on log-out.
-------------- next part --------------
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.537 loncom/interface/londocs.pm:1.538
--- loncom/interface/londocs.pm:1.537 Sun Mar 17 14:27:34 2013
+++ loncom/interface/londocs.pm Sun Mar 31 22:36:01 2013
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.537 2013/03/17 14:27:34 raeburn Exp $
+# $Id: londocs.pm,v 1.538 2013/03/31 22:36:01 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -323,10 +323,9 @@
}
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 = &mt('Web Page');
+ $name = &LONCAPA::map::qtunescape(&mt('Web Page'));
}
if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {
my $filepath = $1;
@@ -367,6 +366,7 @@
return (&mt('Failed to save new web page.'),1);
}
}
+ $url = &LONCAPA::map::qtunescape($url);
$LONCAPA::map::resources[$residx] =
join(':', ($name, $url, $ext, 'normal', 'res'));
}
@@ -490,7 +490,7 @@
}
my $folderpath=$env{'form.folderpath'};
if ($folderpath eq '') {
- $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents').':::::');
+ $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Content').':::::');
}
$pathitem = '<input type="hidden" name="folderpath" value="'.
&HTML::Entities::encode($folderpath,'<>&"').'" />';
@@ -655,57 +655,115 @@
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 (!defined($env{'form.markcopy'}));
+ return if (@possibles == 0);
return if (!defined($env{'form.copyfolder'}));
- return if ($env{'form.markcopy'} < 0);
my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
$env{'form.copyfolder'});
-
return if ($fatal);
-# 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 %curr_groups = &Apache::longroup::coursegroups();
+
+# Retrieve current paste buffer suffixes.
+ my @currpaste = split(/,/,$env{'docs.markedcopies'});
+ my (%pasteurls, at 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);
+ }
+
+ $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;
}
- if ($nestednames ne '') {
- $addtoenv{'docs.markedcopy_nestednames'} = $nestednames;
+ 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 (@newpaste) {
+ $addtoenv{'docs.markedcopies'} = join(',',(@currpaste, at newpaste));
+ }
&Apache::lonnet::appenv(\%addtoenv);
delete($env{'form.markcopy'});
}
@@ -737,155 +795,200 @@
sub print_paste_buffer {
my ($r,$container,$folder,$coursedom,$coursenum) = @_;
- return if (!defined($env{'docs.markedcopy_url'}));
+ return if (!defined($env{'docs.markedcopies'}));
- 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;
+ unless (($env{'form.pastemarked'}) || ($env{'form.clearmarked'})) {
+ return if ($env{'docs.markedcopies'} eq '');
}
- 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;
- }
+ my @currpaste = split(/,/,$env{'docs.markedcopies'});
+ my ($pasteitems, at pasteable);
- 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 = '<br />'.&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 ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {
- my $prefix = $1;
- $parent = $2;
- if ($folder !~ /^\Q$prefix\E/) {
- $areachange = 1;
+ if ($folder =~ /^supplemental/) {
+ $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix});
+ unless ($canpaste) {
+ $nopaste = &mt('Paste into Supplemental Content unavailable.');
}
- $is_uploaded_map = 1;
+ } else {
+ $canpaste = 1;
}
- }
- }
-
- $r->print('<fieldset>'
- .'<legend>'.&mt('Clipboard').'</legend>');
- 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 {
- my $icon = &Apache::loncommon::icon($extension);
- if ($extension eq 'sequence' &&
- $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
- $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
- $icon .= '/navmap.folder.closed.gif';
- }
- $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';
- $buffer = $icon.$type.': '. &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}));
- }
- if ($canpaste) {
- $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);
- if ((!$areachange) && (!$othercourse) &&
- ($env{'docs.markedcopy_cmd'} eq 'cut')) {
- if (($is_uploaded_map) ||
- ($env{'docs.markedcopy_url'} =~ /(bulletinboard|smppg)$/) ||
- ($env{'docs.markedcopy_url'} =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) {
- my ($copytext,$movetext);
- if ($is_uploaded_map) {
- $copytext = &mt('Copy to new folder');
- $movetext = &mt('Move old folder');
- } elsif ($env{'docs.markedcopy_url'} =~ /bulletinboard$/) {
- $copytext = &mt('Copy to new bulletin board (not posts)');
- $movetext = &mt('Move old bulletin board (not posts)');
- } elsif ($env{'docs.markedcopy_url'} =~ /smppg$/) {
- $copytext = &mt('Copy to new simple page');
- $movetext = &mt('Move old simple page');
- } else {
- $copytext = &mt('Copy to new uploaded document');
- $movetext = &mt('Move old uploaded document');
- }
- $r->print((' 'x 4).'<span id="pasteoptionstext">'.
- '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.
- &mt('Show Paste Options').'</a></span><br />'.
- '<div id="pasteoptions" class="LC_dccid">'.(' 'x 4).
- '<label>'.
- '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.
- $copytext.'</label>'.(' ' x2).
- '<label>'.
- '<input type="radio" name="docs.markedcopy_options" value="move" />'.
- $movetext.'</label><br />');
- if (($is_uploaded_map) && ($env{'docs.markedcopy_nested'})) {
- $r->print('<br />'.&mt('Folder to paste contains sub-folders').
- '<br /><table border="0">');
- my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});
- my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames'});
- my $lastdir = $parent;
- my %depths = (
- $lastdir => 0,
- );
- my (%display,%deps);
- for (my $i=0; $i<@pastemaps; $i++) {
- ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]);
- my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]);
- my @subfolders = split(/,/,$subfolderstr);
- $deps{$lastdir} = \@subfolders;
- my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr);
- my $depth = $depths{$lastdir} + 1;
- my $offset = int($depth * 4);
- my $indent = (' ' x $offset);
- for (my $j=0; $j<@subfolders; $j++) {
- $depths{$subfolders[$j]} = $depth;
- $display{$subfolders[$j]} =
- '<tr><td>'.$indent.$subfoldertitles[$j].' </td>'.
- '<td><label>'.
- '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.(' ' x2).
- '<label>'.
- '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="move" />'.
- &mt('Move old').'</label>'.
- '</td></tr>';
+ 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 = '<br />'.&mt('(from another course).');
+ }
+ } else {
+ $canpaste = 0;
+ $nopaste = &mt('Paste from another course unavailable.');
}
}
- &recurse_print($r,$parent,\%deps,\%display);
- $r->print('</table>');
+ 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) {
+ 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 = '<img src="'.$icon.'" alt="" class="LC_icon" />'.
+ ': '.
+ &Apache::loncommon::parse_supplemental_title(
+ &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}));
+ }
+ $pasteitems .= '<div class="LC_left_float">';
+ 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 .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';
+ if ($nopaste) {
+ $pasteitems .= $nopaste;
+ } else {
+ if ($othercrs) {
+ $pasteitems .= $othercrs;
+ }
+ if ($options) {
+ $pasteitems .= $options;
}
- $r->print('</div>');
}
+ $pasteitems .= '</div>';
}
- $r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs);
- $r->print('
- <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
-');
- $r->print('</form>');
+ }
+ if ($pasteitems eq '') {
+ &Apache::lonnet::delenv('docs.markedcopies');
+ }
+ my ($pasteform,$form_start,$buttons,$form_end);
+ if ($pasteitems) {
+ $pasteitems .= '<div style="padding:0;clear:both;margin:0;border:0"></div>';
+ $form_start = '<form name="pasteform" action="/adm/coursedocs" method="post">';
+ if (@pasteable) {
+ $buttons = '<input type="submit" name="pastemarked" value="'.&mt('Paste selected').'" />'.(' 'x2);
+ }
+ $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Clear selected').'" />'.
+ '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
+ $form_end = '</form>';
} else {
- $r->print(&mt('Paste buffer contains:').' '.$buffer.
- '<br /><p class="LC_info">'.$nopaste.'</p>');
+ $pasteitems = &mt('Clipboard is empty');
}
- $r->print('</fieldset>');
+ $r->print($form_start
+ .'<fieldset>'
+ .'<legend>'.&mt('Clipboard').(' ' x2).$buttons.'</legend>'
+ .$pasteitems
+ .'</fieldset>'
+ .$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');
+ } else {
+ $copytext = &mt('Copy to new file');
+ $movetext = &mt('Move');
+ }
+ my $output = '<br />'.
+ '<span id="pasteoptionstext_'.$suffix.'" class="LC_fontsize_small LC_nobreak"></span>'.
+ '<div id="pasteoptions_'.$suffix.'" class="LC_dccid" style="display:none;"><span class="LC_nobreak">'.(' 'x 4).
+ '<label>'.
+ '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="new" checked="checked" />'.
+ $copytext.'</label></span>'.(' 'x2).' '.
+ '<span class="LC_nobreak"><label>'.
+ '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="move" />'.
+ $movetext.'</label></span>';
+ if (($is_uploaded_map) && ($env{'docs.markedcopy_nested_'.$suffix})) {
+ $output .= '<br /><fieldset><legend>'.&mt('Folder to paste contains sub-folders').
+ '</legend><table border="0">';
+ my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix});
+ my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames_'.$suffix});
+ my $lastdir = $parent;
+ my %depths = (
+ $lastdir => 0,
+ );
+ my (%display,%deps);
+ for (my $i=0; $i<@pastemaps; $i++) {
+ ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]);
+ my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]);
+ my @subfolders = split(/,/,$subfolderstr);
+ $deps{$lastdir} = \@subfolders;
+ my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr);
+ my $depth = $depths{$lastdir} + 1;
+ my $offset = int($depth * 4);
+ my $indent = (' ' x $offset);
+ for (my $j=0; $j<@subfolders; $j++) {
+ $depths{$subfolders[$j]} = $depth;
+ $display{$subfolders[$j]} =
+ '<tr><td>'.$indent.$subfoldertitles[$j].' </td>'.
+ '<td><label>'.
+ '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.(' ' x2).
+ '<label>'.
+ '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="move" />'.
+ &mt('Move old').'</label>'.
+ '</td></tr>';
+ }
+ }
+ &recurse_print(\$output,$parent,\%deps,\%display);
+ $output .= '</table></fieldset>';
+ }
+ $output .= '</div>';
+ 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);
}
}
}
@@ -904,22 +1007,34 @@
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 ='<a href="javascript:hidePasteOptions();" class="LC_menubuttons_link">$lt{'hide'}</a><br />';
+function showPasteOptions(suffix) {
+ document.getElementById('pasteoptions_'+suffix).style.display='block';
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML = ' <a href="javascript:hidePasteOptions(\\''+suffix+'\\');" class="LC_menubuttons_link">$lt{'hide'}</a>';
return;
}
-function hidePasteOptions() {
- document.getElementById('pasteoptions').style.display='none';
- document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:showPasteOptions()" class="LC_menubuttons_link">$lt{'show'}</a>';
+function hidePasteOptions(suffix) {
+ document.getElementById('pasteoptions_'+suffix).style.display='none';
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML =' <a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$lt{'show'}</a>';
+ return;
+}
+
+function showOptions(caller,suffix) {
+ if (document.getElementById('pasteoptionstext_'+suffix)) {
+ if (caller.checked) {
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML =' <a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$lt{'show'}</a>';
+ } else {
+ document.getElementById('pasteoptionstext_'+suffix).innerHTML ='';
+ }
+ if (document.getElementById('pasteoptions_'+suffix)) {
+ document.getElementById('pasteoptions_'+suffix).style.display='none';
+ }
+ }
return;
}
@@ -931,276 +1046,423 @@
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, at 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,$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.'));
+ 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;
+ }
}
}
}
- }
- 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;
+ 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};
}
- 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);
+ $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;
+ }
+ }
# 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) {
+ unless ($is_map{$suffix}) {
+ my $newidx;
# 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) ||
- ($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;
+ $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;
+ }
}
}
}
- }
- }
-# 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,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.':'.&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';
}
}
- $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';
- push(@LONCAPA::map::order, $newidx);
+
+# 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;
+ 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);
+ }
+ }
}
}
+ &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);
+}
- 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');
+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 ($result,$save_err,$msgsarray,$lockerrors);
+ 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 {
@@ -1744,7 +2006,8 @@
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 $src)) {
+ if ((exists($toremove{$idx})) &&
+ ($toremove{$idx} eq &LONCAPA::map::qtescape($src))) {
splice(@LONCAPA::map::order,$i,1);
if (ref($currparam{$idx}) eq 'ARRAY') {
foreach my $name (@{$currparam{$idx}}) {
@@ -1783,7 +2046,7 @@
$changed = 1;
}
if ($changed) {
- $LONCAPA::map::resources[$idx] = join(':',($title,$src,$ext,$type));
+ $LONCAPA::map::resources[$idx] = join(':',($title,&LONCAPA::map::qtunescape($src),$ext,$type));
}
}
}
@@ -1981,12 +2244,13 @@
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);
@@ -2008,7 +2272,6 @@
@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]]=
@@ -2017,6 +2280,7 @@
# Devalidate title cache
my $renamed_url=&LONCAPA::map::qtescape($url);
&Apache::lonnet::devalidate_title_cache($renamed_url);
+
} else {
return 0;
}
@@ -2102,10 +2366,10 @@
return $save_error;
}
if ($paste_res ne 'ok') {
- $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>');
+ $r->print('<p class="LC_error">'.$paste_res.'</p>');
}
if (keys(%paste_errors) > 0) {
- $r->print('<p span class="LC_warning">'."\n".
+ $r->print('<p class="LC_warning">'."\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".
'<ul>'."\n");
foreach my $key (sort(keys(%paste_errors))) {
@@ -2113,18 +2377,81 @@
}
$r->print('</ul></p>'."\n");
}
- }
+ } elsif ($env{'form.clearmarked'}) {
+ my $output = &do_buffer_empty();
+ if ($output) {
+ $r->print('<p class="LC_info">'.$output.'</p>');
+ }
+ }
$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;
@@ -2237,8 +2564,13 @@
$r->print('</div>');
}
- my ($to_show,$output, at allidx, at allmapidx);
-
+ my ($to_show,$output, at allidx, at 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]);
@@ -2252,12 +2584,14 @@
}
$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 = '<table><tr><td>'
.&Apache::loncommon::help_open_menu('Navigation Screen',
@@ -2275,50 +2609,41 @@
.&Apache::loncommon::start_data_table(undef,'contentlist')
.&Apache::loncommon::start_data_table_header_row()
.'<th colspan="2">'.&mt('Move').'</th>'
- .'<th>'.&mt('Actions').'</th>'
- .'<th colspan="2">'.&mt('Document').'</th>';
+ .'<th colspan="2">'.&mt('Actions').'</th>'
+ .'<th>'.&mt('Document').'</th>';
if ($folder !~ /^supplemental/) {
$to_show .= '<th colspan="4">'.&mt('Settings').'</th>';
}
$to_show .= &Apache::loncommon::end_data_table_header_row();
if ($folder !~ /^supplemental/) {
- my $idxlist = join(',', at allidx);
- my $mapidxlist = join(',', at allmapidx);
+ $lists{'canhide'} = join(',', at allidx);
+ $lists{'canrandomlyorder'} = join(',', at 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'},'<>&"');
}
- $to_show .=
- &Apache::loncommon::continue_data_table_row().
- '<td colspan="5"> </td>'.
- '<td colspan="4">'.
- '<form action="/adm/coursedocs" method="post" name="togglemultchecks">'.
- '<span class="LC_nobreak" style="font-size:x-small;font-weight:bold;">'.&mt('Select:').' '.
- '<label><input type="radio" name="showmultpick" value="0" onclick="javascript:togglePick();" checked="checked" />'.&mt('single').'</label>'.(' 'x2).'<label><input type="radio" name="showmultpick" value="1" onclick="javascript:togglePick();" />'.&mt('multiple').'</label></span></form>'.
- '<div id="multiclick" style="display: none">'.
- '<form action="/adm/coursedocs" method="post" name="cumulativechecks" onsubmit="return submitSettings(this);">'."\n".
- '<fieldset><legend style="font-size:x-small;">'.&mt('check/uncheck all').'</legend>'."\n".
- '<table><tr><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><input type="checkbox" name="hiddenresourceall" id="hiddenresourceall" onclick="propagateState(this.form,'."'hiddenresource'".')" />'.&mt('Hidden').'</span></td><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><input type="checkbox" name="randompickall" id="randompickall" onclick="updatePick(this.form,'."'all','check'".');propagateState(this.form,'."'randompick'".');propagateState(this.form,'."'rpicknum'".');" />'.&mt('Randomly Pick').'<span id="rpicktextall"></span><input type="hidden" name="rpicknumall" id="rpicknumall" value="" /></span></td>'.
- '</tr>'."\n".
- '<tr><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><input type="checkbox" name="encrypturlall" id="encrypturlall" onclick="propagateState(this.form,'."'encrypturl'".')" />'.&mt('URL hidden').'</span></td><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><input type="checkbox" name="randomorderall" id="randomorderall" onclick="propagateState(this.form,'."'randomorder'".')" />'.&mt('Random Order').'</span></td></tr></table>'."\n".
- '</fieldset>'.
- '<input type="hidden" name="folderpath" value="'.$path.'" />'.
- '<input type="hidden" name="symb" value="'.$env{'form.symb'}.'" />'.
- '<input type="hidden" name="allhiddenresource" value="" />'.
- '<input type="hidden" name="allencrypturl" value="" />'.
- '<input type="hidden" name="allrandompick" value="" />'.
- '<input type="hidden" name="allrandomorder" value="" />'.
- '<input type="hidden" name="allidx" value="'.$idxlist.'" />'.
- '<input type="hidden" name="allmapidx" value="'.$mapidxlist.'" />'.
- '<input type="hidden" name="changeparms" value="all" />'.
- '<input type="submit" name="multiplesettings" value="'.&mt('Save settings below').'" />'.
- '</form>'.
- '</div>'.
-
- '</td>'.
- &Apache::loncommon::end_data_table_row();
+ if (@allidx > 1) {
+ $to_show .=
+ &Apache::loncommon::continue_data_table_row().
+ '<td colspan="2"> </td>'.
+ '<td>'.
+ &multiple_check_form('actions',\%lists).
+ '</td>'.
+ '<td> </td>'.
+ '<td> </td>'.
+ '<td colspan="4">'.
+ &multiple_check_form('settings',\%lists).
+ '</td>'.
+ &Apache::loncommon::end_data_table_row();
+ $need_save = 1;
+ }
}
}
$to_show .= $output.' '
@@ -2360,8 +2685,8 @@
}
if ($allowed) {
my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
- $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto,
- $readfile));
+ $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,
+ $jumpto,$readfile,$need_save,"$folder.$container"));
&print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);
} else {
$r->print($to_show);
@@ -2369,6 +2694,67 @@
return;
}
+sub multiple_check_form {
+ my ($caller,$listsref) = @_;
+ return unless (ref($listsref) eq 'HASH');
+ my $output =
+ '<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'.
+ '<span class="LC_nobreak" style="font-size:x-small;font-weight:bold;">'.
+ '<label><input type="radio" name="showmultpick" value="0" onclick="javascript:togglePick('."'$caller','0'".');" checked="checked" />'.&mt('one').'</label>'.(' 'x2).'<label><input type="radio" name="showmultpick" value="1" onclick="javascript:togglePick('."'$caller','1'".');" />'.&mt('multiple').'</label></span><span id="more'.$caller.'" class="LC_nobreak LC_docs_ext_edit"></span></form>'.
+ '<div id="multi'.$caller.'" style="display:none;margin:0;padding:0;border:0">'.
+ '<form action="/adm/coursedocs" method="post" name="cumulative'.$caller.'">'."\n".
+ '<fieldset id="allfields'.$caller.'" style="display:none"><legend style="font-size:x-small;">'.&mt('check/uncheck all').'</legend>'."\n";
+ if ($caller eq 'settings') {
+ $output .=
+ '<table><tr>'.
+ '<td class="LC_docs_entry_parameter">'.
+ '<span class="LC_nobreak"><label>'.
+ '<input type="checkbox" name="hiddenresourceall" id="hiddenresourceall" onclick="propagateState(this.form,'."'hiddenresource'".')" />'.&mt('Hidden').
+ '</label></span></td>'.
+ '<td class="LC_docs_entry_parameter">'.
+ '<span class="LC_nobreak"><label><input type="checkbox" name="randompickall" id="randompickall" onclick="updatePick(this.form,'."'all','check'".');propagateState(this.form,'."'randompick'".');propagateState(this.form,'."'rpicknum'".');" />'.&mt('Randomly Pick').'</label><span id="rpicktextall"></span><input type="hidden" name="rpicknumall" id="rpicknumall" value="" />'.
+ '</span></td>'.
+ '</tr>'."\n".
+ '<tr>'.
+ '<td class="LC_docs_entry_parameter">'.
+ '<span class="LC_nobreak"><label><input type="checkbox" name="encrypturlall" id="encrypturlall" onclick="propagateState(this.form,'."'encrypturl'".')" />'.&mt('URL hidden').'</label></span></td><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><label><input type="checkbox" name="randomorderall" id="randomorderall" onclick="propagateState(this.form,'."'randomorder'".')" />'.&mt('Random Order').
+ '</label></span>'.
+ '</td></tr></table>'."\n";
+ } else {
+ $output .=
+ '<table><tr>'.
+ '<td class="LC_docs_entry_parameter">'.
+ '<span class="LC_nobreak LC_docs_remove">'.
+ '<label><input type="checkbox" name="removeall" id="removeall" onclick="propagateState(this.form,'."'remove'".')" />'.&mt('Remove').
+ '</label></span></td>'.
+ '<td class="LC_docs_entry_parameter">'.
+ '<span class="LC_nobreak LC_docs_cut">'.
+ '<label><input type="checkbox" name="cut" id="cutall" onclick="propagateState(this.form,'."'cut'".');" />'.&mt('Cut').
+ '</label></span></td>'."\n".
+ '<td class="LC_docs_entry_parameter">'.
+ '<span class="LC_nobreak LC_docs_copy">'.
+ '<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')" />'.&mt('Copy').
+ '</label></span></td>'.
+ '</tr></table>'."\n";
+ }
+ $output .=
+ '</fieldset>'.
+ '<input type="hidden" name="allidx" value="'.$listsref->{'canhide'}.'" />';
+ if ($caller eq 'settings') {
+ $output .=
+ '<input type="hidden" name="allmapidx" value="'.$listsref->{'canrandomlyorder'}.'" />';
+ } elsif ($caller eq 'actions') {
+ $output .=
+ '<input type="hidden" name="allremoveidx" id="allremoveidx" value="'.$listsref->{'canremove'}.'" />'.
+ '<input type="hidden" name="allcutidx" id="allcutidx" value="'.$listsref->{'cancut'}.'" />'.
+ '<input type="hidden" name="allcopyidx" id="allcopyidx" value="'.$listsref->{'cancopy'}.'" />';
+ }
+ $output .=
+ '</form>'.
+ '</div>';
+ return $output;
+}
+
sub process_file_upload {
my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
# upload a file, if present
@@ -2528,7 +2914,7 @@
sub entryline {
my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
- $crstype,$pathitem,$supplementalflag,$container)=@_;
+ $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups)=@_;
my ($foldertitle,$renametitle);
if (&is_supplemental_title($title)) {
($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);
@@ -2544,7 +2930,7 @@
$renametitle=~s/\"\;/\\\"/g;
$renametitle=~s/ /%20/g;
my $line=&Apache::loncommon::start_data_table_row();
- my ($form_start,$form_end,$form_common);
+ my ($form_start,$form_end,$form_common,$form_param);
# Edit commands
my ($esc_path, $path, $symb);
if ($env{'form.folderpath'}) {
@@ -2568,8 +2954,25 @@
&Apache::lonnet::declutter($currurl));
}
}
- my ($renamelink,%lt);
+ my ($renamelink,%lt,$ishash);
+ if (ref($filtersref) eq 'HASH') {
+ $ishash = 1;
+ }
+
if ($allowed) {
+ $form_start = '
+ <form action="/adm/coursedocs" method="post">
+';
+ $form_common=(<<END);
+ <input type="hidden" name="folderpath" value="$path" />
+ <input type="hidden" name="symb" value="$symb" />
+END
+ $form_param=(<<END);
+ <input type="hidden" name="setparms" value="$orderidx" />
+ <input type="hidden" name="changeparms" value="0" />
+END
+ $form_end = '</form>';
+
my $incindex=$index+1;
my $selectbox='';
if (($#LONCAPA::map::order>0) &&
@@ -2605,66 +3008,9 @@
'ul' => 'URL',
'ti' => 'Title',
);
- 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 %denied = &action_restrictions($coursenum,$coursedom,$url,
+ $env{'form.folderpath'},
+ $currgroups);
my ($copylink,$cutlink,$removelink);
my $skip_confirm = 0;
if ( $folder =~ /^supplemental/
@@ -2678,48 +3024,62 @@
$skip_confirm = 1;
}
- if ($nocopy) {
+ if ($denied{'copy'}) {
$copylink=(<<ENDCOPY);
<span style="visibility: hidden;">$lt{'cp'}</span>
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=(<<ENDCOPY);
-<a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$folder');" class="LC_docs_copy">$lt{'cp'}</a>
+<form name="$formname" method="post" action="/adm/coursedocs">
+$form_common
+<input type="checkbox" name="copy" id="copy_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','copy');" class="LC_hidden"><a href="$js" class="LC_docs_copy">$lt{'cp'}</a>
+$form_end
ENDCOPY
+ if (($ishash) && (ref($filtersref->{'cancopy'}) eq 'ARRAY')) {
+ push(@{$filtersref->{'cancopy'}},$orderidx);
+ }
}
- if ($nocut) {
+ if ($denied{'cut'}) {
$cutlink=(<<ENDCUT);
<span style="visibility: hidden;">$lt{'ct'}</span>
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=(<<ENDCUT);
-<a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a>
+<form name="$formname" method="post" action="/adm/coursedocs">
+$form_common
+<input type="checkbox" name="cut" id="cut_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','cut');" class="LC_hidden"><a href="$js" class="LC_docs_cut">$lt{'ct'}</a>
+$form_end
ENDCUT
+ if (($ishash) && (ref($filtersref->{'cancut'}) eq 'ARRAY')) {
+ push(@{$filtersref->{'cancut'}},$orderidx);
+ }
}
- if ($noremove) {
+ if ($denied{'remove'}) {
$removelink=(<<ENDREM);
<span style="visibility: hidden;">$lt{'rm'}</a>
ENDREM
} else {
+ my $formname = 'edit_remove_'.$orderidx;
+ my $js = "javascript:checkForSubmit(document.forms.renameform,'remove','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm);";
$removelink=(<<ENDREM);
-<a href='javascript:removeres("$esc_path","$index","$renametitle",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>
+<form name="$formname" method="post" action="/adm/coursedocs">
+$form_common
+<input type="checkbox" name="remove" id="remove_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','remove');" class="LC_hidden"><a href="$js" class="LC_docs_remove">$lt{'rm'}</a>
+$form_end
ENDREM
+ if (($ishash) && (ref($filtersref->{'canremove'}) eq 'ARRAY')) {
+ push(@{$filtersref->{'canremove'}},$orderidx);
+ }
}
unless ($isexternal) {
$renamelink=(<<ENDREN);
<a href='javascript:changename("$esc_path","$index","$renametitle");' class="LC_docs_rename">$lt{'rn'}</a>
ENDREN
}
- $form_start = '
- <form action="/adm/coursedocs" method="post">
-';
- $form_common=(<<END);
- <input type="hidden" name="folderpath" value="$path" />
- <input type="hidden" name="symb" value="$symb" />
- <input type="hidden" name="setparms" value="$orderidx" />
- <input type="hidden" name="changeparms" value="0" />
-END
- $form_end = '</form>';
$line.=(<<END);
<td>
<div class="LC_docs_entry_move">
@@ -2735,6 +3095,7 @@
</td>
<td>
$form_start
+ $form_param
$form_common
$selectbox
$form_end
@@ -2746,7 +3107,6 @@
</span>
</td>
END
-
}
# Figure out what kind of a resource this is
my ($extension)=($url=~/\.(\w+)$/);
@@ -2835,6 +3195,7 @@
my $formname = 'edit_randompick_'.$orderidx;
$rand_pick_text =
'<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
+$form_param."\n".
$form_common."\n".
'<span class="LC_nobreak"><label><input type="checkbox" name="randompick_'.$orderidx.'" id="randompick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="rpicknum_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" /><span id="randompicknum_'.$orderidx.'">';
if ($rpicknum ne '') {
@@ -2847,8 +3208,9 @@
my $formname = 'edit_rorder_'.$orderidx;
$rand_order_text =
'<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
+$form_param."\n".
$form_common."\n".
-'<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder'".')"; '.$ro_set.' /> '.&mt('Random Order').' </label></span>'.
+'<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.' /> '.&mt('Random Order').' </label></span>'.
$form_end;
}
} elsif ($supplementalflag && !$allowed) {
@@ -2928,13 +3290,15 @@
$line.=(<<ENDPARMS);
<td class="LC_docs_entry_parameter">
<form action="/adm/coursedocs" method="post" name="$formhidden">
+ $form_param
$form_common
- <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'."'hiddenresource'".');" $hidtext /> $lt{'hd'}</label>
+ <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext /> $lt{'hd'}</label>
$form_end
<br />
<form action="/adm/coursedocs" method="post" name="$formurlhidden">
+ $form_param
$form_common
- <label><input type="checkbox" name="encrypturl_$orderidx" id="encrypturl_$orderidx" onclick="checkForSubmit(this.form,'."'encrypturl'".');" $enctext /> $lt{'ec'}</label>
+ <label><input type="checkbox" name="encrypturl_$orderidx" id="encrypturl_$orderidx" onclick="checkForSubmit(this.form,'encrypturl','settings');" $enctext /> $lt{'ec'}</label>
$form_end
</td>
<td class="LC_docs_entry_parameter">$rand_pick_text<br />
@@ -2945,10 +3309,75 @@
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 ($coursedom,$coursenum,$type,$area,$container) = @_;
+ my ($dom,$num,$type,$area,$container) = @_;
my ($prefix,$namespace,$idtype,$errtext,$locknotfreed);
- if ($type eq 'map') {
+ if ($type eq 'paste') {
+ $prefix = $type;
+ $namespace = 'courseeditor';
+ } elsif ($type eq 'map') {
$prefix = 'docs';
if ($area eq 'supplemental') {
$prefix = 'supp';
@@ -2961,10 +3390,11 @@
}
$idtype = 'concat';
my ($suffix,$freedlock,$error) =
- &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,
- $coursedom,$coursenum);
+ &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num);
if (!$suffix) {
- if ($type eq 'map') {
+ if ($type eq 'paste') {
+ $errtext = &mt('Failed to acquire a unique timestamp-based suffix when adding to the paste buffer.');
+ } elsif ($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.');
@@ -2979,7 +3409,9 @@
$locknotfreed =
'<div class="LC_error">'.
&mt('There was a problem removing a lockfile.').' ';
- if ($type eq 'map') {
+ if ($type eq 'paste') {
+ &mt('This will prevent use of the paste buffer until th next log-in.');
+ } elsif ($type eq 'map') {
&mt('This will prevent creation of additional folders or composite pages in this course.');
} elsif ($type eq 'smppg') {
$locknotfreed .=
@@ -2988,9 +3420,11 @@
$locknotfreed .=
&mt('This will prevent creation of additional bulletin boards in this course.');
}
- $locknotfreed .=
- ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.').
- '</div>';
+ unless ($type eq 'paste') {
+ $locknotfreed .=
+ ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.');
+ }
+ $locknotfreed .= '</div>';
}
return ($suffix,$errtext,$locknotfreed);
}
@@ -3654,7 +4088,7 @@
# 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;
@@ -3688,12 +4122,11 @@
}
} elsif ($env{'form.command'} eq 'editdocs') {
$env{'form.folderpath'} = 'default&'.
- &Apache::lonhtmlcommon::entity_encode('Main Course Content').
- ':::::';
+ &escape(&mt('Main '.$crstype.' Content').':::::');
&Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}});
} elsif ($env{'form.command'} eq 'editsupp') {
$env{'form.folderpath'} = 'supplemental&'.
- &Apache::lonhtmlcommon::entity_encode('Supplemental Content');
+ &escape('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'});
@@ -3734,8 +4167,8 @@
if ($supplementalflag) {
$env{'form.folderpath'}=&supplemental_base();
} else {
- $env{'form.folderpath'}='default'.&escape(&mt('Main '.$crstype.' Documents')).
- ':::::';
+ $env{'form.folderpath'}='default'.&escape(&mt('Main '.$crstype.' Content').
+ ':::::');
}
}
@@ -3760,8 +4193,7 @@
if ($env{'form.folder'} eq '' ||
$env{'form.folder'} eq 'supplemental') {
$folderpath='default&'.
- &escape(&mt('Main '.$crstype.' Documents')).
- ':::::';
+ &escape(&mt('Main '.$crstype.' Content').':::::');
}
}
$containertag = '<input type="hidden" name="folderpath" value="" />';
@@ -3818,9 +4250,7 @@
onload => "javascript:resize_scrollbox('contentscroll','1','1');",
};
}
- if ($env{'docs.markedcopy_url'}) {
- $script .= &paste_popup_js();
- }
+ $script .= &paste_popup_js();
my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.
&mt('Switch server?');
@@ -3846,7 +4276,6 @@
} else {
&Apache::lonhtmlcommon::add_breadcrumb({
href=>"/adm/coursedocs",text=>"$crstype Contents"});
-
$r->print(&Apache::loncommon::start_page("$crstype Contents", $script,
{'add_entries' => $addentries}
)
@@ -4047,7 +4476,10 @@
if ($folder eq '') {
$folder='default';
}
- &update_paste_buffer($coursenum,$coursedom,$folder);
+ my $output = &update_paste_buffer($coursenum,$coursedom,$folder);
+ if ($output) {
+ $r->print($output);
+ }
$r->print(<<HIDDENFORM);
<form name="renameform" method="post" action="/adm/coursedocs">
<input type="hidden" name="title" />
@@ -4660,7 +5092,7 @@
foreach my $aurole (keys(%outhash)) {
unless(grep(/^\Q$outhash{$aurole}\E/, at hosts)) {
push(@hosts,$outhash{$aurole});
- }
+ }
}
if (@hosts == 1) {
my $switchto = '/adm/switchserver?otherserver='.$hosts[0].
@@ -4724,7 +5156,8 @@
}
sub generate_edit_table {
- my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile) = @_;
+ my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile,
+ $need_save,$copyfolder) = @_;
return unless(ref($orderhash_ref) eq 'HASH');
my %orderhash = %{$orderhash_ref};
my $form;
@@ -4773,7 +5206,35 @@
$form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'."\n";
if ($to_show ne '') {
- $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'."\n";
+ my $saveform;
+ if ($need_save) {
+ my $button = &mt('Make changes');
+ my $path;
+ if ($env{'form.folderpath'}) {
+ $path =
+ &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
+ }
+ $saveform = <<"END";
+<div id="multisave" style="display:none; clear:both;" >
+<form name="saveactions" method="post" action="/adm/coursedocs" onsubmit="return checkSubmits();">
+<input type="hidden" name="folderpath" value="$path" />
+<input type="hidden" name="symb" value="$env{'form.symb'}" />
+<input type="hidden" name="allhiddenresource" value="" />
+<input type="hidden" name="allencrypturl" value="" />
+<input type="hidden" name="allrandompick" value="" />
+<input type="hidden" name="allrandomorder" value="" />
+<input type="hidden" name="changeparms" value="" />
+<input type="hidden" name="multiremove" value="" />
+<input type="hidden" name="multicut" value="" />
+<input type="hidden" name="multicopy" value="" />
+<input type="hidden" name="multichange" value="" />
+<input type="hidden" name="copyfolder" value="$copyfolder" />
+<input type="submit" name="savemultiples" value="$button" />
+</form>
+</div>
+END
+ }
+ $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'.$saveform."\n";
}
foreach my $field (keys(%orderhash)){
if($field ne '00'){
@@ -4823,6 +5284,8 @@
imscms => 'You must select which Course Management System was the source of the IMS package',
invurl => 'Invalid URL',
titbl => 'Title is blank',
+ more => '(More ...)',
+ less => '(Less ...)',
);
my $crstype = &Apache::loncommon::course_type();
@@ -4831,7 +5294,8 @@
if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {
$main_container_page = 1;
}
- my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents%3A%3A%3A%3A%3A';
+ my $toplevelmain =
+ &escape(&mt('Main '.$crstype.' Content').':::::');
my $toplevelsupp = &supplemental_base();
my $backtourl;
@@ -5006,7 +5470,7 @@
function changename(folderpath,index,oldtitle) {
var title=prompt('$lt{"p_chn"}',oldtitle);
if (title) {
-this.document.forms.renameform.markcopy.value=-1;
+this.document.forms.renameform.markcopy.value='';
this.document.forms.renameform.title.value=title;
this.document.forms.renameform.cmd.value='rename_'+index;
this.document.forms.renameform.folderpath.value=folderpath;
@@ -5014,32 +5478,6 @@
}
}
-function removeres(folderpath,index,oldtitle,skip_confirm) {
-if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
-this.document.forms.renameform.markcopy.value=-1;
-this.document.forms.renameform.cmd.value='del_'+index;
-this.document.forms.renameform.folderpath.value=folderpath;
-this.document.forms.renameform.submit();
-}
-}
-
-function cutres(folderpath,index,oldtitle,container,folder,skip_confirm) {
-if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
-this.document.forms.renameform.cmd.value='cut_'+index;
-this.document.forms.renameform.markcopy.value=index;
-this.document.forms.renameform.copyfolder.value=folder+'.'+container;
-this.document.forms.renameform.folderpath.value=folderpath;
-this.document.forms.renameform.submit();
-}
-}
-
-function markcopy(folderpath,index,oldtitle,container,folder) {
-this.document.forms.renameform.markcopy.value=index;
-this.document.forms.renameform.copyfolder.value=folder+'.'+container;
-this.document.forms.renameform.folderpath.value=folderpath;
-this.document.forms.renameform.submit();
-}
-
function updatePick(targetform,index,caller) {
var pickitem;
var picknumitem;
@@ -5064,7 +5502,7 @@
propagateState(targetform,'rpicknum');
}
} else {
- checkForSubmit(targetform,'randompick');
+ checkForSubmit(targetform,'randompick','settings');
}
}
} else {
@@ -5073,13 +5511,13 @@
if (regexdigit.test(picknum)) {
picknumitem.value = picknum;
if (index == 'all') {
- picknumtext.innerHTML = ' <a href="javascript:updatePick(document.cumulativechecks,\\'all\\',\\'link\\');">'+picknum+'</a>';
+ picknumtext.innerHTML = ' <a href="javascript:updatePick(document.cumulativesettings,\\'all\\',\\'link\\');">'+picknum+'</a>';
if (caller == 'link') {
propagateState(targetform,'rpicknum');
}
} else {
picknumtext.innerHTML = ' <a href="javascript:updatePick(document.edit_randompick_'+index+',\\''+index+'\\',\\'link\\');">'+picknum+'</a>';
- checkForSubmit(targetform,'randompick');
+ checkForSubmit(targetform,'randompick','settings');
}
} else {
if (caller == 'check') {
@@ -5090,7 +5528,7 @@
}
} else {
pickitem.checked=false;
- checkForSubmit(targetform,'randompick');
+ checkForSubmit(targetform,'randompick','settings');
}
}
return;
@@ -5104,7 +5542,7 @@
propagateState(targetform,'rpicknum');
}
} else {
- checkForSubmit(targetform,'randompick');
+ checkForSubmit(targetform,'randompick','settings');
}
}
}
@@ -5126,64 +5564,160 @@
setcheck = 1;
}
}
+ var allidxlist;
+ if ((param == 'remove') || (param == 'cut') || (param == 'copy')) {
+ if (document.getElementById('all'+param+'idx')) {
+ allidxlist = document.getElementById('all'+param+'idx').value;
+ }
+ var actions = new Array ('remove','cut','copy');
+ for (var i=0; i<actions.length; i++) {
+ if (actions[i] != param) {
+ if (document.getElementById(actions[i]+'all')) {
+ document.getElementById(actions[i]+'all').checked = false;
+ }
+ }
+ }
+ }
if ((param == 'encrypturl') || (param == 'hiddenresource')) {
- var allidxlist = form.allidx.value;
- if (allidxlist != '') {
- var allidxs = allidxlist.split(',');
- if (allidxs.length > 1) {
- for (var i=0; i<allidxs.length; i++) {
- if (document.getElementById(param+'_'+allidxs[i])) {
+ allidxlist = form.allidx.value;
+ }
+ if ((param == 'randompick') || (param == 'rpicknum') || (param == 'randomorder')) {
+ allidxlist = form.allmapidx.value;
+ }
+ if ((allidxlist != '') && (allidxlist != null)) {
+ var allidxs = allidxlist.split(',');
+ if (allidxs.length > 1) {
+ for (var i=0; i<allidxs.length; i++) {
+ if (document.getElementById(param+'_'+allidxs[i])) {
+ if (param == 'rpicknum') {
+ if (document.getElementById('randompick_'+allidxs[i])) {
+ if (document.getElementById('randompick_'+allidxs[i]).checked) {
+ document.getElementById(param+'_'+allidxs[i]).value = rpick;
+ if (rpick > 0) {
+ document.getElementById('randompicknum_'+allidxs[i]).innerHTML = ': <a href="javascript:updatePick(document.edit_randompick_'+allidxs[i]+',\\''+allidxs[i]+'\\',\\'link\\')">'+rpick+'</a>';
+ } else {
+ document.getElementById('randompicknum_'+allidxs[i]).innerHTML = '';
+ }
+ }
+ }
+ } else {
if (setcheck == 1) {
document.getElementById(param+'_'+allidxs[i]).checked = true;
} else {
document.getElementById(param+'_'+allidxs[i]).checked = false;
+ if (param == 'randompick') {
+ document.getElementById('randompicknum_'+allidxs[i]).innerHTML = '';
+ }
}
}
}
}
- }
- } else {
- var allmapidxlist = form.allmapidx.value;
- if (allmapidxlist != '') {
- var allmapidxs = allmapidxlist.split(',');
- if (allmapidxs.length > 1) {
- for (var i=0; i<allmapidxs.length; i++) {
- var item = param+'_'+allmapidxs[i];
- if (document.getElementById(item)) {
- if (param == 'rpicknum') {
- if (document.getElementById('randompick_'+allmapidxs[i])) {
- if (document.getElementById('randompick_'+allmapidxs[i]).checked) {
- document.getElementById(param+'_'+allmapidxs[i]).value = rpick;
- if (rpick > 0) {
- document.getElementById('randompicknum_'+allmapidxs[i]).innerHTML = ': <a href="javascript:updatePick(document.edit_randompick_'+allmapidxs[i]+',\\''+allmapidxs[i]+'\\',\\'link\\')">'+rpick+'</a>';
- } else {
- document.getElementById('randompicknum_'+allmapidxs[i]).innerHTML = '';
+ if (setcheck == 1) {
+ if ((param == 'remove') || (param == 'cut') || (param == 'copy')) {
+ var actions = new Array('copy','cut','remove');
+ for (var i=0; i<actions.length; i++) {
+ var otheractions;
+ var otheridxs;
+ if (actions[i] === param) {
+ continue;
+ } else {
+ if (document.getElementById('all'+actions[i]+'idx')) {
+ otheractions = document.getElementById('all'+actions[i]+'idx').value;
+ otheridxs = otheractions.split(',');
+ if (otheridxs.length > 1) {
+ for (var j=0; j<otheridxs.length; j++) {
+ if (document.getElementById(actions[i]+'_'+otheridxs[j])) {
+ document.getElementById(actions[i]+'_'+otheridxs[j]).checked = false;
+ }
}
}
}
- } else {
- if (setcheck == 1) {
- document.getElementById(param+'_'+allmapidxs[i]).checked = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return;
+}
+
+function checkForSubmit(targetform,param,context,idx,folderpath,index,oldtitle,skip_confirm,container,folder) {
+ var control = document.togglemultsettings;
+ if (context == 'actions') {
+ control = document.togglemultactions;
+ }
+ if (control.showmultpick.length) {
+ for (var i=0; i<control.showmultpick.length; i++) {
+ if (control.showmultpick[i].checked) {
+ if (control.showmultpick[i].value == 0) {
+ if (context == 'settings') {
+ targetform.changeparms.value=param;
+ targetform.submit();
+ } else {
+ targetform.cmd.value=param+'_'+index;
+ targetform.folderpath.value=folderpath;
+ targetform.markcopy.value=idx+':'+param;
+ targetform.copyfolder.value=folder+'.'+container;
+ if (param == 'remove') {
+ if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
+ targetform.markcopy.value='';
+ targetform.copyfolder.value='';
+ targetform.submit();
+ }
+ }
+ if (param == 'cut') {
+ if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
+ targetform.submit();
+ }
+ }
+ if (param == 'copy') {
+ targetform.submit();
+ }
+ targetform.markcopy.value='';
+ targetform.copyfolder.value='';
+ targetform.cmd.value='';
+ targetform.folderpath.value='';
+ }
+ } else {
+ if (context == 'actions') {
+ if (document.getElementById(param+'_'+idx)) {
+ item = document.getElementById(param+'_'+idx);
+ if (item.type == 'checkbox') {
+ if (item.checked) {
+ item.checked = false;
} else {
- document.getElementById(param+'_'+allmapidxs[i]).checked = false;
+ item.checked = true;
}
}
}
}
}
+ } else {
+ if (document.getElementById(param+'_'+idx)) {
+ checkbox = document.getElementById(param+'_'+idx);
+ singleCheck(checkbox,idx,param);
+ }
}
}
+ } else {
+ if (context == 'settings') {
+ targetform.changeparms.value=param;
+ targetform.submit();
+ }
}
return;
}
-function checkForSubmit(targetform,param) {
- if (document.togglemultchecks.showmultpick.length) {
- for (var i=0; i<document.togglemultchecks.showmultpick.length; i++) {
- if (document.togglemultchecks.showmultpick[i].checked) {
- if (document.togglemultchecks.showmultpick[i].value == 0) {
- targetform.changeparms.value=param;
- targetform.submit();
+function singleCheck(caller,idx,action) {
+ actions = new Array('cut','copy','remove');
+ if (caller.checked) {
+ for (var i=0; i<actions.length; i++) {
+ if (actions[i] != action) {
+ if (document.getElementById(actions[i]+'_'+idx)) {
+ if (document.getElementById(actions[i]+'_'+idx).checked) {
+ document.getElementById(actions[i]+'_'+idx).checked = false;
+ }
}
}
}
@@ -5295,65 +5829,253 @@
location.href=newurl;
}
-function submitSettings(form) {
- var allidxlist = form.allidx.value;
- form.allencrypturl.value = '';
- form.allhiddenresource.value = '';
- if (allidxlist != '') {
- var allidxs = allidxlist.split(',');
- if (allidxs.length > 1) {
- for (var i=0; i<allidxs.length; i++) {
- if (document.getElementById('hiddenresource_'+allidxs[i])) {
- if (document.getElementById('hiddenresource_'+allidxs[i]).checked) {
- form.allhiddenresource.value += allidxs[i]+',';
+function togglePick(caller,value) {
+ var disp = 'none';
+ if (document.getElementById('multi'+caller)) {
+ var curr = document.getElementById('multi'+caller).style.display;
+ if (value == 1) {
+ disp='block';
+ }
+ if (curr == disp) {
+ return;
+ }
+ document.getElementById('multi'+caller).style.display=disp;
+ if (value == 1) {
+ document.getElementById('more'+caller).innerHTML = ' <a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$lt{'more'}</a>';
+ } else {
+ document.getElementById('more'+caller).innerHTML = '';
+ }
+ if (caller == 'actions') {
+ setClass(value);
+ setBoxes(value);
+ }
+ }
+ var showButton = multiSettings();
+ if (showButton != 1) {
+ showButton = multiActions();
+ }
+ if (document.getElementById('multisave')) {
+ if (showButton == 1) {
+ document.getElementById('multisave').style.display='block';
+ } else {
+ document.getElementById('multisave').style.display='none';
+ }
+ }
+ resize_scrollbox('contentscroll','1','1');
+ return;
+}
+
+function toggleCheckUncheck(caller,more) {
+ if (more == 1) {
+ document.getElementById('more'+caller).innerHTML = ' <a href="javascript:toggleCheckUncheck(\\''+caller+'\\',0);" style="text-decoration:none;">$lt{'less'}</a>';
+ document.getElementById('allfields'+caller).style.display='block';
+ } else {
+ document.getElementById('more'+caller).innerHTML = ' <a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$lt{'more'}</a>';
+ document.getElementById('allfields'+caller).style.display='none';
+ }
+ resize_scrollbox('contentscroll','1','1');
+}
+
+function multiSettings() {
+ var inuse = 0;
+ var settingsform = document.togglemultsettings;
+ if (settingsform.showmultpick.length > 1) {
+ for (var i=0; i<settingsform.showmultpick.length; i++) {
+ if (settingsform.showmultpick[i].checked) {
+ if (settingsform.showmultpick[i].value == 1) {
+ inuse = 1;
+ }
+ }
+ }
+ }
+ return inuse;
+}
+
+function multiActions() {
+ var inuse = 0;
+ var actionsform = document.togglemultactions;
+ if (actionsform.showmultpick.length > 1) {
+ for (var i=0; i<actionsform.showmultpick.length; i++) {
+ if (actionsform.showmultpick[i].checked) {
+ if (actionsform.showmultpick[i].value == 1) {
+ inuse = 1;
+ }
+ }
+ }
+ }
+ return inuse;
+}
+
+function checkSubmits() {
+ var numchanges = 0;
+ var form = document.saveactions;
+ var doactions = multiActions();
+ if (doactions == 1) {
+ var remidxlist = document.cumulativeactions.allremoveidx.value;
+ if ((remidxlist != '') && (remidxlist != null)) {
+ var remidxs = remidxlist.split(',');
+ for (var i=0; i<remidxs.length; i++) {
+ if (document.getElementById('remove_'+remidxs[i])) {
+ if (document.getElementById('remove_'+remidxs[i]).checked) {
+ form.multiremove.value += remidxs[i]+',';
+ numchanges ++;
}
}
- if (document.getElementById('encrypturl_'+allidxs[i])) {
- if (document.getElementById('encrypturl_'+allidxs[i]).checked) {
- form.allencrypturl.value += allidxs[i]+',';
+ }
+ }
+ var cutidxlist = document.cumulativeactions.allcutidx.value;
+ if ((cutidxlist != '') && (cutidxlist != null)) {
+ var cutidxs = cutidxlist.split(',');
+ for (var i=0; i<cutidxs.length; i++) {
+ if (document.getElementById('cut_'+cutidxs[i])) {
+ if (document.getElementById('cut_'+cutidxs[i]).checked == true) {
+ form.multicut.value += cutidxs[i]+',';
+ numchanges ++;
}
}
}
}
+ var copyidxlist = document.cumulativeactions.allcopyidx.value;
+ if ((copyidxlist != '') && (copyidxlist != null)) {
+ var copyidxs = copyidxlist.split(',');
+ for (var i=0; i<copyidxs.length; i++) {
+ if (document.getElementById('copy_'+copyidxs[i])) {
+ if (document.getElementById('copy_'+copyidxs[i]).checked) {
+ form.multicopy.value += copyidxs[i]+',';
+ numchanges ++;
+ }
+ }
+ }
+ }
+ if (numchanges > 0) {
+ form.multichange.value = numchanges;
+ }
}
- var allmapidxlist = form.allmapidx.value;
- form.allrandompick.value = '';
- form.allrandomorder.value = '';
- if (allmapidxlist != '') {
- var allmapidxs = allmapidxlist.split(',');
- for (var i=0; i<allmapidxs.length; i++) {
- var randompick = document.getElementById('randompick_'+allmapidxs[i]);
- var rpicknum = document.getElementById('rpicknum_'+allmapidxs[i]);
- var randorder = document.getElementById('randomorder_'+allmapidxs[i]);
- if ((randompick.checked) && (rpicknum.value != '')) {
- form.allrandompick.value += allmapidxs[i]+':'+rpicknum.value+',';
+ var dosettings = multiSettings();
+ if (dosettings == 1) {
+ form.allencrypturl.value = '';
+ form.allhiddenresource.value = '';
+ form.changeparams.value = 'all';
+ var allidxlist = document.cumulativesettings.allidx.value;
+ if ((allidxlist != '') && (allidxlist != null)) {
+ var allidxs = allidxlist.split(',');
+ if (allidxs.length > 1) {
+ for (var i=0; i<allidxs.length; i++) {
+ if (document.getElementById('hiddenresource_'+allidxs[i])) {
+ if (document.getElementById('hiddenresource_'+allidxs[i]).checked) {
+ form.allhiddenresource.value += allidxs[i]+',';
+ }
+ }
+ if (document.getElementById('encrypturl_'+allidxs[i])) {
+ if (document.getElementById('encrypturl_'+allidxs[i]).checked) {
+ form.allencrypturl.value += allidxs[i]+',';
+ }
+ }
+ }
}
- if (randorder.checked) {
- form.allrandomorder.value += allmapidxs[i]+',';
+ }
+ form.allrandompick.value = '';
+ form.allrandomorder.value = '';
+ var allmapidxlist = document.cumulativesettings.allmapidx.value;
+ if ((allmapidxlist != '') && (allmapidxlist != null)) {
+ var allmapidxs = allmapidxlist.split(',');
+ for (var i=0; i<allmapidxs.length; i++) {
+ var randompick = document.getElementById('randompick_'+allmapidxs[i]);
+ var rpicknum = document.getElementById('rpicknum_'+allmapidxs[i]);
+ var randorder = document.getElementById('randomorder_'+allmapidxs[i]);
+ if ((randompick.checked) && (rpicknum.value != '')) {
+ form.allrandompick.value += allmapidxs[i]+':'+rpicknum.value+',';
+ }
+ if (randorder.checked) {
+ form.allrandomorder.value += allmapidxs[i]+',';
+ }
}
}
}
- form.submit();
- return true;
+ if ((numchanges > 0) || (dosettings == 1)) {
+ form.submit();
+ return true;
+ }
+ return false;
+}
+
+function setClass(value) {
+ var cutclass = 'LC_docs_cut';
+ var copyclass = 'LC_docs_copy';
+ var removeclass = 'LC_docs_remove';
+ var cutreg = new RegExp("\\\\b"+cutclass+"\\\\b");
+ var copyreg = new RegExp("\\\\b"+copyclass+"\\\\b");
+ var removereg = new RegExp("\\\\"+removeclass+"\\\\b");
+ var links = document.getElementsByTagName('a');
+ for (var i=0; i<links.length; i++) {
+ var classes = links[i].className;
+ if (cutreg.test(classes)) {
+ links[i].className = cutclass;
+ if (value == 1) {
+ links[i].className += " LC_menubuttons_link";
+ }
+ } else {
+ if (copyreg.test(classes)) {
+ links[i].className = copyclass;
+ if (value == 1) {
+ links[i].className += " LC_menubuttons_link";
+ }
+ } else {
+ if (removereg.test(classes)) {
+ links[i].className = removeclass;
+ if (value == 1) {
+ links[i].className += " LC_menubuttons_link";
+ }
+ }
+ }
+ }
+ }
+ return;
}
-function togglePick() {
- var disp = 'none';
- if (document.getElementById('multiclick')) {
- var curr = document.getElementById('multiclick').style.display;
- if (curr == 'none') {
- disp='block';
+function setBoxes(value) {
+ var remidxlist = document.cumulativeactions.allremoveidx.value;
+ if ((remidxlist != '') && (remidxlist != null)) {
+ var remidxs = remidxlist.split(',');
+ for (var i=0; i<remidxs.length; i++) {
+ if (document.getElementById('remove_'+remidxs[i])) {
+ var item = document.getElementById('remove_'+remidxs[i]);
+ if (value == 1) {
+ item.className = 'LC_docs_remove';
+ } else {
+ item.className = 'LC_hidden';
+ }
+ }
}
- document.getElementById('multiclick').style.display=disp;
}
- if (document.getElementById('savemulti')) {
- var curr = document.getElementById('save.multi').style.display;
- if (curr == 'none') {
- disp='inline';
+ var cutidxlist = document.cumulativeactions.allcutidx.value;
+ if ((cutidxlist != '') && (cutidxlist != null)) {
+ var cutidxs = cutidxlist.split(',');
+ for (var i=0; i<cutidxs.length; i++) {
+ if (document.getElementById('cut_'+cutidxs[i])) {
+ var item = document.getElementById('cut_'+cutidxs[i]);
+ if (value == 1) {
+ item.className = 'LC_docs_cut';
+ } else {
+ item.className = 'LC_hidden';
+ }
+ }
+ }
+ }
+ var copyidxlist = document.cumulativeactions.allcopyidx.value;
+ if ((copyidxlist != '') && (copyidxlist != null)) {
+ var copyidxs = copyidxlist.split(',');
+ for (var i=0; i<copyidxs.length; i++) {
+ if (document.getElementById('copy_'+copyidxs[i])) {
+ var item = document.getElementById('copy_'+copyidxs[i]);
+ if (value == 1) {
+ item.className = 'LC_docs_copy';
+ } else {
+ item.className = 'LC_hidden';
+ }
+ }
}
- document.getElementById('savemulti').style.display=disp;
}
- resize_scrollbox('contentscroll','1','1');
return;
}
@@ -5536,6 +6258,10 @@
=item do_paste_from_buffer()
+=item do_buffer_empty()
+
+=item clear_from_buffer()
+
=item get_newmap_url()
=item dbcopy()
More information about the LON-CAPA-cvs
mailing list