--- loncom/interface/londocs.pm 2013/01/14 23:14:59 1.484.2.25 +++ loncom/interface/londocs.pm 2012/05/15 01:41:27 1.487 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.484.2.25 2013/01/14 23:14:59 raeburn Exp $ +# $Id: londocs.pm,v 1.487 2012/05/15 01:41:27 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,9 +40,7 @@ use Apache::lonxml; use Apache::lonclonecourse; use Apache::lonnavmaps; use Apache::lonnavdisplay(); -use Apache::lonextresedit(); use HTML::Entities; -use HTML::TokeParser; use GDBM_File; use Apache::lonlocal; use Cwd; @@ -69,14 +67,10 @@ sub mapread { } sub storemap { - my ($coursenum,$coursedom,$map,$contentchg)=@_; - my $report; - if (($contentchg) && ($map =~ /^default/)) { - $report = 1; - } + my ($coursenum,$coursedom,$map)=@_; my ($outtext,$errtext)= &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'. - $map,1,$report); + $map,1); if ($errtext) { return ($errtext,2); } $hadchanges=1; @@ -152,7 +146,7 @@ sub dumpcourse { $r->print(&endContentScreen()); return ''; } - my ($ca,$cd)=split(/\:/,$env{'form.authorspace'}); + my ($ca,$cd)=split(/\@/,$env{'form.authorspace'}); $r->print('<h3>'.&mt('Copying Files').'</h3>'); my $title=$env{'form.authorfolder'}; $title=&clean($title); @@ -270,9 +264,7 @@ sub dumpcourse { sub group_import { my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_; - my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap, - %removeparam,$importuploaded,$fixuperrors); - $allmaps = {}; + while (@files) { my ($name, $url, $residx) = @{ shift(@files) }; if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) @@ -298,24 +290,6 @@ sub group_import { } } if ($url) { - if (($caller eq 'londocs') && - ($folder =~ /^default/)) { - unless ($donechk) { - my $chome = &Apache::lonnet::homeserver($coursenum,$coursedom); - my $cid = $coursedom.'_'.$coursenum; - $allmaps = - &Apache::loncommon::allmaps_incourse($coursedom,$coursenum, - $chome,$cid); - $donechk = 1; - } - if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) { - &contained_map_check($url,$folder,\%removefrommap,\%removeparam, - \%addedmaps,\%hierarchy,\%titles,$allmaps); - $importuploaded = 1; - } elsif ($url =~ m{^/res/.+\.(page|sequence)$}) { - next if ($allmaps->{$url}); - } - } if (!$residx || defined($LONCAPA::map::zombies[$residx])) { $residx = &LONCAPA::map::getresidx($url,$residx); @@ -329,31 +303,67 @@ sub group_import { join(':', ($name, $url, $ext, 'normal', 'res')); } } - if ($importuploaded) { - my %import_errors; - my %updated = ( - removefrommap => \%removefrommap, - removeparam => \%removeparam, - ); - &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated); - if (keys(%import_errors) > 0) { - $fixuperrors = - '<p span class="LC_warning">'."\n". - &mt('The following files are either dependencies of a web page or references within a folder and/or composite page for which errors occurred during import:')."\n". - '<ul>'."\n"; - foreach my $key (sort(keys(%import_errors))) { - $fixuperrors .= '<li>'.$key.'</li>'."\n"; - } - $fixuperrors .= '</ul></p>'."\n"; + return &storemap($coursenum, $coursedom, $folder.'.'.$container); +} + +sub breadcrumbs { + my ($allowed,$crstype)=@_; + &Apache::lonhtmlcommon::clear_breadcrumbs(); + my (@folders); + if ($env{'form.pagepath'}) { + @folders = split('&',$env{'form.pagepath'}); + } else { + @folders=split('&',$env{'form.folderpath'}); + } + my $folderpath; + my $cpinfo=''; + my $plain=''; + my $randompick=-1; + my $isencrypted=0; + my $ishidden=0; + my $is_random_order=0; + while (@folders) { + my $folder=shift(@folders); + my $foldername=shift(@folders); + if ($folderpath) {$folderpath.='&';} + $folderpath.=$folder.'&'.$foldername; + my $url; + if ($allowed) { + $url = '/adm/coursedocs?folderpath='; + } else { + $url = '/adm/supplemental?folderpath='; } - } - my ($errtext,$fatal) = - &storemap($coursenum, $coursedom, $folder.'.'.$container,1); - return ($errtext,$fatal,$fixuperrors); + $url .= &escape($folderpath); + my $name=&unescape($foldername); +# randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername + $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//; + if ($1 ne '') { + $randompick=$1; + } else { + $randompick=-1; + } + if ($2) { $ishidden=1; } + if ($3) { $isencrypted=1; } + if ($4 ne '') { $is_random_order = 1; } + if ($folder eq 'supplemental') { + $name = &mt('Supplemental '.$crstype.' Content'); + } + &Apache::lonhtmlcommon::add_breadcrumb( + {'href'=>$url.$cpinfo, + 'title'=>$name, + 'text'=>$name, + 'no_mt'=>1, + }); + $plain.=$name.' > '; + } + $plain=~s/\>\;\s*$//; + return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp', + undef, undef, 1 ),$randompick,$ishidden, + $isencrypted,$plain,$is_random_order); } sub log_docs { - return &Apache::lonnet::write_log('course','docslog',@_); + return &Apache::lonnet::instructor_log('docslog',@_); } { @@ -426,28 +436,26 @@ sub docs_change_log { '</script>'."\n"; $r->print(&Apache::loncommon::start_page('Content Change Log',$js)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Change Log')); - $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs'))); + $r->print(&startContentScreen('docs')); my %orderhash; my $container='sequence'; my $pathitem; - if ($env{'form.folderpath'} =~ /\:1$/) { + if ($env{'form.pagepath'}) { $container='page'; + $pathitem = '<input type="hidden" name="pagepath" value="'. + &HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'; + } else { + my $folderpath=$env{'form.folderpath'}; + if ($folderpath eq '') { + $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents')); + } + $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />'; } - my $folderpath=$env{'form.folderpath'}; - if ($folderpath eq '') { - $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents').':::::'); - } - $pathitem = '<input type="hidden" name="folderpath" value="'. - &HTML::Entities::encode($folderpath,'<>&"').'" />'; my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; my $jumpto = $readfile; $jumpto =~ s{^/}{}; my $tid = 1; - if ($supplementalflag) { - $tid = 2; - } - my ($breadcrumbtrail) = - &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1); + my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype); $r->print($breadcrumbtrail. &generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto, $readfile)); @@ -521,30 +529,18 @@ sub docs_change_log { ':'.$docslog{$id}{'exe_udom'}.'</tt>'. $send_msg_link.'</td><td>'. $docslog{$id}{'logentry'}{'folder'}.'</td><td>'); - my $is_supp = 0; - if ($docslog{$id}{'logentry'}{'currentfolder'} =~ /^supplemental/) { - $is_supp = 1; - } # Before for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; if ($oldname ne $newname) { - my $shown = &LONCAPA::map::qtescape($oldname); - if ($is_supp) { - $shown = &Apache::loncommon::parse_supplemental_title($shown); - } - $r->print($shown); + $r->print(&LONCAPA::map::qtescape($oldname)); } } $r->print('<ul>'); for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) { - my $shown = &LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]); - if ($is_supp) { - $shown = &Apache::loncommon::parse_supplemental_title($shown); - } - $r->print('<li>'.$shown.'</li>'); + $r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]).'</li>'); } } $r->print('</ul>'); @@ -555,21 +551,13 @@ sub docs_change_log { my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; if ($oldname ne '' && $oldname ne $newname) { - my $shown = &LONCAPA::map::qtescape($newname); - if ($is_supp) { - $shown = &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($newname)); - } - $r->print($shown); + $r->print(&LONCAPA::map::qtescape($newname)); } } $r->print('<ul>'); for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) { - my $shown = &LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]); - if ($is_supp) { - $shown = &Apache::loncommon::parse_supplemental_title($shown); - } - $r->print('<li>'.$shown.'</li>'); + $r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]).'</li>'); } } $r->print('</ul>'); @@ -599,7 +587,7 @@ sub docs_change_log { } sub update_paste_buffer { - my ($coursenum,$coursedom,$folder) = @_; + my ($coursenum,$coursedom) = @_; return if (!defined($env{'form.markcopy'})); return if (!defined($env{'form.copyfolder'})); @@ -614,379 +602,114 @@ sub update_paste_buffer { 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); + ($title) = &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; - } - if ($nestednames ne '') { - $addtoenv{'docs.markedcopy_nestednames'} = $nestednames; - } - } - } - &Apache::lonnet::appenv(\%addtoenv); + &Apache::lonnet::appenv({'docs.markedcopy_title' => $title, + 'docs.markedcopy_url' => $url}); delete($env{'form.markcopy'}); } -sub recurse_uploaded_maps { - my ($url,$dir,$hierarchy,$titlesref,$nestref,$namesref) = @_; - if (ref($hierarchy->{$url}) eq 'HASH') { - my @maps = map { $hierarchy->{$url}{$_}; } sort { $a <=> $b } (keys(%{$hierarchy->{$url}})); - my @titles = map { $titlesref->{$url}{$_}; } sort { $a <=> $b } (keys(%{$titlesref->{$url}})); - my (@uploaded,@names,%shorter); - for (my $i=0; $i<@maps; $i++) { - my ($inner) = ($maps[$i] =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_(\d+)\.(?:page|sequence)$}); - if ($inner ne '') { - push(@uploaded,$inner); - push(@names,&escape($titles[$i])); - $shorter{$maps[$i]} = $inner; - } - } - $$nestref .= "$dir:".join(',',@uploaded).'&'; - $$namesref .= "$dir:".(join(',',@names)).'___&&&___'; - foreach my $map (@maps) { - if ($shorter{$map} ne '') { - &recurse_uploaded_maps($map,$shorter{$map},$hierarchy,$titlesref,$nestref,$namesref); - } - } - } - return; -} - sub print_paste_buffer { - my ($r,$container,$folder,$coursedom,$coursenum) = @_; + my ($r,$container) = @_; return if (!defined($env{'docs.markedcopy_url'})); - my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent); - my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; + $r->print('<fieldset>' + .'<legend>'.&mt('Clipboard').'</legend>' + .'<form name="pasteform" action="/adm/coursedocs" method="post">' + .'<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> ' + ); + + my $type; if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { - $is_external = 1; + $type = &mt('External Resource'); + $r->print($type.': '. + &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('. + &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')'); + } else { + my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; + 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" />'; + $r->print($icon.$type.': '. &parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}))); } - - 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.'); - } + if ($container eq 'page') { + $r->print(' + <input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" /> + <input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" /> +'); } else { - $canpaste = 1; - } - - if ($canpaste) { - if ($env{'docs.markedcopy_url'} =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { - my $srcdom = $1; - my $srcnum = $2; - my $rem = $3; - if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { - $othercourse = 1; - if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { - if ($canpaste) { - $othercrs = '<br />'.&mt('(from another course).'); - } - } else { - $canpaste = 0; - $nopaste = &mt('Paste from another course unavailable.') - } - } - if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) { - my $prefix = $1; - $parent = $2; - if ($folder !~ /^\Q$prefix\E/) { - $areachange = 1; - } - $is_uploaded_map = 1; - } - } - } - - $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 (($is_uploaded_map) && (!$areachange)) { - if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) { - $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" />'. - &mt('Copy to new folder').'</label>'.(' ' x2). - '<label>'. - '<input type="radio" name="docs.markedcopy_options" value="move" />'. - &mt('Move old folder').'</label><br />'); - if ($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>'; - } - } - &recurse_print($r,$parent,\%deps,\%display); - $r->print('</table>'); - } - $r->print('</div>'); - } - } - $r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs); - $r->print(' + $r->print(' <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> '); - $r->print('</form>'); - } else { - $r->print(&mt('Paste buffer contains:').' '.$buffer. - '<br /><p class="LC_info">'.$nopaste.'</p>'); - } - $r->print('</fieldset>'); -} - -sub recurse_print { - my ($r,$dir,$deps,$display) = @_; - $r->print($display->{$dir}."\n"); - if (ref($deps->{$dir}) eq 'ARRAY') { - foreach my $subdir (@{$deps->{$dir}}) { - &recurse_print($r,$subdir,$deps,$display); - } - } -} - -sub supp_pasteable { - my ($url) = @_; - if (($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//}) || - (($url =~ /\.sequence$/) && ($url =~ m{^/uploaded/})) || - ($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(default|\d+)/\d+/}) || - ($url =~ m{^/adm/$match_domain/$match_username/aboutme}) || - ($url =~ m{^/public/$match_domain/$match_courseid/syllabus})) { - return 1; } - return; -} - -sub paste_popup_js { - my %lt = &Apache::lonlocal::texthash( - show => 'Show Paste Options', - hide => 'Hide Paste 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 />'; - return; -} - -function hidePasteOptions() { - document.getElementById('pasteoptions').style.display='none'; - document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:showPasteOptions()" class="LC_menubuttons_link">$lt{'show'}</a>'; - return; + $r->print('</form></fieldset>'); } -END - -} - - sub do_paste_from_buffer { - my ($coursenum,$coursedom,$folder,$container,$errors) = @_; + my ($coursenum,$coursedom,$folder) = @_; -# Early out if paste buffer is empty if (!$env{'form.pastemarked'}) { - return (); - } - -# 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')); - } + return; } -# Prepare to paste resource at end of list +# paste resource to end of list my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}); my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}); - - my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove); - if ($url=~/\.(page|sequence)$/) { - $is_map = 1; - } - if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) { - $srcdom = $1; - $srcnum = $2; - my $oldprefix = $3; -# When paste buffer was populated using an active role in a different course -# check for mdc privilege in the course from which the resource was pasted - if (($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.')); +# Maps need to be copied first + if (($url=~/\.(page|sequence)$/) && ($url=~/^\/uploaded\//)) { + $title=&mt('Copy of').' '.$title; + my $newid=$$.int(rand(100)).time; + my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/); + if ($oldid =~ m{^(/uploaded/\Q$coursedom\E/\Q$coursenum\E/)(\D+)(\d+)$}) { + my $path = $1; + my $prefix = $2; + my $ancestor = $3; + if (length($ancestor) > 10) { + $ancestor = substr($ancestor,-10,10); } + $oldid = $path.$prefix.$ancestor; } -# 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 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); - } + my $counter = 0; + my $newurl=$oldid.$newid.'.'.$ext; + my $is_unique = &uniqueness_check($newurl); + while (!$is_unique && $counter < 100) { + $counter ++; + $newid ++; + $newurl = $oldid.$newid; + $is_unique = &uniqueness_check($newurl); + } + if (!$is_unique) { + if ($url=~/\.page$/) { + return &mt('Paste failed: an error occurred creating a unique URL for the composite page'); + } else { + return &mt('Paste failed: an error occurred creating a unique URL for the folder'); } - foreach my $item (@nested) { - if ($env{'form.docs.markedcopy_'.$item} eq 'move') { - $tomove{$type.'_'.$item} = 1; - } + } + my $storefn=$newurl; + $storefn=~s{^/\w+/$match_domain/$match_username/}{}; + my $paste_map_result = + &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, + &Apache::lonnet::getfile($url)); + if ($paste_map_result eq '/adm/notfound.html') { + if ($url=~/\.page$/) { + return &mt('Paste failed: an error occurred saving the composite page'); + } else { + return &mt('Paste failed: an error occurred saving the folder'); } } + $url = $newurl; } - -# 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) { -# 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; - } - $mapchanges{$url} = 1; - } - } - } - if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) || - (($newurl ne '') && ($newurl ne $url))) { - unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum, - $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies, - \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove, - \%newsubdir,\%newurls)) { - $mapmoves{$url} = 1; - } - $url = $newurl; - } elsif ($env{'docs.markedcopy_nested'}) { - &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,$allmaps,\%rewrites, - \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves, - \%mapchanges,\%tomove,\%newsubdir,\%newurls); - } - } elsif ($url=~m {^/res/}) { # published maps can only exists once, so remove it from paste buffer when done - &Apache::lonnet::delenv('docs.markedcopy'); -# if pasting published map (main content are only) check map is not already in course - if ($folder =~ /^default/) { - if ((ref($allmaps) eq 'HASH') && ($allmaps->{$url})) { - return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.')); - } - } - } + if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) { + &Apache::lonnet::delenv('docs.markedcopy'); } if ($url=~ m{/smppg$}) { my $db_name = &Apache::lonsimplepage::get_db_name($url); @@ -995,200 +718,36 @@ sub do_paste_from_buffer { my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum); my $now = time(); $db_name =~ s{_\d*$ }{_$now}x; - my $dbresult=&Apache::lonnet::put($db_name,\%contents, + my $result=&Apache::lonnet::put($db_name,\%contents, $coursedom,$coursenum); - if ($dbresult eq 'ok') { - $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; - $title=&mt('Copy of').' '.$title; - } else { - return (&mt('Paste failed: An error occurred when copying the simple page.')); - } + $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; + $title=&mt('Copy of').' '.$title; } } $title = &LONCAPA::map::qtunescape($title); my $ext='false'; if ($url=~m{^http(|s)://}) { $ext='true'; } $url = &LONCAPA::map::qtunescape($url); - -# For uploaded files (excluding pages/sequences) path in copied file is changed -# if paste is from Main to Supplemental (or vice versa), or if pasting between -# courses. - - my $newidx; - unless ($is_map) { # Now insert the URL at the bottom - $newidx = &LONCAPA::map::getresidx($url); - if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) { - my $relpath = $1; - if ($relpath ne '') { - my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$}); - my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/); - my $newprefix = $newloc; - if ($newloc eq 'default') { - $newprefix = 'docs'; - } - if ($newdocsdir eq '') { - $newdocsdir = 'default'; - } - if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { - my $newpath = "$newprefix/$newdocsdir/$newidx/$rem"; - $url = - &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath, - &Apache::lonnet::getfile($oldurl)); - if ($url eq '/adm/notfound.html') { - return (&mt('Paste failed: an error occurred saving the file.')); - } else { - my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$}); - $newsubpath =~ s{/+$}{/}; - $docmoves{$oldurl} = $newsubpath; - } - } - } - } - } -# Apply any changes to maps, or copy dependencies for uploaded HTML pages - my ($result,$save_err); - my %updated = ( - rewrites => \%rewrites, - zombies => \%zombies, - removefrommap => \%removefrommap, - removeparam => \%removeparam, - dbcopies => \%dbcopies, - retitles => \%retitles, - ); - my %info = ( - newsubdir => \%newsubdir, - params => \%params, - before => \%before, - after => \%after, - ); - my %moves = ( - copies => \%copies, - docmoves => \%docmoves, - mapmoves => \%mapmoves, - ); - $result = - &apply_fixups($folder,$is_map,$coursedom,$coursenum,$errors, - \%updated,\%info,\%moves,$prefixchg,$oldurl,$url,'paste'); - if ($result eq 'ok') { - if ($is_map) { - my ($errtext,$fatal) = &mapread($coursenum,$coursedom, - $folder.'.'.$container); - return $errtext if ($fatal); - - if ($#LONCAPA::map::order<1) { - my $idx=&LONCAPA::map::getresidx(); - if ($idx<=0) { $idx=1; } - $LONCAPA::map::order[0]=$idx; - $LONCAPA::map::resources[$idx]=''; - } - $newidx = &LONCAPA::map::getresidx($url); - } - if ($env{'docs.markedcopy_supplemental'}) { - if ($folder !~ /^supplemental/) { - (undef,undef,$title) = - &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'}); - } - } else { - if ($folder=~/^supplemental/) { - $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'. - $env{'user.domain'}.'___&&&___'.$title; - } - } - $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res'; - push(@LONCAPA::map::order, $newidx); - -# Store the result - my ($errtext,$fatal) = - &storemap($coursenum,$coursedom,$folder.'.'.$container,1); - if ($fatal) { - $save_err = $errtext; - } - } - - if ($env{'form.docs.markedcopy_options'} eq 'move') { - &Apache::lonnet::delenv('docs.markedcopy'); - &Apache::lonnet::delenv('docs.markedcopy_nested'); - &Apache::lonnet::delenv('docs.markedcopy_nestednames'); - } - return ($result,$save_err); -} - -sub get_newmap_url { - my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum, - $titleref,$allmaps,$newurls) = @_; - my $newurl; - if ($url=~ m{^/uploaded/}) { - $$titleref=&mt('Copy of').' '.$$titleref; - } - my $now = time; - my $suffix=$$.int(rand(100)).$now; - my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/); - if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) { - my $path = $1; - my $prefix = $2; - my $ancestor = $3; - if (length($ancestor) > 10) { - $ancestor = substr($ancestor,-10,10); - } - my $newid; - if ($prefixchg) { - if ($folder =~ /^supplemental/) { - $prefix =~ s/^default/supplemental/; - } else { - $prefix =~ s/^supplemental/default/; - } - } - if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) { - $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext; + my $newidx = &LONCAPA::map::getresidx($url); + if ($env{'docs.markedcopy_supplemental'}) { + if ($folder =~ /^supplemental/) { + $title = $env{'docs.markedcopy_supplemental'}; } else { - $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$now.'.'.$ext; + (undef,undef,$title) = + &parse_supplemental_title($env{'docs.markedcopy_supplemental'}); } - my $counter = 0; - my $is_unique = &uniqueness_check($newurl); - if ($folder =~ /^default/) { - if ($allmaps->{$newurl}) { - $is_unique = 0; - } - } - while ((!$is_unique || $allmaps->{$newurl} || $newurls->{$newurl}) && ($counter < 100)) { - $counter ++; - $suffix ++; - if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) { - $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext; - } else { - $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$ancestor.$suffix.'.'.$ext; - } - $is_unique = &uniqueness_check($newurl); - } - if ($is_unique) { - $newurls->{$newurl} = 1; - } else { - if ($url=~/\.page$/) { - return (undef,&mt('Paste failed: an error occurred creating a unique URL for the composite page')); - } else { - return (undef,&mt('Paste failed: an error occurred creating a unique URL for the folder')); - } + } else { + if ($folder=~/^supplemental/) { + $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'. + $env{'user.domain'}.'___&&&___'.$title; } } - return ($newurl); -} -sub dbcopy { - my ($url,$coursedom,$coursenum) = @_; - if ($url=~ m{/smppg$}) { - my $db_name = &Apache::lonsimplepage::get_db_name($url); - if ($db_name =~ /^smppage_/) { - #simple pages, need to copy the db contents to a new one. - my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum); - my $now = time(); - $db_name =~ s{_\d*$ }{_$now}x; - my $result=&Apache::lonnet::put($db_name,\%contents, - $coursedom,$coursenum); - $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; - } - } - return $url; + $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res'; + push(@LONCAPA::map::order, $newidx); + return 'ok'; +# Store the result } sub uniqueness_check { @@ -1205,491 +764,6 @@ sub uniqueness_check { return $unique; } -sub contained_map_check { - my ($url,$folder,$removefrommap,$removeparam,$addedmaps,$hierarchy,$titles, - $allmaps) = @_; - my $content = &Apache::lonnet::getfile($url); - unless ($content eq '-1') { - my $parser = HTML::TokeParser->new(\$content); - $parser->attr_encoded(1); - while (my $token = $parser->get_token) { - next if ($token->[0] ne 'S'); - if ($token->[1] eq 'resource') { - next if ($token->[2]->{'type'} eq 'zombie'); - my $ressrc = $token->[2]->{'src'}; - if ($folder =~ /^supplemental/) { - unless (&supp_pasteable($ressrc)) { - $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; - next; - } - } - if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) { - if ($1 eq 'uploaded') { - $hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc; - $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'}; - } else { - if ($allmaps->{$ressrc}) { - $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; - } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') { - $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; - } else { - $addedmaps->{$ressrc} = [$url]; - } - } - &contained_map_check($ressrc,$folder,$removefrommap,$removeparam, - $addedmaps,$hierarchy,$titles,$allmaps); - } - } elsif ($token->[1] eq 'param') { - if ($folder =~ /^supplemental/) { - if (ref($removeparam->{$url}{$token->[2]->{'to'}}) eq 'ARRAY') { - push(@{$removeparam->{$url}{$token->[2]->{'to'}}},$token->[2]->{'name'}); - } else { - $removeparam->{$url}{$token->[2]->{'to'}} = [$token->[2]->{'name'}]; - } - } - } - } - } - return; -} - -sub url_paste_fixups { - my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies, - $dbcopies,$zombies,$params,$mapmoves,$mapchanges,$tomove,$newsubdir,$newurls) = @_; - my $checktitle; - if (($prefixchg) && - ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) { - $checktitle = 1; - } - my $skip; - if ($oldurl =~ m{^\Q/uploaded/$cdom/$cnum/\E(default|supplemental)(_?\d*)\.(?:page|sequence)$}) { - my $mapid = $1.$2; - if ($tomove->{$mapid}) { - $skip = 1; - } - } - my $file = &Apache::lonnet::getfile($oldurl); - return if ($file eq '-1'); - my $parser = HTML::TokeParser->new(\$file); - $parser->attr_encoded(1); - my $changed = 0; - while (my $token = $parser->get_token) { - next if ($token->[0] ne 'S'); - if ($token->[1] eq 'resource') { - my $ressrc = $token->[2]->{'src'}; - next if ($ressrc eq ''); - my $id = $token->[2]->{'id'}; - my $title = $token->[2]->{'title'}; - if ($checktitle) { - if ($title =~ m{\d+\Q___&&&___\E$match_username\Q___&&&___\E$match_domain\Q___&&&___\E(.+)$}) { - $retitles->{$oldurl}{$id} = $ressrc; - } - } - next if ($token->[2]->{'type'} eq 'external'); - if ($token->[2]->{'type'} eq 'zombie') { - next if ($skip); - $zombies->{$oldurl}{$id} = $ressrc; - $changed = 1; - } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { - my $srcdom = $1; - my $srcnum = $2; - my $rem = $3; - my $newurl; - my $mapname; - if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) { - my $prefix = $1; - $mapname = $prefix.$2; - if ($tomove->{$mapname}) { - &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps, - $rewrites,$retitles,$copies,$dbcopies,$zombies, - $params,$mapmoves,$mapchanges,$tomove,$newsubdir, - $newurls); - next; - } else { - ($newurl,my $error) = - &get_newmap_url($ressrc,$folder,$prefixchg,$cdom,$cnum, - $srcdom,$srcnum,\$title,$allmaps,$newurls); - if ($newurl =~ /(?:default|supplemental)_(\d+)\.(?:sequence|page)$/) { - $newsubdir->{$ressrc} = $1; - } - if ($error) { - next; - } - } - } - if (($srcdom ne $cdom) || ($srcnum ne $cnum) || ($prefixchg) || - ($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) { - - if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) { - $rewrites->{$oldurl}{$id} = $ressrc; - $mapchanges->{$ressrc} = 1; - unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps, - $rewrites,$retitles,$copies,$dbcopies,$zombies, - $params,$mapmoves,$mapchanges,$tomove,$newsubdir, - $newurls)) { - $mapmoves->{$ressrc} = 1; - } - $changed = 1; - } else { - $rewrites->{$oldurl}{$id} = $ressrc; - $copies->{$oldurl}{$ressrc} = $id; - $changed = 1; - } - } - } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) { - next if ($skip); - my $srcdom = $1; - my $srcnum = $2; - if (($srcdom ne $cdom) || ($srcnum ne $cnum)) { - $rewrites->{$oldurl}{$id} = $ressrc; - $dbcopies->{$oldurl}{$ressrc} = $id; - $changed = 1; - } - } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) { - next if ($skip); - my $srcdom = $1; - my $srcnum = $2; - if (($srcdom ne $cdom) || ($srcnum ne $cnum)) { - $rewrites->{$oldurl}{$id} = $ressrc; - $dbcopies->{$oldurl}{$ressrc} = $id; - $changed = 1; - } - } - } elsif ($token->[1] eq 'param') { - next if ($skip); - my $to = $token->[2]->{'to'}; - if ($to ne '') { - if (ref($params->{$oldurl}{$to}) eq 'ARRAY') { - push(@{$params->{$oldurl}{$to}},$token->[2]->{'name'}); - } else { - @{$params->{$oldurl}{$to}} = ($token->[2]->{'name'}); - } - } - } - } - return $changed; -} - -sub apply_fixups { - my ($folder,$is_map,$cdom,$cnum,$errors,$updated,$info,$moves,$prefixchg, - $oldurl,$url,$caller) = @_; - my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles, - %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves); - if (ref($updated) eq 'HASH') { - if (ref($updated->{'rewrites'}) eq 'HASH') { - %rewrites = %{$updated->{'rewrites'}}; - } - if (ref($updated->{'zombies'}) eq 'HASH') { - %zombies = %{$updated->{'zombies'}}; - } - if (ref($updated->{'removefrommap'}) eq 'HASH') { - %removefrommap = %{$updated->{'removefrommap'}}; - } - if (ref($updated->{'removeparam'}) eq 'HASH') { - %removeparam = %{$updated->{'removeparam'}}; - } - if (ref($updated->{'dbcopies'}) eq 'HASH') { - %dbcopies = %{$updated->{'dbcopies'}}; - } - if (ref($updated->{'retitles'}) eq 'HASH') { - %retitles = %{$updated->{'retitles'}}; - } - } - if (ref($info) eq 'HASH') { - if (ref($info->{'newsubdir'}) eq 'HASH') { - %newsubdir = %{$info->{'newsubdir'}}; - } - if (ref($info->{'params'}) eq 'HASH') { - %params = %{$info->{'params'}}; - } - if (ref($info->{'before'}) eq 'HASH') { - %before = %{$info->{'before'}}; - } - if (ref($info->{'after'}) eq 'HASH') { - %after = %{$info->{'after'}}; - } - } - if (ref($moves) eq 'HASH') { - if (ref($moves->{'copies'}) eq 'HASH') { - %copies = %{$moves->{'copies'}}; - } - if (ref($moves->{'docmoves'}) eq 'HASH') { - %docmoves = %{$moves->{'docmoves'}}; - } - if (ref($moves->{'mapmoves'}) eq 'HASH') { - %mapmoves = %{$moves->{'mapmoves'}}; - } - } - foreach my $key (keys(%copies),keys(%docmoves)) { - my @allcopies; - if (exists($copies{$key})) { - if (ref($copies{$key}) eq 'HASH') { - my %added; - foreach my $innerkey (keys(%{$copies{$key}})) { - if (($innerkey ne '') && (!$added{$innerkey})) { - push(@allcopies,$innerkey); - $added{$innerkey} = 1; - } - } - undef(%added); - } - } - if ($key eq $oldurl) { - if ((exists($docmoves{$key}))) { - unless (grep(/^\Q$oldurl\E$/,@allcopies)) { - push(@allcopies,$oldurl); - } - } - } - if (@allcopies > 0) { - foreach my $item (@allcopies) { - my ($relpath,$oldsubdir,$fname) = - ($item =~ m{^(/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(default|\d+)/.*/)([^/]+)$}); - if ($fname ne '') { - my $content = &Apache::lonnet::getfile($item); - unless ($content eq '-1') { - my $storefn; - if (($key eq $oldurl) && (exists($docmoves{$key}))) { - $storefn = $docmoves{$key}; - } else { - $storefn = $relpath; - $storefn =~s{^/uploaded/$match_domain/$match_courseid/}{}; - if ($prefixchg && $before{'doc'} && $after{'doc'}) { - $storefn =~ s/^\Q$before{'doc'}\E/$after{'doc'}/; - } - if ($newsubdir{$key}) { - $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir{$key}/#; - } - } - ©_dependencies($item,$storefn,$relpath,$errors,\$content); - my $copyurl = - &Apache::lonclonecourse::writefile($env{'request.course.id'}, - $storefn.$fname,$content); - if ($copyurl eq '/adm/notfound.html') { - if (exists($docmoves{$oldurl})) { - return &mt('Paste failed: an error occurred copying the file.'); - } elsif (ref($errors) eq 'HASH') { - $errors->{$item} = 1; - } - } - } - } - } - } - } - foreach my $key (keys(%mapmoves)) { - my $storefn=$key; - $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{}; - if ($prefixchg && $before{'map'} && $after{'map'}) { - $storefn =~ s/^\Q$before{'map'}\E/$after{'map'}/; - } - if ($newsubdir{$key}) { - $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/; - } - my $mapcontent = &Apache::lonnet::getfile($key); - if ($mapcontent eq '-1') { - if (ref($errors) eq 'HASH') { - $errors->{$key} = 1; - } - } else { - my $newmap = - &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, - $mapcontent); - if ($newmap eq '/adm/notfound.html') { - if (ref($errors) eq 'HASH') { - $errors->{$key} = 1; - } - } - } - } - my %updates; - if ($is_map) { - if (ref($updated) eq 'HASH') { - foreach my $type (keys(%{$updated})) { - if (ref($updated->{$type}) eq 'HASH') { - foreach my $key (keys(%{$updated->{$type}})) { - $updates{$key} = 1; - } - } - } - } - foreach my $key (keys(%updates)) { - my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb); - if (ref($rewrites{$key}) eq 'HASH') { - %torewrite = %{$rewrites{$key}}; - } - if (ref($retitles{$key}) eq 'HASH') { - %toretitle = %{$retitles{$key}}; - } - if (ref($removefrommap{$key}) eq 'HASH') { - %toremove = %{$removefrommap{$key}}; - } - if (ref($removeparam{$key}) eq 'HASH') { - %remparam = %{$removeparam{$key}}; - } - if (ref($zombies{$key}) eq 'HASH') { - %zombie = %{$zombies{$key}}; - } - if (ref($dbcopies{$key}) eq 'HASH') { - foreach my $item (keys(%{$dbcopies{$key}})) { - $newdb{$item} = &dbcopy($item); - } - } - if (ref($params{$key}) eq 'HASH') { - %currparam = %{$params{$key}}; - } - my ($errtext,$fatal) = &LONCAPA::map::mapread($key); - if ($fatal) { - return $errtext; - } - for (my $i=0; $i<@LONCAPA::map::zombies; $i++) { - if (defined($LONCAPA::map::zombies[$i])) { - my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]); - if ($zombie{$i} eq $src) { - undef($LONCAPA::map::zombies[$i]); - } - } - } - for (my $i=0; $i<@LONCAPA::map::order; $i++) { - my $idx = $LONCAPA::map::order[$i]; - 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)) { - splice(@LONCAPA::map::order,$i,1); - if (ref($currparam{$idx}) eq 'ARRAY') { - foreach my $name (@{$currparam{$idx}}) { - &LONCAPA::map::delparameter($idx,'parameter_'.$name); - } - } - next; - } - my $origsrc = $src; - if ((exists($toretitle{$idx})) && ($toretitle{$idx} eq $src)) { - if ($title =~ m{^\d+\Q___&&&___\E$match_username\Q___&&&___\E$match_domain\Q___&&&___\E(.+)$}) { - $changed = 1; - } - } - if ((exists($torewrite{$idx})) && ($torewrite{$idx} eq $src)) { - $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/}; - if ($origsrc =~ m{^/uploaded/}) { - if ($prefixchg && $before{'map'} && $after{'map'}) { - if ($src =~ /\.(page|sequence)$/) { - $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'map'}\E#$1$after{'map'}#; - } else { - $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'doc'}\E#$1$after{'doc'}#; - } - } - if ($origsrc =~ /\.(page|sequence)$/) { - if ($newsubdir{$origsrc}) { - $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir{$origsrc}#; - } - } elsif ($newsubdir{$key}) { - $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir{$key}#; - } - } - $changed = 1; - } elsif ($newdb{$src} ne '') { - $src = $newdb{$src}; - $changed = 1; - } - if ($changed) { - $LONCAPA::map::resources[$idx] = join(':',($title,$src,$ext,$type)); - } - } - } - foreach my $idx (keys(%remparam)) { - if (ref($remparam{$idx}) eq 'ARRAY') { - foreach my $name (@{$remparam{$idx}}) { - &LONCAPA::map::delparameter($idx,'parameter_'.$name); - } - } - } - my $storefn; - if ($key eq $oldurl) { - $storefn = $url; - $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{}; - } else { - $storefn = $key; - $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{}; - if ($prefixchg && $before{'map'} && $after{'map'}) { - $storefn =~ s/^\Q$before{'map'}\E/$after{'map'}/; - } - if ($newsubdir{$key}) { - $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/; - } - } - my $report; - if ($folder !~ /^supplemental/) { - $report = 1; - } - (my $outtext,$errtext) = - &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report); - if ($errtext) { - if ($caller eq 'paste') { - return &mt('Paste failed: an error occurred saving the folder or page.'); - } - } - } - } - return 'ok'; -} - -sub copy_dependencies { - my ($item,$storefn,$relpath,$errors,$contentref) = @_; - my $content; - if (ref($contentref)) { - $content = $$contentref; - } else { - $content = &Apache::lonnet::getfile($item); - } - unless ($content eq '-1') { - my $mm = new File::MMagic; - my $mimetype = $mm->checktype_contents($content); - if ($mimetype eq 'text/html') { - my (%allfiles,%codebase,$state); - my $res = &Apache::lonnet::extract_embedded_items(undef,\%allfiles,\%codebase,\$content); - if ($res eq 'ok') { - my ($numexisting,$numpathchanges,$existing); - (undef,$numexisting,$numpathchanges,$existing) = - &Apache::loncommon::ask_for_embedded_content( - '/adm/coursedocs',$state,\%allfiles,\%codebase, - {'error_on_invalid_names' => 1, - 'ignore_remote_references' => 1, - 'docs_url' => $item, - 'context' => 'paste'}); - if ($numexisting > 0) { - if (ref($existing) eq 'HASH') { - foreach my $dep (keys(%{$existing})) { - my $depfile = $dep; - unless ($depfile =~ m{^\Q$relpath\E}) { - $depfile = $relpath.$dep; - } - my $depcontent = &Apache::lonnet::getfile($depfile); - unless ($depcontent eq '-1') { - my $storedep = $dep; - $storedep =~ s{^\Q$relpath\E}{}; - my $dep_url = - &Apache::lonclonecourse::writefile( - $env{'request.course.id'}, - $storefn.$storedep,$depcontent); - if ($dep_url eq '/adm/notfound.html') { - if (ref($errors) eq 'HASH') { - $errors->{$depfile} = 1; - } - } else { - ©_dependencies($depfile,$storefn,$relpath,$errors,\$depcontent); - } - } - } - } - } - } - } - } - return; -} - my %parameter_type = ( 'randompick' => 'int_pos', 'hiddenresource' => 'string_yesno', 'encrypturl' => 'string_yesno', @@ -1763,24 +837,15 @@ sub handle_edit_cmd { sub editor { my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype, - $supplementalflag,$orderhash,$iconpath,$pathitem)=@_; - my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order,$container); - if ($allowed) { - (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain, - $is_random_order,$container) = - &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1); - $r->print($breadcrumbtrail); - } elsif ($env{'form.folderpath'} =~ /\:1$/) { - $container = 'page'; - } else { - $container = 'sequence'; - } + $supplementalflag,$orderhash,$iconpath)=@_; + my $container= ($env{'form.pagepath'}) ? 'page' + : 'sequence'; + + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = + &breadcrumbs($allowed,$crstype); + $r->print($breadcrumbtrail); - my $jumpto; - - unless ($supplementalflag) { - $jumpto = "'uploaded/$coursedom/$coursenum/$folder.$container'"; - } + my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container"; unless ($allowed) { $randompick = -1; @@ -1819,35 +884,20 @@ sub editor { } if ($env{'form.pastemarked'}) { - my %paste_errors; - my ($paste_res,$save_error) = - &do_paste_from_buffer($coursenum,$coursedom,$folder,$container, - \%paste_errors); - if ($save_error ne '') { - return $save_error; - } - if ($paste_res ne 'ok') { + my $paste_res = + &do_paste_from_buffer($coursenum,$coursedom,$folder); + if ($paste_res eq 'ok') { + ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container); + return $errtext if ($fatal); + } elsif ($paste_res ne '') { $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>'); } - if (keys(%paste_errors) > 0) { - $r->print('<p span 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))) { - $r->print('<li>'.$key.'</li>'."\n"); - } - $r->print('</ul></p>'."\n"); - } } $r->print($upload_output); if (&handle_edit_cmd()) { - my $contentchg; - if ($env{'form.cmd'} =~ /^(del|cut)_/) { - $contentchg = 1; - } - ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg); + ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); return $errtext if ($fatal); } # Group import/search @@ -1857,28 +907,12 @@ sub editor { if (defined($item)) { my ($name,$url,$residx)= map {&unescape($_)} split(/\=/,$item); - if ($url=~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) { - my ($suffix,$errortxt,$locknotfreed) = - &newmap_suffix($1,$2,$coursedom,$coursenum); - if ($locknotfreed) { - $r->print($locknotfreed); - } - if ($suffix) { - $url =~ s/_new\./_$suffix./; - } else { - return $errortxt; - } - } push(@imports, [$name, $url, $residx]); } } - ($errtext,$fatal,my $fixuperrors) = - &group_import($coursenum, $coursedom, $folder,$container, - 'londocs',@imports); + ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder, + $container,'londocs',@imports); return $errtext if ($fatal); - if ($fixuperrors) { - $r->print($fixuperrors); - } } # Loading a complete map if ($env{'form.loadmap'}) { @@ -1890,7 +924,7 @@ sub editor { $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx; } ($errtext,$fatal)=&storemap($coursenum,$coursedom, - $folder.'.'.$container,1); + $folder.'.'.$container); return $errtext if ($fatal); } else { $r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>'); @@ -1944,68 +978,35 @@ sub editor { unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $idx++; next; } $output .= &entryline($idx,$name,$url,$folder,$allowed,$res, - $coursenum,$coursedom,$crstype, - $pathitem,$supplementalflag,$container); + $coursenum,$crstype); $idx++; $shown++; } &Apache::loncommon::end_data_table_count(); - - if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) { - my $toolslink = '<table><tr><td>' - .&Apache::loncommon::help_open_menu('Navigation Screen', - 'Navigation_Screen',undef,'RAT') - .'</td><td class="LC_middle">'.&mt('Tools:').'</td>' - .'<td align="left"><ul id="LC_toolbar">' - .'<li><a href="/adm/coursedocs?forcesupplement=1&command=editsupp" ' - .'id="LC_content_toolbar_edittoplevel" ' - .'class="LC_toolbarItem" ' - .'title="'.&mt('Supplemental Content Editor').'">' - .'</a></li></ul></td></tr></table><br />'; - if ($shown) { - if ($allowed) { - $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll') - .&Apache::loncommon::start_data_table(undef,'contentlist') - .&Apache::loncommon::start_data_table_header_row() - .'<th colspan="2">'.&mt('Move').'</th>' - .'<th>'.&mt('Actions').'</th>' - .'<th colspan="2">'.&mt('Document').'</th>'; - if ($folder !~ /^supplemental/) { - $to_show .= '<th colspan="4">'.&mt('Settings').'</th>'; - } - $to_show .= &Apache::loncommon::end_data_table_header_row() - .$output.' ' - .&Apache::loncommon::end_data_table() - .'<br style="line-height:2px;" />' - .&Apache::loncommon::end_scrollbox(); - } else { - $to_show .= $toolslink - .&Apache::loncommon::start_data_table('LC_tableOfContent') - .$output.' ' - .&Apache::loncommon::end_data_table(); - } - } else { - if (!$allowed) { - $to_show .= $toolslink; + + if ($shown) { + $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll') + .&Apache::loncommon::start_data_table(undef,'contentlist'); + if ($allowed) { + $to_show .= &Apache::loncommon::start_data_table_header_row() + .'<th colspan="2">'.&mt('Move').'</th>' + .'<th>'.&mt('Actions').'</th>' + .'<th colspan="2">'.&mt('Document').'</th>'; + if ($folder !~ /^supplemental/) { + $to_show .= '<th colspan="4">'.&mt('Settings').'</th>'; } - $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll') - .'<div class="LC_info" id="contentlist">' - .&mt('Currently no documents.') - .'</div>' - .&Apache::loncommon::end_scrollbox(); - } - } else { - if ($shown) { - $to_show = '<div>' - .&Apache::loncommon::start_data_table('LC_tableOfContent') - .$output - .&Apache::loncommon::end_data_table() - .'</div>'; - } else { - $to_show = '<div class="LC_info" id="contentlist">' - .&mt('Currently no documents.') - .'</div>' + $to_show .= &Apache::loncommon::end_data_table_header_row(); } + $to_show .= $output.' ' + .&Apache::loncommon::end_data_table() + .'<br style="line-height:2px;" />' + .&Apache::loncommon::end_scrollbox(); + } else { + $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll') + .'<div class="LC_info" id="contentlist">' + .&mt('Currently no documents.') + .'</div>' + .&Apache::loncommon::end_scrollbox(); } my $tid = 1; if ($supplementalflag) { @@ -2015,8 +1016,21 @@ sub editor { my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, $readfile)); - &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum); + &print_paste_buffer($r,$container); } else { + if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + #Function Box for Supplemental Content for users with mdc priv. + my $funcname = &mt('Folder Editor'); + $r->print( + &Apache::loncommon::head_subbox( + &Apache::lonhtmlcommon::start_funclist(). + &Apache::lonhtmlcommon::add_item_funclist( + '<a href="/adm/coursedocs?command=direct&forcesupplement=1&'. + 'supppath='.&HTML::Entities::encode($env{'form.folderpath'}).'">'. + '<img src="/res/adm/pages/docs.png" alt="'.$funcname.'" class="LC_icon" />'. + '<span class="LC_menubuttons_inline_text">'.$funcname.'</span></a>'). + &Apache::lonhtmlcommon::end_funclist())); + } $r->print($to_show); } return; @@ -2037,7 +1051,7 @@ sub process_file_upload { my $errtext=''; my $fatal=0; my $container='sequence'; - if ($env{'form.folderpath'} =~ /:1$/) { + if ($env{'form.pagepath'}) { $container='page'; } ($errtext,$fatal)= @@ -2090,7 +1104,7 @@ sub process_file_upload { $comment.':'.$url.':'.$ext.':normal:res'; $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx; ($errtext,$fatal)=&storemap($coursenum,$coursedom, - $folder.'.'.$container,1); + $folder.'.'.$container); if ($fatal) { $$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>'; return; @@ -2127,6 +1141,7 @@ sub process_file_upload { my $archiveurl = &HTML::Entities::encode($url,'<>&"'); my %archiveitems = ( folderpath => $env{'form.folderpath'}, + pagepath => $env{'form.pagepath'}, cmd => $nextphase, newidx => $newidx, position => $position, @@ -2177,56 +1192,68 @@ sub is_supplemental_title { return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/); } +sub parse_supplemental_title { + my ($title) = @_; + + my ($foldertitle,$renametitle); + if ($title =~ /&&&/) { + $title = &HTML::Entites::decode($title); + } + if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) { + $renametitle=$4; + my ($time,$uname,$udom) = ($1,$2,$3); + $foldertitle=&Apache::lontexconvert::msgtexconverted($4); + my $name = &Apache::loncommon::plainname($uname,$udom); + $name = &HTML::Entities::encode($name,'"<>&\''); + $renametitle = &HTML::Entities::encode($renametitle,'"<>&\''); + $title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '. + $name.': <br />'.$foldertitle; + } + if (wantarray) { + return ($title,$foldertitle,$renametitle); + } + return $title; +} + # --------------------------------------------------------------- An entry line sub entryline { - my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom, - $crstype,$pathitem,$supplementalflag,$container)=@_; - my ($foldertitle,$renametitle); + my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_; + my ($foldertitle,$pagetitle,$renametitle); if (&is_supplemental_title($title)) { - ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title); + ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title); + $pagetitle = $foldertitle; } else { $title=&HTML::Entities::encode($title,'"<>&\''); $renametitle=$title; $foldertitle=$title; + $pagetitle=$title; } my $orderidx=$LONCAPA::map::order[$index]; + $renametitle=~s/\\/\\\\/g; $renametitle=~s/\"\;/\\\"/g; $renametitle=~s/ /%20/g; my $line=&Apache::loncommon::start_data_table_row(); my ($form_start,$form_end,$form_common); # Edit commands - my ($type, $esc_path, $path, $symb); - if ($container eq 'page') { - $type = 'page'; - } else { - $type = 'folder'; - } + my ($container, $type, $esc_path, $path, $symb); if ($env{'form.folderpath'}) { + $type = 'folder'; + $container = 'sequence'; $esc_path=&escape($env{'form.folderpath'}); $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"'); } - my $isexternal; - if ($residx) { - my $currurl = $url; - $currurl =~ s{^http(|s)(:|:)//}{/adm/wrapper/ext/}; - if ($currurl =~ m{^/adm/wrapper/ext/}) { - $isexternal = 1; - } - if (!$supplementalflag) { - my $path = 'uploaded/'. - $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'. - $env{'course.'.$env{'request.course.id'}.'.num'}.'/'; - $symb = &Apache::lonnet::encode_symb($path.$folder.".$container", - $residx, - &Apache::lonnet::declutter($currurl)); - } + if ($env{'form.pagepath'}) { + $type = $container = 'page'; + $esc_path=&escape($env{'form.pagepath'}); + $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"'); + $symb=&escape($env{'form.pagesymb'}); } - my ($renamelink,%lt); + my $cpinfo=''; if ($allowed) { my $incindex=$index+1; my $selectbox=''; @@ -2249,81 +1276,36 @@ sub entryline { } $selectbox.='</select>'; } - %lt=&Apache::lonlocal::texthash( + my %lt=&Apache::lonlocal::texthash( 'up' => 'Move Up', 'dw' => 'Move Down', 'rm' => 'Remove', 'ct' => 'Cut', 'rn' => 'Rename', - 'cp' => 'Copy', - 'ex' => 'External Resource', - 'ed' => 'Edit', - 'pr' => 'Preview', - 'sv' => 'Save', - 'ul' => 'URL', - 'ti' => 'Title', - ); + 'cp' => 'Copy'); my $nocopy=0; my $nocut=0; - my $noremove=0; - if ($url=~ m{^/res/.+\.(page|sequence)$}) { - # no copy for published maps - $nocopy=1; + if ($url=~/\.(page|sequence)$/) { + if ($url =~ m{/res/}) { + # no copy for published maps + $nocopy = 1; + } else { + foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) { + my ($title,$url,$ext,$type)=split(/\:/,$item); + if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) { + $nocopy=1; + last; + } + } + } } if ($url=~/^\/res\/lib\/templates\//) { $nocopy=1; $nocut=1; } - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - if ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") { - if ($env{'form.folderpath'} =~ /^default&[^\&]+$/) { - my %curr_groups = &Apache::longroup::coursegroups(); - if (keys(%curr_groups) > 0) { - $noremove=1; - } - $nocut=1; - $nocopy=1; - } - } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) { - my $group = $1; - if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) { - my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); - if (keys(%curr_group) > 0) { - $noremove=1; - } - } - $nocut=1; - $nocopy=1; - } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) { - my $group = $1; - if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) { - my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); - my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group}); - if (keys(%groupsettings) > 0) { - $noremove=1; - } - $nocut=1; - $nocopy=1; - } - } elsif ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) { - my $group = $1; - my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); - if ($url =~ /group_boards_\Q$group\E/) { - my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group); - my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group}); - if (keys(%groupsettings) > 0) { - if (ref($groupsettings{'functions'}) eq 'HASH') { - if ($groupsettings{'functions'}{'discussion'} eq 'on') { - $noremove=1; - } - } - } - $nocut=1; - $nocopy=1; - } - } - my ($copylink,$cutlink,$removelink); + my $copylink=' '; + my $cutlink=' '; + my $skip_confirm = 0; if ( $folder =~ /^supplemental/ || ($url =~ m{( /smppg$ @@ -2331,43 +1313,21 @@ sub entryline { |/aboutme$ |/navmaps$ |/bulletinboard$ - |\.html$)}x) - || $isexternal) { + |\.html$ + |^/adm/wrapper/ext)}x)) { $skip_confirm = 1; } - if ($nocopy) { - $copylink=(<<ENDCOPY); -<span style="visibility: hidden;">$lt{'cp'}</span> -ENDCOPY - } else { + if (!$nocopy) { $copylink=(<<ENDCOPY); -<a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$folder');" class="LC_docs_copy">$lt{'cp'}</a> +<a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$symb','$folder');" class="LC_docs_copy">$lt{'cp'}</a> ENDCOPY } - if ($nocut) { - $cutlink=(<<ENDCUT); -<span style="visibility: hidden;">$lt{'ct'}</span> -ENDCUT - } else { + if (!$nocut) { $cutlink=(<<ENDCUT); -<a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a> +<a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$symb','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a> ENDCUT } - if ($noremove) { - $removelink=(<<ENDREM); -<span style="visibility: hidden;">$lt{'rm'}</a> -ENDREM - } else { - $removelink=(<<ENDREM); -<a href='javascript:removeres("$esc_path","$index","$renametitle",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a> -ENDREM - } - 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"> '; @@ -2381,13 +1341,13 @@ END $line.=(<<END); <td> <div class="LC_docs_entry_move"> - <a href='/adm/coursedocs?cmd=up_$index&${type}path=$esc_path&${type}symb=$symb'> - <img src="${iconpath}move_up.gif" alt="$lt{'up'}" class="LC_icon" /> + <a href='/adm/coursedocs?cmd=up_$index&${type}path=$esc_path&${type}symb=$symb$cpinfo'> + <img src="${iconpath}move_up.gif" alt='$lt{'up'}' class="LC_icon" /> </a> </div> <div class="LC_docs_entry_move"> - <a href='/adm/coursedocs?cmd=down_$index&${type}path=$esc_path&${type}symb=$symb'> - <img src="${iconpath}move_down.gif" alt="$lt{'dw'}" class="LC_icon" /> + <a href='/adm/coursedocs?cmd=down_$index&${type}path=$esc_path&${type}symb=$symb$cpinfo'> + <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' class="LC_icon" /> </a> </div> </td> @@ -2397,11 +1357,11 @@ END $selectbox $form_end </td> -<td class="LC_docs_entry_commands"><span class="LC_nobreak"> -$removelink +<td class="LC_docs_entry_commands"> + <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a> $cutlink + <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' class="LC_docs_rename">$lt{'rn'}</a> $copylink -</span> </td> END @@ -2410,18 +1370,22 @@ END my ($extension)=($url=~/\.(\w+)$/); my $uploaded=($url=~/^\/*uploaded\//); my $icon=&Apache::loncommon::icon($url); - my $isfolder; - my $ispage; - my $containerarg; + my $isfolder=0; + my $ispage=0; + my $folderarg; + my $pagearg; + my $pagefile; if ($uploaded) { if (($extension eq 'sequence') || ($extension eq 'page')) { $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/; - $containerarg = $1; + my $containerarg = $1; if ($extension eq 'sequence') { $icon=$iconpath.'navmap.folder.closed.gif'; + $folderarg=$containerarg; $isfolder=1; } else { $icon=$iconpath.'page.gif'; + $pagearg=$containerarg; $ispage=1; } if ($allowed) { @@ -2434,122 +1398,114 @@ END } } - my ($editlink,$extresform); my $orig_url = $url; $orig_url=~s{http(:|:)//https(:|:)//}{https$2//}; - $url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/}; - if (!$supplementalflag && $residx && $symb) { - if ((!$isfolder) && (!$ispage)) { - (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); - $url=&Apache::lonnet::clutter($url); - if ($url=~/^\/*uploaded\//) { - $url=~/\.(\w+)$/; - my $embstyle=&Apache::loncommon::fileembstyle($1); - if (($embstyle eq 'img') || ($embstyle eq 'emb')) { - $url='/adm/wrapper'.$url; - } elsif ($embstyle eq 'ssi') { - #do nothing with these - } elsif ($url!~/\.(sequence|page)$/) { - $url='/adm/coursedocs/showdoc'.$url; - } - } elsif ($url=~m|^/ext/|) { - $url='/adm/wrapper'.$url; - } - if (&Apache::lonnet::symbverify($symb,$url)) { - $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); - } else { - $url=''; - } + my $external = ($url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/}); + if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) { + my $symb=&Apache::lonnet::symbclean( + &Apache::lonnet::declutter('uploaded/'. + $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'. + $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder. + '.sequence'). + '___'.$residx.'___'. + &Apache::lonnet::declutter($url)); + (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); + $url=&Apache::lonnet::clutter($url); + if ($url=~/^\/*uploaded\//) { + $url=~/\.(\w+)$/; + my $embstyle=&Apache::loncommon::fileembstyle($1); + if (($embstyle eq 'img') || ($embstyle eq 'emb')) { + $url='/adm/wrapper'.$url; + } elsif ($embstyle eq 'ssi') { + #do nothing with these + } elsif ($url!~/\.(sequence|page)$/) { + $url='/adm/coursedocs/showdoc'.$url; + } + } elsif ($url=~m|^/ext/|) { + $url='/adm/wrapper'.$url; + $external = 1; + } + if (&Apache::lonnet::symbverify($symb,$url)) { + $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); + } else { + $url=''; + } + if ($container eq 'page') { + my $symb=$env{'form.pagesymb'}; + + $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]); + $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); } } my ($rand_pick_text,$rand_order_text); - if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') { + if ($isfolder || $extension eq 'sequence') { my $foldername=&escape($foldertitle); my $folderpath=$env{'form.folderpath'}; if ($folderpath) { $folderpath.='&' }; - if (!$allowed && $supplementalflag) { - $folderpath.=$containerarg.'&'.$foldername; - $url.='folderpath='.&escape($folderpath); - } else { # Append randompick number, hidden, and encrypted with ":" to foldername, # so it gets transferred between levels - $folderpath.=$containerarg.'&'.$foldername. - ':'.(&LONCAPA::map::getparameter($orderidx, + $folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx, 'parameter_randompick'))[0] .':'.((&LONCAPA::map::getparameter($orderidx, 'parameter_hiddenresource'))[0]=~/^yes$/i) .':'.((&LONCAPA::map::getparameter($orderidx, 'parameter_encrypturl'))[0]=~/^yes$/i) .':'.((&LONCAPA::map::getparameter($orderidx, - 'parameter_randomorder'))[0]=~/^yes$/i) - .':'.$ispage; - $url.='folderpath='.&escape($folderpath); - my $rpicknum = (&LONCAPA::map::getparameter($orderidx, - 'parameter_randompick'))[0]; - my $rpckchk; - if ($rpicknum) { - $rpckchk = ' checked="checked"'; - } - my $formname = 'edit_rpick_'.$orderidx; - $rand_pick_text = + 'parameter_randomorder'))[0]=~/^yes$/i); + $url.='folderpath='.&escape($folderpath).$cpinfo; + my $rpicknum = (&LONCAPA::map::getparameter($orderidx, + 'parameter_randompick'))[0]; + my $rpckchk; + if ($rpicknum) { + $rpckchk = ' checked="checked"'; + } + my $formname = 'edit_rpick_'.$orderidx; + $rand_pick_text = '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n". $form_common."\n". '<span class="LC_nobreak"><label><input type="checkbox" name="randpickon_'.$orderidx.'" id="rpick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="randompick_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" />'; - if ($rpicknum ne '') { - $rand_pick_text .= ': <a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>'; - } - $rand_pick_text .= '</span></form>'; - my $ro_set= - ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':''); - $rand_order_text = + if ($rpicknum ne '') { + $rand_pick_text .= ': <a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>'; + } + $rand_pick_text .= '</span></form>'; + my $ro_set= + ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':''); + $rand_order_text = $form_start. $form_common.' <span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onclick="'."this.form.changeparms.value='randomorder';this.form.submit()".'" '.$ro_set.' /> '.&mt('Random Order').' </label></span></form>'; - } - } elsif ($supplementalflag && !$allowed) { - $url .= ($url =~ /\?/) ? '&':'?'; - $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"'); - if ($title) { - $url .= '&title='.&HTML::Entities::encode($renametitle,'<>&"'); - } - if ($isexternal && $orderidx) { - $url .= '&idx='.$orderidx; - } } - my ($tdalign,$tdwidth); - if ($allowed) { - my $fileloc = - &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url)); - if ($isexternal) { - ($editlink,$extresform) = - &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem); - } elsif (!$isfolder && !$ispage) { - my ($cfile,$home,$switchserver,$forceedit,$forceview) = - &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url); - if (($cfile ne '') && ($symb ne '' || $supplementalflag)) { - my $jscall = - &Apache::lonhtmlcommon::jump_to_editres($cfile,$home, - $switchserver, - $forceedit, - undef,$symb, - &escape($env{'form.folderpath'}), - $renametitle,'','',1); - if ($jscall) { - $editlink = '<a class="LC_docs_ext_edit" href="javascript:'. - $jscall.'" >'.&mt('Edit').'</a> '."\n"; - } - } - } - $tdalign = ' align="right" valign="top"'; - $tdwidth = ' width="80%"'; + if ($ispage) { + my $pagename=&escape($pagetitle); + my $pagepath; + my $folderpath=$env{'form.folderpath'}; + if ($folderpath) { $pagepath = $folderpath.'&' }; + $pagepath.=$pagearg.'&'.$pagename; + my $symb=$env{'form.pagesymb'}; + if (!$symb) { + my $path='uploaded/'. + $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'. + $env{'course.'.$env{'request.course.id'}.'.num'}.'/'; + $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence', + $residx, + $path.$pagearg.'.page'); + } + $url.='pagepath='.&escape($pagepath). + '&pagesymb='.&escape($symb).$cpinfo; + } + if (($external) && ($allowed)) { + my $form = ($folder =~ /^default/)? 'newext' : 'supnewext'; + $external = ' <a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>'; + } else { + undef($external); } my $reinit; if ($crstype eq 'Community') { $reinit = &mt('(re-initialize community to access)'); } else { $reinit = &mt('(re-initialize course to access)'); - } - $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink; + } + $line.='<td>'; if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>'; } elsif ($url) { @@ -2558,7 +1514,7 @@ $form_common.' } else { $line.='<img src="'.$icon.'" alt="" class="LC_icon" />'; } - $line.='</span></td><td'.$tdwidth.'>'; + $line.='</td><td>'; if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { $line.='<a href="'.$url.'">'.$title.'</a>'; } elsif ($url) { @@ -2567,7 +1523,7 @@ $form_common.' } else { $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>'; } - $line.="$extresform</td>"; + $line.=$external."</td>"; $rand_pick_text = ' ' if ($rand_pick_text eq ''); $rand_order_text = ' ' if ($rand_order_text eq ''); if (($allowed) && ($folder!~/^supplemental/)) { @@ -2598,30 +1554,6 @@ ENDPARMS return $line; } -sub newmap_suffix { - my ($area,$container,$coursedom,$coursenum) = @_; - my ($prefix,$idtype,$errtext,$locknotfreed); - $prefix = 'docs'; - if ($area eq 'supplemental') { - $prefix = 'supp'; - } - $prefix .= $container; - $idtype = 'concat'; - my ($suffix,$freedlock,$error) = - &Apache::lonnet::get_timebased_id($prefix,'num','uploadedmaps', - $coursedom,$coursenum); - if (!$suffix) { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.'); - if ($error) { - $errtext .= '<br />'.$error; - } - } - if ($freedlock ne 'ok') { - $locknotfreed = '<div class="LC_error">'.&mt('There was a problem removing a lockfile. This will prevent creation of additional folders or composite pages in this course. Please contact the domain coordinator for your LON-CAPA domain.').'</div>'; - } - return ($suffix,$errtext,$locknotfreed); -} - =pod =item tiehash() @@ -2717,7 +1649,7 @@ sub checkonthis { $r->print('<span class="LC_error">'.&mt('connection down').'</span>'); } elsif ($result eq 'not_found') { unless ($url=~/\$/) { - $r->print('<span class="LC_error">'.&mt('not found').'</span>'); + $r->print('<span class="LC_error">'.&mt('not found').'</b></span>'); } else { $r->print('<span class="LC_error">'.&mt('unable to verify variable URL').'</span>'); } @@ -2763,7 +1695,7 @@ sub list_symbs { $r->print(&Apache::loncommon::start_data_table_row(). '<td>'.$res->compTitle().'</td>'. '<td>'.$res->symb().'</td>'. - &Apache::loncommon::end_data_table_row()); + &Apache::loncommon::start_data_table_row()); $count ++; } if (!$count) { @@ -2773,7 +1705,6 @@ sub list_symbs { } $r->print(&Apache::loncommon::end_data_table()); } - $r->print(&endContentScreen()); } @@ -2804,7 +1735,6 @@ sub verifycontent { } &untiehash(); $r->print('<p class="LC_success">'.&mt('Done').'</p>'); - $r->print(&endContentScreen()); } @@ -2884,7 +1814,7 @@ sub checkversions { if ($env{'form.timerange'} eq 'all') { # show all documents $header=&mt('All Documents in '.$crstype); - $allsel=' selected="selected"'; + $allsel=1; foreach my $key (keys(%hash)) { if ($key=~/^ids\_(\/res\/.+)$/) { my $src=$1; @@ -2905,19 +1835,19 @@ sub checkversions { .&mt('seconds'); if ($env{'form.timerange'}==-1) { $seltext='since start of course'; - $startsel=' selected="selected"'; + $startsel='selected'; $env{'form.timerange'}=time; } $starttime=time-$env{'form.timerange'}; if ($env{'form.timerange'}==2592000) { $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')'; - $monthsel=' selected="selected"'; + $monthsel='selected'; } elsif ($env{'form.timerange'}==604800) { $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')'; - $weeksel=' selected="selected"'; + $weeksel='selected'; } elsif ($env{'form.timerange'}==86400) { $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')'; - $daysel=' selected="selected"'; + $daysel='selected'; } $header=&mt('Content changed').' '.$seltext; } else { @@ -2955,11 +1885,11 @@ sub checkversions { <fieldset> <legend>$lt{'cd'}</legend> <select name="timerange"> -<option value='all'$allsel>$lt{'al'}</option> -<option value="-1"$startsel>$lt{'st'}</option> -<option value="2592000"$monthsel>$lt{'lm'}</option> -<option value="604800"$weeksel>$lt{'lw'}</option> -<option value="86400"$daysel>$lt{'sy'}</option> +<option value='all' $allsel>$lt{'al'}</option> +<option value="-1" $startsel>$lt{'st'}</option> +<option value="2592000" $monthsel>$lt{'lm'}</option> +<option value="604800" $weeksel>$lt{'lw'}</option> +<option value="86400" $daysel>$lt{'sy'}</option> </select> <input type="submit" name="display" value="$lt{'sd'}" /> </fieldset> @@ -2975,93 +1905,110 @@ $lt{'sc'}: <input type="submit" name="se <hr /> <h4>$lt{'vers'}</h4> <input type="submit" name="setversions" value="$lt{'save'}" /> +<table border="0"> ENDHEADERS #number of columns for version history + my $num_ver_col = 1; $r->print( - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - '<th>'.&mt('Resources').'</th>'. - "<th>$lt{'mr'}</th>". - "<th>$lt{'ve'}</th>". - "<th>$lt{'vu'}</th>". - '<th>'.&mt('History').'</th>'. - &Apache::loncommon::end_data_table_header_row() - ); + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th>'.&mt('Resources').'</th>'. + "<th>$lt{'mr'}</th>". + "<th>$lt{'ve'}</th>". + "<th>$lt{'vu'}</th>". + '<th colspan="'.$num_ver_col.'">'.&mt('History').'</th>'. + '</b>'); foreach my $key (sort(keys(%changes))) { - #excludes not versionable problems from resource version history: - next unless ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/); - my ($root,$extension)=($key=~/^(.*)\.(\w+)$/); - my $currentversion=&Apache::lonnet::getversion($key); - if ($currentversion<0) { - $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>'; - } - my $linkurl=&Apache::lonnet::clutter($key); + if ($changes{$key}>$starttime) { + my ($root,$extension)=($key=~/^(.*)\.(\w+)$/); + my $currentversion=&Apache::lonnet::getversion($key); + if ($currentversion<0) { + $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>'; + } + my $linkurl=&Apache::lonnet::clutter($key); $r->print( + &Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row(). - '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'. + '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br>'. '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'. - '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('. + '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br>('. &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')</span></td>'. - '<td align="right">' - ); - # Used in course - my $usedversion=$hash{'version_'.$linkurl}; - if (($usedversion) && ($usedversion ne 'mostrecent')) { - if ($usedversion != $currentversion) { + '<td align="right">'); +# Used in course + my $usedversion=$hash{'version_'.$linkurl}; + if (($usedversion) && ($usedversion ne 'mostrecent')) { + if($usedversion != $currentversion){ $r->print('<span class="LC_warning">'.$usedversion.'</span>'); - } else { + }else{ $r->print($usedversion); } + } else { + $r->print($currentversion); + } + $r->print('</td><td title="'.$lt{'vu'}.'">'); +# Set version + $r->print(&Apache::loncommon::select_form($setversions{$linkurl}, + 'set_version_'.$linkurl, + {'select_form_order' => + ['',1..$currentversion,'mostrecent'], + '' => '', + 'mostrecent' => &mt('most recent'), + map {$_,$_} (1..$currentversion)})); + my $lastold=1; + for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { + my $url=$root.'.'.$prevvers.'.'.$extension; + if (&Apache::lonnet::metadata($url,'lastrevisiondate')< + $starttime) { + $lastold=$prevvers; + } + } + # + # Code to figure out how many version entries should go in + # each of the four columns + my $entries_per_col = 0; + my $num_entries = ($currentversion-$lastold); + if ($num_entries % $num_ver_col == 0) { + $entries_per_col = $num_entries/$num_ver_col; } else { - $r->print($currentversion); + $entries_per_col = $num_entries/$num_ver_col + 1; } - $r->print('</td><td title="'.$lt{'vu'}.'">'); - # Set version - $r->print(&Apache::loncommon::select_form( - $setversions{$linkurl}, - 'set_version_'.$linkurl, - {'select_form_order' => ['',1..$currentversion,'mostrecent'], - '' => '', - 'mostrecent' => &mt('most recent'), - map {$_,$_} (1..$currentversion)})); - my $lastold=1; - for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { - my $url=$root.'.'.$prevvers.'.'.$extension; - if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) { - $lastold=$prevvers; - } - } - $r->print('</td>'); - # List all available versions - $r->print('<td valign="top"><span class="LC_fontsize_medium">'); - for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) { - my $url=$root.'.'.$prevvers.'.'.$extension; - $r->print( - '<span class="LC_nobreak">' - .'<a href="'.&Apache::lonnet::clutter($url).'">' - .&mt('Version [_1]',$prevvers).'</a>' - .' ('.&Apache::lonlocal::locallocaltime( - &Apache::lonnet::metadata($url,'lastrevisiondate')) - .')'); - if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') { - $r->print( - ' <a href="/adm/diff?filename='. - &Apache::lonnet::clutter($root.'.'.$extension). - &HTML::Entities::encode('&versionone='.$prevvers,'"<>&'). - '" target="diffs">'.&mt('Diffs').'</a>'); + my $entries_count = 0; + $r->print('<td valign="top"><span class="LC_fontsize_medium">'); + my $cols_output = 1; + for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) { + my $url=$root.'.'.$prevvers.'.'.$extension; + $r->print('<span class="LC_nobreak"><a href="'.&Apache::lonnet::clutter($url). + '">'.&mt('Version').' '.$prevvers.'</a> ('. + &Apache::lonlocal::locallocaltime( + &Apache::lonnet::metadata($url, + 'lastrevisiondate') + ). + ')'); + if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') { + $r->print(' <a href="/adm/diff?filename='. + &Apache::lonnet::clutter($root.'.'.$extension). + '&versionone='.$prevvers. + '" target="diffs">'.&mt('Diffs').'</a>'); + } + $r->print('</span><br />'); + if (++$entries_count % $entries_per_col == 0) { + $r->print('</span></td>'); + if ($cols_output != $num_ver_col) { + $r->print('<td valign="top"><span class="LC_fontsize_medium">'); + $cols_output++; + } + } + } + while($cols_output++ < $num_ver_col) { + $r->print('</span></td><td>'); } - $r->print('</span><br />'); - } - $r->print('</span></td>'.&Apache::loncommon::end_data_table_row()); + } } - $r->print( - &Apache::loncommon::end_data_table(). - '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />'. - '</form>' - ); + $r->print('</td>'.&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(). + '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />'); &untiehash(); - $r->print(&endContentScreen()); } sub mark_hash_old { @@ -3093,6 +2040,11 @@ sub changewarning { my $pathvar='folderpath'; my $path=&escape($env{'form.folderpath'}); if (!defined($url)) { + if (defined($env{'form.pagepath'})) { + $pathvar='pagepath'; + $path=&escape($env{'form.pagepath'}); + $path.='&pagesymb='.&escape($env{'form.pagesymb'}); + } $url='/adm/coursedocs?'.$pathvar.'='.$path; } my $course_type = &Apache::loncommon::course_type(); @@ -3133,9 +2085,9 @@ sub init_breadcrumbs { sub create_list_elements { my @formarr = @_; my $list = ''; - foreach my $button (@formarr){ - foreach my $picture (keys(%{$button})) { - $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text', id => ''}); + for my $button (@formarr){ + for my $picture(keys %$button) { + $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'}); } } return $list; @@ -3158,6 +2110,7 @@ sub startContentScreen { if (($mode eq 'navmaps') || ($mode eq 'supplemental')) { $output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b> '.&mt('Content Overview').' </b></a></li>'."\n"; $output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b> '.&mt('Content Search').' </b></a></li>'."\n"; + $output .= '<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b> '.&mt('Content Index').' </b></a></li>'."\n"; $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>'; } else { $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b> '.&mt('Content Editor').' </b></a></li>'."\n"; @@ -3204,8 +2157,7 @@ sub handler { 'Adding_External_Resource','Navigate_Content', 'Adding_Folders','Docs_Overview', 'Load_Map', 'Supplemental','Score_Upload_Form','Adding_Pages', - 'Importing_LON-CAPA_Resource','Importing_IMS_Course', - 'Uploading_From_Harddrive', + 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive', 'Check_Resource_Versions','Verify_Content') { $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic); } @@ -3265,9 +2217,9 @@ sub handler { # Get the parameters that may be needed # &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['folderpath', - 'forcesupplement','forcestandard', - 'tools','symb','command','supppath']); + ['folderpath','pagepath', + 'pagesymb','forcesupplement','forcestandard', + 'tools','symb','command']); # standard=1: this is a "new-style" course with an uploaded map as top level # standard=2: this is a "old-style" course, and there is nothing we can do @@ -3281,7 +2233,7 @@ sub handler { my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); - if (($env{'form.folderpath'}=~/^default/) || ($env{'form.folderpath'} eq "")) { + if (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'} eq "" || ($env{'form.pagepath'})) { $supplementalflag=0; } if ($env{'form.forcesupplement'}) { $supplementalflag=1; } @@ -3296,58 +2248,106 @@ sub handler { my $addentries = {}; my $container; my $containertag; - my $pathitem; + my $uploadtag; # Do we directly jump somewhere? - if (($env{'form.command'} eq 'direct') || ($env{'form.command'} eq 'directnav')) { + if ($env{'form.command'} eq 'direct') { + my ($mapurl,$id,$resurl); if ($env{'form.symb'} ne '') { - $env{'form.folderpath'}= - &Apache::loncommon::symb_to_docspath($env{'form.symb'}); - &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => - $env{'form.command'}.'_'.$env{'form.symb'}}); + ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'}); + if ($resurl=~/\.(sequence|page)$/) { + $mapurl=$resurl; + } elsif ($resurl eq 'adm/navmaps') { + $mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; + } + my $mapresobj; + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + $mapresobj = $navmap->getResourceByUrl($mapurl); + } + $mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1}; + my $type=$2; + my $path; + if (ref($mapresobj)) { + my $pcslist = $mapresobj->map_hierarchy(); + if ($pcslist ne '') { + foreach my $pc (split(/,/,$pcslist)) { + next if ($pc <= 1); + my $res = $navmap->getByMapPc($pc); + if (ref($res)) { + my $thisurl = $res->src(); + $thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; + my $thistitle = $res->title(); + $path .= '&'. + &Apache::lonhtmlcommon::entity_encode($thisurl).'&'. + &Apache::lonhtmlcommon::entity_encode($thistitle). + ':'.$res->randompick(). + ':'.$res->randomout(). + ':'.$res->encrypted(). + ':'.$res->randomorder(); + } + } + } + $path .= '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. + &Apache::lonhtmlcommon::entity_encode($mapresobj->title()). + ':'.$mapresobj->randompick(). + ':'.$mapresobj->randomout(). + ':'.$mapresobj->encrypted(). + ':'.$mapresobj->randomorder(); + } else { + my $maptitle = &Apache::lonnet::gettitle($mapurl); + $path = '&default&...::::'. + '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. + &Apache::lonhtmlcommon::entity_encode($maptitle).'::::'; + } + $path = 'default&'. + &Apache::lonhtmlcommon::entity_encode('Main Course Documents'). + $path; + if ($type eq 'sequence') { + $env{'form.folderpath'}=$path; + $env{'form.pagepath'}=''; + } else { + $env{'form.pagepath'}=$path; + $env{'form.folderpath'}=''; + } } elsif ($env{'form.supppath'} ne '') { $env{'form.folderpath'}=$env{'form.supppath'}; - &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => - $env{'form.command'}.'_'.$env{'form.supppath'}}); } } elsif ($env{'form.command'} eq 'editdocs') { - $env{'form.folderpath'} = 'default&'. - &Apache::lonhtmlcommon::entity_encode('Main Course Content'). - ':::::'; - &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}}); + $env{'form.folderpath'} = 'default&'. + &Apache::lonhtmlcommon::entity_encode('Main Course Content'); + $env{'form.pagepath'}=''; } elsif ($env{'form.command'} eq 'editsupp') { - $env{'form.folderpath'} = 'supplemental&'. + $env{'form.folderpath'} = 'default&'. &Apache::lonhtmlcommon::entity_encode('Supplemental Content'); - &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'}); - } elsif ($env{'form.command'} eq 'contents') { - &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'}); - } elsif ($env{'form.command'} eq 'home') { - &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/menu'}); + $env{'form.pagepath'}=''; } - # Where do we store these for when we come back? my $stored_folderpath='docs_folderpath'; if ($supplementalflag) { $stored_folderpath='docs_sup_folderpath'; } -# No folderpath, and in edit mode, see if we have something stored - if ((!$env{'form.folderpath'}) && $allowed) { +# No folderpath, no pagepath, see if we have something stored + if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) { &Apache::loncommon::restore_course_settings($stored_folderpath, - {'folderpath' => 'scalar'}); - unless (&unescape($env{'form.folderpath'}) =~ m{^(default|supplemental)&}) { - undef($env{'form.folderpath'}); - } + {'folderpath' => 'scalar'}); } # If we are not allowed to make changes, all we can see are supplemental docs if (!$allowed) { + $env{'form.pagepath'}=''; unless ($env{'form.folderpath'} =~ /^supplemental/) { $env{'form.folderpath'} = &supplemental_base(); } } +# If we still not have a folderpath, see if we can resurrect at pagepath + if (!$env{'form.folderpath'} && $allowed) { + &Apache::loncommon::restore_course_settings($stored_folderpath, + {'pagepath' => 'scalar'}); + } # Make the zeroth entry in supplemental docs page paths, so we can get to top level if ($env{'form.folderpath'} =~ /^supplemental_\d+/) { $env{'form.folderpath'} = &supplemental_base() @@ -3355,42 +2355,48 @@ sub handler { $env{'form.folderpath'}; } # If after all of this, we still don't have any paths, make them - unless ($env{'form.folderpath'}) { + unless (($env{'form.pagepath'}) || ($env{'form.folderpath'})) { if ($supplementalflag) { $env{'form.folderpath'}=&supplemental_base(); } else { - $env{'form.folderpath'}='default'.&escape(&mt('Main '.$crstype.' Documents')). - ':::::'; + $env{'form.folderpath'}='default'; } } # Store this unless ($toolsflag) { - if ($allowed) { - &Apache::loncommon::store_course_settings($stored_folderpath, - {'folderpath' => 'scalar'}); - } - my $folderpath; + &Apache::loncommon::store_course_settings($stored_folderpath, + {'pagepath' => 'scalar', + 'folderpath' => 'scalar'}); if ($env{'form.folderpath'}) { - $folderpath = $env{'form.folderpath'}; - my (@folders)=split('&',$env{'form.folderpath'}); - $env{'form.foldername'}=&unescape(pop(@folders)); - if ($env{'form.foldername'} =~ /\:1$/) { - $container = 'page'; - } else { - $container = 'sequence'; - } - $env{'form.folder'}=pop(@folders); - } else { - if ($env{'form.folder'} eq '' || - $env{'form.folder'} eq 'supplemental') { - $folderpath='default&'. - &escape(&mt('Main '.$crstype.' Documents')). - ':::::'; + my (@folderpath)=split('&',$env{'form.folderpath'}); + $env{'form.foldername'}=&unescape(pop(@folderpath)); + $env{'form.folder'}=pop(@folderpath); + $container='sequence'; + } + if ($env{'form.pagepath'}) { + my (@pagepath)=split('&',$env{'form.pagepath'}); + $env{'form.pagename'}=&unescape(pop(@pagepath)); + $env{'form.folder'}=pop(@pagepath); + $container='page'; + $containertag = '<input type="hidden" name="pagepath" value="" />'. + '<input type="hidden" name="pagesymb" value="" />'; + $uploadtag = + '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'. + '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'. + '<input type="hidden" name="folderpath" value="" />'; + } else { + my $folderpath=$env{'form.folderpath'}; + if (!$folderpath) { + if ($env{'form.folder'} eq '' || + $env{'form.folder'} eq 'supplemental') { + $folderpath='default&'. + &escape(&mt('Main '.$crstype.' Documents')); + } } + $containertag = '<input type="hidden" name="folderpath" value="" />'; + $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />'; } - $containertag = '<input type="hidden" name="folderpath" value="" />'; - $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />'; if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { $showdoc='/'.$1; } @@ -3428,7 +2434,7 @@ sub handler { @tabids = ('002','ee2','ff2'); } else { @tabids = ('aa1','bb1','cc1','ff1'); - unless ($env{'form.folderpath'} =~ /\:1$/) { + unless ($env{'form.pagepath'}) { unshift(@tabids,'001'); push(@tabids,('dd1','ee1')); } @@ -3437,19 +2443,11 @@ sub handler { $script .= &editing_js($udom,$uname,$supplementalflag). &history_tab_js(). &inject_data_js(). - &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr). - &Apache::lonextresedit::extedit_javascript(); + &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr); $addentries = { onload => "javascript:resize_scrollbox('contentscroll','1','1');", }; } - if ($env{'docs.markedcopy_url'}) { - $script .= &paste_popup_js(); - } - my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'. - &mt('Switch server?'); - - } # -------------------------------------------------------------------- Body tag $script = '<script type="text/javascript">'."\n" @@ -3460,26 +2458,22 @@ sub handler { # Breadcrumbs &Apache::lonhtmlcommon::clear_breadcrumbs(); - - if ($showdoc) { - $r->print(&Apache::loncommon::start_page("$crstype documents",undef, - {'force_register' => $showdoc,})); - } elsif ($r->uri eq '/adm/supplemental') { - my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype); - $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef, - {'bread_crumbs' => $brcrum,})); - } else { + unless ($showdoc) { &Apache::lonhtmlcommon::add_breadcrumb({ href=>"/adm/coursedocs",text=>"$crstype Contents"}); $r->print(&Apache::loncommon::start_page("$crstype Contents", $script, - {'add_entries' => $addentries} - ) + {'force_register' => $showdoc, + 'add_entries' => $addentries, + }) .&Apache::loncommon::help_open_menu('','',273,'RAT') .&Apache::lonhtmlcommon::breadcrumbs( 'Editing '.$crstype.' Contents', 'Docs_Adding_Course_Doc') ); + } else { + $r->print(&Apache::loncommon::start_page("$crstype documents",undef, + {'force_register' => $showdoc,})); } my %allfiles = (); @@ -3542,17 +2536,20 @@ sub handler { } elsif ((!$showdoc) && (!$uploadphase)) { # ----------------------------------------------------------------------------- my %lt=&Apache::lonlocal::texthash( + 'uplm' => 'Upload a new main '.lc($crstype).' document', + 'upls' => 'Upload a new supplemental '.lc($crstype).' document', + 'impp' => 'Import a document', 'copm' => 'All documents out of a published map into this folder', - 'upfi' => 'Upload File', - 'upld' => 'Import Content', + 'upld' => 'Import Document', 'srch' => 'Search', 'impo' => 'Import', 'lnks' => 'Import from Stored Links', - 'impm' => 'Import from Assembled Map', 'selm' => 'Select Map', 'load' => 'Load Map', + 'reco' => 'Recover Deleted Documents', 'newf' => 'New Folder', 'newp' => 'New Composite Page', + 'extr' => 'External Resource', 'syll' => 'Syllabus', 'navc' => 'Table of Contents', 'sipa' => 'Simple Course Page', @@ -3563,15 +2560,17 @@ sub handler { 'mypi' => 'My Personal Information Page', 'grpo' => 'Group Portfolio', 'rost' => 'Course Roster', - 'abou' => 'Personal Information Page for a User', + 'abou' => 'Personal Information Page for a User', 'imsf' => 'IMS Import', 'imsl' => 'Import IMS package', - 'cms' => 'Origin of IMS package', - 'se' => 'Select', 'file' => 'File', 'title' => 'Title', 'comment' => 'Comment', 'parse' => 'Upload embedded images/multimedia files if HTML file', + 'nd' => 'Upload Document', + 'pm' => 'Published Map', + 'sd' => 'Special Document', + 'mo' => 'More Options', ); # ----------------------------------------------------------------------------- my $fileupload=(<<FIUP); @@ -3587,91 +2586,56 @@ FIUP <input type="checkbox" name="parserflag" checked="checked" /> $lt{'parse'} </label> CHBO - my $imsfolder = $env{'form.folder'}; - if ($imsfolder eq '') { - $imsfolder = 'default'; - } - my $imspform=(<<IMSFORM); - <a class="LC_menubuttons_link" href="javascript:toggleUpload('ims');"> - $lt{'imsf'}</a> $help{'Importing_IMS_Course'} - <form name="uploadims" action="/adm/imsimportdocs" method="post" enctype="multipart/form-data" target="IMSimport"> - <fieldset id="uploadimsform" style="display: none;"> - <legend>$lt{'imsf'}</legend> - $fileupload - <br /> - <p> - $lt{'cms'}: - <select name="source"> - <option value="-1" selected="selected">$lt{'se'}</option> - <option value="bb5">Blackboard 5</option> - <option value="bb6">Blackboard 6</option> - <option value="angel5">ANGEL 5.5</option> - <option value="webctce4">WebCT 4 Campus Edition</option> - </select> - <input type="hidden" name="folder" value="$imsfolder" /> - </p> - <input type="hidden" name="phase" value="one" /> - <input type="button" value="$lt{'imsl'}" onclick="makeims(this.form);" /> - </fieldset> - </form> -IMSFORM + my $fileuploada = "<br clear='all' /><input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}"; my $fileuploadform=(<<FUFORM); - <a class="LC_menubuttons_link" href="javascript:toggleUpload('doc');"> - $lt{'upfi'}</a> $help{'Uploading_From_Harddrive'} - <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data"> - <fieldset id="uploaddocform" style="display: none;"> - <legend>$lt{'upfi'}</legend> + <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data"> <input type="hidden" name="active" value="aa" /> $fileupload <br /> $lt{'title'}:<br /> <input type="text" size="60" name="comment" /> - $pathitem + $uploadtag <input type="hidden" name="cmd" value="upload_default" /> <br /> <span class="LC_nobreak" style="float:left"> $checkbox </span> - <br clear="all" /> - <input type="submit" value="$lt{'upld'}" /> - </fieldset> - </form> FUFORM + $fileuploadform .= $fileuploada.'</form>'; - my $importpubform=(<<SEDFFORM); - <a class="LC_menubuttons_link" href="javascript:toggleMap('map');"> - $lt{'impm'}</a>$help{'Load_Map'} - <form action="/adm/coursedocs" method="post" name="mapimportform"> - <fieldset id="importmapform" style="display: none;"> - <legend>$lt{'impm'}</legend> + my $simpleeditdefaultform=(<<SEDFFORM); + <form action="/adm/coursedocs" method="post" name="simpleeditdefault"> <input type="hidden" name="active" value="bb" /> - $lt{'copm'}<br /> - <span class="LC_nobreak"> - <input type="text" name="importmap" size="40" value="" - onfocus="this.blur();openbrowser('mapimportform','importmap','sequence,page','');" /> - <a href="javascript:openbrowser('mapimportform','importmap','sequence,page','');">$lt{'selm'}</a></span><br /> - <input type="submit" name="loadmap" value="$lt{'load'}" /> - </fieldset> - </form> - SEDFFORM - my @importpubforma = ( - { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'" onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" }, + my @simpleeditdefaultforma = ( + { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'" onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" }, { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'" onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" }, { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:open_StoredLinks_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_StoredLinks_Import();'>$lt{'lnks'}</a>" }, - { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform } ); - $importpubform = &create_form_ul(&create_list_elements(@importpubforma)); - my $extresourcesform = - &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem, - $help{'Adding_External_Resource'}); + $simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma)); + $simpleeditdefaultform .=(<<SEDFFORM); + <hr id="bb_hrule" style="width:0px;text-align:left;margin-left:0" /> + $lt{'copm'}<br /> + <input type="text" size="40" name="importmap" /><br /> + <span class="LC_nobreak" style="float:left"><input type="button" + onclick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')" + value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" /> + $help{'Load_Map'}</span> + </form> +SEDFFORM + + my $extresourcesform=(<<ERFORM); + <form action="/adm/coursedocs" method="post" name="newext"> + $uploadtag + <input type="hidden" name="importdetail" value="" /> + <a class="LC_menubuttons_link" href="javascript:makenewext('newext');">$lt{'extr'}</a>$help{'Adding_External_Resource'} + </form> +ERFORM + + if ($allowed) { - my $folder = $env{'form.folder'}; - if ($folder eq '') { - $folder='default'; - } - &update_paste_buffer($coursenum,$coursedom,$folder); + &update_paste_buffer($coursenum,$coursedom); $r->print(<<HIDDENFORM); <form name="renameform" method="post" action="/adm/coursedocs"> <input type="hidden" name="title" /> @@ -3682,23 +2646,18 @@ SEDFFORM </form> HIDDENFORM - $r->print(&makesimpleeditform($pathitem)."\n". - &makedocslogform($pathitem."\n". + $r->print(&makesimpleeditform($uploadtag)."\n". + &makedocslogform($uploadtag."\n". '<input type="hidden" name="folder" value="'. $env{'form.folder'}.'" />'."\n")); } # Generate the tabs - my ($mode,$needs_end); + my $mode; if (($supplementalflag) && (!$allowed)) { - my @folders = split('&',$env{'form.folderpath'}); - unless (@folders > 2) { - &Apache::lonnavdisplay::startContentScreen($r,'supplemental'); - $needs_end = 1; - } + &Apache::lonnavdisplay::startContentScreen($r,'supplemental'); } else { $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs'))); - $needs_end = 1; } # @@ -3711,7 +2670,7 @@ HIDDENFORM $folder='default'; $savefolderpath = $env{'form.folderpath'}; $env{'form.folderpath'}='default&'.&escape(&mt('Content')); - $pathitem = '<input type="hidden" name="folderpath" value="'. + $uploadtag = '<input type="hidden" name="folderpath" value="'. &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'; } my $postexec=''; @@ -3725,14 +2684,27 @@ HIDDENFORM } else { #$postexec='self.close();'; } - my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.sequence'; - my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.page'; + my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time. + '.sequence'; + my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time. + '.page'; + my $container='sequence'; + if ($env{'form.pagepath'}) { + $container='page'; + } my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container; + my $imspform=(<<IMSPFORM); + <form action="/adm/imsimportdocs" method="post" name="ims"> + <input type="hidden" name="folder" value="$folder" /> + <a class="LC_menubuttons_link" href="javascript:makeims();">$lt{'imsf'}</a> + </form> +IMSPFORM + my $newnavform=(<<NNFORM); <form action="/adm/coursedocs" method="post" name="newnav"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="$lt{'navc'}=/adm/navmaps" /> <a class="LC_menubuttons_link" href="javascript:document.newnav.submit()">$lt{'navc'}</a> @@ -3742,7 +2714,7 @@ NNFORM my $newsmppageform=(<<NSPFORM); <form action="/adm/coursedocs" method="post" name="newsmppg"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a> $help{'Simple Page'} @@ -3752,7 +2724,7 @@ NSPFORM my $newsmpproblemform=(<<NSPROBFORM); <form action="/adm/coursedocs" method="post" name="newsmpproblem"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a> $help{'Simple Problem'} @@ -3763,7 +2735,7 @@ NSPROBFORM my $newdropboxform=(<<NDBFORM); <form action="/adm/coursedocs" method="post" name="newdropbox"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a> </form> @@ -3772,7 +2744,7 @@ NDBFORM my $newexuploadform=(<<NEXUFORM); <form action="/adm/coursedocs" method="post" name="newexamupload"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makeexamupload();">$lt{'scuf'}</a> $help{'Score_Upload_Form'} @@ -3782,7 +2754,7 @@ NEXUFORM my $newbulform=(<<NBFORM); <form action="/adm/coursedocs" method="post" name="newbul"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a> $help{'Bulletin Board'} @@ -3792,7 +2764,7 @@ NBFORM my $newaboutmeform=(<<NAMFORM); <form action="/adm/coursedocs" method="post" name="newaboutme"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="$plainname=/adm/$udom/$uname/aboutme" /> <a class="LC_menubuttons_link" href="javascript:document.newaboutme.submit()">$lt{'mypi'}</a> @@ -3803,7 +2775,7 @@ NAMFORM my $newaboutsomeoneform=(<<NASOFORM); <form action="/adm/coursedocs" method="post" name="newaboutsomeone"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a> </form> @@ -3813,7 +2785,7 @@ NASOFORM my $newrosterform=(<<NROSTFORM); <form action="/adm/coursedocs" method="post" name="newroster"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="$lt{'rost'}=/adm/viewclasslist" /> <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a> @@ -3845,7 +2817,7 @@ NPFORM $newfolderform=(<<NFFORM); <form action="/adm/coursedocs" method="post" name="newfolder"> - $pathitem + <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="" /> <input type="hidden" name="active" value="aa" /> <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'} @@ -3855,7 +2827,7 @@ NFFORM my $newsylform=(<<NSYLFORM); <form action="/adm/coursedocs" method="post" name="newsyl"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" /> <a class="LC_menubuttons_link" href="javascript:document.newsyl.submit()">$lt{'syll'}</a> @@ -3867,7 +2839,7 @@ NSYLFORM my $newgroupfileform=(<<NGFFORM); <form action="/adm/coursedocs" method="post" name="newgroupfiles"> <input type="hidden" name="active" value="cc" /> - $pathitem + $uploadtag <input type="hidden" name="importdetail" value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" /> <a class="LC_menubuttons_link" href="javascript:document.newgroupfiles.submit()">$lt{'grpo'}</a> @@ -3884,17 +2856,9 @@ NGFFORM my @importdoc = ( - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform} - ); - unless ($container eq 'page') { - push(@importdoc, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform} - ); - } - push(@importdoc, - {'<img class="LC_noBorder_LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform} - ); - $fileuploadform = &create_form_ul(&create_list_elements(@importdoc)); + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'newext\');" />'=>$extresourcesform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:makeims();" />'=>$imspform},); + $fileuploadform = &create_form_ul(&create_list_elements(@importdoc)) . '<hr id="cc_hrule" style="width:0px;text-align:left;margin-left:0" />' . $fileuploadform; @gradingforma=( {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform}, @@ -3914,20 +2878,20 @@ NGFFORM $communityform = &create_form_ul(&create_list_elements(@communityforma)); my %orderhash = ( - 'aa' => ['Import Content',$fileuploadform], - 'bb' => ['Published Content',$importpubform], + 'aa' => ['Import Documents',$fileuploadform], + 'bb' => ['Published Resources',$simpleeditdefaultform], 'cc' => ['Grading Resources',$gradingform], ); -unless ($container eq 'page') { +unless ($env{'form.pagepath'}) { $orderhash{'00'} = ['Newfolder',$newfolderform]; $orderhash{'dd'} = ['Collaboration',$communityform]; - $orderhash{'ee'} = ['Special Pages',$specialdocumentsform]; + $orderhash{'ee'} = ['Special Documents',$specialdocumentsform]; } $hadchanges=0; unless (($supplementalflag || $toolsflag)) { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, - $supplementalflag,\%orderhash,$iconpath,$pathitem); + $supplementalflag,\%orderhash,$iconpath); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } @@ -3951,18 +2915,17 @@ unless ($container eq 'page') { } elsif ($allowed) { $env{'form.folderpath'} = $savefolderpath; } - $pathitem = '<input type="hidden" name="folderpath" value="'. - &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'; + $env{'form.pagepath'} = ''; if ($allowed) { my $folderseq= - '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_new.sequence'; + '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time. + '.sequence'; + + my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + my $supupdocformbtn = "<input type='submit' value='".$lt{'upld'}."' />$help{'Uploading_From_Harddrive'}"; my $supupdocform=(<<SUPDOCFORM); - <a class="LC_menubuttons_link" href="javascript:toggleUpload('suppdoc');"> - $lt{'upfi'}</a> $help{'Uploading_From_Harddrive'} <form action="/adm/coursedocs" method="post" name="supuploaddocument" enctype="multipart/form-data"> - <fieldset id="uploadsuppdocform" style="display: none;"> - <legend>$lt{'upfi'}</legend> <input type="hidden" name="active" value="ee" /> $fileupload <br /> @@ -3974,30 +2937,35 @@ unless ($container eq 'page') { $lt{'comment'}:<br /> <textarea cols="50" rows="4" name="comment"></textarea> <br /> - $pathitem + <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="cmd" value="upload_supplemental" /> - <input type='submit' value="$lt{'upld'}" /> - </form> SUPDOCFORM + $supupdocform .= &create_form_ul(&Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>"; my $supnewfolderform=(<<SNFFORM); <form action="/adm/coursedocs" method="post" name="supnewfolder"> <input type="hidden" name="active" value="ee" /> - $pathitem + <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> $help{'Adding_Folders'} </form> SNFFORM - my $supextform = - &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem, - $help{'Adding_External_Resource'}); + + my $supnewextform=(<<SNEFORM); + <form action="/adm/coursedocs" method="post" name="supnewext"> + <input type="hidden" name="active" value="ff" /> + <input type="hidden" name="folderpath" value="$path" /> + <input type="hidden" name="importdetail" value="" /> + <a class="LC_menubuttons_link" href="javascript:makenewext('supnewext');">$lt{'extr'}</a> $help{'Adding_External_Resource'} + </form> +SNEFORM my $supnewsylform=(<<SNSFORM); <form action="/adm/coursedocs" method="post" name="supnewsyl"> <input type="hidden" name="active" value="ff" /> - $pathitem + <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="Syllabus=/public/$coursedom/$coursenum/syllabus" /> <a class="LC_menubuttons_link" href="javascript:document.supnewsyl.submit()">$lt{'syll'}</a> @@ -4008,7 +2976,7 @@ SNSFORM my $supnewaboutmeform=(<<SNAMFORM); <form action="/adm/coursedocs" method="post" name="supnewaboutme"> <input type="hidden" name="active" value="ff" /> - $pathitem + <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="$plainname=/adm/$udom/$uname/aboutme" /> <a class="LC_menubuttons_link" href="javascript:document.supnewaboutme.submit()">$lt{'mypi'}</a> @@ -4024,36 +2992,31 @@ my @specialdocs = ( =>$supnewaboutmeform}, ); my @supimportdoc = ( - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />' - =>$supextform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'suppdoc\');" />' - =>$supupdocform}, - ); - -$supupdocform = &create_form_ul(&create_list_elements(@supimportdoc)); + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'supnewext\');" />' + =>$supnewextform}, + ); +$supupdocform = &create_form_ul(&create_list_elements(@supimportdoc)) . '<hr id="ee_hrule" style="width:0px;text-align:left;margin-left:0" />' . $supupdocform; my %suporderhash = ( '00' => ['Supnewfolder', $supnewfolderform], - 'ee' => ['Import Content',$supupdocform], - 'ff' => ['Special Pages',&create_form_ul(&create_list_elements(@specialdocs))] + 'ee' => ['Import Documents',$supupdocform], + 'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))] ); if ($supplementalflag) { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, - $supplementalflag,\%suporderhash,$iconpath,$pathitem); + $supplementalflag,\%suporderhash,$iconpath); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } } } elsif ($supplementalflag) { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, - $supplementalflag,'',$iconpath,$pathitem); + $supplementalflag,'',$iconpath); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } } - if ($needs_end) { - $r->print(&endContentScreen()); - } + $r->print(&endContentScreen()); if ($allowed) { $r->print(' @@ -4067,7 +3030,7 @@ my %suporderhash = ( } elsif ($showdoc) { # -------------------------------------------------------- This is showdoc mode $r->print("<h1>".&mt('Uploaded Document').' - '. - &Apache::lonnet::gettitle($r->uri).'</h1><p class="LC_warning">'. + &Apache::lonnet::gettitle($r->uri).'</h1><p>'. &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>". &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>'); } @@ -4119,9 +3082,12 @@ sub decompression_info { my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; my $container='sequence'; my ($pathitem,$hiddenelem); - my @hiddens = ('newidx','comment','position','folderpath'); - if ($env{'form.folderpath'} =~ /\:1$/) { + my @hiddens = ('newidx','comment','position'); + if ($env{'form.pagepath'}) { $container='page'; + $pathitem = 'pagepath'; + } else { + $pathitem = 'folderpath'; } unshift(@hiddens,$pathitem); foreach my $item (@hiddens) { @@ -4138,7 +3104,7 @@ sub decompression_phase_one { my ($dir,$file,$warning,$error,$output); my ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,$hiddenelem)= &decompression_info(); - if ($env{'form.archiveurl'} !~ m{^/uploaded/\Q$docudom/$docuname/\E(?:docs|supplemental)/(?:default|\d+).*/([^/]+)$}) { + if ($env{'form.archiveurl'} !~ m{^/uploaded/\Q$docudom/$docuname/docs/\E(?:default|supplemental|\d+).*/([^/]+)$}) { $error = &mt('Archive file "[_1]" not in the expected location.',$env{'form.archiveurl'}); } else { my $file = $1; @@ -4193,7 +3159,7 @@ sub remove_archive { my ($title,$url,@rrest) = split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]); if (&handle_edit_cmd($docuname,$docudom)) { - ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1); + ($errtext,$fatal) = &storemap($docuname,$docudom,$map); if ($fatal) { if ($container eq 'page') { $delwarning = &mt('An error occurred updating the contents of the current page.'); @@ -4311,30 +3277,32 @@ sub generate_edit_table { my $form; my $activetab; my $active; - if (($env{'form.active'} ne '') && ($env{'form.active'} ne 'aa')) { + if($env{'form.active'} ne ''){ $activetab = $env{'form.active'}; } my $backicon = $iconpath.'clickhere.gif'; - my $backtext = &mt('Exit Editor'); + my $backtext = &mt('To Overview'); $form = '<div class="LC_Box" style="margin:0;">'. - '<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n". - '<li class="goback">'. - '<a href="javascript:toContents('.$jumpto.');">'. - '<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'. - ' alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n". - '<li>'. - '<a href="javascript:groupopen('."'$readfile'".',1);">'. - &mt('Undo Delete').'</a></li>'."\n"; - if ($env{'form.docslog'}) { - $form .= '<li class="active">'; - } else { - $form .= '<li>'; - } - $form .= '<a href="javascript:toggleHistoryDisp(1);">'. - &mt('History').'</a></li>'."\n"; - if ($env{'form.docslog'}) { - $form .= '<li><a href="javascript:toggleHistoryDisp(0);">'. - &mt('Edit').'</a></li>'."\n"; + '<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n". + '<li class="goback">'. + '<a href="javascript:toContents('."'$jumpto'".');">'. + '<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'. + ' alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n"; + if ($tid == 1) { + $form .= '<li>'. + '<a href="javascript:groupopen('."'$readfile'".',1);">'. + &mt('Undo Delete').'</a></li>'."\n"; + if ($env{'form.docslog'}) { + $form .= '<li class="active">'; + } else { + $form .= '<li>'; + } + $form .= '<a href="javascript:toggleHistoryDisp(1);">'. + &mt('History').'</a></li>'."\n"; + if ($env{'form.docslog'}) { + $form .= '<li><a href="javascript:toggleHistoryDisp(0);">'. + &mt('Edit').'</a></li>'."\n"; + } } foreach my $name (reverse(sort(keys(%orderhash)))) { if($name ne '00'){ @@ -4344,6 +3312,7 @@ sub generate_edit_table { $active = 'class="active"'; } $form .= '<li style="float:right" '.$active + .' onmouseover="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"' .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n"; } else { $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n"; @@ -4400,48 +3369,23 @@ sub editing_js { p_ctr2a => 'Cut[_98]', p_ctr2b => '?[_98]', rpck => 'Enter number to pick (e.g., 3)', - imsfile => 'You must choose an IMS package for import', - imscms => 'You must select which Course Management System was the source of the IMS package', - invurl => 'Invalid URL', - titbl => 'Title is blank', ); my $crstype = &Apache::loncommon::course_type(); my $docs_folderpath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'},'<>&"'); + my $docs_pagepath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.pagepath'},'<>&"'); my $main_container_page; - 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 $toplevelsupp = &supplemental_base(); - - my $backtourl; - if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) { - my $caller = $1; - if ($caller =~ /^supplemental/) { - $backtourl = '/adm/supplemental?folderpath='.&escape($caller); - } else { - my ($map,$id,$res)=&Apache::lonnet::decode_symb($caller); - $res = &Apache::lonnet::clutter($res); - if (&Apache::lonnet::is_on_map($res)) { - $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($res),'<>&"').'?symb='. - &HTML::Entities::encode($caller,'<>&"'); - } + if ($docs_folderpath eq '') { + if ($docs_pagepath ne '') { + $main_container_page = 1; } - } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') { - $backtourl = '/adm/menu'; - } elsif ($supplementalflag) { - $backtourl = '/adm/supplemental'; - } else { - $backtourl = '/adm/navmaps'; } + my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents'; + my $toplevelsupp = &supplemental_base(); - my $fieldsets = "'ext','doc'"; - unless ($main_container_page) { - $fieldsets .=",'ims'"; - } + my $backtourl = '/adm/navmaps'; if ($supplementalflag) { - $fieldsets = "'suppext','suppdoc'"; + $backtourl = '/adm/supplemental'; } return <<ENDNEWSCRIPT; @@ -4461,6 +3405,22 @@ function makenewpage(targetform,folderse } } +function makenewext(targetname) { + this.document.forms.extimport.useform.value=targetname; + this.document.forms.extimport.title.value=''; + this.document.forms.extimport.url.value=''; + this.document.forms.extimport.residx.value=''; + window.open('/adm/rat/extpickframe.html'); +} + +function edittext(targetname,residx,title,url) { + this.document.forms.extimport.useform.value=targetname; + this.document.forms.extimport.residx.value=residx; + this.document.forms.extimport.url.value=url; + this.document.forms.extimport.title.value=title; + window.open('/adm/rat/extpickframe.html'); +} + function makeexamupload() { var title=prompt('$lt{"p_mxu"}'); if (title) { @@ -4525,84 +3485,79 @@ function makeabout() { } } -function toggleUpload(caller) { - var blocks = Array($fieldsets); - for (var i=0; i<blocks.length; i++) { - var disp = 'none'; - if (caller == blocks[i]) { - var curr = document.getElementById('upload'+caller+'form').style.display; - if (curr == 'none') { - disp='block'; - } - } - document.getElementById('upload'+blocks[i]+'form').style.display=disp; - } - resize_scrollbox('contentscroll','1','1'); - return; +function makeims() { +var caller = document.forms.ims.folder.value; +var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one"; +newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes"); +newWindow.location.href = newlocation; +} + +function finishpick() { +var title=this.document.forms.extimport.title.value; +var url=this.document.forms.extimport.url.value; +var form=this.document.forms.extimport.useform.value; +var residx=this.document.forms.extimport.residx.value; +eval('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+'='+residx+'";this.document.forms.'+form+'.submit();'); } -function toggleMap(caller) { - var disp = 'none'; - if (document.getElementById('importmapform')) { - if (caller == 'map') { - var curr = document.getElementById('importmapform').style.display; - if (curr == 'none') { - disp='block'; - } - } - document.getElementById('importmapform').style.display=disp; - resize_scrollbox('contentscroll','1','1'); - } - return; -} - -function makeims(imsform) { - if ((imsform.uploaddoc.value == '') || (!imsform.uploaddoc.value)) { - alert("$lt{'imsfile'}"); - return; - } - if (imsform.source.selectedIndex == 0) { - alert("$lt{'imscms'}"); - return; - } - newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes"); - imsform.submit(); -} - -function changename(folderpath,index,oldtitle) { +function changename(folderpath,index,oldtitle,container,pagesymb) { var title=prompt('$lt{"p_chn"}',oldtitle); if (title) { this.document.forms.renameform.markcopy.value=-1; this.document.forms.renameform.title.value=title; this.document.forms.renameform.cmd.value='rename_'+index; -this.document.forms.renameform.folderpath.value=folderpath; +if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; +} +if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; +} this.document.forms.renameform.submit(); } } -function removeres(folderpath,index,oldtitle,skip_confirm) { +function removeres(folderpath,index,oldtitle,container,pagesymb,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; +if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; +} +if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; +} this.document.forms.renameform.submit(); } } -function cutres(folderpath,index,oldtitle,container,folder,skip_confirm) { +function cutres(folderpath,index,oldtitle,container,pagesymb,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; +if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; +} +if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; +} this.document.forms.renameform.submit(); } } -function markcopy(folderpath,index,oldtitle,container,folder) { +function markcopy(folderpath,index,oldtitle,container,pagesymb,folder) { this.document.forms.renameform.markcopy.value=index; this.document.forms.renameform.copyfolder.value=folder+'.'+container; +if (container == 'sequence') { this.document.forms.renameform.folderpath.value=folderpath; +} +if (container == 'page') { +this.document.forms.renameform.pagepath.value=folderpath; +this.document.forms.renameform.pagesymb.value=pagesymb; +} this.document.forms.renameform.submit(); } @@ -4696,10 +3651,11 @@ function showPage(current, pageId, nav, currentData = document.getElementById(pageId); currentData.style.display = 'block'; activeTab = pageId; - toggleUpload(); - toggleMap(); if (nav == 'mainnav') { var storedpath = "$docs_folderpath"; + if (storedpath == '') { + storedpath = "$docs_pagepath"; + } var storedpage = "$main_container_page"; var reg = new RegExp("^supplemental"); if (pageId == 'mainCourseDocuments') { @@ -4735,8 +3691,9 @@ function showPage(current, pageId, nav, function toContents(jumpto) { var newurl = '$backtourl'; - if ((newurl == '/adm/navmaps') && (jumpto != '')) { + if (jumpto != '') { newurl = newurl+'?postdata='+jumpto; +; } location.href=newurl; } @@ -4920,20 +3877,6 @@ Return hash with valid author names =item do_paste_from_buffer() -=item get_newmap_url() - -=item dbcopy() - -=item uniqueness_check() - -=item contained_map_check() - -=item url_paste_fixups() - -=item apply_fixups() - -=item copy_dependencies() - =item update_parameter() =item handle_edit_cmd() @@ -4946,6 +3889,8 @@ Return hash with valid author names =item is_supplemental_title() +=item parse_supplemental_title() + =item entryline() =item tiehash()