--- loncom/interface/londocs.pm 2020/03/05 22:35:58 1.484.2.87 +++ loncom/interface/londocs.pm 2012/10/01 12:06:46 1.496 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.484.2.87 2020/03/05 22:35:58 raeburn Exp $ +# $Id: londocs.pm,v 1.496 2012/10/01 12:06:46 goltermann Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,13 +40,10 @@ use Apache::lonxml; use Apache::lonclonecourse; use Apache::lonnavmaps; use Apache::lonnavdisplay(); -use Apache::lonextresedit(); -use Apache::lontemplate(); -use Apache::lonsimplepage(); +use Apache::lonuserstate(); use HTML::Entities; use HTML::TokeParser; use GDBM_File; -use File::MMagic; use Apache::lonlocal; use Cwd; use LONCAPA qw(:DEFAULT :match); @@ -59,7 +56,6 @@ my $hashtied; my %alreadyseen=(); my $hadchanges; -my $suppchanges; my %help=(); @@ -83,11 +79,7 @@ sub storemap { $map,1,$report); if ($errtext) { return ($errtext,2); } - if ($map =~ /^default/) { - $hadchanges=1; - } else { - $suppchanges=1; - } + $hadchanges=1; return ($errtext,0); } @@ -139,69 +131,13 @@ sub clean { return $title; } -sub default_folderpath { - my ($coursenum,$coursedom,$navmapref) = @_; - return unless ($coursenum && $coursedom && ref($navmapref)); -# Check if entire course is hidden and/or encrypted - my ($hiddenmap,$encryptmap,$folderpath,$hiddentop); - my $toplevel = "uploaded/$coursedom/$coursenum/default.sequence"; - unless (ref($$navmapref)) { - $$navmapref = Apache::lonnavmaps::navmap->new(); - } - if (ref($$navmapref)) { - if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.hiddenresource")) eq 'yes') { - my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; - my @resources = $$navmapref->retrieveResources($toplevel,$filterFunc,1,1); - unless (@resources) { - $hiddenmap = 1; - unless ($env{'request.role.adv'}) { - $hiddentop = 1; - if ($env{'form.folder'}) { - undef($env{'form.folder'}); - } - } - } - } - if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.encrypturl")) eq 'yes') { - $encryptmap = 1; - } - } - unless ($hiddentop) { - $folderpath='default&'.&escape(&mt('Main Content')). - '::'.$hiddenmap.':'.$encryptmap.'::'; - } - if (wantarray) { - return ($folderpath,$hiddentop); - } else { - return $folderpath; - } -} + sub dumpcourse { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - my ($starthash,$js); - unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) { - $js = <<"ENDJS"; -<script type="text/javascript"> -// <![CDATA[ - -function hide_searching() { - if (document.getElementById('searching')) { - document.getElementById('searching').style.display = 'none'; - } - return; -} - -// ]]> -</script> -ENDJS - $starthash = { - add_entries => {'onload' => "hide_searching();"}, - }; - } - $r->print(&Apache::loncommon::start_page('Copy '.$crstype.' Content to Authoring Space',$js,$starthash)."\n". - &Apache::lonhtmlcommon::breadcrumbs('Copy '.$crstype.' Content to Authoring Space')."\n"); + $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n". + &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n"); $r->print(&startContentScreen('tools')); my ($home,$other,%outhash)=&authorhosts(); unless ($home) { @@ -216,416 +152,125 @@ ENDJS $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); - my ($navmap,$errormsg) = - &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs'); - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my (%maps,%resources,%titles); - if (!ref($navmap)) { - $r->print($errormsg. - &endContentScreen()); - return ''; - } else { - &Apache::loncourserespicker::enumerate_course_contents($navmap,\%maps,\%resources,\%titles, - 'dumpdocs',$cdom,$cnum); - } - my @todump = &Apache::loncommon::get_env_multiple('form.archive'); - my (%tocopy,%replacehash,%lookup,%deps,%display,%result,%depresult,%simpleproblems,%simplepages, - %newcontent,%has_simpleprobs); - foreach my $item (sort {$a <=> $b} (@todump)) { - my $name = $env{'form.namefor_'.$item}; - if ($resources{$item}) { - my ($map,$id,$res) = &Apache::lonnet::decode_symb($resources{$item}); - if ($res =~ m{^uploaded/$cdom/$cnum/\E((?:docs|supplemental)/.+)$}) { - $tocopy{$1} = $name; - $display{$item} = $1; - $lookup{$1} = $item; - } elsif ($res eq 'lib/templates/simpleproblem.problem') { - $simpleproblems{$item} = { - symb => $resources{$item}, - name => $name, - }; - $display{$item} = 'simpleproblem_'.$name; - if ($map =~ m{^\Quploaded/$cdom/$cnum/\E(.+)$}) { - $has_simpleprobs{$1}{$id} = $item; - } - } elsif ($res =~ m{^adm/$match_domain/$match_username/(\d+)/smppg}) { - my $marker = $1; - my $db_name = &Apache::lonsimplepage::get_db_name($res,$marker,$cdom,$cnum); - $simplepages{$item} = { - res => $res, - title => $titles{$item}, - db => $db_name, - marker => $marker, - symb => $resources{$item}, - name => $name, - }; - $display{$item} = '/'.$res; - } - } elsif ($maps{$item}) { - if ($maps{$item} =~ m{^\Quploaded/$cdom/$cnum/\E((?:default|supplemental)_\d+\.(?:sequence|page))$}) { - $tocopy{$1} = $name; - $display{$item} = $1; - $lookup{$1} = $item; - } - } else { - next; - } - } + my %replacehash=(); + foreach my $key (keys(%env)) { + if ($key=~/^form\.namefor\_(.+)/) { + $replacehash{$1}=$env{$key}; + } + } my $crs='/uploaded/'.$env{'request.course.id'}.'/'; $crs=~s/\_/\//g; - my $mm = new File::MMagic; - my $prefix = "/uploaded/$cdom/$cnum/"; - %replacehash = %tocopy; - foreach my $item (sort(keys(%simpleproblems))) { - my $content = &Apache::imsexport::simpleproblem($simpleproblems{$item}{'symb'}); - $newcontent{$display{$item}} = $content; - } - my $gateway = Apache::lonhtmlgateway->new('web'); - foreach my $item (sort(keys(%simplepages))) { - if (ref($simplepages{$item}) eq 'HASH') { - my $pagetitle = $simplepages{$item}{'title'}; - my %fields = &Apache::lonnet::dump($simplepages{$item}{'db'},$cdom,$cnum); - my %contents; - foreach my $field (keys(%fields)) { - if ($field =~ /^(?:aaa|bbb|ccc)_(\w+)$/) { - my $name = $1; - my $msg = $fields{$field}; - if ($name eq 'webreferences') { - if ($msg =~ m{^https?://}) { - $contents{$name} = '<a href="'.$msg.'"><tt>'.$msg.'</tt></a>'; - } - } else { - $msg = &Encode::decode('utf8',$msg); - $msg = $gateway->process_outgoing_html($msg,1); - $contents{$name} = $msg; - } - } elsif ($field eq 'uploaded.photourl') { - my $marker = $simplepages{$item}{marker}; - if ($fields{$field} =~ m{^\Q$prefix\E(simplepage/$marker/.+)$}) { - my $filepath = $1; - my ($relpath,$fname) = ($filepath =~ m{^(.+/)([^/]+)$}); - if ($fname ne '') { - $fname=~s/\.(\w+)$//; - my $ext=$1; - $fname = &clean($fname); - $fname.='.'.$ext; - $contents{image} = '<img src="'.$relpath.$fname.'" alt="Image" />'; - $replacehash{$filepath} = $relpath.$fname; - $deps{$item}{$filepath} = 1; - } - } - } - } - $replacehash{'/'.$simplepages{$item}{'res'}} = $simplepages{$item}{'name'}; - $lookup{'/'.$simplepages{$item}{'res'}} = $item; - my $content = ' -<html> -<head> -<title>'.$pagetitle.'</title> -</head> -<body bgcolor="#ffffff">'; - if ($contents{title}) { - $content .= "\n".'<h2>'.$contents{title}.'</h2>'; - } - if ($contents{image}) { - $content .= "\n".$contents{image}; - } - if ($contents{content}) { - $content .= ' -<div class="LC_Box"> -<h4 class="LC_hcell">'.&mt('Content').'</h4>'. -$contents{content}.' -</div>'; - } - if ($contents{webreferences}) { - $content .= ' -<div class="LC_Box"> -<h4 class="LC_hcell">'.&mt('Web References').'</h4>'. -$contents{webreferences}.' -</div>'; - } - $content .= ' -</body> -</html> -'; - $newcontent{'/'.$simplepages{$item}{res}} = $content; - } - } - foreach my $item (keys(%tocopy)) { - unless ($item=~/\.(sequence|page)$/) { - my $currurlpath = $prefix.$item; - my $currdirpath = &Apache::lonnet::filelocation('',$currurlpath); - &recurse_html($mm,$prefix,$currdirpath,$currurlpath,$item,$lookup{$item},\%replacehash,\%deps); - } - } - foreach my $num (sort {$a <=> $b} (@todump)) { - my $src = $display{$num}; - next if ($src eq ''); - my @needcopy = (); - if ($replacehash{$src}) { - push(@needcopy,$src); - if (ref($deps{$num}) eq 'HASH') { - foreach my $dep (sort(keys(%{$deps{$num}}))) { - if ($replacehash{$dep}) { - push(@needcopy,$dep); - } - } - } - } elsif ($src =~ /^simpleproblem_/) { - push(@needcopy,$src); - } - next if (@needcopy == 0); - my ($result,$depresult); - for (my $i=0; $i<@needcopy; $i++) { - my $item = $needcopy[$i]; - my $newfilename; - if ($simpleproblems{$num}) { - $newfilename=$title.'/'.$simpleproblems{$num}{'name'}; - } else { - $newfilename=$title.'/'.$replacehash{$item}; - } - $newfilename=~s/\.(\w+)$//; - my $ext=$1; - $newfilename=&clean($newfilename); - $newfilename.='.'.$ext; - my ($newrelpath) = ($newfilename =~ m{^\Q$title/\E(.+)$}); - if ($newrelpath ne $replacehash{$item}) { - $replacehash{$item} = $newrelpath; - } - my @dirs=split(/\//,$newfilename); - my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca"; - my $makepath=$path; - my $fail; - my $origin; - for (my $i=0;$i<$#dirs;$i++) { - $makepath.='/'.$dirs[$i]; - unless (-e $makepath) { - unless(mkdir($makepath,0755)) { - $fail = &mt('Directory creation failed.'); - } - } - } - if ($i == 0) { - $result = '<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: '; - } else { - $depresult .= '<li><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt> '. - '<span class="LC_fontsize_small" style="font-weight: bold;">'. - &mt('(dependency)').'</span>: '; - } - if (-e $path.'/'.$newfilename) { - $fail = &mt('Destination already exists -- not overwriting.'); - } else { - if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) { - if (($item =~ m{^/adm/$match_domain/$match_username/\d+/smppg}) || - ($item =~ /^simpleproblem_/)) { - print $fh $newcontent{$item}; - } else { - my $fileloc = &Apache::lonnet::filelocation('',$prefix.$item); - if (-e $fileloc) { - if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) { - if ((($1 eq 'sequence') || ($1 eq 'page')) && - (ref($has_simpleprobs{$item}) eq 'HASH')) { - my %changes = %{$has_simpleprobs{$item}}; - my $content = &Apache::lonclonecourse::rewritefile( - &Apache::lonclonecourse::readfile($env{'request.course.id'},$item), - (%replacehash,$crs => '') - ); - my $updatedcontent = ''; - my $parser = HTML::TokeParser->new(\$content); - $parser->attr_encoded(1); - while (my $token = $parser->get_token) { - if ($token->[0] eq 'S') { - if (($token->[1] eq 'resource') && - ($token->[2]->{'src'} eq '/res/lib/templates/simpleproblem.problem') && - ($changes{$token->[2]->{'id'}})) { - my $id = $token->[2]->{'id'}; - $updatedcontent .= '<'.$token->[1]; - foreach my $attrib (@{$token->[3]}) { - next unless ($attrib =~ /^(src|type|title|id)$/); - if ($attrib eq 'src') { - my ($file) = ($display{$changes{$id}} =~ /^\Qsimpleproblem_\E(.+)$/); - if ($file) { - $updatedcontent .= ' '.$attrib.'="'.$file.'"'; - } else { - $updatedcontent .= ' '.$attrib.'="'.$token->[2]->{$attrib}.'"'; - } - } else { - $updatedcontent .= ' '.$attrib.'="'.$token->[2]->{$attrib}.'"'; - } - } - $updatedcontent .= ' />'."\n"; - } else { - $updatedcontent .= $token->[4]."\n"; - } - } else { - $updatedcontent .= $token->[2]; - } - } - print $fh $updatedcontent; - } else { - print $fh &Apache::lonclonecourse::rewritefile( - &Apache::lonclonecourse::readfile($env{'request.course.id'},$item), - (%replacehash,$crs => '') - ); - } - } else { - print $fh - &Apache::lonclonecourse::readfile($env{'request.course.id'},$item); - } - } else { - $fail = &mt('Source does not exist.'); - } - } - $fh->close(); - } else { - $fail = &mt('Could not write to destination.'); - } - } - my $text; - if ($fail) { - $text = '<span class="LC_error">'.&mt('fail').(' 'x3).$fail.'</span>'; - } else { - $text = '<span class="LC_success">'.&mt('ok').'</span>'; - } - if ($i == 0) { - $result .= $text; - } else { - $depresult .= $text.'</li>'; - } - } - $r->print($result); - if ($depresult) { - $r->print('<ul>'.$depresult.'</ul>'); - } - } + foreach my $item (keys(%replacehash)) { + my $newfilename=$title.'/'.$replacehash{$item}; + $newfilename=~s/\.(\w+)$//; + my $ext=$1; + $newfilename=&clean($newfilename); + $newfilename.='.'.$ext; + my @dirs=split(/\//,$newfilename); + my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca"; + my $makepath=$path; + my $fail=0; + for (my $i=0;$i<$#dirs;$i++) { + $makepath.='/'.$dirs[$i]; + unless (-e $makepath) { + unless(mkdir($makepath,0777)) { $fail=1; } + } + } + $r->print('<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: '); + if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) { + if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) { + print $fh &Apache::lonclonecourse::rewritefile( + &Apache::lonclonecourse::readfile($env{'request.course.id'},$item), + (%replacehash,$crs => '') + ); + } else { + print $fh + &Apache::lonclonecourse::readfile($env{'request.course.id'},$item); + } + $fh->close(); + } else { + $fail=1; + } + if ($fail) { + $r->print('<span class="LC_error">'.&mt('fail').'</span>'); + } else { + $r->print('<span class="LC_success">'.&mt('ok').'</span>'); + } + } } else { - my ($navmap,$errormsg) = - &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs'); - if (!ref($navmap)) { - $r->print($errormsg); - } else { - $r->print('<div id="searching">'.&mt('Searching ...').'</div>'); - $r->rflush(); - my ($preamble,$formname); - $formname = 'dumpdoc'; - unless ($home==1) { - $preamble = '<div class="LC_left_float">'. - '<fieldset><legend>'. - &mt('Select the Authoring Space'). - '</legend><select name="authorspace">'; - } - my @orderspaces = (); - foreach my $key (sort(keys(%outhash))) { - if ($key=~/^home_(.+)$/) { - if ($1 eq $env{'user.name'}.':'.$env{'user.domain'}) { - unshift(@orderspaces,$1); - } else { - push(@orderspaces,$1); - } - } - } - if ($home>1) { - $preamble .= '<option value="" selected="selected">'.&mt('Select').'</option>'; - } - foreach my $user (@orderspaces) { - if ($home==1) { - $preamble .= '<input type="hidden" name="authorspace" value="'.$user.'" />'; - } else { - $preamble .= '<option value="'.$user.'">'.$user.' - '. - &Apache::loncommon::plainname(split(/\:/,$user)).'</option>'; - } - } - unless ($home==1) { - $preamble .= '</select></fieldset></div>'."\n"; - } - my $title=$origcrsdata{'description'}; - $title=~s/[\/\s]+/\_/gs; - $title=&clean($title); - $preamble .= '<div class="LC_left_float">'. - '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'. - '<input type="text" size="50" name="authorfolder" value="'. - $title.'" />'. - '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n"; - my %uploadedfiles; - &tiehash(); - foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) { - my ($ext)=($file=~/\.(\w+)$/); -# FIXME Check supplemental here - my $title=$hash{'title_'.$hash{ - 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}}; - if (!$title) { - $title=$file; - } else { - $title=~s|/|_|g; - } - $title=~s/\.(\w+)$//; - $title=&clean($title); - $title.='.'.$ext; -# $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>" - $uploadedfiles{$file} = $title; - } - &untiehash(); - $r->print(&Apache::loncourserespicker::create_picker($navmap,'dumpdocs',$formname,$crstype,undef, - undef,undef,$preamble,$home,\%uploadedfiles)); - } + $r->print(&mt('Searching ...').'<br />'); + $r->rflush(); +# Input form + $r->print('<form name="dumpdoc" action="" method="post">'."\n"); + unless ($home==1) { + $r->print('<div class="LC_left_float">'. + '<fieldset><legend>'. + &mt('Select the Authoring Space'). + '</legend><select name="authorspace">'); + } + foreach my $key (sort(keys(%outhash))) { + if ($key=~/^home_(.+)$/) { + if ($home==1) { + $r->print( + '<input type="hidden" name="authorspace" value="'.$1.'" />'); + } else { + $r->print('<option value="'.$1.'">'.$1.' - '. + &Apache::loncommon::plainname(split(/\:/,$1)).'</option>'); + } + } + } + unless ($home==1) { + $r->print('</select></fieldset></div>'."\n"); + } + my $title=$origcrsdata{'description'}; + $title=~s/[\/\s]+/\_/gs; + $title=&clean($title); + $r->print('<div class="LC_left_float">'. + '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'. + '<input type="text" size="50" name="authorfolder" value="'. + $title.'" />'. + '</fieldset></div><br clear="all" />'."\n"); + &tiehash(); + $r->print('<h4>'.&mt('Filenames in Authoring Space').'</h4>' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'<th>'.&mt('Internal Filename').'</th>' + .'<th>'.&mt('Title').'</th>' + .'<th>'.&mt('Save as ...').'</th>' + .&Apache::loncommon::end_data_table_header_row()); + foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) { + $r->print(&Apache::loncommon::start_data_table_row() + .'<td>'.$file.'</td>'); + my ($ext)=($file=~/\.(\w+)$/); + my $title=$hash{'title_'.$hash{ + 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}}; + $r->print('<td>'.($title?$title:' ').'</td>'); + if (!$title) { + $title=$file; + } else { + $title=~s|/|_|g; + } + $title=~s/\.(\w+)$//; + $title=&clean($title); + $title.='.'.$ext; + $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>" + .&Apache::loncommon::end_data_table_row()); + } + $r->print(&Apache::loncommon::end_data_table()); + &untiehash(); + $r->print( + '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Content").'" /></p></form>'); } $r->print(&endContentScreen()); } -sub recurse_html { - my ($mm,$prefix,$currdirpath,$currurlpath,$container,$item,$replacehash,$deps) = @_; - return unless ((ref($replacehash) eq 'HASH') && (ref($deps) eq 'HASH')); - my (%allfiles,%codebase); - if (&Apache::lonnet::extract_embedded_items($currdirpath,\%allfiles,\%codebase) eq 'ok') { - if (keys(%allfiles)) { - foreach my $dependency (keys(%allfiles)) { - next if (($dependency =~ m{^/(res|adm)/}) || ($dependency =~ m{^https?://})); - my ($depurl,$relfile,$newcontainer); - if ($dependency =~ m{^/}) { - if ($dependency =~ m{^\Q$currurlpath/\E(.+)$}) { - $relfile = $1; - if ($dependency =~ m{^\Q$prefix\E(.+)$}) { - $newcontainer = $1; - next if ($replacehash->{$newcontainer}); - } - $depurl = $dependency; - } else { - next; - } - } else { - $relfile = $dependency; - $depurl = $currurlpath; - $depurl =~ s{[^/]+$}{}; - $depurl .= $dependency; - ($newcontainer) = ($depurl =~ m{^\Q$prefix\E(.+)$}); - } - next if ($relfile eq ''); - my $newname = $replacehash->{$container}; - $newname =~ s{[^/]+$}{}; - $replacehash->{$newcontainer} = $newname.$relfile; - $deps->{$item}{$newcontainer} = 1; - my ($newurlpath) = ($depurl =~ m{^(.*)/[^/]+$}); - my $depfile = &Apache::lonnet::filelocation('',$depurl); - my $type = $mm->checktype_filename($depfile); - if ($type eq 'text/html') { - &recurse_html($mm,$prefix,$depfile,$newurlpath,$newcontainer,$item,$replacehash,$deps); - } - } - } - } - return; -} - 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)$}) @@ -642,7 +287,7 @@ sub group_import { $env{'form.output'}=$newmapstr; my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom, 'output',$1.$2); - if ($result !~ m{^/uploaded/}) { + if ($result != m|^/uploaded/|) { $errtext.='Map not saved: A network error occurred when trying to save the new map. '; $fatal = 2; } @@ -651,24 +296,6 @@ sub group_import { } } if ($url) { - if (($caller eq 'londocs') && - ($folder =~ /^default/)) { - if (($url =~ /\.(page|sequence)$/) && (!$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); @@ -676,93 +303,69 @@ sub group_import { } my $ext = 'false'; if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; } + $url = &LONCAPA::map::qtunescape($url); $name = &LONCAPA::map::qtunescape($name); - if ($name eq '') { - $name = &LONCAPA::map::qtunescape(&mt('Web Page')); - } - if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) { - my $filepath = $1; - my $fname = $name; - if ($fname =~ /^\W+$/) { - $fname = 'web'; - } else { - $fname =~ s/\W/_/g; - } - if (length($fname) > 15) { - $fname = substr($fname,0,14); - } - my $initialtext = &mt('Replace with your own content.'); - my $newhtml = <<END; -<html> -<head> -<title>$name</title> -</head> -<body bgcolor="#ffffff"> -$initialtext -</body> -</html> -END - $env{'form.output'}=$newhtml; - my $result = - &Apache::lonnet::finishuserfileupload($coursenum,$coursedom, - 'output', - "$filepath/$residx/$fname.html"); - if ($result =~ m{^/uploaded/}) { - $url = $result; - if ($filepath =~ /^supplemental/) { - $name = time.'___&&&___'.$env{'user.name'}.'___&&&___'. - $env{'user.domain'}.'___&&&___'.$name; - } - } else { - return (&mt('Failed to save new web page.'),1); - } - } - $url = &LONCAPA::map::qtunescape($url); $LONCAPA::map::resources[$residx] = join(':', ($name, $url, $ext, 'normal', 'res')); } } - if ($importuploaded) { - my %import_errors; - my %updated = ( - removefrommap => \%removefrommap, - removeparam => \%removeparam, - ); - my ($result,$msgsarray,$lockerror) = - &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"; - } - if (ref($msgsarray) eq 'ARRAY') { - if (@{$msgsarray} > 0) { - $fixuperrors .= '<p class="LC_info">'. - join('<br />',@{$msgsarray}). - '</p>'; - } - } - if ($lockerror) { - $fixuperrors .= '<p class="LC_error">'. - $lockerror. - '</p>'; - } - } - my ($errtext,$fatal) = - &storemap($coursenum, $coursedom, $folder.'.'.$container,1); - unless ($fatal) { - if ($folder =~ /^supplemental/) { - &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1); - my ($errtext,$fatal) = &mapread($coursenum,$coursedom, - $folder.'.'.$container); - } + return &storemap($coursenum, $coursedom, $folder.'.'.$container,1); +} + +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'}); } - return ($errtext,$fatal,$fixuperrors); + 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='; + } + $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 { @@ -827,14 +430,12 @@ sub log_docs { } sub docs_change_log { - my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit)=@_; + my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_; my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); - my $navmap; my $js = '<script type="text/javascript">'."\n". '// <![CDATA['."\n". &Apache::loncommon::display_filter_js('docslog')."\n". - &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag, - $coursedom,$coursenum,$canedit,'',\$navmap)."\n". + &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag)."\n". &history_tab_js()."\n". &Apache::lonratedt::editscript('simple')."\n". '// ]]>'."\n". @@ -845,16 +446,17 @@ sub docs_change_log { 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_folderpath($coursenum,$coursedom,\$navmap); - } - undef($navmap); - $pathitem = '<input type="hidden" name="folderpath" value="'. - &HTML::Entities::encode($folderpath,'<>&"').'" />'; my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; my $jumpto = $readfile; $jumpto =~ s{^/}{}; @@ -862,8 +464,7 @@ sub docs_change_log { 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)); @@ -1016,142 +617,59 @@ sub docs_change_log { sub update_paste_buffer { my ($coursenum,$coursedom,$folder) = @_; - my (@possibles,%removals,%cuts,$output); - if ($env{'form.multiremove'}) { - $env{'form.multiremove'} =~ s/,$//; - map { $removals{$_} = 1; } split(/,/,$env{'form.multiremove'}); - } - if (($env{'form.multicopy'}) || ($env{'form.multicut'})) { - if ($env{'form.multicut'}) { - $env{'form.multicut'} =~ s/,$//; - foreach my $item (split(/,/,$env{'form.multicut'})) { - unless ($removals{$item}) { - $cuts{$item} = 1; - push(@possibles,$item.':cut'); - } - } - } - if ($env{'form.multicopy'}) { - $env{'form.multicopy'} =~ s/,$//; - foreach my $item (split(/,/,$env{'form.multicopy'})) { - unless ($removals{$item} || $cuts{$item}) { - push(@possibles,$item.':copy'); - } - } - } - } elsif ($env{'form.markcopy'}) { - @possibles = split(/,/,$env{'form.markcopy'}); - } - return if (@possibles == 0); + return if (!defined($env{'form.markcopy'})); return if (!defined($env{'form.copyfolder'})); + return if ($env{'form.markcopy'} < 0); my ($errtext,$fatal) = &mapread($coursenum,$coursedom, $env{'form.copyfolder'}); - return if ($fatal); - my %curr_groups = &Apache::longroup::coursegroups(); - -# Retrieve current paste buffer suffixes. - my @currpaste = split(/,/,$env{'docs.markedcopies'}); - my (%pasteurls,@newpaste); - -# Construct identifiers for current contents of user's paste buffer - if (@currpaste) { - foreach my $suffix (@currpaste) { - my $cid = $env{'docs.markedcopy_crs_'.$suffix}; - my $url = $env{'docs.markedcopy_url_'.$suffix}; - my $mapidx = $env{'docs.markedcopy_map_'.$suffix}; - if (($cid =~ /^$match_domain(?:_)$match_courseid$/) && - ($url ne '')) { - if ($url eq '/res/lib/templates/simpleproblem.problem') { - $pasteurls{$cid.'_'.$mapidx} = 1; - } elsif ($url =~ m{^/res/$match_domain/$match_username/}) { - $pasteurls{$url} = 1; - } else { - $pasteurls{$cid.'_'.$url} = 1; - } - } - } - } - -# Mark items for copying (skip any items already in user's paste buffer) - my %addtoenv; + return if ($fatal); - my @pathitems = split(/\&/,$env{'form.folderpath'}); - my @folderconf = split(/\:/,$pathitems[-1]); - my $ispage = $folderconf[5]; - - foreach my $item (@possibles) { - my ($orderidx,$cmd) = split(/:/,$item); - next if ($orderidx =~ /\D/); - next unless (($cmd eq 'cut') || ($cmd eq 'copy') || ($cmd eq 'remove')); - my $mapidx = $folder.':'.$orderidx.':'.$ispage; - my ($title,$url)=split(':',$LONCAPA::map::resources[$orderidx]); - my %denied = &action_restrictions($coursenum,$coursedom, - &LONCAPA::map::qtescape($url), - $env{'form.folderpath'},\%curr_groups); - next if ($denied{'copy'}); - $url=~s{http(:|:)//https(:|:)//}{https$2//}; - if ($url eq '/res/lib/templates/simpleproblem.problem') { - next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx})); - } elsif ($url =~ m{^/res/$match_domain/$match_username/}) { - next if (exists($pasteurls{$url})); - } else { - next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url})); - } - my ($suffix,$errortxt,$locknotfreed) = - &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste'); - if ($suffix ne '') { - push(@newpaste,$suffix); - } else { - if ($locknotfreed) { - return $locknotfreed; +# Mark for copying + my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]); + if (&is_supplemental_title($title)) { + &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title}); + ($title) = &Apache::loncommon::parse_supplemental_title($title); + } elsif ($env{'docs.markedcopy_supplemental'}) { + &Apache::lonnet::delenv('docs.markedcopy_supplemental'); + } + $url=~s{http(:|:)//https(:|:)//}{https$2//}; + + (my $cmd,undef)=split('_',$env{'form.cmd'}); + + my %addtoenv = ( + 'docs.markedcopy_title' => $title, + 'docs.markedcopy_url' => $url, + 'docs.markedcopy_cmd' => $cmd, + ); + &Apache::lonnet::delenv('docs.markedcopy_nested'); + &Apache::lonnet::delenv('docs.markedcopy_nestednames'); + if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) { + my $prefix = $1; + my $subdir =$2; + if ($subdir eq '') { + $subdir = $prefix; + } + my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps); + &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps, + \%hierarchy,\%titles,\%allmaps); + if (ref($hierarchy{$url}) eq 'HASH') { + my ($nested,$nestednames); + &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames); + $nested =~ s/\&$//; + $nestednames =~ s/\Q___&&&___\E$//; + if ($nested ne '') { + $addtoenv{'docs.markedcopy_nested'} = $nested; } - } - if (&is_supplemental_title($title)) { - &Apache::lonnet::appenv({'docs.markedcopy_supplemental_'.$suffix => $title}); - ($title) = &Apache::loncommon::parse_supplemental_title($title); - } - - $addtoenv{'docs.markedcopy_title_'.$suffix} = $title, - $addtoenv{'docs.markedcopy_url_'.$suffix} = $url, - $addtoenv{'docs.markedcopy_cmd_'.$suffix} = $cmd, - $addtoenv{'docs.markedcopy_crs_'.$suffix} = $env{'request.course.id'}; - $addtoenv{'docs.markedcopy_map_'.$suffix} = $mapidx; - 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_'.$suffix} = $nested; - } - if ($nestednames ne '') { - $addtoenv{'docs.markedcopy_nestednames_'.$suffix} = $nestednames; - } + if ($nestednames ne '') { + $addtoenv{'docs.markedcopy_nestednames'} = $nestednames; } } - if ($locknotfreed) { - $output = $locknotfreed; - last; - } - } - if (@newpaste) { - $addtoenv{'docs.markedcopies'} = join(',',(@currpaste,@newpaste)); } &Apache::lonnet::appenv(\%addtoenv); delete($env{'form.markcopy'}); - return $output; } sub recurse_uploaded_maps { @@ -1181,228 +699,145 @@ sub recurse_uploaded_maps { sub print_paste_buffer { my ($r,$container,$folder,$coursedom,$coursenum) = @_; - return if (!defined($env{'docs.markedcopies'})); + return if (!defined($env{'docs.markedcopy_url'})); - unless (($env{'form.pastemarked'}) || ($env{'form.clearmarked'})) { - return if ($env{'docs.markedcopies'} eq ''); + my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent); + my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; + if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { + $is_external = 1; } - my @currpaste = split(/,/,$env{'docs.markedcopies'}); - my ($pasteitems,@pasteable); - my $clipboardcount = 0; - -# Construct identifiers for current contents of user's paste buffer - foreach my $suffix (@currpaste) { - next if ($suffix =~ /\D/); - my $cid = $env{'docs.markedcopy_crs_'.$suffix}; - my $url = $env{'docs.markedcopy_url_'.$suffix}; - my $mapidx = $env{'docs.markedcopy_map_'.$suffix}; - if (($cid =~ /^$match_domain\_$match_courseid$/) && - ($url ne '')) { - $clipboardcount ++; - my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent, - $canpaste,$nopaste,$othercrs,$areachange); - my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1]; - if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { - $is_external = 1; - } - if ($folder =~ /^supplemental/) { - $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix}); - unless ($canpaste) { - $nopaste = &mt('Paste into Supplemental Content unavailable.'); + my ($canpaste,$nopaste,$othercrs,$areachange,$is_uploaded_map); + if ($folder =~ /^supplemental/) { + $canpaste = &supp_pasteable($env{'docs.markedcopy_url'}); + unless ($canpaste) { + $nopaste = &mt('Paste into Supplemental Content unavailable for this type of content.'); + } + } else { + $canpaste = 1; + } + + 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.') } - } else { - $canpaste = 1; } - if ($canpaste) { - if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { - my $srcdom = $1; - my $srcnum = $2; - my $rem = $3; - if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { - $othercourse = 1; - if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { - $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; + 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>'; } - $is_uploaded_map = 1; } - } elsif (($url =~ m{^/res/lib/templates/\w+\.problem$}) || - ($url =~ m{^/adm/($match_domain)/($match_username)/\d+/(bulletinboard|smppg)$})) { - if ($cid ne $env{'request.course.id'}) { - my ($srcdom,$srcnum) = split(/_/,$cid); - if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { - $othercrs = '<br />'.&mt('(from another course)'); - } else { - $canpaste = 0; - $nopaste = &mt('Paste from another course unavailable.'); - } - } - } - if ($canpaste) { - push(@pasteable,$suffix); + &recurse_print($r,$parent,\%deps,\%display); + $r->print('</table>'); } + $r->print('</div>'); } - my $buffer; - if ($is_external) { - $buffer = &mt('External Resource').': '. - &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('. - &LONCAPA::map::qtescape($url).')'; - } else { - my $icon = &Apache::loncommon::icon($extension); - if ($extension eq 'sequence' && - $url =~ m{/default_\d+\.sequence$}x) { - $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL')); - $icon .= '/navmap.folder.closed.gif'; - } - my $title = $env{'docs.markedcopy_title_'.$suffix}; - if ($title eq '') { - ($title) = ($url =~ m{/([^/]+)$}); - } - $buffer = '<img src="'.$icon.'" alt="" class="LC_icon" />'. - ': '. - &Apache::loncommon::parse_supplemental_title( - &LONCAPA::map::qtescape($title)); - } - $pasteitems .= '<div class="LC_left_float">'; - my ($options,$onclick); - if (($canpaste) && (!$areachange) && (!$othercourse) && - ($env{'docs.markedcopy_cmd_'.$suffix} eq 'cut')) { - if (($is_uploaded_map) || - ($url =~ /(bulletinboard|smppg)$/) || - ($url =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) { - $options = &paste_options($suffix,$is_uploaded_map,$parent); - $onclick= 'onclick="showOptions(this,'."'$suffix'".');" '; - } - } - $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>'; - if ($nopaste) { - $pasteitems .= $nopaste; - } else { - if ($othercrs) { - $pasteitems .= $othercrs; - } - if ($options) { - $pasteitems .= $options; - } - } - $pasteitems .= '</div>'; - } - } - if ($pasteitems eq '') { - &Apache::lonnet::delenv('docs.markedcopies'); - } - my ($pasteform,$form_start,$buttons,$form_end); - if ($pasteitems) { - $pasteitems .= '<div style="padding:0;clear:both;margin:0;border:0"></div>'; - $form_start = '<form name="pasteform" action="/adm/coursedocs" method="post" onsubmit="return validateClipboard();">'; - if (@pasteable) { - my $value = &mt('Paste to current folder'); - if ($container eq 'page') { - $value = &mt('Paste to current page'); - } - $buttons = '<input type="submit" name="pastemarked" value="'.$value.'" />'.(' 'x2); } - $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Clear selected').'" />'.(' 'x2); - if ($clipboardcount > 1) { - $buttons .= - '<span style="text-decoration:line-through">'.(' 'x20).'</span>'.(' 'x2). - '<input type="button" name="checkallclip" value="'.&mt('Check all').'" style="height:20px;" onclick="checkClipboard();" />'. - (' 'x2). - '<input type="button" name="uncheckallclip" value="'.&mt('Uncheck all').'" style="height:20px;" onclick="uncheckClipboard();" />'. - (' 'x2); + $r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs); + 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 { + $r->print(' + <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> +'); } - $form_end = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'. - '</form>'; - } else { - $pasteitems = &mt('Clipboard is empty'); - } - $r->print($form_start - .'<fieldset>' - .'<legend>'.&mt('Clipboard').(' ' x2).$buttons.'</legend>' - .$pasteitems - .'</fieldset>' - .$form_end); -} - -sub paste_options { - my ($suffix,$is_uploaded_map,$parent) = @_; - my ($copytext,$movetext); - if ($is_uploaded_map) { - $copytext = &mt('Copy to new folder'); - $movetext = &mt('Move old'); - } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /bulletinboard$/) { - $copytext = &mt('Copy to new board'); - $movetext = &mt('Move (not posts)'); - } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /smppg$/) { - $copytext = &mt('Copy to new page'); - $movetext = &mt('Move'); + $r->print('</form>'); } else { - $copytext = &mt('Copy to new file'); - $movetext = &mt('Move'); + $r->print(&mt('Paste buffer contains:').' '.$buffer. + '<br /><p class="LC_info">'.$nopaste.'</p>'); } - my $output = '<br />'. - '<span id="pasteoptionstext_'.$suffix.'" class="LC_fontsize_small LC_nobreak"></span>'. - '<div id="pasteoptions_'.$suffix.'" class="LC_dccid" style="display:none;"><span class="LC_nobreak">'.(' 'x 4). - '<label>'. - '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="new" checked="checked" />'. - $copytext.'</label></span>'.(' 'x2).' '. - '<span class="LC_nobreak"><label>'. - '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="move" />'. - $movetext.'</label></span>'; - if (($is_uploaded_map) && ($env{'docs.markedcopy_nested_'.$suffix})) { - $output .= '<br /><fieldset><legend>'.&mt('Folder to paste contains sub-folders'). - '</legend><table border="0">'; - my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix}); - my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames_'.$suffix}); - my $lastdir = $parent; - my %depths = ( - $lastdir => 0, - ); - my (%display,%deps); - for (my $i=0; $i<@pastemaps; $i++) { - ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]); - my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]); - my @subfolders = split(/,/,$subfolderstr); - $deps{$lastdir} = \@subfolders; - my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr); - my $depth = $depths{$lastdir} + 1; - my $offset = int($depth * 4); - my $indent = (' ' x $offset); - for (my $j=0; $j<@subfolders; $j++) { - $depths{$subfolders[$j]} = $depth; - $display{$subfolders[$j]} = - '<tr><td>'.$indent.$subfoldertitles[$j].' </td>'. - '<td><label>'. - '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.(' ' x2). - '<label>'. - '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="move" />'. - &mt('Move old').'</label>'. - '</td></tr>'; - } - } - &recurse_print(\$output,$parent,\%deps,\%display); - $output .= '</table></fieldset>'; - } - $output .= '</div>'; - return $output; + $r->print('</fieldset>'); } sub recurse_print { - my ($outputref,$dir,$deps,$display) = @_; - $$outputref .= $display->{$dir}."\n"; + my ($r,$dir,$deps,$display) = @_; + $r->print($display->{$dir}."\n"); if (ref($deps->{$dir}) eq 'ARRAY') { foreach my $subdir (@{$deps->{$dir}}) { - &recurse_print($outputref,$subdir,$deps,$display); + &recurse_print($r,$subdir,$deps,$display); } } } @@ -1420,82 +855,23 @@ sub supp_pasteable { } sub paste_popup_js { - my %html_js_lt = &Apache::lonlocal::texthash( - show => 'Show Options', - hide => 'Hide Options', - ); - my %js_lt = &Apache::lonlocal::texthash( - none => 'No items selected from clipboard.', + my %lt = &Apache::lonlocal::texthash( + show => 'Show Paste Options', + hide => 'Hide Paste Options', ); - &html_escape(\%html_js_lt); - &js_escape(\%html_js_lt); - &js_escape(\%js_lt); return <<"END"; -function showPasteOptions(suffix) { - document.getElementById('pasteoptions_'+suffix).style.display='block'; - document.getElementById('pasteoptionstext_'+suffix).innerHTML = ' <a href="javascript:hidePasteOptions(\\''+suffix+'\\');" class="LC_menubuttons_link">$html_js_lt{'hide'}</a>'; +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(suffix) { - document.getElementById('pasteoptions_'+suffix).style.display='none'; - document.getElementById('pasteoptionstext_'+suffix).innerHTML =' <a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$html_js_lt{'show'}</a>'; - return; -} - -function showOptions(caller,suffix) { - if (document.getElementById('pasteoptionstext_'+suffix)) { - if (caller.checked) { - document.getElementById('pasteoptionstext_'+suffix).innerHTML =' <a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$html_js_lt{'show'}</a>'; - } else { - document.getElementById('pasteoptionstext_'+suffix).innerHTML =''; - } - if (document.getElementById('pasteoptions_'+suffix)) { - document.getElementById('pasteoptions_'+suffix).style.display='none'; - } - } - return; -} - -function validateClipboard() { - var numchk = 0; - if (document.pasteform.pasting.length > 1) { - for (var i=0; i<document.pasteform.pasting.length; i++) { - if (document.pasteform.pasting[i].checked) { - numchk ++; - } - } - } else { - if (document.pasteform.pasting.type == 'checkbox') { - if (document.pasteform.pasting.checked) { - numchk ++; - } - } - } - if (numchk > 0) { - return true; - } else { - alert("$js_lt{'none'}"); - return false; - } -} - -function checkClipboard() { - if (document.pasteform.pasting.length > 1) { - for (var i=0; i<document.pasteform.pasting.length; i++) { - document.pasteform.pasting[i].checked = true; - } - } - return; -} - -function uncheckClipboard() { - if (document.pasteform.pasting.length >1) { - for (var i=0; i<document.pasteform.pasting.length; i++) { - document.pasteform.pasting[i].checked = false; - } - } +function hidePasteOptions() { + document.getElementById('pasteoptions').style.display='none'; + document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:showPasteOptions()" class="LC_menubuttons_link">$lt{'show'}</a>'; return; } @@ -1503,283 +879,229 @@ END } + sub do_paste_from_buffer { my ($coursenum,$coursedom,$folder,$container,$errors) = @_; -# Array of items in paste buffer - my (@currpaste,%pastebuffer,%allerrors); - @currpaste = split(/,/,$env{'docs.markedcopies'}); - # Early out if paste buffer is empty - if (@currpaste == 0) { + if (!$env{'form.pastemarked'}) { return (); - } - map { $pastebuffer{$_} = 1; } @currpaste; - -# Array of items selected items to paste - my @reqpaste = &Apache::loncommon::get_env_multiple('form.pasting'); - -# Early out if nothing selected to paste - if (@reqpaste == 0) { - return(); - } - my @topaste; - foreach my $suffix (@reqpaste) { - next if ($suffix =~ /\D/); - next unless (exists($pastebuffer{$suffix})); - push(@topaste,$suffix); } -# Early out if nothing available to paste - if (@topaste == 0) { - return(); - } - - my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate, - %prefixchg,%srcdom,%srcnum,%srcmapidx,%marktomove,$save_err,$lockerrors,$allresult); - - foreach my $suffix (@topaste) { - my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix}); - my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix}); - my $mapidx=&LONCAPA::map::qtescape($env{'docs.markedcopy_map_'.$suffix}); # Supplemental content may only include certain types of content # Early out if pasted content is not supported in Supplemental area - if ($folder =~ /^supplemental/) { - unless (&supp_pasteable($url)) { - $notinsupp{$suffix} = 1; - next; - } + if ($folder =~ /^supplemental/) { + unless (&supp_pasteable($env{'docs.markedcopy_url'})) { + return (&mt('Paste failed: content type is not supported within Supplemental Content')); } - if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/}) { - my $srcd = $1; - my $srcn = $2; -# When paste buffer was populated using an active role in a different course -# check for mdc privilege in the course from which the resource was pasted - if (($srcd ne $coursedom) || ($srcn ne $coursenum)) { - unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) { - $notincrs{$suffix} = 1; - next; - } - } - $srcdom{$suffix} = $srcd; - $srcnum{$suffix} = $srcn; - } elsif (($url =~ m{^/res/lib/templates/\w+\.problem$}) || - ($url =~ m{^/adm/$match_domain/$match_username/\d+/(bulletinboard|smppg)$})) { - my ($srcd,$srcn) = split(/_/,$cid); + } + +# Prepare to paste resource at end of list + my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}); + my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}); + + my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove); + if ($url=~/\.(page|sequence)$/) { + $is_map = 1; + } + if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) { + $srcdom = $1; + $srcnum = $2; + my $oldprefix = $3; # When paste buffer was populated using an active role in a different course -# check for mdc privilege in the course from which the resource was pasted - if (($srcd ne $coursedom) || ($srcn ne $coursenum)) { - unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) { - $notincrs{$suffix} = 1; - next; - } +# check for mdc privilege in the course from which the resource was pasted + if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { + unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { + return (&mt('Paste failed: Item is from a different course which you do not have rights to edit.')); } - $srcdom{$suffix} = $srcd; - $srcnum{$suffix} = $srcn; - } - $srcmapidx{$suffix} = $mapidx; - push(@dopaste,$suffix); - if ($url=~/\.(page|sequence)$/) { - $is_map{$suffix} = 1; } - - if ($url =~ m{^/uploaded/$match_domain/$match_courseid/([^/]+)}) { - my $oldprefix = $1; # When pasting content from Main Content to Supplemental Content and vice versa # URLs will contain different paths (which depend on whether pasted item is -# a folder/page or a document). - if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) { - $prefixchg{$suffix} = 'docstosupp'; - } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) { - $prefixchg{$suffix} = 'supptodocs'; - } +# 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. - if ($env{'docs.markedcopy_nested_'.$suffix}) { - my @nested; - my ($type) = ($oldprefix =~ /^(default|supplemental)/); - my @items = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix}); - my @deps = map { /\d+:([\d,]+$)/ } @items; - foreach my $dep (@deps) { - if ($dep =~ /,/) { - push(@nested,split(/,/,$dep)); - } else { - push(@nested,$dep); - } + my @nested; + if ($env{'docs.markedcopy_nested'}) { + my ($type) = ($oldprefix =~ /^(default|supplemental)/); + my @items = split(/\&/,$env{'docs.markedcopy_nested'}); + my @deps = map { /\d+:([\d,]+$)/ } @items; + foreach my $dep (@deps) { + if ($dep =~ /,/) { + push(@nested,split(/,/,$dep)); + } else { + push(@nested,$dep); } - foreach my $item (@nested) { - if ($env{'form.docs.markedcopy_'.$suffix.'_'.$item} eq 'move') { - push(@{$marktomove{$suffix}},$type.'_'.$item); - } + } + foreach my $item (@nested) { + if ($env{'form.docs.markedcopy_'.$item} eq 'move') { + $tomove{$type.'_'.$item} = 1; } } } } -# Early out if nothing available to paste - if (@dopaste == 0) { - return (); +# 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 ($folder =~ /^default/) { + my $lastchange = &Apache::lonnet::get_coursechange($coursedom,$coursenum); + if ($lastchange > $env{'request.course.tied'}) { + &reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"}); + } + } +# If pasting a map, check if map contains other maps + my (%allmaps,%hierarchy,%titles); + if ($folder =~ /^default/) { + my $navmap = Apache::lonnavmaps::navmap->new(); + if (defined($navmap)) { + foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) { + $allmaps{$res->src()} = 1; + } + } + } + &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 ($allmaps{$url}) { + return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.')); + } + } + } + } + if ($url=~ m{/smppg$}) { + my $db_name = &Apache::lonsimplepage::get_db_name($url); + if ($db_name =~ /^smppage_/) { + #simple pages, need to copy the db contents to a new one. + my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum); + my $now = time(); + $db_name =~ s{_\d*$ }{_$now}x; + my $dbresult=&Apache::lonnet::put($db_name,\%contents, + $coursedom,$coursenum); + if ($dbresult eq 'ok') { + $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; + $title=&mt('Copy of').' '.$title; + } else { + return (&mt('Paste failed: An error occurred when copying the simple page.')); + } + } } + $title = &LONCAPA::map::qtunescape($title); + my $ext='false'; + if ($url=~m{^http(|s)://}) { $ext='true'; } + $url = &LONCAPA::map::qtunescape($url); -# Populate message hash and hashes used for main content <=> supplemental content -# changes - - %msgs = &Apache::lonlocal::texthash ( - notinsupp => 'Paste failed: content type is not supported within Supplemental Content', - notincrs => 'Paste failed: Item is from a different course which you do not have rights to edit.', - duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.', - ); - - %before = ( - docstosupp => { - map => 'default', - doc => 'docs', - }, - supptodocs => { - map => 'supplemental', - doc => 'supplemental', - }, - ); - - %after = ( - docstosupp => { - map => 'supplemental', - doc => 'supplemental' - }, - supptodocs => { - map => 'default', - doc => 'docs', - }, - ); - -# Retrieve information about all course maps in main content area - - my $allmaps = {}; - my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk); +# 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. -# Loop over the items to paste - foreach my $suffix (@dopaste) { -# Maps need to be copied first - my (%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies, - %dbcopies,%zombies,%params,%docmoves,%mapmoves,%mapchanges,%newsubdir, - %newurls,%tomove,%resdatacopy); - if (ref($marktomove{$suffix}) eq 'ARRAY') { - map { $tomove{$_} = 1; } @{$marktomove{$suffix}}; - } - my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix}); - my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}); - my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix}); - my $oldurl = $url; - if ($is_map{$suffix}) { -# If pasting a map, check if map contains other maps - my (%hierarchy,%titles); - if (($folder =~ /^default/) && (!$donechk)) { - $allmaps = - &Apache::loncommon::allmaps_incourse($coursedom,$coursenum, - $env{"course.$env{'request.course.id'}.home"}, - $env{'request.course.id'}); - $donechk = 1; - } - &contained_map_check($url,$folder,\%removefrommap,\%removeparam, - \%addedmaps,\%hierarchy,\%titles,$allmaps); - if ($url=~ m{^/uploaded/}) { - my $newurl; - unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') { - ($newurl,my $error) = - &get_newmap_url($url,$folder,$prefixchg{$suffix},$coursedom, - $coursenum,$srcdom{$suffix},$srcnum{$suffix}, - \$title,$allmaps,\%newurls); - if ($error) { - $allerrors{$suffix} = $error; - next; - } - if ($newurl ne '') { - if ($newurl ne $url) { - if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) { - $newsubdir{$url} = $1; - } - $mapchanges{$url} = 1; - } - } - } - if (($srcdom{$suffix} ne $coursedom) || - ($srcnum{$suffix} ne $coursenum) || - ($prefixchg{$suffix}) || (($newurl ne '') && ($newurl ne $url))) { - unless (&url_paste_fixups($url,$folder,$prefixchg{$suffix}, - $coursedom,$coursenum,$srcdom{$suffix}, - $srcnum{$suffix},$allmaps,\%rewrites, - \%retitles,\%copies,\%dbcopies, - \%zombies,\%params,\%mapmoves, - \%mapchanges,\%tomove,\%newsubdir, - \%newurls,\%resdatacopy)) { - $mapmoves{$url} = 1; - } - $url = $newurl; - } elsif ($env{'docs.markedcopy_nested_'.$suffix}) { - &url_paste_fixups($url,$folder,$prefixchg{$suffix},$coursedom, - $coursenum,$srcdom{$suffix},$srcnum{$suffix}, - $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies, - \%zombies,\%params,\%mapmoves,\%mapchanges, - \%tomove,\%newsubdir,\%newurls,\%resdatacopy); - } - } elsif ($url=~m {^/res/}) { -# published map can only exist once, so remove from paste buffer when done - push(@toclear,$suffix); -# if pasting published map (main content area only) check map not already in course - if ($folder =~ /^default/) { - if ((ref($allmaps) eq 'HASH') && ($allmaps->{$url})) { - $duplicate{$suffix} = 1; - next; + my $newidx; + unless ($is_map) { +# Now insert the URL at the bottom + $newidx = &LONCAPA::map::getresidx($url); + if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) { + my $relpath = $1; + if ($relpath ne '') { + my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$}); + my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/); + my $newprefix = $newloc; + if ($newloc eq 'default') { + $newprefix = 'docs'; + } + if ($newdocsdir eq '') { + $newdocsdir = 'default'; + } + if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { + my $newpath = "$newprefix/$newdocsdir/$newidx/$rem"; + $url = + &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath, + &Apache::lonnet::getfile($oldurl)); + if ($url eq '/adm/notfound.html') { + return (&mt('Paste failed: an error occurred saving the file.')); + } else { + my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$}); + $newsubpath =~ s{/+$}{/}; + $docmoves{$oldurl} = $newsubpath; } } } } - if ($url=~ m{/(bulletinboard|smppg)$}) { - my $prefix = $1; - my $fromothercrs; - #need to copy the db contents to a new one, unless this is a move. - my %info = ( - src => $url, - cdom => $coursedom, - cnum => $coursenum, - ); - if (($srcdom{$suffix} =~ /^$match_domain$/) && ($srcnum{$suffix} =~ /^$match_courseid$/)) { - unless (($srcdom{$suffix} eq $coursedom) && ($srcnum{$suffix} eq $coursenum)) { - $fromothercrs = 1; - $info{'cdom'} = $srcdom{$suffix}; - $info{'cnum'} = $srcnum{$suffix}; - } - } - unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) { - my (%lockerr,$msg); - my ($newurl,$result,$errtext) = - &dbcopy(\%info,$coursedom,$coursenum,\%lockerr); - if ($result eq 'ok') { - $url = $newurl; - $title=&mt('Copy of').' '.$title; - } else { - if ($prefix eq 'smppg') { - $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext; - } elsif ($prefix eq 'bulletinboard') { - $msg = &mt('Paste failed: An error occurred when copying the discussion board.').' '.$errtext; - } - $results{$suffix} = $result; - $msgerrs{$suffix} = $msg; - $lockerrs{$suffix} = $lockerr{$prefix}; - next; - } - if ($lockerr{$prefix}) { - $lockerrs{$suffix} = $lockerr{$prefix}; - } + } +# Apply any changes to maps, or copy dependencies for uploaded HTML pages + my ($result,$save_err); + $result = + &apply_fixups($folder,$is_map,$prefixchg,$coursedom,$coursenum,$oldurl, + $url,\%removefrommap,\%removeparam,\%rewrites,\%retitles, + \%copies,\%dbcopies,\%zombies,\%params,\%docmoves, + \%mapmoves,\%newsubdir,$errors,\%before,\%after); + 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); } - $title = &LONCAPA::map::qtunescape($title); - my $ext='false'; - if ($url=~m{^http(|s)://}) { $ext='true'; } - if ($env{'docs.markedcopy_supplemental_'.$suffix}) { + if ($env{'docs.markedcopy_supplemental'}) { if ($folder !~ /^supplemental/) { (undef,undef,$title) = - &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental_'.$suffix}); + &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'}); } } else { if ($folder=~/^supplemental/) { @@ -1787,173 +1109,23 @@ sub do_paste_from_buffer { $env{'user.domain'}.'___&&&___'.$title; } } - -# For uploaded files (excluding pages/sequences) path in copied file is changed -# if paste is from Main to Supplemental (or vice versa), or if pasting between -# courses. - - unless ($is_map{$suffix}) { - my $newidx; -# Now insert the URL at the bottom - $newidx = &LONCAPA::map::getresidx(&LONCAPA::map::qtunescape($url)); - if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) { - my $relpath = $1; - if ($relpath ne '') { - my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$}); - my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/); - my $newprefix = $newloc; - if ($newloc eq 'default') { - $newprefix = 'docs'; - } - if ($newdocsdir eq '') { - $newdocsdir = 'default'; - } - if (($prefixchg{$suffix}) || - ($srcdom{$suffix} ne $coursedom) || - ($srcnum{$suffix} ne $coursenum) || - ($env{'form.docs.markedcopy_options_'.$suffix} ne 'move')) { - my $newpath = "$newprefix/$newdocsdir/$newidx/$rem"; - $url = - &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath, - &Apache::lonnet::getfile($oldurl)); - if ($url eq '/adm/notfound.html') { - $msgs{$suffix} = &mt('Paste failed: an error occurred saving the file.'); - next; - } else { - my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$}); - $newsubpath =~ s{/+$}{/}; - $docmoves{$oldurl} = $newsubpath; - } - } - } - } elsif ($url =~ m{^/res/lib/templates/(\w+)\.problem$}) { - my $template = $1; - if ($newidx) { - ©_templated_files($url,$srcdom{$suffix},$srcnum{$suffix},$srcmapidx{$suffix}, - $coursedom,$coursenum,$template,$newidx,"$folder.$container"); - } - } - $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url). - ':'.$ext.':normal:res'; - push(@LONCAPA::map::order,$newidx); -# Store the result - my ($errtext,$fatal) = - &storemap($coursenum,$coursedom,$folder.'.'.$container,1); - if ($fatal) { - $save_err .= $errtext; - $allresult = 'fail'; - } - } - -# Apply any changes to maps, or copy dependencies for uploaded HTML pages, or update -# resourcedata for simpleproblems copied from another course - unless ($allresult eq 'fail') { - my %updated = ( - rewrites => \%rewrites, - zombies => \%zombies, - removefrommap => \%removefrommap, - removeparam => \%removeparam, - dbcopies => \%dbcopies, - resdatacopy => \%resdatacopy, - retitles => \%retitles, - ); - my %info = ( - newsubdir => \%newsubdir, - params => \%params, - ); - if ($prefixchg{$suffix}) { - $info{'before'} = $before{$prefixchg{$suffix}}; - $info{'after'} = $after{$prefixchg{$suffix}}; - } - my %moves = ( - copies => \%copies, - docmoves => \%docmoves, - mapmoves => \%mapmoves, - ); - (my $result,$msgs{$suffix},my $lockerror) = - &apply_fixups($folder,$is_map{$suffix},$coursedom,$coursenum,$errors, - \%updated,\%info,\%moves,$prefixchg{$suffix},$oldurl, - $url,'paste'); - $lockerrors .= $lockerror; - if ($result eq 'ok') { - if ($is_map{$suffix}) { - my ($errtext,$fatal) = &mapread($coursenum,$coursedom, - $folder.'.'.$container); - if ($fatal) { - $allresult = 'failread'; - } else { - if ($#LONCAPA::map::order<1) { - my $idx=&LONCAPA::map::getresidx(); - if ($idx<=0) { $idx=1; } - $LONCAPA::map::order[0]=$idx; - $LONCAPA::map::resources[$idx]=''; - } - my $newidx = &LONCAPA::map::getresidx(&LONCAPA::map::qtunescape($url)); - $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url). - ':'.$ext.':normal:res'; - push(@LONCAPA::map::order,$newidx); + $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res'; + push(@LONCAPA::map::order, $newidx); # Store the result - my ($errtext,$fatal) = - &storemap($coursenum,$coursedom,$folder.'.'.$container,1); - if ($fatal) { - $save_err .= $errtext; - $allresult = 'failstore'; - } - } - } - if ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') { - push(@toclear,$suffix); - } - } + my ($errtext,$fatal) = + &storemap($coursenum,$coursedom,$folder.'.'.$container,1); + if ($fatal) { + $save_err = $errtext; } } - &clear_from_buffer(\@toclear,\@currpaste); - my $msgsarray; - foreach my $suffix (keys(%msgs)) { - if (ref($msgs{$suffix}) eq 'ARRAY') { - $msgsarray .= join(',',@{$msgs{$suffix}}); - } - } - return ($allresult,$save_err,$msgsarray,$lockerrors); -} - -sub do_buffer_empty { - my @currpaste = split(/,/,$env{'docs.markedcopies'}); - if (@currpaste == 0) { - return &mt('Clipboard is already empty'); - } - my @toclear = &Apache::loncommon::get_env_multiple('form.pasting'); - if (@toclear == 0) { - return &mt('Nothing selected to clear from clipboard'); - } - my $numdel = &clear_from_buffer(\@toclear,\@currpaste); - if ($numdel) { - return &mt('[quant,_1,item] cleared from clipboard',$numdel); - } else { - return &mt('Clipboard unchanged'); + + if ($env{'form.docs.markedcopy_options'} eq 'move') { + &Apache::lonnet::delenv('docs.markedcopy'); + &Apache::lonnet::delenv('docs.markedcopy_nested'); + &Apache::lonnet::delenv('docs.markedcopy_nestednames'); } - return; -} - -sub clear_from_buffer { - my ($toclear,$currpaste) = @_; - return unless ((ref($toclear) eq 'ARRAY') && (ref($currpaste) eq 'ARRAY')); - my %pastebuffer; - map { $pastebuffer{$_} = 1; } @{$currpaste}; - my $numdel = 0; - foreach my $suffix (@{$toclear}) { - next if ($suffix =~ /\D/); - next unless (exists($pastebuffer{$suffix})); - my $regexp = 'docs.markedcopy_[a-z]+_'.$suffix; - if (&Apache::lonnet::delenv($regexp,1) eq 'ok') { - delete($pastebuffer{$suffix}); - $numdel ++; - } - } - my $newbuffer = join(',',sort(keys(%pastebuffer))); - &Apache::lonnet::appenv({'docs.markedcopies' => $newbuffer}); - return $numdel; + return ($result,$save_err); } sub get_newmap_url { @@ -2017,189 +1189,20 @@ sub get_newmap_url { } sub dbcopy { - my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_; - my ($url,$result,$errtext); - if (ref($dbref) eq 'HASH') { - $url = $dbref->{'src'}; - if ($url =~ m{/(smppg|bulletinboard)$}) { - my $prefix = $1; - if (($dbref->{'cdom'} =~ /^$match_domain$/) && - ($dbref->{'cnum'} =~ /^$match_courseid$/)) { - my $db_name; - my $marker = (split(m{/},$url))[4]; - $marker=~s/\D//g; - if ($dbref->{'src'} =~ m{/smppg$}) { - $db_name = - &Apache::lonsimplepage::get_db_name($url,$marker, - $dbref->{'cdom'}, - $dbref->{'cnum'}); - } else { - $db_name = 'bulletinpage_'.$marker; - } - my ($suffix,$freedlock,$error) = - &Apache::lonnet::get_timebased_id($prefix,'num','templated', - $coursedom,$coursenum, - 'concat'); - if (!$suffix) { - if ($prefix eq 'smppg') { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url); - } else { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a discussion board [_1].',$url); - } - if ($error) { - $errtext .= '<br />'.$error; - } - } else { - #need to copy the db contents to a new one. - my %contents=&Apache::lonnet::dump($db_name, - $dbref->{'cdom'}, - $dbref->{'cnum'}); - if (exists($contents{'uploaded.photourl'})) { - my $photo = $contents{'uploaded.photourl'}; - my ($subdir,$fname) = - ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$}); - my $newphoto; - if ($fname ne '') { - my $content = &Apache::lonnet::getfile($photo); - unless ($content eq '-1') { - $env{'form.'.$suffix.'.photourl'} = $content; - $newphoto = - &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname"); - delete($env{'form.'.$suffix.'.photourl'}); - } - } - if ($newphoto =~ m{^/uploaded/}) { - $contents{'uploaded.photourl'} = $newphoto; - } - } - $db_name =~ s{_\d*$ }{_$suffix}x; - $result=&Apache::lonnet::put($db_name,\%contents, - $coursedom,$coursenum); - if ($result eq 'ok') { - $url =~ s{/(\d*)/(smppg|bulletinboard)$}{/$suffix/$2}x; - } - } - if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) { - $lockerrorsref->{$prefix} = - '<div class="LC_error">'. - &mt('There was a problem removing a lockfile.'); - if ($prefix eq 'smppg') { - $lockerrorsref->{$prefix} .= - ' '.&mt('This will prevent creation of additional simple pages in this course.'); - } else { - $lockerrorsref->{$prefix} .= ' '.&mt('This will prevent creation of additional discussion boards in this course.'); - } - $lockerrorsref->{$prefix} .= ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.', - '<a href="/adm/helpdesk" target="_helpdesk">','</a>'). - '</div>'; - } - } - } elsif ($url =~ m{/syllabus$}) { - if (($dbref->{'cdom'} =~ /^$match_domain$/) && - ($dbref->{'cnum'} =~ /^$match_courseid$/)) { - if (($dbref->{'cdom'} ne $coursedom) || - ($dbref->{'cnum'} ne $coursenum)) { - my %contents=&Apache::lonnet::dump('syllabus', - $dbref->{'cdom'}, - $dbref->{'cnum'}); - $result=&Apache::lonnet::put('syllabus',\%contents, - $coursedom,$coursenum); - } - } - } - } - return ($url,$result,$errtext); -} - -sub copy_templated_files { - my ($srcurl,$srcdom,$srcnum,$srcmapinfo,$coursedom,$coursenum,$template,$newidx,$newmapname) = @_; - my ($srcfolder,$srcid,$srcwaspage) = split(/:/,$srcmapinfo); - my $srccontainer = 'sequence'; - if ($srcwaspage) { - $srccontainer = 'page'; - } - my $srcsymb = "uploaded/$srcdom/$srcnum/$srcfolder.$srccontainer". - '___'.$srcid.'___'.&Apache::lonnet::declutter($srcurl); - my $srcprefix = $srcdom.'_'.$srcnum.'.'.$srcsymb; - my %srcparms=&Apache::lonnet::dump('resourcedata',$srcdom,$srcnum,$srcprefix); - my $newsymb = "uploaded/$coursedom/$coursenum/$newmapname".'___'.$newidx.'___lib/templates/'. - $template.'.problem'; - my $newprefix = $coursedom.'_'.$coursenum.'.'.$newsymb; - if ($template eq 'simpleproblem') { - $srcprefix .= '.0.'; - my $weightprefix = $newprefix; - $newprefix .= '.0.'; - my @simpleprobqtypes = qw(radio option string essay numerical); - my $qtype=$srcparms{$srcprefix.'questiontype'}; - if (grep(/^\Q$qtype\E$/,@simpleprobqtypes)) { - my %newdata = ( - $newprefix.'questiontype' => $qtype, - ); - foreach my $type (@simpleprobqtypes) { - if ($type eq $qtype) { - $newdata{"$weightprefix.$type.weight"}=1; - } else { - $newdata{"$weightprefix.$type.weight"}=0; - } - } - $newdata{$newprefix.'hiddenparts'} = '!'.$qtype; - $newdata{$newprefix.'questiontext'} = $srcparms{$srcprefix.'questiontext'}; - $newdata{$newprefix.'hinttext'} = $srcparms{$srcprefix.'hinttext'}; - if ($qtype eq 'numerical') { - $newdata{$newprefix.'numericalscript'} = $srcparms{$srcprefix.'numericalscript'}; - $newdata{$newprefix.'numericalanswer'} = $srcparms{$srcprefix.'numericalanswer'}; - $newdata{$newprefix.'numericaltolerance'} = $srcparms{$srcprefix.'numericaltolerance'}; - $newdata{$newprefix.'numericalsigfigs'} = $srcparms{$srcprefix.'numericalsigfigs'}; - } elsif (($qtype eq 'option') || ($qtype eq 'radio')) { - my $maxfoils=$srcparms{$srcprefix.'maxfoils'}; - unless (defined($maxfoils)) { $maxfoils=10; } - unless ($maxfoils=~/^\d+$/) { $maxfoils=10; } - if ($maxfoils<=0) { $maxfoils=10; } - my $randomize=$srcparms{$srcprefix.'randomize'}; - unless (defined($randomize)) { $randomize='yes'; } - unless ($randomize eq 'no') { $randomize='yes'; } - $newdata{$newprefix.'maxfoils'} = $maxfoils; - $newdata{$newprefix.'randomize'} = $randomize; - if ($qtype eq 'option') { - $newdata{$newprefix.'options'} = $srcparms{$srcprefix.'options'}; - } - for (my $i=1; $i<=10; $i++) { - $newdata{$newprefix.'value'.$i} = $srcparms{$srcprefix.'value'.$i}; - $newdata{$newprefix.'position'.$i} = $srcparms{$srcprefix.'position'.$i}; - $newdata{$newprefix.'text'.$i} = $srcparms{$srcprefix.'text'.$i}; - } - - } elsif (($qtype eq 'option') || ($qtype eq 'radio')) { - my $maxfoils=$srcparms{$srcprefix.'maxfoils'}; - unless (defined($maxfoils)) { $maxfoils=10; } - unless ($maxfoils=~/^\d+$/) { $maxfoils=10; } - if ($maxfoils<=0) { $maxfoils=10; } - my $randomize=$srcparms{$srcprefix.'randomize'}; - unless (defined($randomize)) { $randomize='yes'; } - unless ($randomize eq 'no') { $randomize='yes'; } - $newdata{$newprefix.'maxfoils'} = $maxfoils; - $newdata{$newprefix.'randomize'} = $randomize; - if ($qtype eq 'option') { - $newdata{$newprefix.'options'} = $srcparms{$srcprefix.'options'}; - } - for (my $i=1; $i<=10; $i++) { - $newdata{$newprefix.'value'.$i} = $srcparms{$srcprefix.'value'.$i}; - $newdata{$newprefix.'position'.$i} = $srcparms{$srcprefix.'position'.$i}; - $newdata{$newprefix.'text'.$i} = $srcparms{$srcprefix.'text'.$i}; - } - } elsif ($qtype eq 'string') { - $newdata{$newprefix.'stringanswer'} = $srcparms{$srcprefix.'stringanswer'}; - $newdata{$newprefix.'stringtype'} = $srcparms{$srcprefix.'stringtype'}; - } - if (keys(%newdata)) { - my $putres = &Apache::lonnet::cput('resourcedata',\%newdata,$coursedom, - $coursenum); - if ($putres eq 'ok') { - &Apache::lonnet::devalidatecourseresdata($coursenum,$coursedom); - } - } + 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; } sub uniqueness_check { @@ -2240,7 +1243,7 @@ sub contained_map_check { $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'}; } else { if ($allmaps->{$ressrc}) { - $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; + $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') { $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; } else { @@ -2264,10 +1267,18 @@ sub contained_map_check { return; } +sub reinit_role { + my ($cdom,$cnum,$chome) = @_; + my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); + unless ($ferr) { + &Apache::loncommon::update_content_constraints($cdom,$cnum,$chome,$cdom.'_'.$cnum); + } + return; +} + sub url_paste_fixups { - my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$fromcdom,$fromcnum,$allmaps, - $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves, - $mapchanges,$tomove,$newsubdir,$newurls,$resdatacopy) = @_; + 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})) { @@ -2294,13 +1305,13 @@ sub url_paste_fixups { 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; + $retitles->{$oldurl}{$ressrc} = $id; } } next if ($token->[2]->{'type'} eq 'external'); if ($token->[2]->{'type'} eq 'zombie') { - next if ($skip); - $zombies->{$oldurl}{$id} = $ressrc; + next if ($skip); + $zombies->{$oldurl}{$ressrc} = $id; $changed = 1; } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { my $srcdom = $1; @@ -2312,11 +1323,10 @@ sub url_paste_fixups { my $prefix = $1; $mapname = $prefix.$2; if ($tomove->{$mapname}) { - &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum, - $srcdom,$srcnum,$allmaps,$rewrites, - $retitles,$copies,$dbcopies,$zombies, - $params,$mapmoves,$mapchanges,$tomove, - $newsubdir,$newurls,$resdatacopy); + &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) = @@ -2334,55 +1344,37 @@ sub url_paste_fixups { ($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) { if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) { - $rewrites->{$oldurl}{$id} = $ressrc; + $rewrites->{$oldurl}{$ressrc} = $id; $mapchanges->{$ressrc} = 1; - unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom, - $cnum,$srcdom,$srcnum,$allmaps, - $rewrites,$retitles,$copies,$dbcopies, - $zombies,$params,$mapmoves,$mapchanges, - $tomove,$newsubdir,$newurls,$resdatacopy)) { + 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; + $rewrites->{$oldurl}{$ressrc} = $id; $copies->{$oldurl}{$ressrc} = $id; $changed = 1; } } - } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/.+$}) { - next if ($skip); + } 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}{$id}{'src'} = $ressrc; - $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom; - $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum; - $changed = 1; - } - } elsif ($ressrc =~ m{^/adm/$match_domain/$match_username/\d+/(smppg|bulletinboard)$}) { - if (($fromcdom ne $cdom) || ($fromcnum ne $cnum) || - ($env{'form.docs.markedcopy_options'} ne 'move')) { - $dbcopies->{$oldurl}{$id}{'src'} = $ressrc; - $dbcopies->{$oldurl}{$id}{'cdom'} = $fromcdom; - $dbcopies->{$oldurl}{$id}{'cnum'} = $fromcnum; + $rewrites->{$oldurl}{$ressrc} = $id; + $dbcopies->{$oldurl}{$ressrc} = $id; $changed = 1; } - } elsif ($ressrc eq '/res/lib/templates/simpleproblem.problem') { - if (($fromcdom ne $cdom) || ($fromcnum ne $cnum)) { - $resdatacopy->{$oldurl}{$id}{'src'} = $ressrc; - $resdatacopy->{$oldurl}{$id}{'cdom'} = $fromcdom; - $resdatacopy->{$oldurl}{$id}{'cnum'} = $fromcnum; - } } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) { next if ($skip); my $srcdom = $1; my $srcnum = $2; if (($srcdom ne $cdom) || ($srcnum ne $cnum)) { - $dbcopies->{$oldurl}{$id}{'src'} = $ressrc; - $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom; - $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum; + $rewrites->{$oldurl}{$ressrc} = $id; + $dbcopies->{$oldurl}{$ressrc} = $id; $changed = 1; } } @@ -2402,76 +1394,24 @@ sub url_paste_fixups { } 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,@msgs, - %resdatacopy,%lockerrors,$lockmsg); - 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($updated->{'resdatacopy'}) eq 'HASH') { - %resdatacopy = %{$updated->{'resdatacopy'}}; - } - } - 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 ($folder,$is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap, + $removeparam,$rewrites,$retitles,$copies,$dbcopies,$zombies,$params, + $docmoves,$mapmoves,$newsubdir,$errors,$before,$after) = @_; + 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; - } + 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); } + undef(%added); } if ($key eq $oldurl) { - if ((exists($docmoves{$key}))) { - unless (grep(/^\Q$oldurl\E$/,@allcopies)) { + if ((exists($docmoves->{$key}))) { + unless (grep(/^\Q$oldurl\E/,@allcopies)) { push(@allcopies,$oldurl); } } @@ -2484,16 +1424,16 @@ sub apply_fixups { my $content = &Apache::lonnet::getfile($item); unless ($content eq '-1') { my $storefn; - if (($key eq $oldurl) && (exists($docmoves{$key}))) { - $storefn = $docmoves{$key}; + if (($key eq $oldurl) && (ref($docmoves) eq 'HASH') && (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 ($prefixchg) { + $storefn =~ s/^\Q$before->{'doc'}\E/$after->{'doc'}/; } - if ($newsubdir{$key}) { - $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir{$key}/#; + if ($newsubdir->{$key}) { + $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir->{$key}#; } } ©_dependencies($item,$storefn,$relpath,$errors,\$content); @@ -2501,7 +1441,7 @@ sub apply_fixups { &Apache::lonclonecourse::writefile($env{'request.course.id'}, $storefn.$fname,$content); if ($copyurl eq '/adm/notfound.html') { - if (exists($docmoves{$oldurl})) { + if ((ref($docmoves) eq 'HASH') && (exists($docmoves->{$oldurl}))) { return &mt('Paste failed: an error occurred copying the file.'); } elsif (ref($errors) eq 'HASH') { $errors->{$item} = 1; @@ -2512,14 +1452,14 @@ sub apply_fixups { } } } - foreach my $key (keys(%mapmoves)) { + 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 ($prefixchg) { + $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/; } - if ($newsubdir{$key}) { - $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/; + if ($newsubdir->{$key}) { + $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/; } my $mapcontent = &Apache::lonnet::getfile($key); if ($mapcontent eq '-1') { @@ -2539,151 +1479,115 @@ sub apply_fixups { } 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(%{$rewrites})) { + $updates{$key} = 1; + } + foreach my $key (keys(%{$zombies})) { + $updates{$key} = 1; + } + foreach my $key (keys(%{$removefrommap})) { + $updates{$key} = 1; + } + foreach my $key (keys(%{$removeparam})) { + $updates{$key} = 1; + } + foreach my $key (keys(%{$dbcopies})) { + $updates{$key} = 1; + } + foreach my $key (keys(%{$retitles})) { + $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($rewrites->{$key}) eq 'HASH') { + %torewrite = %{$rewrites->{$key}}; } - if (ref($retitles{$key}) eq 'HASH') { - %toretitle = %{$retitles{$key}}; + if (ref($retitles->{$key}) eq 'HASH') { + %toretitle = %{$retitles->{$key}}; } - if (ref($removefrommap{$key}) eq 'HASH') { - %toremove = %{$removefrommap{$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 $idx (keys(%{$dbcopies{$key}})) { - if (ref($dbcopies{$key}{$idx}) eq 'HASH') { - my ($newurl,$result,$errtext) = - &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors); - if ($result eq 'ok') { - $newdb{$idx} = $newurl; - } elsif (ref($errors) eq 'HASH') { - $errors->{$key} = 1; - } - push(@msgs,$errtext); - } - } + if (ref($removeparam->{$key}) eq 'HASH') { + %remparam = %{$removeparam->{$key}}; } - if (ref($resdatacopy{$key}) eq 'HASH') { - my ($gotnewmapname,$newmapname,$srcfolder,$srccontainer); - foreach my $idx (keys(%{$resdatacopy{$key}})) { - if (ref($resdatacopy{$key}{$idx}) eq 'HASH') { - my $srcurl = $resdatacopy{$key}{$idx}{'src'}; - if ($srcurl =~ m{^/res/lib/templates/(\w+)\.problem$}) { - my $template = $1; - if (($resdatacopy{$key}{$idx}{'cdom'} =~ /^$match_domain$/) && - ($resdatacopy{$key}{$idx}{'cnum'} =~ /^$match_courseid$/)) { - my $srcdom = $resdatacopy{$key}{$idx}{'cdom'}; - my $srcnum = $resdatacopy{$key}{$idx}{'cnum'}; - unless ($gotnewmapname) { - ($newmapname) = ($key =~ m{/([^/]+)$}); - ($srcfolder,$srccontainer) = split(/\./,$newmapname); - if ($newsubdir{$key}) { - $newmapname =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/; - } - $gotnewmapname = 1; - } - my $srcmapinfo = $srcfolder.':'.$idx; - if ($srccontainer eq 'page') { - $srcmapinfo .= ':1'; - } - ©_templated_files($srcurl,$srcdom,$srcnum,$srcmapinfo,$cdom, - $cnum,$template,$idx,$newmapname); - } - } - } + 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}}; + if (ref($params->{$key}) eq 'HASH') { + %currparam = %{$params->{$key}}; } my ($errtext,$fatal) = &LONCAPA::map::mapread($key); if ($fatal) { - return ($errtext); + 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) { + if ($zombie{$src} eq $i) { undef($LONCAPA::map::zombies[$i]); } } } - my $total = scalar(@LONCAPA::map::order) - 1; - for (my $i=$total; $i>=0; $i--) { - my $idx = $LONCAPA::map::order[$i]; - if (defined($LONCAPA::map::resources[$idx])) { + for (my $i=0; $i<@LONCAPA::map::resources; $i++) { + if (defined($LONCAPA::map::resources[$i])) { my $changed; - my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$idx]); - if ((exists($toremove{$idx})) && - ($toremove{$idx} eq &LONCAPA::map::qtescape($src))) { + my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$i]); + if ($toremove{$src} eq $i) { splice(@LONCAPA::map::order,$i,1); - if (ref($currparam{$idx}) eq 'ARRAY') { - foreach my $name (@{$currparam{$idx}}) { - &LONCAPA::map::delparameter($idx,$name); + if (ref($currparam{$i}) eq 'ARRAY') { + foreach my $name (@{$currparam{$i}}) { + &LONCAPA::map::delparameter($i,'parameter_'.$name); } } next; } my $origsrc = $src; - if ((exists($toretitle{$idx})) && ($toretitle{$idx} eq $src)) { + if ((exists($toretitle{$src})) && ($toretitle{$src} eq $i)) { if ($title =~ m{^\d+\Q___&&&___\E$match_username\Q___&&&___\E$match_domain\Q___&&&___\E(.+)$}) { $changed = 1; } } - if ((exists($torewrite{$idx})) && ($torewrite{$idx} eq $src)) { + if ((exists($torewrite{$src})) && ($torewrite{$src} eq $i)) { $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/}; if ($origsrc =~ m{^/uploaded/}) { - if ($prefixchg && $before{'map'} && $after{'map'}) { + if ($prefixchg) { if ($src =~ /\.(page|sequence)$/) { - $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'map'}\E#$1$after{'map'}#; + $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'}#; + $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}#; + if ($newsubdir->{$origsrc}) { + if ($src =~ /\.(page|sequence)$/) { + $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir->{$origsrc}#; + } else { + $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir->{$origsrc}#; } - } elsif ($newsubdir{$key}) { - $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir{$key}#; } } $changed = 1; - } elsif ($newdb{$idx} ne '') { - $src = $newdb{$idx}; + } elsif ($newdb{$src} ne '') { + $src = $newdb{$src}; $changed = 1; } if ($changed) { - $LONCAPA::map::resources[$idx] = join(':',($title,&LONCAPA::map::qtunescape($src),$ext,$type)); + $LONCAPA::map::resources[$i] = 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,$name); + &LONCAPA::map::delparameter($idx,'parameter_'.$name); } } } - if (values(%lockerrors) > 0) { - $lockmsg = join('<br />',values(%lockerrors)); - } my $storefn; if ($key eq $oldurl) { $storefn = $url; @@ -2691,27 +1595,25 @@ sub apply_fixups { } 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 ($prefixchg) { + $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/; } - if ($newsubdir{$key}) { - $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/; + if ($newsubdir->{$key}) { + $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/; } } my $report; if ($folder !~ /^supplemental/) { $report = 1; } - (my $outtext,$errtext) = + 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 &mt('Paste failed: an error occurred saving the folder or page.'); } } } - return ('ok',\@msgs,$lockmsg); + return 'ok'; } sub copy_dependencies { @@ -2776,128 +1678,34 @@ my %parameter_type = ( 'randompick' my $valid_parameters_re = join('|',keys(%parameter_type)); # set parameters sub update_parameter { - if ($env{'form.changeparms'} eq 'all') { - my (@allidx,@allmapidx,%allchecked,%currchecked); - %allchecked = ( - 'hiddenresource' => {}, - 'encrypturl' => {}, - 'randompick' => {}, - 'randomorder' => {}, - ); - foreach my $which (keys(%allchecked)) { - $env{'form.all'.$which} =~ s/,$//; - if ($which eq 'randompick') { - foreach my $item (split(/,/,$env{'form.all'.$which})) { - my ($res,$value) = split(/:/,$item); - if ($value =~ /^\d+$/) { - $allchecked{$which}{$res} = $value; - } - } - } else { - if ($env{'form.all'.$which}) { - map { $allchecked{$which}{$_} = 1; } split(/,/,$env{'form.all'.$which}); - } - } - } - my $haschanges = 0; - foreach my $res (@LONCAPA::map::order) { - my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); - $name=&LONCAPA::map::qtescape($name); - $url=&LONCAPA::map::qtescape($url); - next unless ($name && $url); - my $is_map; - if ($url =~ m{/uploaded/.+\.(page|sequence)$}) { - $is_map = 1; - } - foreach my $which (keys(%allchecked)) { - if (($which eq 'randompick' || $which eq 'randomorder')) { - next if (!$is_map); - } - my $oldvalue = 0; - my $newvalue = 0; - if ($allchecked{$which}{$res}) { - $newvalue = $allchecked{$which}{$res}; - } - my $current = (&LONCAPA::map::getparameter($res,'parameter_'.$which))[0]; - if ($which eq 'randompick') { - if ($current =~ /^(\d+)$/) { - $oldvalue = $1; - } - } else { - if ($current =~ /^yes$/i) { - $oldvalue = 1; - } - } - if ($oldvalue ne $newvalue) { - $haschanges = 1; - if ($newvalue) { - my $storeval = 'yes'; - if ($which eq 'randompick') { - $storeval = $newvalue; - } - &LONCAPA::map::storeparameter($res,'parameter_'.$which, - $storeval, - $parameter_type{$which}); - &remember_parms($res,$which,'set',$storeval); - } elsif ($oldvalue) { - &LONCAPA::map::delparameter($res,'parameter_'.$which); - &remember_parms($res,$which,'del'); - } - } - } - } - return $haschanges; + + return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/); + + my $which = $env{'form.changeparms'}; + my $idx = $env{'form.setparms'}; + if ($env{'form.'.$which.'_'.$idx}) { + my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx} + : 'yes'; + &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value, + $parameter_type{$which}); + &remember_parms($idx,$which,'set',$value); } else { - my $haschanges = 0; - return $haschanges if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/); + &LONCAPA::map::delparameter($idx,'parameter_'.$which); - my $which = $env{'form.changeparms'}; - my $idx = $env{'form.setparms'}; - my $oldvalue = 0; - my $newvalue = 0; - my $current = (&LONCAPA::map::getparameter($idx,'parameter_'.$which))[0]; - if ($which eq 'randompick') { - if ($current =~ /^(\d+)$/) { - $oldvalue = $1; - } - } elsif ($current =~ /^yes$/i) { - $oldvalue = 1; - } - if ($env{'form.'.$which.'_'.$idx}) { - $newvalue = ($which eq 'randompick') ? $env{'form.rpicknum_'.$idx} - : 1; - } - if ($oldvalue ne $newvalue) { - $haschanges = 1; - if ($newvalue) { - my $storeval = 'yes'; - if ($which eq 'randompick') { - $storeval = $newvalue; - } - &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $storeval, - $parameter_type{$which}); - &remember_parms($idx,$which,'set',$storeval); - } else { - &LONCAPA::map::delparameter($idx,'parameter_'.$which); - &remember_parms($idx,$which,'del'); - } - } - return $haschanges; + &remember_parms($idx,$which,'del'); } - return; + return 1; } + sub handle_edit_cmd { my ($coursenum,$coursedom) =@_; - if ($env{'form.cmd'} eq '') { - return 0; - } my ($cmd,$idx)=split('_',$env{'form.cmd'}); my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]; my ($title, $url, @rrest) = split(':', $ratstr); - if ($cmd eq 'remove') { + if ($cmd eq 'del') { if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && ($url!~/$LONCAPA::assess_page_seq_re/)) { &Apache::lonnet::removeuploadedurl($url); @@ -2919,6 +1727,7 @@ sub handle_edit_cmd { @LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1]; } elsif ($cmd eq 'rename') { + my $comment = &LONCAPA::map::qtunescape($env{'form.title'}); if ($comment=~/\S/) { $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]= @@ -2927,7 +1736,6 @@ sub handle_edit_cmd { # Devalidate title cache my $renamed_url=&LONCAPA::map::qtescape($url); &Apache::lonnet::devalidate_title_cache($renamed_url); - } else { return 0; } @@ -2936,45 +1744,23 @@ sub handle_edit_cmd { sub editor { my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype, - $supplementalflag,$orderhash,$iconpath,$pathitem,$canedit, - $hostname,$navmapref,$hiddentop)=@_; - 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; } - my ($errtext,$fatal); - if (($folder eq '') && (!$supplementalflag)) { - if (@LONCAPA::map::order) { - undef(@LONCAPA::map::order); - undef(@LONCAPA::map::resources); - undef(@LONCAPA::map::resparms); - undef(@LONCAPA::map::zombies); - } - $folder = 'default'; - $container = 'sequence'; - } else { - ($errtext,$fatal) = &mapread($coursenum,$coursedom, - $folder.'.'.$container); - return $errtext if ($fatal); - } + my ($errtext,$fatal) = &mapread($coursenum,$coursedom, + $folder.'.'.$container); + return $errtext if ($fatal); if ($#LONCAPA::map::order<1) { my $idx=&LONCAPA::map::getresidx(); @@ -2986,12 +1772,12 @@ sub editor { # ------------------------------------------------------------ Process commands # ---------------- if they are for this folder and user allowed to make changes - if (($allowed && $canedit) && ($env{'form.folder'} eq $folder)) { + if (($allowed) && ($env{'form.folder'} eq $folder)) { # set parameters and change order &snapshotbefore(); if (&update_parameter()) { - ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,1); + ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); return $errtext if ($fatal); } @@ -3006,36 +1792,17 @@ sub editor { if ($env{'form.pastemarked'}) { my %paste_errors; - my ($paste_res,$save_error,$pastemsgarray,$lockerror) = + my ($paste_res,$save_error) = &do_paste_from_buffer($coursenum,$coursedom,$folder,$container, \%paste_errors); - if (ref($pastemsgarray) eq 'ARRAY') { - if (@{$pastemsgarray} > 0) { - $r->print('<p class="LC_info">'. - join('<br />',@{$pastemsgarray}). - '</p>'); - } - } - if ($lockerror) { - $r->print('<p class="LC_error">'. - $lockerror. - '</p>'); - } - if ($save_error ne '') { - return $save_error; - } - if ($paste_res) { - my %errortext = &Apache::lonlocal::texthash ( - fail => 'Storage of folder contents failed', - failread => 'Reading folder contents failed', - failstore => 'Storage of folder contents failed', - ); - if ($errortext{$paste_res}) { - $r->print('<p class="LC_error">'.$errortext{$paste_res}.'</p>'); + if ($save_error ne '') { + return $save_error; } + if ($paste_res ne 'ok') { + $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>'); } if (keys(%paste_errors) > 0) { - $r->print('<p class="LC_warning">'."\n". + $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))) { @@ -3043,138 +1810,31 @@ sub editor { } $r->print('</ul></p>'."\n"); } - } elsif ($env{'form.clearmarked'}) { - my $output = &do_buffer_empty(); - if ($output) { - $r->print('<p class="LC_info">'.$output.'</p>'); - } - } + } $r->print($upload_output); -# Rename, cut, copy or remove a single resource - if (&handle_edit_cmd($coursenum,$coursedom)) { + if (&handle_edit_cmd()) { my $contentchg; - if ($env{'form.cmd'} =~ m{^(remove|cut)_}) { + if ($env{'form.cmd'} =~ /^(del|cut)_/) { $contentchg = 1; } ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg); return $errtext if ($fatal); } - -# Cut, copy and/or remove multiple resources - if ($env{'form.multichange'}) { - my %allchecked = ( - cut => {}, - remove => {}, - ); - my $needsupdate; - foreach my $which (keys(%allchecked)) { - $env{'form.multi'.$which} =~ s/,$//; - if ($env{'form.multi'.$which}) { - map { $allchecked{$which}{$_} = 1; } split(/,/,$env{'form.multi'.$which}); - if (ref($allchecked{$which}) eq 'HASH') { - $needsupdate += scalar(keys(%{$allchecked{$which}})); - } - } - } - if ($needsupdate) { - my $haschanges = 0; - my %curr_groups = &Apache::longroup::coursegroups(); - my $total = scalar(@LONCAPA::map::order) - 1; - for (my $i=$total; $i>=0; $i--) { - my $res = $LONCAPA::map::order[$i]; - my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); - $name=&LONCAPA::map::qtescape($name); - $url=&LONCAPA::map::qtescape($url); - next unless $url; - my %denied = - &action_restrictions($coursenum,$coursedom,$url, - $env{'form.folderpath'},\%curr_groups); - foreach my $which (keys(%allchecked)) { - next if ($denied{$which}); - next unless ($allchecked{$which}{$res}); - if ($which eq 'remove') { - if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && - ($url!~/$LONCAPA::assess_page_seq_re/)) { - &Apache::lonnet::removeuploadedurl($url); - } else { - &LONCAPA::map::makezombie($res); - } - splice(@LONCAPA::map::order,$i,1); - $haschanges ++; - } elsif ($which eq 'cut') { - &LONCAPA::map::makezombie($res); - splice(@LONCAPA::map::order,$i,1); - $haschanges ++; - } - } - } - if ($haschanges) { - ($errtext,$fatal) = - &storemap($coursenum,$coursedom,$folder.'.'.$container,1); - return $errtext if ($fatal); - } - } - } - # Group import/search if ($env{'form.importdetail'}) { my @imports; foreach my $item (split(/\&/,$env{'form.importdetail'})) { if (defined($item)) { my ($name,$url,$residx)= - map { &unescape($_); } split(/\=/,$item); - if ($url =~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) { - my ($suffix,$errortxt,$locknotfreed) = - &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2); - if ($locknotfreed) { - $r->print($locknotfreed); - } - if ($suffix) { - $url =~ s/_new\./_$suffix./; - } else { - return $errortxt; - } - } elsif ($url =~ m{^/adm/$match_domain/$match_username/new/(smppg|bulletinboard)$}) { - my $type = $1; - my ($suffix,$errortxt,$locknotfreed) = - &new_timebased_suffix($coursedom,$coursenum,$type); - if ($locknotfreed) { - $r->print($locknotfreed); - } - if ($suffix) { - $url =~ s{^(/adm/$match_domain/$match_username)/new}{$1/$suffix}; - } else { - return $errortxt; - } - } elsif ($url =~ m{^/uploaded/$coursedom/$coursenum/(docs|supplemental)/(default|\d+)/new.html$}) { - if ($supplementalflag) { - next unless ($1 eq 'supplemental'); - if ($folder eq 'supplemental') { - next unless ($2 eq 'default'); - } else { - next unless ($folder eq 'supplemental_'.$2); - } - } else { - next unless ($1 eq 'docs'); - if ($folder eq 'default') { - next unless ($2 eq 'default'); - } else { - next unless ($folder eq 'default_'.$2); - } - } - } + map {&unescape($_)} split(/\=/,$item); 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'}) { @@ -3230,17 +1890,8 @@ sub editor { $r->print('</div>'); } - my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups); - %filters = ( - canremove => [], - cancut => [], - cancopy => [], - hiddenresource => [], - encrypturl => [], - randomorder => [], - randompick => [], - ); - %curr_groups = &Apache::longroup::coursegroups(); + my ($to_show,$output); + &Apache::loncommon::start_data_table_count(); #setup a row counter foreach my $res (@LONCAPA::map::order) { my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); @@ -3248,121 +1899,36 @@ sub editor { $url=&LONCAPA::map::qtescape($url); unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $idx++; next; } - push(@allidx,$res); - if ($url =~ m{/uploaded/.+\.(page|sequence)$}) { - push(@allmapidx,$res); - } - $output .= &entryline($idx,$name,$url,$folder,$allowed,$res, - $coursenum,$coursedom,$crstype, - $pathitem,$supplementalflag,$container, - \%filters,\%curr_groups,$canedit, - $isencrypted,$navmapref,$hostname); + $coursenum,$crstype); $idx++; $shown++; } &Apache::loncommon::end_data_table_count(); - - my $need_save; - if ($allowed || ($supplementalflag && $folder eq 'supplemental')) { - my $toolslink; + + if ($shown) { + $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll') + .&Apache::loncommon::start_data_table(undef,'contentlist'); if ($allowed) { - $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 colspan="2">'.&mt('Actions').'</th>' - .'<th>'.&mt('Document').'</th>'; - if ($folder !~ /^supplemental/) { - $to_show .= '<th colspan="4">'.&mt('Settings').'</th>'; - } - $to_show .= &Apache::loncommon::end_data_table_header_row(); - if ($folder !~ /^supplemental/) { - $lists{'canhide'} = join(',',@allidx); - $lists{'canrandomlyorder'} = join(',',@allmapidx); - my @possfilters = ('canremove','cancut','cancopy','hiddenresource','encrypturl', - 'randomorder','randompick'); - foreach my $item (@possfilters) { - if (ref($filters{$item}) eq 'ARRAY') { - if (@{$filters{$item}} > 0) { - $lists{$item} = join(',',@{$filters{$item}}); - } - } - } - if (@allidx > 0) { - my $path; - if ($env{'form.folderpath'}) { - $path = - &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); - } - if (@allidx > 1) { - $to_show .= - &Apache::loncommon::continue_data_table_row(). - '<td colspan="2"> </td>'. - '<td>'. - &multiple_check_form('actions',\%lists,$canedit). - '</td>'. - '<td> </td>'. - '<td> </td>'. - '<td colspan="4">'. - &multiple_check_form('settings',\%lists,$canedit). - '</td>'. - &Apache::loncommon::end_data_table_row(); - $need_save = 1; - } - } - } - $to_show .= $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; - } - my $noresmsg; - if ($allowed && $hiddentop && !$supplementalflag) { - $noresmsg = &mt('Main Content Hidden'); - } else { - $noresmsg = &mt('Currently empty'); + $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">' - .$noresmsg - .'</div>' - .&Apache::loncommon::end_scrollbox(); + $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 { - 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 empty') - .'</div>' - } + $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) { @@ -3370,114 +1936,31 @@ sub editor { } if ($allowed) { my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; - $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath, - $jumpto,$readfile,$need_save,"$folder.$container",$canedit)); - if ($canedit) { - &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum); - } + $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, + $readfile)); + &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum); } 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; } -sub multiple_check_form { - my ($caller,$listsref,$canedit) = @_; - return unless (ref($listsref) eq 'HASH'); - my $disabled; - unless ($canedit) { - $disabled = 'disabled="disabled"'; - } - my $output = - '<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'. - '<span class="LC_nobreak" style="font-size:x-small;font-weight:bold;">'. - '<label><input type="radio" name="showmultpick" value="0" onclick="javascript:togglePick('."'$caller','0'".');" checked="checked" />'.&mt('one').'</label>'.(' 'x2).'<label><input type="radio" name="showmultpick" value="1" onclick="javascript:togglePick('."'$caller','1'".');" />'.&mt('multiple').'</label></span><span id="more'.$caller.'" class="LC_nobreak LC_docs_ext_edit"></span></form>'. - '<div id="multi'.$caller.'" style="display:none;margin:0;padding:0;border:0">'. - '<form action="/adm/coursedocs" method="post" name="cumulative'.$caller.'">'."\n". - '<fieldset id="allfields'.$caller.'" style="display:none"><legend style="font-size:x-small;">'.&mt('check/uncheck all').'</legend>'."\n"; - if ($caller eq 'settings') { - $output .= - '<table><tr>'. - '<td class="LC_docs_entry_parameter">'. - '<span class="LC_nobreak"><label>'. - '<input type="checkbox" name="hiddenresourceall" id="hiddenresourceall" onclick="propagateState(this.form,'."'hiddenresource'".')"'.$disabled.' />'.&mt('Hidden'). - '</label></span></td>'. - '<td class="LC_docs_entry_parameter">'. - '<span class="LC_nobreak"><label><input type="checkbox" name="randompickall" id="randompickall" onclick="updatePick(this.form,'."'all','check'".');propagateState(this.form,'."'randompick'".');propagateState(this.form,'."'rpicknum'".');"'.$disabled.' />'.&mt('Randomly Pick').'</label><span id="rpicktextall"></span><input type="hidden" name="rpicknumall" id="rpicknumall" value="" />'. - '</span></td>'. - '</tr>'."\n". - '<tr>'. - '<td class="LC_docs_entry_parameter">'. - '<span class="LC_nobreak"><label><input type="checkbox" name="encrypturlall" id="encrypturlall" onclick="propagateState(this.form,'."'encrypturl'".')"'.$disabled.' />'.&mt('URL hidden').'</label></span></td><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><label><input type="checkbox" name="randomorderall" id="randomorderall" onclick="propagateState(this.form,'."'randomorder'".')"'.$disabled.' />'.&mt('Random Order'). - '</label></span>'. - '</td></tr></table>'."\n"; - } else { - $output .= - '<table><tr>'. - '<td class="LC_docs_entry_parameter">'. - '<span class="LC_nobreak LC_docs_remove">'. - '<label><input type="checkbox" name="removeall" id="removeall" onclick="propagateState(this.form,'."'remove'".')"'.$disabled.' />'.&mt('Remove'). - '</label></span></td>'. - '<td class="LC_docs_entry_parameter">'. - '<span class="LC_nobreak LC_docs_cut">'. - '<label><input type="checkbox" name="cut" id="cutall" onclick="propagateState(this.form,'."'cut'".');"'.$disabled.' />'.&mt('Cut'). - '</label></span></td>'."\n". - '<td class="LC_docs_entry_parameter">'. - '<span class="LC_nobreak LC_docs_copy">'. - '<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')"'.$disabled.' />'.&mt('Copy'). - '</label></span></td>'. - '</tr></table>'."\n"; - } - $output .= - '</fieldset>'. - '<input type="hidden" name="allidx" value="'.$listsref->{'canhide'}.'" />'; - if ($caller eq 'settings') { - $output .= - '<input type="hidden" name="allmapidx" value="'.$listsref->{'canrandomlyorder'}.'" />'."\n". - '<input type="hidden" name="currhiddenresource" value="'.$listsref->{'hiddenresource'}.'" />'."\n". - '<input type="hidden" name="currencrypturl" value="'.$listsref->{'encrypturl'}.'" />'."\n". - '<input type="hidden" name="currrandomorder" value="'.$listsref->{'randomorder'}.'" />'."\n". - '<input type="hidden" name="currrandompick" value="'.$listsref->{'randompick'}.'" />'."\n"; - } elsif ($caller eq 'actions') { - $output .= - '<input type="hidden" name="allremoveidx" id="allremoveidx" value="'.$listsref->{'canremove'}.'" />'. - '<input type="hidden" name="allcutidx" id="allcutidx" value="'.$listsref->{'cancut'}.'" />'. - '<input type="hidden" name="allcopyidx" id="allcopyidx" value="'.$listsref->{'cancopy'}.'" />'; - } - $output .= - '</form>'. - '</div>'; - return $output; -} - sub process_file_upload { - my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd,$crstype) = @_; + my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_; # upload a file, if present - my $filesize = length($env{'form.uploaddoc'}); - if (!$filesize) { - $$upload_output = '<div class="LC_error">'. - &mt('Unable to upload [_1]. (size = [_2] bytes)', - '<span class="LC_filename">'.$env{'form.uploaddoc.filename'}.'</span>', - $filesize).'<br />'. - &mt('Either the file you attempted to upload was empty, or your web browser was unable to read its contents.').'<br />'. - '</div>'; - return; - } - my $quotatype = 'unofficial'; - if ($crstype eq 'Community') { - $quotatype = 'community'; - } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.coursecode'}) { - $quotatype = 'official'; - } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.textbook'}) { - $quotatype = 'textbook'; - } - if (&Apache::loncommon::get_user_quota($coursenum,$coursedom,'course',$quotatype)) { - $filesize = int($filesize/1000); #expressed in kb - $$upload_output = &Apache::loncommon::excess_filesize_warning($coursenum,$coursedom,'course', - $env{'form.uploaddoc.filename'},$filesize, - 'upload',$quotatype); - return if ($$upload_output); - } my ($parseaction,$showupload,$nextphase,$mimetype); if ($env{'form.parserflag'}) { $parseaction = 'parse'; @@ -3490,15 +1973,19 @@ 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)= - &mapread($coursenum,$coursedom,$folder.'.'.$container); + &mapread($coursenum,$coursedom,$folder.'.'.$container); if ($#LONCAPA::map::order<1) { $LONCAPA::map::order[0]=1; $LONCAPA::map::resources[1]=''; } + if ($fatal) { + $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>'; + return; + } my $destination = 'docs/'; if ($folder =~ /^supplemental/) { $destination = 'supplemental/'; @@ -3508,10 +1995,6 @@ sub process_file_upload { } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { $destination .= $2.'/'; } - if ($fatal) { - $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>'; - return; - } # this is for a course, not a user, so set context to coursedoc. my $newidx=&LONCAPA::map::getresidx(); $destination .= $newidx; @@ -3573,14 +2056,14 @@ sub process_file_upload { $$upload_output .= &mt('No embedded items identified').'<br />'; } $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>'; - } elsif ((&Apache::loncommon::is_archive_file($mimetype)) && - ($env{'form.uploaddoc.filename'} =~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/i)) { + } elsif (&Apache::loncommon::is_archive_file($mimetype)) { $nextphase = 'decompress_uploaded'; my $position = scalar(@LONCAPA::map::order)-1; my $noextract = &return_to_editor(); my $archiveurl = &HTML::Entities::encode($url,'<>&"'); my %archiveitems = ( folderpath => $env{'form.folderpath'}, + pagepath => $env{'form.pagepath'}, cmd => $nextphase, newidx => $newidx, position => $position, @@ -3634,76 +2117,43 @@ sub is_supplemental_title { # --------------------------------------------------------------- An entry line sub entryline { - my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom, - $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups, - $canedit,$isencrypted,$navmapref,$hostname)=@_; - my ($foldertitle,$renametitle,$oldtitle); + 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); + $pagetitle = $foldertitle; } else { $title=&HTML::Entities::encode($title,'"<>&\''); $renametitle=$title; $foldertitle=$title; - } - - my ($disabled,$readonly,$js_lt); - unless ($canedit) { - $disabled = 'disabled="disabled"'; - $readonly = 1; + $pagetitle=$title; } my $orderidx=$LONCAPA::map::order[$index]; + $renametitle=~s/\\/\\\\/g; $renametitle=~s/\"\;/\\\"/g; - $renametitle=~s/"/%22/g; $renametitle=~s/ /%20/g; - $oldtitle = $renametitle; - $renametitle=~s/\'\;/\\\'/g; my $line=&Apache::loncommon::start_data_table_row(); - my ($form_start,$form_end,$form_common,$form_param); + my ($form_start,$form_end,$form_common); # Edit commands - my ($esc_path, $path, $symb); + 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)); - } - } - my ($renamelink,%lt,$ishash); - if (ref($filtersref) eq 'HASH') { - $ishash = 1; + 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 $cpinfo=''; if ($allowed) { - $form_start = ' - <form action="/adm/coursedocs" method="post"> -'; - $form_common=(<<END); - <input type="hidden" name="folderpath" value="$path" /> - <input type="hidden" name="symb" value="$symb" /> -END - $form_param=(<<END); - <input type="hidden" name="setparms" value="$orderidx" /> - <input type="hidden" name="changeparms" value="0" /> -END - $form_end = '</form>'; - my $incindex=$index+1; my $selectbox=''; if (($#LONCAPA::map::order>0) && @@ -3715,7 +2165,7 @@ END ne '')) { $selectbox= '<input type="hidden" name="currentpos" value="'.$incindex.'" />'. - '<select name="newpos" onchange="this.form.submit()"'.$disabled.'>'; + '<select name="newpos" onchange="this.form.submit()">'; for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) { if ($i==$incindex) { $selectbox.='<option value="" selected="selected">('.$i.')</option>'; @@ -3725,154 +2175,108 @@ END } $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', - 'er' => 'Editing rights unavailable for your current role.', - ); - my %denied = &action_restrictions($coursenum,$coursedom,$url, - $env{'form.folderpath'}, - $currgroups); - my ($copylink,$cutlink,$removelink); + 'cp' => 'Copy'); + my $nocopy=0; + my $nocut=0; + if ($url=~ m{^/res/.+\.(page|sequence)$}) { + # no copy for published maps + $nocopy=1; + } + if ($url=~/^\/res\/lib\/templates\//) { + $nocopy=1; + $nocut=1; + } + my $copylink=' '; + my $cutlink=' '; + my $skip_confirm = 0; - my $confirm_removal = 0; if ( $folder =~ /^supplemental/ || ($url =~ m{( /smppg$ |/syllabus$ |/aboutme$ |/navmaps$ |/bulletinboard$ - |\.html$)}x) - || $isexternal) { + |\.html$ + |^/adm/wrapper/ext)}x)) { $skip_confirm = 1; } - if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && - ($url!~/$LONCAPA::assess_page_seq_re/)) { - $confirm_removal = 1; - } - if ($denied{'copy'}) { - $copylink=(<<ENDCOPY) -<span style="visibility: hidden;">$lt{'cp'}</span> -ENDCOPY - } else { - my $formname = 'edit_copy_'.$orderidx; - my $js = "javascript:checkForSubmit(document.forms.renameform,'copy','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');"; + if (!$nocopy) { $copylink=(<<ENDCOPY); -<form name="$formname" method="post" action="/adm/coursedocs"> -$form_common -<input type="checkbox" name="copy" id="copy_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','copy');" class="LC_hidden" $disabled /><a href="$js" class="LC_docs_copy">$lt{'cp'}</a> -$form_end +<a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$symb','$folder');" class="LC_docs_copy">$lt{'cp'}</a> ENDCOPY - if (($ishash) && (ref($filtersref->{'cancopy'}) eq 'ARRAY')) { - push(@{$filtersref->{'cancopy'}},$orderidx); - } } - if ($denied{'cut'}) { - $cutlink=(<<ENDCUT); -<span style="visibility: hidden;">$lt{'ct'}</span> -ENDCUT - } else { - my $formname = 'edit_cut_'.$orderidx; - my $js = "javascript:checkForSubmit(document.forms.renameform,'cut','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');"; + if (!$nocut) { $cutlink=(<<ENDCUT); -<form name="$formname" method="post" action="/adm/coursedocs"> -$form_common -<input type="hidden" name="skip_$orderidx" id="skip_cut_$orderidx" value="$skip_confirm" /> -<input type="checkbox" name="cut" id="cut_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','cut');" class="LC_hidden" $disabled /><a href="$js" class="LC_docs_cut">$lt{'ct'}</a> -$form_end +<a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$symb','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a> ENDCUT - if (($ishash) && (ref($filtersref->{'cancut'}) eq 'ARRAY')) { - push(@{$filtersref->{'cancut'}},$orderidx); - } - } - if ($denied{'remove'}) { - $removelink=(<<ENDREM); -<span style="visibility: hidden;">$lt{'rm'}</a> -ENDREM - } else { - my $formname = 'edit_remove_'.$orderidx; - my $js = "javascript:checkForSubmit(document.forms.renameform,'remove','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder',$confirm_removal);"; - $removelink=(<<ENDREM); -<form name="$formname" method="post" action="/adm/coursedocs"> -$form_common -<input type="hidden" name="skip_$orderidx" id="skip_remove_$orderidx" value="$skip_confirm" /> -<input type="hidden" name="confirm_rem_$orderidx" id="confirm_removal_$orderidx" value="$confirm_removal" /> -<input type="checkbox" name="remove" id="remove_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','remove');" class="LC_hidden" $disabled /><a href="$js" class="LC_docs_remove">$lt{'rm'}</a> -$form_end -ENDREM - if (($ishash) && (ref($filtersref->{'canremove'}) eq 'ARRAY')) { - push(@{$filtersref->{'canremove'}},$orderidx); - } - } - $renamelink=(<<ENDREN); -<a href='javascript:changename("$esc_path","$index","$oldtitle");' class="LC_docs_rename">$lt{'rn'}</a> -ENDREN - my ($uplink,$downlink); - if ($canedit) { - $uplink = "/adm/coursedocs?cmd=up_$index&folderpath=$esc_path&symb=$symb"; - $downlink = "/adm/coursedocs?cmd=down_$index&folderpath=$esc_path&symb=$symb"; - } else { - $uplink = "javascript:alert('".&js_escape($lt{'er'})."');"; - $downlink = $uplink; } + $form_start = ' + <form action="/adm/coursedocs" method="post"> +'; + $form_common=(<<END); + <input type="hidden" name="${type}path" value="$path" /> + <input type="hidden" name="${type}symb" value="$symb" /> + <input type="hidden" name="setparms" value="$orderidx" /> + <input type="hidden" name="changeparms" value="0" /> +END + $form_end = '</form>'; $line.=(<<END); <td> <div class="LC_docs_entry_move"> - <a href="$uplink"> - <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="$downlink"> - <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> <td> $form_start - $form_param $form_common $selectbox $form_end </td> -<td class="LC_docs_entry_commands 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 </td> END + } # Figure out what kind of a resource this is my ($extension)=($url=~/\.(\w+)$/); my $uploaded=($url=~/^\/*uploaded\//); my $icon=&Apache::loncommon::icon($url); - my $isfolder; - my $ispage; - my $containerarg; - my $folderurl; + 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; } - $folderurl = &Apache::lonnet::declutter($url); if ($allowed) { $url='/adm/coursedocs?'; } else { @@ -3883,351 +2287,152 @@ END } } - my ($editlink,$extresform,$anchor,$hiddenres,$nomodal); my $orig_url = $url; $orig_url=~s{http(:|:)//https(:|:)//}{https$2//}; - if ($container eq 'page') { - $url=~s{^http(|s)(:|:)//}{/ext/}; - } else { - $url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/}; - } - if (!$supplementalflag && $residx && $symb) { - if ((!$isfolder) && (!$ispage)) { - (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); - if (($url =~ m{^ext/}) && ($container eq 'page')) { - $url=&Apache::lonnet::clutter_with_no_wrapper($url); - } else { - $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{^(|/adm/wrapper)/ext/([^#]+)}) { - my $wrapped = $1; - my $exturl = $2; - if (($wrapped eq '') && ($container ne 'page')) { - $url='/adm/wrapper'.$url; - } - if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) { - $nomodal = 1; - } - } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") { - if (($ENV{'SERVER_PORT'} == 443) && - ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { - unless (&Apache::lonnet::uses_sts()) { - $url .= '?usehttp=1'; - } - $nomodal = 1; - } + 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; } - if (&Apache::lonnet::symbverify($symb,$url)) { - my $shownsymb = $symb; - if ($isexternal) { - if ($url =~ /^([^#]+)#([^#]+)$/) { - $url = $1; - $anchor = $2; - my $escan = &escape('#'); - $shownsymb =~ s/^([^\#]+)#([^\#]+)$/$1$escan$2/; - } - if ($container eq 'page') { - $url = &Apache::lonnet::clutter($url); - } - } - unless ($env{'request.role.adv'}) { - if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { - $url = ''; - } - if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) { - $url = ''; - $hiddenres = 1; - } - } - if ($url ne '') { - $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb); - } - } elsif (!$env{'request.role.adv'}) { - my $checkencrypt; - if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) || - $isencrypted || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) { - $checkencrypt = 1; - } elsif (ref($navmapref)) { - unless (ref($$navmapref)) { - $$navmapref = Apache::lonnavmaps::navmap->new(); - } - if (ref($$navmapref)) { - if (lc($$navmapref->get_mapparam($symb,undef,"0.encrypturl")) eq 'yes') { - $checkencrypt = 1; - } - } - } - if ($checkencrypt) { - my $shownsymb = &Apache::lonenc::encrypted($symb); - my $shownurl = &Apache::lonenc::encrypted($url); - if (&Apache::lonnet::symbverify($shownsymb,$shownurl)) { - $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb); - if ($env{'request.enc'} ne '') { - delete($env{'request.enc'}); - } - } else { - $url=''; - } - } else { - $url=''; - } - } else { - $url=''; - } + } elsif ($url=~m|^/ext/|) { + $url='/adm/wrapper'.$url; + $external = 1; } - } elsif ($supplementalflag) { - if ($isexternal) { - if ($url =~ /^([^#]+)#([^#]+)$/) { - $url = $1; - $anchor = $2; - if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) { - unless (&Apache::lonnet::uses_sts()) { - if ($hostname ne '') { - $url = 'http://'.$hostname.$url; - } - $url .= (($url =~ /\?/) ? '&':'?').'usehttp=1'; - } - $nomodal = 1; - } - } - } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) { - if (($ENV{'SERVER_PORT'} == 443) && - ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { - unless (&Apache::lonnet::uses_sts()) { - if ($hostname ne '') { - $url = 'http://'.$hostname.$url; - } - $url .= (($url =~ /\?/) ? '&':'?').'usehttp=1'; - } - $nomodal = 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,$hiddenfolder); - my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; - if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') { + my ($rand_pick_text,$rand_order_text); + 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 { - my $rpicknum = (&LONCAPA::map::getparameter($orderidx, - 'parameter_randompick'))[0]; - my $randorder = ((&LONCAPA::map::getparameter($orderidx, - 'parameter_randomorder'))[0]=~/^yes$/i); - my $hiddenmap = ((&LONCAPA::map::getparameter($orderidx, - 'parameter_hiddenresource'))[0]=~/^yes$/i); - my $encryptmap = ((&LONCAPA::map::getparameter($orderidx, - 'parameter_encrypturl'))[0]=~/^yes$/i); - unless ($hiddenmap) { - if (ref($navmapref)) { - unless (ref($$navmapref)) { - $$navmapref = Apache::lonnavmaps::navmap->new(); - } - if (ref($$navmapref)) { - if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') { - my @resources = $$navmapref->retrieveResources($folderurl,$filterFunc,1,1); - unless (@resources) { - $hiddenmap = 1; - unless ($env{'request.role.adv'}) { - $url = ''; - $hiddenfolder = 1; - } - } - } - } - } - } - unless ($encryptmap) { - if ((ref($navmapref)) && (ref($$navmapref))) { - if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.encrypturl")) eq 'yes') { - $encryptmap = 1; - } - } - } - # Append randompick number, hidden, and encrypted with ":" to foldername, # so it gets transferred between levels - $folderpath.=$containerarg.'&'.$foldername. - ':'.$rpicknum.':'.$hiddenmap.':'.$encryptmap.':'.$randorder.':'.$ispage; - unless ($url eq '') { - $url.='folderpath='.&escape($folderpath); - } - my $rpckchk; - if ($rpicknum) { - $rpckchk = ' checked="checked"'; - if (($ishash) && (ref($filtersref->{'randompick'}) eq 'ARRAY')) { - push(@{$filtersref->{'randompick'}},$orderidx.':'.$rpicknum); - } - } - my $formname = 'edit_randompick_'.$orderidx; - $rand_pick_text = -'<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n". -$form_param."\n". -$form_common."\n". -'<span class="LC_nobreak"><label><input type="checkbox" name="randompick_'.$orderidx.'" id="randompick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.$disabled.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="rpicknum_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" /><span id="randompicknum_'.$orderidx.'">'; - if ($rpicknum ne '') { - $rand_pick_text .= ': <a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>'; - } - $rand_pick_text .= '</span></span>'. - $form_end; - my $ro_set; - if ($randorder) { - $ro_set = 'checked="checked"'; - if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) { - push(@{$filtersref->{'randomorder'}},$orderidx); - } - } - $formname = 'edit_rorder_'.$orderidx; - $rand_order_text = + $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); + $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_param."\n". $form_common."\n". -'<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.$disabled.' /> '.&mt('Random Order').' </label></span>'. -$form_end; - } - } 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; - } - if ($anchor ne '') { - $url .= '&anchor='.&HTML::Entities::encode($anchor,'"<>&'); - } +'<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 = +$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>'; + } + 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; } - 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, - undef,undef,undef,$disabled); - } 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 $suppanchor; - if ($supplementalflag) { - $suppanchor = $anchor; - } - my $jscall = - &Apache::lonhtmlcommon::jump_to_editres($cfile,$home, - $switchserver, - $forceedit, - undef,$symb, - &escape($env{'form.folderpath'}), - $renametitle,$hostname, - '','',1,$suppanchor); - 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 (($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; - my $link; + } + $line.='<td>'; if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>'; } elsif ($url) { - if ($anchor ne '') { - if ($supplementalflag) { - $anchor = '&anchor='.&HTML::Entities::encode($anchor,'"<>&'); - } else { - $anchor = '#'.&HTML::Entities::encode($anchor,'"<>&'); - } - } - - if ((!$supplementalflag) && ($nomodal) && ($hostname ne '')) { - $link = 'http://'.$hostname.$url; - } else { - $link = $url; - } - $link = &js_escape($link.(($url=~/\?/)?'&':'?').'inhibitmenu=yes'.$anchor); - if ($nomodal) { - $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'. - '<img src="'.$icon.'" alt="" class="LC_icon" border="0" /></a>'; - } else { - $line.=&Apache::loncommon::modal_link($link, - '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500); - } + $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', + '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500); } 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) { - if ($nomodal) { - $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'. - $title.'</a>'; - } else { - $line.=&Apache::loncommon::modal_link($link,$title,600,500); - } - } elsif (($hiddenfolder) || ($hiddenres)) { - $line.=$title.' <span class="LC_warning LC_docs_reinit_warn">('.&mt('Hidden').')</span>'; + $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', + $title,600,500); } 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/)) { my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', 'ec' => 'URL hidden'); - my ($enctext,$hidtext); - if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) { - $enctext = ' checked="checked"'; - if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) { - push(@{$filtersref->{'encrypturl'}},$orderidx); - } - } - if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) { - $hidtext = ' checked="checked"'; - if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) { - push(@{$filtersref->{'hiddenresource'}},$orderidx); - } - } - my $formhidden = 'edit_hiddenresource_'.$orderidx; - my $formurlhidden = 'edit_encrypturl_'.$orderidx; + my $enctext= + ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':''); + my $hidtext= + ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':''); $line.=(<<ENDPARMS); <td class="LC_docs_entry_parameter"> - <form action="/adm/coursedocs" method="post" name="$formhidden"> - $form_param + $form_start $form_common - <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext $disabled /> $lt{'hd'}</label> + <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label> $form_end <br /> - <form action="/adm/coursedocs" method="post" name="$formurlhidden"> - $form_param + $form_start $form_common - <label><input type="checkbox" name="encrypturl_$orderidx" id="encrypturl_$orderidx" onclick="checkForSubmit(this.form,'encrypturl','settings');" $enctext $disabled /> $lt{'ec'}</label> + <label><input type="checkbox" name="encrypturl_$orderidx" onclick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label> $form_end </td> <td class="LC_docs_entry_parameter">$rand_pick_text<br /> @@ -4238,139 +2443,6 @@ ENDPARMS return $line; } -sub action_restrictions { - my ($cnum,$cdom,$url,$folderpath,$currgroups) = @_; - my %denied = ( - cut => 0, - copy => 0, - remove => 0, - ); - if ($url=~ m{^/res/.+\.(page|sequence)$}) { - # no copy for published maps - $denied{'copy'} = 1; - } elsif ($url=~m{^/res/lib/templates/([^/]+)\.problem$}) { - unless ($1 eq 'simpleproblem') { - $denied{'copy'} = 1; - } - $denied{'cut'} = 1; - } elsif ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") { - if ($folderpath =~ /^default&[^\&]+$/) { - if ((ref($currgroups) eq 'HASH') && (keys(%{$currgroups}) > 0)) { - $denied{'remove'} = 1; - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } - } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) { - my $group = $1; - if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) { - if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) { - $denied{'remove'} = 1; - } - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) { - my $group = $1; - if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) { - if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) { - my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group}); - if (keys(%groupsettings) > 0) { - $denied{'remove'} = 1; - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } - } - } elsif ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) { - my $group = $1; - if ($url =~ /group_boards_\Q$group\E/) { - if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) { - my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group}); - if (keys(%groupsettings) > 0) { - if (ref($groupsettings{'functions'}) eq 'HASH') { - if ($groupsettings{'functions'}{'discussion'} eq 'on') { - $denied{'remove'} = 1; - } - } - } - $denied{'cut'} = 1; - $denied{'copy'} = 1; - } - } - } - return %denied; -} - -sub new_timebased_suffix { - my ($dom,$num,$type,$area,$container) = @_; - my ($prefix,$namespace,$idtype,$errtext,$locknotfreed); - if ($type eq 'paste') { - $prefix = $type; - $namespace = 'courseeditor'; - $idtype = 'addcode'; - } elsif ($type eq 'map') { - $prefix = 'docs'; - if ($area eq 'supplemental') { - $prefix = 'supp'; - } - $prefix .= $container; - $namespace = 'uploadedmaps'; - } else { - $prefix = $type; - $namespace = 'templated'; - } - my ($suffix,$freedlock,$error) = - &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num,$idtype); - if (!$suffix) { - if ($type eq 'paste') { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix when adding to the paste buffer.'); - } elsif ($type eq 'map') { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.'); - } elsif ($type eq 'smppg') { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.'); - } else { - $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new discussion board.'); - } - if ($error) { - $errtext .= '<br />'.$error; - } - } - if ($freedlock ne 'ok') { - $locknotfreed = - '<div class="LC_error">'. - &mt('There was a problem removing a lockfile.').' '; - if ($type eq 'paste') { - if ($freedlock eq 'nolock') { - $locknotfreed = - '<div class="LC_error">'. - &mt('A lockfile was not released when you added content to the clipboard earlier in this session.').' '. - - &mt('As a result addition of items to the clipboard will be unavailable until your next log-in.'); - } else { - $locknotfreed .= - &mt('This will prevent addition of items to the clipboard until your next log-in.'); - } - } elsif ($type eq 'map') { - $locknotfreed .= - &mt('This will prevent creation of additional folders or composite pages in this course.'); - } elsif ($type eq 'smppg') { - $locknotfreed .= - &mt('This will prevent creation of additional simple pages in this course.'); - } else { - $locknotfreed .= - &mt('This will prevent creation of additional discussion boards in this course.'); - } - unless ($type eq 'paste') { - $locknotfreed .= - ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.', - '<a href="/adm/helpdesk" target="_helpdesk">','</a>'); - } - $locknotfreed .= '</div>'; - } - return ($suffix,$errtext,$locknotfreed); -} - =pod =item tiehash() @@ -4407,7 +2479,7 @@ sub untiehash { sub checkonthis { - my ($r,$url,$level,$title,$checkstale)=@_; + my ($r,$url,$level,$title)=@_; $url=&unescape($url); $alreadyseen{$url}=1; $r->rflush(); @@ -4422,22 +2494,10 @@ sub checkonthis { $r->print('<a href="'.$url.'" target="cat">'. ($title?$title:$url).'</a> '); if ($url=~/^\/res\//) { - my $updated; - if (($checkstale) && ($url !~ m{^/res/lib/templates/}) && - ($url !~ /\.\d+\.\w+$/)) { - $updated = &Apache::lonnet::remove_stale_resfile($url); - } my $result=&Apache::lonnet::repcopy( &Apache::lonnet::filelocation('',$url)); if ($result eq 'ok') { $r->print('<span class="LC_success">'.&mt('ok').'</span>'); - if ($updated) { - $r->print('<br />'); - for (my $i=0;$i<=$level*5;$i++) { - $r->print(' '); - } - $r->print('- '.&mt('Outdated copy removed')); - } $r->rflush(); &Apache::lonnet::countacc($url); $url=~/\.(\w+)$/; @@ -4471,23 +2531,20 @@ sub checkonthis { &Apache::lonnet::metadata($url,'dependencies'); foreach my $dep (split(/\,/,$dependencies)) { if (($dep=~/^\/res\//) && (!$alreadyseen{$dep})) { - &checkonthis($r,$dep,$level+1,'',$checkstale); + &checkonthis($r,$dep,$level+1); } } } elsif ($result eq 'unavailable') { $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>'); } } else { $r->print('<span class="LC_error">'.&mt('access denied').'</span>'); } - if (($updated) && ($result ne 'ok')) { - $r->print('<br />'.&mt('Outdated copy removed')); - } } } } @@ -4527,7 +2584,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) { @@ -4537,35 +2594,14 @@ sub list_symbs { } $r->print(&Apache::loncommon::end_data_table()); } - $r->print(&endContentScreen()); } -sub contentverifyform { - my ($r) = @_; - my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content')); - $r->print(&startContentScreen('tools')); - $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>'); - $r->print('<form method="post" action="/adm/coursedocs"><p>'. - &mt('Include a check if files copied from elsewhere are up to date (will increase verification time)?'). - ' <span class="LC_nobreak">'. - '<label><input type="radio" name="checkstale" value="0" checked="checked" />'. - &mt('No').'</label>'.(' 'x2). - '<label><input type="radio" name="checkstale" value="1" />'. - &mt('Yes').'</label></span></p><p>'. - '<input type="submit" value="'.&mt('Verify content').' "/>'. - '<input type="hidden" value="1" name="tools" />'. - '<input type="hidden" value="1" name="verify" /></p></form>'); - $r->print(&endContentScreen()); - return; -} sub verifycontent { - my ($r,$checkstale) = @_; + my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content')); + $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); $r->print(&startContentScreen('tools')); $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>'); $hashtied=0; @@ -4583,12 +2619,11 @@ sub verifycontent { } } if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) { - &checkonthis($r,$hash{$key},0,$hash{'title_'.$1},$checkstale); + &checkonthis($r,$hash{$key},0,$hash{'title_'.$1}); } } &untiehash(); $r->print('<p class="LC_success">'.&mt('Done').'</p>'); - $r->print(&endContentScreen()); } @@ -4599,10 +2634,10 @@ sub devalidateversioncache { } sub checkversions { - my ($r,$canedit) = @_; + my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page("Check $crstype Resource Versions")); - $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Resource Versions")); + $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions")); + $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions")); $r->print(&startContentScreen('tools')); my $header=''; @@ -4620,57 +2655,55 @@ sub checkversions { $hashtied=0; &tiehash(); - if ($canedit) { - my %newsetversions=(); - if ($env{'form.setmostrecent'}) { - $haschanged=1; - foreach my $key (keys(%hash)) { - if ($key=~/^ids\_(\/res\/.+)$/) { - $newsetversions{$1}='mostrecent'; - &devalidateversioncache($1); - } - } - } elsif ($env{'form.setcurrent'}) { - $haschanged=1; - foreach my $key (keys(%hash)) { - if ($key=~/^ids\_(\/res\/.+)$/) { - my $getvers=&Apache::lonnet::getversion($1); - if ($getvers>0) { - $newsetversions{$1}=$getvers; - &devalidateversioncache($1); - } - } + my %newsetversions=(); + if ($env{'form.setmostrecent'}) { + $haschanged=1; + foreach my $key (keys(%hash)) { + if ($key=~/^ids\_(\/res\/.+)$/) { + $newsetversions{$1}='mostrecent'; + &devalidateversioncache($1); } - } elsif ($env{'form.setversions'}) { - $haschanged=1; - foreach my $key (keys(%env)) { - if ($key=~/^form\.set_version_(.+)$/) { - my $src=$1; - if (($env{$key}) && ($env{$key} ne $setversions{$src})) { - $newsetversions{$src}=$env{$key}; - &devalidateversioncache($src); - } - } + } + } elsif ($env{'form.setcurrent'}) { + $haschanged=1; + foreach my $key (keys(%hash)) { + if ($key=~/^ids\_(\/res\/.+)$/) { + my $getvers=&Apache::lonnet::getversion($1); + if ($getvers>0) { + $newsetversions{$1}=$getvers; + &devalidateversioncache($1); + } } - } - if ($haschanged) { - if (&Apache::lonnet::put('resourceversions',\%newsetversions, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { - $r->print(&Apache::loncommon::confirmwrapper( - &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved')))); - } else { - $r->print(&Apache::loncommon::confirmwrapper( - &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1))); + } + } elsif ($env{'form.setversions'}) { + $haschanged=1; + foreach my $key (keys(%env)) { + if ($key=~/^form\.set_version_(.+)$/) { + my $src=$1; + if (($env{$key}) && ($env{$key} ne $setversions{$src})) { + $newsetversions{$src}=$env{$key}; + &devalidateversioncache($src); + } } - &mark_hash_old(); - } - &changewarning($r,''); + } } + if ($haschanged) { + if (&Apache::lonnet::put('resourceversions',\%newsetversions, + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { + $r->print(&Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved')))); + } else { + $r->print(&Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1))); + } + &mark_hash_old(); + } + &changewarning($r,''); if ($env{'form.timerange'} eq 'all') { # show all documents - $header=&mt('All content in '.$crstype); - $allsel=' selected="selected"'; + $header=&mt('All Documents in '.$crstype); + $allsel=1; foreach my $key (keys(%hash)) { if ($key=~/^ids\_(\/res\/.+)$/) { my $src=$1; @@ -4691,19 +2724,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 { @@ -4733,11 +2766,6 @@ sub checkversions { 'save' => 'Save changes', 'vers' => 'Version choice(s) for specific resources', 'act' => 'Actions'); - my ($disabled,$readonly); - unless ($canedit) { - $disabled = 'disabled="disabled"'; - $readonly = 1; - } $r->print(<<ENDHEADERS); <h4 class="LC_info">$header</h4> <form action="/adm/coursedocs" method="post"> @@ -4746,11 +2774,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> @@ -4758,122 +2786,119 @@ sub checkversions { <div class="LC_left_float"> <fieldset> <legend>$lt{'act'}</legend> -$lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" $disabled /><br /> -$lt{'sc'}: <input type="submit" name="setcurrent" value="Go" $disabled /> +$lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" /><br /> +$lt{'sc'}: <input type="submit" name="setcurrent" value="Go" /> </fieldset> </div> <br clear="all" /> <hr /> <h4>$lt{'vers'}</h4> +<input type="submit" name="setversions" value="$lt{'save'}" /> +<table border="0"> ENDHEADERS #number of columns for version history - my %changedbytime; - foreach my $key (keys(%changes)) { - #excludes not versionable problems from resource version history: - next if ($key =~ /^\/res\/lib\/templates/); - my $chg; - if ($env{'form.timerange'} eq 'all') { - my ($root,$extension)=($key=~/^(.*)\.(\w+)$/); - $chg = &Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate'); - } else { - $chg = $changes{$key}; - next if ($chg < $starttime); - } - push(@{$changedbytime{$chg}},$key); - } - if (keys(%changedbytime) == 0) { - &untiehash(); - $r->print(&mt('No content changes in imported content in specified time frame'). - &endContentScreen()); - return; - } + my $num_ver_col = 1; $r->print( - '<input type="submit" name="setversions" value="'.$lt{'save'}.'"'.$disabled.' />'. - &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() - ); - foreach my $chg (sort {$b <=> $a } keys(%changedbytime)) { - foreach my $key (sort(@{$changedbytime{$chg}})) { - my ($root,$extension)=($key=~/^(.*)\.(\w+)$/); - my $currentversion=&Apache::lonnet::getversion($key); - if ($currentversion<0) { + &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: + if ($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); - $r->print( - &Apache::loncommon::start_data_table_row(). - '<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 />('. - &Apache::lonlocal::locallocaltime($chg).')</span></td>'. - '<td align="right">' - ); - # Used in course - my $usedversion=$hash{'version_'.$linkurl}; - if (($usedversion) && ($usedversion ne 'mostrecent')) { - if ($usedversion != $currentversion) { + } + 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>'. + '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'. + '<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){ $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)},'',$readonly)); - 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 + 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 [_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 $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++; + } } - $r->print('</span><br />'); + } + while($cols_output++ < $num_ver_col) { + $r->print('</span></td><td>'); } - $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'}.'"'.$disabled.' />'. - '</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()); - return; } sub mark_hash_old { @@ -4905,6 +2930,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(); @@ -4928,13 +2958,13 @@ $help{'Caching'}.'</p></form>'."\n\n"); sub init_breadcrumbs { - my ($form,$text,$help)=@_; + my ($form,$text)=@_; &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1", text=>&Apache::loncommon::course_type().' Editor', faq=>273, bug=>'Instructor Interface', - help => $help}); + help => 'Docs_Adding_Course_Doc'}); &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1', text=>$text, faq=>273, @@ -4945,9 +2975,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; @@ -4970,9 +3000,10 @@ 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('Main Content Editor').' </b></a></li>'."\n"; + $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b> '.&mt('Content Editor').' </b></a></li>'."\n"; $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n"; $output .= '<li '.(($mode eq 'tools')?' class="active"':'').'><a href="/adm/coursedocs?tools=1"><b> '.&mt('Content Utilities').' </b></a></li>'."\n"; '><a href="/adm/coursedocs?tools=1"><b> '.&mt('Content Utilities').' </b></a></li>'; @@ -4993,7 +3024,7 @@ sub endContentScreen { } sub supplemental_base { - return 'supplemental&'.&escape(&mt('Supplemental Content')); + return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content')); } sub handler { @@ -5016,9 +3047,8 @@ 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','Course_Roster','Web_Page', - 'Dropbox','Simple_Problem') { + 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive', + 'Check_Resource_Versions','Verify_Content') { $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic); } # Composite help files @@ -5026,49 +3056,31 @@ sub handler { 'Docs_About_Syllabus,Docs_Editing_Templated_Pages'); $help{'Simple Page'} = &Apache::loncommon::help_open_topic( 'Docs_About_Simple_Page,Docs_Editing_Templated_Pages'); + $help{'Simple Problem'} = &Apache::loncommon::help_open_topic( + 'Option_Response_Simple'); $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic( 'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages'); $help{'My Personal Information Page'} = &Apache::loncommon::help_open_topic( 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages'); $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files'); $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching'); - - my ($allowed,$canedit,$canview,$disabled); + + + my $allowed; # URI is /adm/supplemental when viewing supplemental docs in non-edit mode. unless ($r->uri eq '/adm/supplemental') { # does this user have privileges to modify content. - if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { - $allowed = 1; - $canedit = 1; - $canview = 1; - } elsif (&Apache::lonnet::allowed('cev',$env{'request.course.id'})) { - $allowed = 1; - $canview = 1; - } - } - unless ($canedit) { - $disabled = ' disabled="disabled"'; - } - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']); - if ($env{'form.inhibitmenu'}) { - unless ($env{'form.inhibitmenu'} eq 'yes') { - delete($env{'form.inhibitmenu'}); - } + $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'}); } - if ($allowed && $env{'form.verify'}) { - &init_breadcrumbs('verify','Verify Content','Docs_Verify_Content'); - if (!$canedit) { - &verifycontent($r); - } elsif (($env{'form.checkstale'} ne '') && ($env{'form.checkstale'} =~ /^\d$/)) { - &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1&verify=1&checkstale=$env{'form.checkstale'}", - text=>'Results', - faq=>273, - bug=>'Instructor Interface'}); - &verifycontent($r,$env{'form.checkstale'}); - } else { - &contentverifyform($r); - } + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver', + 'inhibitmenu']); + if ($allowed && $env{'form.chooseserver'}) { + &choose_dump_server($r); + return OK; + } elsif ($allowed && $env{'form.verify'}) { + &init_breadcrumbs('verify','Verify Content'); + &verifycontent($r); } elsif ($allowed && $env{'form.listsymbs'}) { &init_breadcrumbs('listsymbs','List Content IDs'); &list_symbs($r); @@ -5078,12 +3090,12 @@ sub handler { if ($folder eq '') { $folder='default'; } - &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit); + &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath); } elsif ($allowed && $env{'form.versions'}) { - &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions'); - &checkversions($r,$canedit); - } elsif ($canedit && $env{'form.dumpcourse'}) { - &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space'); + &init_breadcrumbs('versions','Check/Set Resource Versions'); + &checkversions($r); + } elsif ($allowed && $env{'form.dumpcourse'}) { + &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space'); &dumpcourse($r); } elsif ($allowed && $env{'form.exportcourse'}) { &init_breadcrumbs('exportcourse','IMS Export'); @@ -5095,29 +3107,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']); - - foreach my $item ('forcesupplement','forcestandard','tools') { - next if ($env{'form.'.$item} eq ''); - unless ($env{'form.'.$item} eq '1') { - delete($env{'form.'.$item}); - } - } - - if ($env{'form.command'}) { - unless ($env{'form.command'} =~ /^(direct|directnav|editdocs|editsupp|contents|home)$/) { - delete($env{'form.command'}); - } - } - - if ($env{'form.symb'}) { - my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'}); - unless (($id =~ /^\d+$/) && (&Apache::lonnet::is_on_map($resurl))) { - delete($env{'form.symb'}); - } - } + ['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 @@ -5129,9 +3121,9 @@ sub handler { # supplementalflag=0: show standard documents # toolsflag=1: show utilities - my $unesc_folderpath = &unescape($env{'form.folderpath'}); - my $supplementalflag=($unesc_folderpath=~/^supplemental/); - if (($unesc_folderpath=~/^default/) || ($unesc_folderpath eq "")) { + + my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); + if (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'} eq "" || ($env{'form.pagepath'})) { $supplementalflag=0; } if ($env{'form.forcesupplement'}) { $supplementalflag=1; } @@ -5141,183 +3133,167 @@ sub handler { my $toolsflag=0; if ($env{'form.tools'}) { $toolsflag=1; } - if ($env{'form.folderpath'} ne '') { - my @items = split(/\&/,$env{'form.folderpath'}); - my $badpath; - for (my $i=0; $i<@items; $i++) { - my $odd = $i%2; - if (($odd) && (!$supplementalflag) && ($items[$i] !~ /^[^:]*:(|\d+):(|1):(|1):(|1):(|1)$/)) { - $badpath = 1; - } elsif ((!$odd) && ($items[$i] !~ /^(default|supplemental)(|_\d+)$/)) { - $badpath = 1; - } - last if ($badpath); - } - if ($badpath) { - delete($env{'form.folderpath'}); - } - } - - if ($env{'form.supppath'} ne '') { - my @items = split(/\&/,$env{'form.supppath'}); - my $badpath; - for (my $i=0; $i<@items; $i++) { - my $odd = $i%2; - if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) { - $badpath = 1; - } - last if ($badpath); - } - if ($badpath) { - delete($env{'form.supppath'}); - } - } - my $script=''; my $showdoc=0; my $addentries = {}; my $container; my $containertag; - my $pathitem; - my $hiddentop; - my $navmap; - my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; + 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'},\$navmap); - &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_folderpath($coursenum,$coursedom,\$navmap); - &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_base(); - &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.folderpath'} = 'default&'. + &Apache::lonhtmlcommon::entity_encode('Supplemental Content'); + $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'}); - - if (&unescape($env{'form.folderpath'}) =~ m{^(default|supplemental)&}) { - if ($supplementalflag) { - undef($env{'form.folderpath'}) if ($1 eq 'default'); - } else { - undef($env{'form.folderpath'}) if ($1 eq 'supplemental'); - } - } else { - 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() .'&'. $env{'form.folderpath'}; } -# If allowed and user's role is not advanced check folderpath is not hidden - if (($allowed) && (!$env{'request.role.adv'}) && - ($env{'form.folderpath'} ne '') && (!$supplementalflag)) { - my $folderurl; - my @pathitems = split(/\&/,$env{'form.folderpath'}); - my $folder = $pathitems[-2]; - if ($folder eq '') { - undef($env{'form.folderpath'}); - } else { - $folderurl = "uploaded/$coursedom/$coursenum/$folder"; - if ((split(/\:/,$pathitems[-1]))[5]) { - $folderurl .= '.page'; - } else { - $folderurl .= '.sequence'; - } - unless (ref($navmap)) { - $navmap = Apache::lonnavmaps::navmap->new(); - } - if (ref($navmap)) { - if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') { - my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1); - unless (@resources) { - undef($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(); - } elsif ($allowed) { - ($env{'form.folderpath'},$hiddentop) = &default_folderpath($coursenum,$coursedom,\$navmap); + } else { + $env{'form.folderpath'}='default'; } } # Store this unless ($toolsflag) { - if (($allowed) && ($env{'form.folderpath'} ne '')) { - &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') { - if ($env{'form.folder'} eq 'supplemental') { - $folderpath=&supplemental_base(); - } elsif (!$hiddentop) { + 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 Content').':::::'); + &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; } if ($showdoc) { # got called in sequence from course $allowed=0; } else { - if ($canedit) { + if ($allowed) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); $script=&Apache::lonratedt::editscript('simple'); } @@ -5343,105 +3319,67 @@ sub handler { $script .= &dump_switchserver_js(@hosts); } } else { - my $tid = 1; my @tabids; if ($supplementalflag) { @tabids = ('002','ee2','ff2'); - $tid = 2; } else { @tabids = ('aa1','bb1','cc1','ff1'); - unless ($env{'form.folderpath'} =~ /\:1$/) { + unless ($env{'form.pagepath'}) { unshift(@tabids,'001'); push(@tabids,('dd1','ee1')); } } my $tabidstr = join("','",@tabids); - my $hostname = $r->hostname(); - $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum, - $canedit,$hostname,\$navmap). + $script .= &editing_js($udom,$uname,$supplementalflag). &history_tab_js(). &inject_data_js(). - &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid). - &Apache::lonextresedit::extedit_javascript(); + &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr); $addentries = { onload => "javascript:resize_scrollbox('contentscroll','1','1');", }; } - $script .= &paste_popup_js(); - my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'. - &mt('Switch server?'); - - + if ($env{'docs.markedcopy_url'}) { + $script .= &paste_popup_js(); + } } # -------------------------------------------------------------------- Body tag $script = '<script type="text/javascript">'."\n" .'// <![CDATA['."\n" .$script."\n" .'// ]]>'."\n" - .'</script>'."\n" - .'<script type="text/javascript" src="/res/adm/includes/file_upload.js"></script>'."\n"; + .'</script>'."\n"; # Breadcrumbs &Apache::lonhtmlcommon::clear_breadcrumbs(); - - if ($showdoc) { - $r->print(&Apache::loncommon::start_page("$crstype documents",undef, - {'force_register' => $showdoc,})); - } elsif ($toolsflag) { - my ($breadtext,$breadtitle); - $breadtext = "$crstype Editor"; - if ($canedit) { - $breadtitle = 'Editing '.$crstype.' Contents'; - } else { - $breadtext .= ' (View-only mode)'; - $breadtitle = 'Viewing '.$crstype.' Contents'; - } + unless ($showdoc) { &Apache::lonhtmlcommon::add_breadcrumb({ - href=>"/adm/coursedocs",text=>$breadtext}); - $r->print(&Apache::loncommon::start_page("$crstype Contents", $script) - .&Apache::loncommon::help_open_menu('','',273,'RAT') - .&Apache::lonhtmlcommon::breadcrumbs( - $breadtitle) - ); - } 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 { - my ($breadtext,$breadtitle,$helpitem); - $breadtext = "$crstype Editor"; - if ($canedit) { - $breadtitle = 'Editing '.$crstype.' Contents'; - $helpitem = 'Docs_Adding_Course_Doc'; - } else { - $breadtext .= ' (View-only mode)'; - $breadtitle = 'Viewing '.$crstype.' Contents'; - $helpitem = 'Docs_Viewing_Course_Doc'; - } - &Apache::lonhtmlcommon::add_breadcrumb({ - href=>"/adm/coursedocs",text=>$breadtext}); + 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( - $breadtitle, - $helpitem) + 'Editing '.$crstype.' Contents', + 'Docs_Adding_Course_Doc') ); + } else { + $r->print(&Apache::loncommon::start_page("$crstype documents",undef, + {'force_register' => $showdoc,})); } my %allfiles = (); my %codebase = (); my ($upload_result,$upload_output,$uploadphase); - if ($canedit) { + if ($allowed) { if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) { my $context = $1; # Process file upload - phase one - upload and parse primary file. undef($hadchanges); $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom, - \%allfiles,\%codebase,$context,$crstype); - undef($navmap); + \%allfiles,\%codebase,$context); if ($hadchanges) { &mark_hash_old(); } @@ -5486,86 +3424,51 @@ sub handler { if ($allowed && $toolsflag) { $r->print(&startContentScreen('tools')); - $r->print(&generate_admin_menu($crstype,$canedit)); + $r->print(&generate_admin_menu($crstype)); $r->print(&endContentScreen()); } 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' => 'Upload 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', 'sipr' => 'Simple Problem', - 'webp' => 'Blank Web Page (editable)', 'drbx' => 'Drop Box', 'scuf' => 'External Scores (handgrade, upload, clicker)', 'bull' => 'Discussion Board', 'mypi' => 'My Personal Information Page', 'grpo' => 'Group Portfolio', 'rost' => 'Course Roster', - 'abou' => 'Personal Information Page for a User', - 'imsf' => 'IMS Upload', - 'imsl' => 'Upload IMS package', - 'cms' => 'Origin of IMS package', - 'se' => 'Select', + 'abou' => 'Personal Information Page for a User', + 'imsf' => 'IMS Import', + 'imsl' => 'Import IMS package', 'file' => 'File', 'title' => 'Title', 'comment' => 'Comment', 'parse' => 'Upload embedded images/multimedia files if HTML file', - 'bb5' => 'Blackboard 5', - 'bb6' => 'Blackboard 6', - 'angel5' => 'ANGEL 5.5', - 'webctce4' => 'WebCT 4 Campus Edition', - 'er' => 'Editing rights unavailable for your current role.', - ); + 'nd' => 'Upload Document', + 'pm' => 'Published Map', + 'sd' => 'Special Document', + 'mo' => 'More Options', + ); # ----------------------------------------------------------------------------- - # Calculate free quota space for a user or course. A javascript function checks - # file size to determine if upload should be allowed. - my $quotatype = 'unofficial'; - if ($crstype eq 'Community') { - $quotatype = 'community'; - } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.coursecode'}) { - $quotatype = 'official'; - } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.textbook'}) { - $quotatype = 'textbook'; - } - my $disk_quota = &Apache::loncommon::get_user_quota($coursenum,$coursedom, - 'course',$quotatype); # expressed in MB - my $current_disk_usage = 0; - foreach my $subdir ('docs','supplemental') { - $current_disk_usage += &Apache::lonnet::diskusage($coursedom,$coursenum, - "userfiles/$subdir",1); # expressed in kB - } - my $free_space = 1024 * ((1024 * $disk_quota) - $current_disk_usage); - my $usage = $current_disk_usage/1024; # in MB - my $quota = $disk_quota; - my $percent; - if ($disk_quota == 0) { - $percent = 100.0; - } else { - $percent = 100*($usage/$disk_quota); - } - $usage = sprintf("%.2f",$usage); - $quota = sprintf("%.2f",$quota); - $percent = sprintf("%.0f",$percent); - my $quotainfo = '<p>'.&mt('Currently using [_1] of the [_2] available.', - $percent.'%',$quota.' MB').'</p>'; - my $fileupload=(<<FIUP); - $quotainfo $lt{'file'}:<br /> - <input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled /> - <input type="hidden" id="LC_free_space" value="$free_space" /> + <input type="file" name="uploaddoc" size="40" /> FIUP my $checkbox=(<<CHBO); @@ -5573,114 +3476,63 @@ FIUP <input type="checkbox" name="parserflag" /> </label> --> <label> - <input type="checkbox" name="parserflag" checked="checked" $disabled /> $lt{'parse'} + <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" $disabled> - <option value="-1" selected="selected">$lt{'se'}</option> - <option value="bb5">$lt{'bb5'}</option> - <option value="bb6">$lt{'bb6'}</option> - <option value="angel5">$lt{'angel5'}</option> - <option value="webctce4">$lt{'webctce4'}</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);" $disabled /> - </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" $disabled /> - $pathitem + <input type="text" size="60" name="comment" /> + $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'}" $disabled /> - </fieldset> - </form> FUFORM + $fileuploadform .= $fileuploada.'</form>'; - my $mapimportjs; - if ($canedit) { - $mapimportjs = "javascript:openbrowser('mapimportform','importmap','sequence,page','');"; - } else { - $mapimportjs = "javascript:alert('".&js_escape($lt{'er'})."');"; - } - 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();$mapimportjs" $disabled /> - <a href="$mapimportjs">$lt{'selm'}</a></span><br /> - <input type="submit" name="loadmap" value="$lt{'load'}" $disabled /> - </fieldset> - </form> - SEDFFORM - - my $fromstoredjs; - if ($canedit) { - $fromstoredjs = 'open_StoredLinks_Import()'; - } else { - $fromstoredjs = "alert('".&js_escape($lt{'er'})."')"; - } - - 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:'.$fromstoredjs.';" />' => '<a class="LC_menubuttons_link" href="javascript:'.$fromstoredjs.';">'.$lt{'lnks'}.'</a>' }, - { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform } + { '<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>" }, ); - $importpubform = &create_form_ul(&create_list_elements(@importpubforma)); - my $extresourcesform = - &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem, - $help{'Adding_External_Resource'}, - undef,undef,$disabled); + $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'; } - if ($canedit) { - my $output = &update_paste_buffer($coursenum,$coursedom,$folder); - if ($output) { - $r->print($output); - } - } + &update_paste_buffer($coursenum,$coursedom,$folder); $r->print(<<HIDDENFORM); <form name="renameform" method="post" action="/adm/coursedocs"> <input type="hidden" name="title" /> @@ -5691,37 +3543,31 @@ 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; } # my $savefolderpath; - my $hostname = $r->hostname(); if ($allowed) { my $folder=$env{'form.folder'}; - if ((($folder eq '') && (!$hiddentop)) || ($supplementalflag)) { + if ($folder eq '' || $supplementalflag) { $folder='default'; $savefolderpath = $env{'form.folderpath'}; - $env{'form.folderpath'}='default&'.&escape(&mt('Main Content')); - $pathitem = '<input type="hidden" name="folderpath" value="'. + $env{'form.folderpath'}='default&'.&escape(&mt('Content')); + $uploadtag = '<input type="hidden" name="folderpath" value="'. &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'; } my $postexec=''; @@ -5735,24 +3581,37 @@ 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="ee" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="$lt{'navc'}=/adm/navmaps" /> - <a class="LC_menubuttons_link" href="javascript:makenew(document.newnav);">$lt{'navc'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newnav.submit()">$lt{'navc'}</a> $help{'Navigate_Content'} </form> NNFORM my $newsmppageform=(<<NSPFORM); <form action="/adm/coursedocs" method="post" name="newsmppg"> - <input type="hidden" name="active" value="ee" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a> $help{'Simple Page'} @@ -5762,10 +3621,10 @@ 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'} + $help{'Simple Problem'} </form> NSPROBFORM @@ -5773,17 +3632,16 @@ 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> - $help{'Dropbox'} </form> 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'} @@ -5792,8 +3650,8 @@ NEXUFORM my $newbulform=(<<NBFORM); <form action="/adm/coursedocs" method="post" name="newbul"> - <input type="hidden" name="active" value="dd" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a> $help{'Bulletin Board'} @@ -5802,56 +3660,36 @@ NBFORM my $newaboutmeform=(<<NAMFORM); <form action="/adm/coursedocs" method="post" name="newaboutme"> - <input type="hidden" name="active" value="dd" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="$plainname=/adm/$udom/$uname/aboutme" /> - <a class="LC_menubuttons_link" href="javascript:makenew(document.newaboutme);">$lt{'mypi'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newaboutme.submit()">$lt{'mypi'}</a> $help{'My Personal Information Page'} </form> NAMFORM my $newaboutsomeoneform=(<<NASOFORM); <form action="/adm/coursedocs" method="post" name="newaboutsomeone"> - <input type="hidden" name="active" value="dd" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="" /> <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a> </form> NASOFORM + my $newrosterform=(<<NROSTFORM); <form action="/adm/coursedocs" method="post" name="newroster"> - <input type="hidden" name="active" value="dd" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="$lt{'rost'}=/adm/viewclasslist" /> - <a class="LC_menubuttons_link" href="javascript:makenew(document.newroster);">$lt{'rost'}</a> - $help{'Course_Roster'} + <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a> + $help{'Course Roster'} </form> NROSTFORM - my $newwebpage; - if ($folder =~ /^default_?(\d*)$/) { - $newwebpage = "/uploaded/$coursedom/$coursenum/docs/"; - if ($1) { - $newwebpage .= $1; - } else { - $newwebpage .= 'default'; - } - $newwebpage .= '/new.html'; - } - my $newwebpageform =(<<NWEBFORM); - <form action="/adm/coursedocs" method="post" name="newwebpage"> - <input type="hidden" name="active" value="ee" /> - $pathitem - <input type="hidden" name="importdetail" value="$newwebpage" /> - <a class="LC_menubuttons_link" href="javascript:makewebpage();">$lt{'webp'}</a> - $help{'Web_Page'} - </form> -NWEBFORM - - my $specialdocumentsform; my @specialdocumentsforma; my $gradingform; @@ -5867,7 +3705,7 @@ my $newfolderb; <form action="/adm/coursedocs" method="post" name="newpage"> <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="" /> - <input type="hidden" name="active" value="ee" /> + <input type="hidden" name="active" value="cc" /> <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a> $help{'Adding_Pages'} </form> @@ -5876,20 +3714,20 @@ 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="" /> + <input type="hidden" name="active" value="aa" /> <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'} </form> NFFORM my $newsylform=(<<NSYLFORM); <form action="/adm/coursedocs" method="post" name="newsyl"> - <input type="hidden" name="active" value="ee" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" /> - <a class="LC_menubuttons_link" href="javascript:makenew(document.newsyl);">$lt{'syll'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newsyl.submit()">$lt{'syll'}</a> $help{'Syllabus'} </form> @@ -5897,36 +3735,27 @@ NSYLFORM my $newgroupfileform=(<<NGFFORM); <form action="/adm/coursedocs" method="post" name="newgroupfiles"> - <input type="hidden" name="active" value="dd" /> - $pathitem + <input type="hidden" name="active" value="cc" /> + $uploadtag <input type="hidden" name="importdetail" value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" /> - <a class="LC_menubuttons_link" href="javascript:makenew(document.newgroupfiles);">$lt{'grpo'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newgroupfiles.submit()">$lt{'grpo'}</a> $help{'Group Portfolio'} </form> NGFFORM @specialdocumentsforma=( {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'" onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform}, ); $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma)); 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}, @@ -5940,35 +3769,31 @@ NGFFORM {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="javascript:makenew(document.newroster);" />'=>$newrosterform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="javascript:makenew(document.newgroupfiles);" />'=>$newgroupfileform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="document.newroster.submit()" />'=>$newrosterform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="document.newgroupfiles.submit()" />'=>$newgroupfileform}, ); $communityform = &create_form_ul(&create_list_elements(@communityforma)); my %orderhash = ( - 'aa' => ['Upload',$fileuploadform], - 'bb' => ['Import',$importpubform], - 'cc' => ['Grading',$gradingform], + 'aa' => ['Import Content',$fileuploadform], + 'bb' => ['Published Content',$simpleeditdefaultform], + 'cc' => ['Grading Resources',$gradingform], ); -unless ($container eq 'page') { +unless ($env{'form.pagepath'}) { $orderhash{'00'} = ['Newfolder',$newfolderform]; $orderhash{'dd'} = ['Collaboration',$communityform]; - $orderhash{'ee'} = ['Other',$specialdocumentsform]; + $orderhash{'ee'} = ['Special Documents',$specialdocumentsform]; } $hadchanges=0; unless (($supplementalflag || $toolsflag)) { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, - $supplementalflag,\%orderhash,$iconpath,$pathitem, - $canedit,$hostname,\$navmap,$hiddentop); - undef($navmap); + $supplementalflag,\%orderhash,$iconpath); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } if ($hadchanges) { - unless (&is_hash_old()) { - &mark_hash_old(); - } + &mark_hash_old(); } &changewarning($r,''); @@ -5987,18 +3812,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 /> @@ -6010,34 +3834,38 @@ 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="" /> - $pathitem + <input type="hidden" name="active" value="ee" /> + <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'}, - undef,undef,$disabled); + + 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:makenew(document.supnewsyl);">$lt{'syll'}</a> + <a class="LC_menubuttons_link" href="javascript:document.supnewsyl.submit()">$lt{'syll'}</a> $help{'Syllabus'} </form> SNSFORM @@ -6045,88 +3873,47 @@ 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:makenew(document.supnewaboutme);">$lt{'mypi'}</a> + <a class="LC_menubuttons_link" href="javascript:document.supnewaboutme.submit()">$lt{'mypi'}</a> $help{'My Personal Information Page'} </form> SNAMFORM - my $supwebpage; - if ($folder =~ /^supplemental_?(\d*)$/) { - $supwebpage = "/uploaded/$coursedom/$coursenum/supplemental/"; - if ($1) { - $supwebpage .= $1; - } else { - $supwebpage .= 'default'; - } - $supwebpage .= '/new.html'; - } - my $supwebpageform =(<<SWEBFORM); - <form action="/adm/coursedocs" method="post" name="supwebpage"> - <input type="hidden" name="active" value="cc" /> - $pathitem - <input type="hidden" name="importdetail" value="$supwebpage" /> - <a class="LC_menubuttons_link" href="javascript:makewebpage('supp');">$lt{'webp'}</a> - $help{'Web_Page'} - </form> -SWEBFORM - my @specialdocs = ( - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.supnewsyl);" />' + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.supnewsyl.submit()" />' =>$supnewsylform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makenew(document.supnewaboutme);" />' + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="document.supnewaboutme.submit()" />' =>$supnewaboutmeform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage('."'supp'".');" />'=>$supwebpageform}, - ); 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' => ['Upload',$supupdocform], - 'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))] + 'ee' => ['Import Content',$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, - $canedit,$hostname); + $supplementalflag,\%suporderhash,$iconpath); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); - } else { - if ($suppchanges) { - my %servers = &Apache::lonnet::internet_dom_servers($coursedom); - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $server (keys(%servers)) { - next if (grep(/^\Q$server\E$/,@ids)); - my $hashid=$coursenum.':'.$coursedom; - my $cachekey = &escape('suppcount').':'.&escape($hashid); - &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]); - } - &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1); - undef($suppchanges); - } } } } elsif ($supplementalflag) { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, - $supplementalflag,'',$iconpath,$pathitem,'',$hostname); + $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(' @@ -6140,7 +3927,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>'); } @@ -6152,7 +3939,6 @@ my %suporderhash = ( sub embedded_form_elems { my ($phase,$primaryurl,$newidx) = @_; my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); - $newidx =~s /\D+//g; return <<STATE; <input type="hidden" name="folderpath" value="$folderpath" /> <input type="hidden" name="cmd" value="upload_embedded" /> @@ -6173,11 +3959,7 @@ sub embedded_destination { } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { $destination .= $2.'/'; } - my $newidx = $env{'form.newidx'}; - $newidx =~s /\D+//g; - if ($newidx) { - $destination .= $newidx; - } + $destination .= $env{'form.newidx'}; my $dir_root = '/userfiles'; return ($destination,$dir_root); } @@ -6197,18 +3979,18 @@ sub decompression_info { my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; my $container='sequence'; my ($pathitem,$hiddenelem); - my @hiddens = ('newidx','comment','position','folderpath','archiveurl'); - 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) { - if ($item eq 'newidx') { - next if ($env{'form.'.$item} =~ /\D/); - } if ($env{'form.'.$item}) { $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'. - &HTML::Entities::encode($env{'form.'.$item},'<>&"').'" />'."\n"; + $env{'form.'.$item}.'" />'."\n"; } } return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container, @@ -6265,34 +4047,25 @@ sub remove_archive { } else { $delwarning = &mt('An error occurred retrieving the contents of the current folder.'); } - $delwarning .= ' '.&mt('As a result the archive file has not been removed.'); + $delwarning .= &mt('As a result the archive file has not been removed.'); } else { my $currcmd = $env{'form.cmd'}; my $position = $env{'form.position'}; - my $archiveidx = $position; - if ($position > 0) { - if (($env{'form.autoextract_camtasia'}) && (scalar(@LONCAPA::map::order) == 2)) { - $archiveidx = $position-1; - } - $env{'form.cmd'} = 'remove_'.$archiveidx; - my ($title,$url,@rrest) = - split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$archiveidx]]); - if ($url eq $env{'form.archiveurl'}) { - if (&handle_edit_cmd($docuname,$docudom)) { - ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1); - if ($fatal) { - if ($container eq 'page') { - $delwarning = &mt('An error occurred updating the contents of the current page.'); - } else { - $delwarning = &mt('An error occurred updating the contents of the current folder.'); - } + if ($position > 0) { + $env{'form.cmd'} = 'del_'.$position; + 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); + if ($fatal) { + if ($container eq 'page') { + $delwarning = &mt('An error occurred updating the contents of the current page.'); } else { - $delresult = &mt('Archive file removed.'); + $delwarning = &mt('An error occurred updating the contents of the current folder.'); } + } else { + $delresult = &mt('Archive file removed.'); } - } else { - $delwarning .= &mt('Archive file had unexpected item number in folder.'). - ' '.&mt('As a result the archive file has not been removed.'); } } $env{'form.cmd'} = $currcmd; @@ -6311,16 +4084,16 @@ sub remove_archive { } sub generate_admin_menu { - my ($crstype,$canedit) = @_; + my ($crstype) = @_; my $lc_crstype = lc($crstype); my ($home,$other,%outhash)=&authorhosts(); - my %lt= ( # do not translate here + my %lt=&Apache::lonlocal::texthash ( 'vc' => 'Verify Content', 'cv' => 'Check/Set Resource Versions', 'ls' => 'List Resource Identifiers', 'imse' => 'Export contents to IMS Archive', - 'dcd' => "Copy $crstype Content to Authoring Space", - ); + 'dcd' => "Dump $crstype Content to Authoring Space", + ); my ($candump,$dumpurl); if ($home + $other > 0) { $candump = 'F'; @@ -6331,7 +4104,7 @@ sub generate_admin_menu { foreach my $aurole (keys(%outhash)) { unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) { push(@hosts,$outhash{$aurole}); - } + } } if (@hosts == 1) { my $switchto = '/adm/switchserver?otherserver='.$hosts[0]. @@ -6350,14 +4123,14 @@ sub generate_admin_menu { { linktext => $lt{'vc'}, url => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')", permission => 'F', - help => 'Docs_Verify_Content', + help => 'Verify_Content', icon => 'verify.png', linktitle => 'Verify contents can be retrieved/rendered', }, { linktext => $lt{'cv'}, url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')", permission => 'F', - help => 'Docs_Check_Resource_Versions', + help => 'Check_Resource_Versions', icon => 'resversion.png', linktitle => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions", }, @@ -6369,9 +4142,7 @@ sub generate_admin_menu { linktitle => "List the unique identifier used for each resource instance in your $lc_crstype" }, ] - }); - if ($canedit) { - push(@menu, + }, { categorytitle=>'Export', items =>[ { linktext => $lt{'imse'}, @@ -6384,13 +4155,12 @@ sub generate_admin_menu { { linktext => $lt{'dcd'}, url => $dumpurl, permission => $candump, - help => 'Docs_Dump_Course_Docs', + #help => '', icon => 'dump.png', linktitle => $lt{'dcd'}, }, ] }); - } return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n". '<input type="hidden" id="dummy" />'."\n". &Apache::lonhtmlcommon::generate_menu(@menu)."\n". @@ -6398,19 +4168,17 @@ sub generate_admin_menu { } sub generate_edit_table { - my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile, - $need_save,$copyfolder,$canedit) = @_; + my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile) = @_; return unless(ref($orderhash_ref) eq 'HASH'); my %orderhash = %{$orderhash_ref}; - my ($form, $activetab, $active, $disabled); - if (($env{'form.active'} ne '') && ($env{'form.active'} ne '00')) { + my $form; + my $activetab; + my $active; + if($env{'form.active'} ne ''){ $activetab = $env{'form.active'}; } - unless ($canedit) { - $disabled = ' disabled="disabled"'; - } 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">'. @@ -6439,9 +4207,10 @@ 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 style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n"; + $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n"; } } @@ -6449,35 +4218,7 @@ sub generate_edit_table { $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'."\n"; if ($to_show ne '') { - my $saveform; - if ($need_save) { - my $button = &mt('Make changes'); - my $path; - if ($env{'form.folderpath'}) { - $path = - &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); - } - $saveform = <<"END"; -<div id="multisave" style="display:none; clear:both;" > -<form name="saveactions" method="post" action="/adm/coursedocs" onsubmit="return checkSubmits();"> -<input type="hidden" name="folderpath" value="$path" /> -<input type="hidden" name="symb" value="$env{'form.symb'}" /> -<input type="hidden" name="allhiddenresource" value="" /> -<input type="hidden" name="allencrypturl" value="" /> -<input type="hidden" name="allrandompick" value="" /> -<input type="hidden" name="allrandomorder" value="" /> -<input type="hidden" name="changeparms" value="" /> -<input type="hidden" name="multiremove" value="" /> -<input type="hidden" name="multicut" value="" /> -<input type="hidden" name="multicopy" value="" /> -<input type="hidden" name="multichange" value="" /> -<input type="hidden" name="copyfolder" value="$copyfolder" /> -<input type="submit" name="savemultiples" value="$button" $disabled /> -</form> -</div> -END - } - $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'.$saveform."\n"; + $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'."\n"; } foreach my $field (keys(%orderhash)){ if($field ne '00'){ @@ -6498,9 +4239,9 @@ END } sub editing_js { - my ($udom,$uname,$supplementalflag,$coursedom,$coursenum, - $canedit,$hostname,$navmapref) = @_; - my %js_lt = &Apache::lonlocal::texthash( + my ($udom,$uname,$supplementalflag) = @_; + my $now = time(); + my %lt = &Apache::lonlocal::texthash( p_mnf => 'Name of New Folder', t_mnf => 'New Folder', p_mnp => 'Name of New Page', @@ -6510,123 +4251,41 @@ sub editing_js { p_msb => 'Title for the Problem', p_mdb => 'Title for the Drop Box', p_mbb => 'Title for the Discussion Board', - p_mwp => 'Title for Web Page', p_mab => "Enter user:domain for User's Personal Information Page", p_mab2 => 'Personal Information Page of ', p_mab_alrt1 => 'Not a valid user:domain', p_mab_alrt2 => 'Please enter both user and domain in the format user:domain', p_chn => 'New Title', p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!', - p_rmr2a => 'Remove', - p_rmr2b => '?', - p_rmr3a => 'Remove those', - p_rmr3b => 'items?', - p_rmr4 => 'WARNING: Removing a resource uploaded to a course cannot be undone via "Undo Delete".', - p_rmr5 => 'Push "Cancel" and then use "Cut" instead if you might need to undo this change.', + p_rmr2a => 'Remove[_99]', + p_rmr2b => '?[_99]', p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!', p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.', - p_ctr2a => 'Cut', - p_ctr2b => '?', - p_ctr3a => 'Cut those', - p_ctr3b => 'items?', + 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', - more => '(More ...)', - less => '(Less ...)', - noor => 'No actions selected or changes to settings specified.', - noch => 'No changes to settings specified.', - noac => 'No actions selected.', - edri => 'Editing rights unavailable for your current role.', ); - &js_escape(\%js_lt); 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 $backtourl; - my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref)); - my $toplevelsupp = &supplemental_base(); - - 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)) { - my ($url,$anchor); - if ($res =~ /^([^#]+)#([^#]+)$/) { - $url = $1; - $anchor = $2; - if (($caller =~ m{^([^#]+)\Q#$anchor\E$})) { - $caller = $1.&escape('#').$anchor; - } - } else { - $url = $res; - } - $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($url),'<>&"'); - if ($backtourl =~ m{^\Q/uploaded/$coursedom/$coursenum/\Edefault_\d+\.sequence$}) { - $backtourl .= '?navmap=1'; - } else { - $backtourl .= '?symb='. - &HTML::Entities::encode($caller,'<>&"'); - } - if ($backtourl =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) { - if (($ENV{'SERVER_PORT'} == 443) && - ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { - unless (&Apache::lonnet::uses_sts()) { - if ($hostname ne '') { - $backtourl = 'http://'.$hostname.$backtourl; - } - $backtourl .= (($backtourl =~ /\?/) ? '&':'?').'usehttp=1'; - } - } - } elsif ($backtourl =~ m{^/adm/wrapper/ext/(?!https:)}) { - if (($ENV{'SERVER_PORT'} == 443) && ($hostname ne '')) { - unless (&Apache::lonnet::uses_sts()) { - if ($hostname ne '') { - $backtourl = 'http://'.$hostname.$backtourl; - } - $backtourl .= (($backtourl =~ /\?/) ? '&':'?').'usehttp=1'; - } - } - } - if ($anchor ne '') { - $backtourl .= '#'.&HTML::Entities::encode($anchor,'<>&"'); - } - $backtourl = &Apache::loncommon::escape_single($backtourl); - } else { - $backtourl = '/adm/navmaps'; - } + 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'; } - my $jsmakefunctions; - if ($canedit) { - $jsmakefunctions = <<ENDNEWSCRIPT; + return <<ENDNEWSCRIPT; function makenewfolder(targetform,folderseq) { - var foldername=prompt('$js_lt{"p_mnf"}','$js_lt{"t_mnf"}'); + var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}'); if (foldername) { targetform.importdetail.value=escape(foldername)+"="+folderseq; targetform.submit(); @@ -6634,15 +4293,31 @@ function makenewfolder(targetform,folder } function makenewpage(targetform,folderseq) { - var pagename=prompt('$js_lt{"p_mnp"}','$js_lt{"t_mnp"}'); + var pagename=prompt('$lt{"p_mnp"}','$lt{"t_mnp"}'); if (pagename) { targetform.importdetail.value=escape(pagename)+"="+folderseq; targetform.submit(); } } +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('$js_lt{"p_mxu"}'); + var title=prompt('$lt{"p_mxu"}'); if (title) { this.document.forms.newexamupload.importdetail.value= escape(title)+'=/res/lib/templates/examupload.problem'; @@ -6651,31 +4326,16 @@ function makeexamupload() { } function makesmppage() { - var title=prompt('$js_lt{"p_msp"}'); + var title=prompt('$lt{"p_msp"}'); if (title) { this.document.forms.newsmppg.importdetail.value= - escape(title)+'=/adm/$udom/$uname/new/smppg'; + escape(title)+'=/adm/$udom/$uname/$now/smppg'; this.document.forms.newsmppg.submit(); } } -function makewebpage(type) { - var title=prompt('$js_lt{"p_mwp"}'); - var formname; - if (type == 'supp') { - formname = this.document.forms.supwebpage; - } else { - formname = this.document.forms.newwebpage; - } - if (title) { - var webpage = formname.importdetail.value; - formname.importdetail.value = escape(title)+'='+webpage; - formname.submit(); - } -} - function makesmpproblem() { - var title=prompt('$js_lt{"p_msb"}'); + var title=prompt('$lt{"p_msb"}'); if (title) { this.document.forms.newsmpproblem.importdetail.value= escape(title)+'=/res/lib/templates/simpleproblem.problem'; @@ -6684,7 +4344,7 @@ function makesmpproblem() { } function makedropbox() { - var title=prompt('$js_lt{"p_mdb"}'); + var title=prompt('$lt{"p_mdb"}'); if (title) { this.document.forms.newdropbox.importdetail.value= escape(title)+'=/res/lib/templates/DropBox.problem'; @@ -6693,435 +4353,138 @@ function makedropbox() { } function makebulboard() { - var title=prompt('$js_lt{"p_mbb"}'); + var title=prompt('$lt{"p_mbb"}'); if (title) { this.document.forms.newbul.importdetail.value= - escape(title)+'=/adm/$udom/$uname/new/bulletinboard'; + escape(title)+'=/adm/$udom/$uname/$now/bulletinboard'; this.document.forms.newbul.submit(); } } function makeabout() { - var user=prompt("$js_lt{'p_mab'}"); + var user=prompt("$lt{'p_mab'}"); if (user) { var comp=new Array(); comp=user.split(':'); if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) { if ((comp[0]) && (comp[1])) { this.document.forms.newaboutsomeone.importdetail.value= - '$js_lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme'; - this.document.forms.newaboutsomeone.submit(); - } else { - alert("$js_lt{'p_mab_alrt1'}"); - } - } else { - alert("$js_lt{'p_mab_alrt2'}"); - } - } + '$lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme'; + this.document.forms.newaboutsomeone.submit(); + } else { + alert("$lt{'p_mab_alrt1'}"); + } +} else { + alert("$lt{'p_mab_alrt2'}"); } - -function makenew(targetform) { - targetform.submit(); } - -function changename(folderpath,index,oldtitle) { - var title=prompt('$js_lt{"p_chn"}',oldtitle); - if (title) { - this.document.forms.renameform.markcopy.value=''; - this.document.forms.renameform.title.value=title; - this.document.forms.renameform.cmd.value='rename_'+index; - this.document.forms.renameform.folderpath.value=folderpath; - this.document.forms.renameform.submit(); - } } -ENDNEWSCRIPT - } else { - $jsmakefunctions = <<ENDNEWSCRIPT; - -function makenewfolder() { - alert("$js_lt{'edri'}"); +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 makenewpage() { - alert("$js_lt{'edri'}"); +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 makeexamupload() { - alert("$js_lt{'edri'}"); +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; +if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; } - -function makesmppage() { - alert("$js_lt{'edri'}"); +if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; } - -function makewebpage(type) { - alert("$js_lt{'edri'}"); +this.document.forms.renameform.submit(); } - -function makesmpproblem() { - alert("$js_lt{'edri'}"); } -function makedropbox() { - alert("$js_lt{'edri'}"); +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; +if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; } - -function makebulboard() { - alert("$js_lt{'edri'}"); +if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; } - -function makeabout() { - alert("$js_lt{'edri'}"); +this.document.forms.renameform.submit(); } - -function changename() { - alert("$js_lt{'edri'}"); } -function makenew() { - alert("$js_lt{'edri'}"); +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; +if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; } - -function groupimport() { - alert("$js_lt{'edri'}"); +if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; } - -function groupsearch() { - alert("$js_lt{'edri'}"); +this.document.forms.renameform.submit(); } - -function groupopen(url,recover) { - var options="scrollbars=1,resizable=1,menubar=0"; - idxflag=1; - idx=open("/adm/groupsort?inhibitmenu=yes&mode=simple&recover="+recover+"&readfile="+url,"idxout",options); - idx.focus(); } -ENDNEWSCRIPT - - } - return <<ENDSCRIPT; - -$jsmakefunctions - -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 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; } - -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; +if (container == 'page') { +this.document.forms.renameform.pagepath.value=folderpath; +this.document.forms.renameform.pagesymb.value=pagesymb; } - -function makeims(imsform) { - if ((imsform.uploaddoc.value == '') || (!imsform.uploaddoc.value)) { - alert("$js_lt{'imsfile'}"); - return; - } - if (imsform.source.selectedIndex == 0) { - alert("$js_lt{'imscms'}"); - return; - } - newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes"); - imsform.submit(); +this.document.forms.renameform.submit(); } function updatePick(targetform,index,caller) { - var pickitem; - var picknumitem; - var picknumtext; - if (index == 'all') { - pickitem = document.getElementById('randompickall'); - picknumitem = document.getElementById('rpicknumall'); - picknumtext = document.getElementById('rpicktextall'); - } else { - pickitem = document.getElementById('randompick_'+index); - picknumitem = document.getElementById('rpicknum_'+index); - picknumtext = document.getElementById('randompicknum_'+index); - } + var pickitem = document.getElementById('rpick_'+index); + var picknumitem = document.getElementById('rpicknum_'+index); if (pickitem.checked) { - var picknum=prompt('$js_lt{"rpck"}',picknumitem.value); + var picknum=prompt('$lt{"rpck"}',picknumitem.value); if (picknum == '' || picknum == null) { if (caller == 'check') { pickitem.checked=false; - if (index == 'all') { - picknumtext.innerHTML = ''; - if (caller == 'link') { - propagateState(targetform,'rpicknum'); - } - } else { - checkForSubmit(targetform,'randompick','settings'); - } + return; } } else { picknum.toString(); var regexdigit=/^\\d+\$/; if (regexdigit.test(picknum)) { picknumitem.value = picknum; - if (index == 'all') { - picknumtext.innerHTML = ' <a href="javascript:updatePick(document.cumulativesettings,\\'all\\',\\'link\\');">'+picknum+'</a>'; - if (caller == 'link') { - propagateState(targetform,'rpicknum'); - } - } else { - picknumtext.innerHTML = ' <a href="javascript:updatePick(document.edit_randompick_'+index+',\\''+index+'\\',\\'link\\');">'+picknum+'</a>'; - checkForSubmit(targetform,'randompick','settings'); - } + targetform.changeparms.value='randompick'; + targetform.submit(); } else { if (caller == 'check') { - if (index == 'all') { - picknumtext.innerHTML = ''; - if (caller == 'link') { - propagateState(targetform,'rpicknum'); - } - } else { - pickitem.checked=false; - checkForSubmit(targetform,'randompick','settings'); - } + pickitem.checked=false; } return; } } } else { - picknumitem.value = ''; - picknumtext.innerHTML = ''; - if (index == 'all') { - if (caller == 'link') { - propagateState(targetform,'rpicknum'); - } - } else { - checkForSubmit(targetform,'randompick','settings'); - } - } -} - -function propagateState(form,param) { - if (document.getElementById(param+'all')) { - var setcheck = 0; - var rpick = 0; - if (param == 'rpicknum') { - if (document.getElementById('randompickall')) { - if (document.getElementById('randompickall').checked) { - if (document.getElementById('rpicknumall')) { - rpick = document.getElementById('rpicknumall').value; - } - } - } - } else { - if (document.getElementById(param+'all').checked) { - setcheck = 1; - } - } - var allidxlist; - if ((param == 'remove') || (param == 'cut') || (param == 'copy')) { - if (document.getElementById('all'+param+'idx')) { - allidxlist = document.getElementById('all'+param+'idx').value; - } - var actions = new Array ('remove','cut','copy'); - for (var i=0; i<actions.length; i++) { - if (actions[i] != param) { - if (document.getElementById(actions[i]+'all')) { - document.getElementById(actions[i]+'all').checked = false; - } - } - } - } - if ((param == 'encrypturl') || (param == 'hiddenresource')) { - allidxlist = form.allidx.value; - } - if ((param == 'randompick') || (param == 'rpicknum') || (param == 'randomorder')) { - allidxlist = form.allmapidx.value; - } - if ((allidxlist != '') && (allidxlist != null)) { - var allidxs = allidxlist.split(','); - if (allidxs.length > 1) { - for (var i=0; i<allidxs.length; i++) { - if (document.getElementById(param+'_'+allidxs[i])) { - if (param == 'rpicknum') { - if (document.getElementById('randompick_'+allidxs[i])) { - if (document.getElementById('randompick_'+allidxs[i]).checked) { - document.getElementById(param+'_'+allidxs[i]).value = rpick; - if (rpick > 0) { - document.getElementById('randompicknum_'+allidxs[i]).innerHTML = ': <a href="javascript:updatePick(document.edit_randompick_'+allidxs[i]+',\\''+allidxs[i]+'\\',\\'link\\')">'+rpick+'</a>'; - } else { - document.getElementById('randompicknum_'+allidxs[i]).innerHTML = ''; - } - } - } - } else { - if (setcheck == 1) { - document.getElementById(param+'_'+allidxs[i]).checked = true; - } else { - document.getElementById(param+'_'+allidxs[i]).checked = false; - if (param == 'randompick') { - document.getElementById('randompicknum_'+allidxs[i]).innerHTML = ''; - } - } - } - } - } - if (setcheck == 1) { - if ((param == 'remove') || (param == 'cut') || (param == 'copy')) { - var actions = new Array('copy','cut','remove'); - for (var i=0; i<actions.length; i++) { - var otheractions; - var otheridxs; - if (actions[i] === param) { - continue; - } else { - if (document.getElementById('all'+actions[i]+'idx')) { - otheractions = document.getElementById('all'+actions[i]+'idx').value; - otheridxs = otheractions.split(','); - if (otheridxs.length > 1) { - for (var j=0; j<otheridxs.length; j++) { - if (document.getElementById(actions[i]+'_'+otheridxs[j])) { - document.getElementById(actions[i]+'_'+otheridxs[j]).checked = false; - } - } - } - } - } - } - } - } - } - } - } - return; -} - -function checkForSubmit(targetform,param,context,idx,folderpath,index,oldtitle,skip_confirm,container,folder,confirm_removal) { - var canedit = '$canedit'; - if (canedit == '') { - alert("$js_lt{'edri'}"); - return; - } - var dosettings; - var doaction; - var control = document.togglemultsettings; - if (context == 'actions') { - control = document.togglemultactions; - doaction = 1; - } else { - dosettings = 1; - } - if (control) { - if (control.showmultpick.length) { - for (var i=0; i<control.showmultpick.length; i++) { - if (control.showmultpick[i].checked) { - if (control.showmultpick[i].value == 1) { - if (context == 'settings') { - dosettings = 0; - } else { - doaction = 0; - } - } - } - } - } - } - if (context == 'settings') { - if (dosettings == 1) { - targetform.changeparms.value=param; - targetform.submit(); - } - } - if (context == 'actions') { - if (doaction == 1) { - targetform.cmd.value=param+'_'+index; - targetform.folderpath.value=folderpath; - targetform.markcopy.value=idx+':'+param; - targetform.copyfolder.value=folder+'.'+container; - if (param == 'remove') { - var doremove = 0; - if (skip_confirm) { - if (confirm_removal) { - if (confirm('$js_lt{"p_rmr4"}\\n$js_lt{"p_rmr5"}\\n\\n$js_lt{"p_rmr2a"} "'+oldtitle+'"$js_lt{"p_rmr2b"}')) { - doremove = 1; - } - } else { - doremove = 1; - } - } else { - if (confirm('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr2a"} "'+oldtitle+'" $js_lt{"p_rmr2b"}')) { - doremove = 1; - } - } - if (doremove) { - targetform.markcopy.value=''; - targetform.copyfolder.value=''; - targetform.submit(); - } - } - if (param == 'cut') { - if (skip_confirm || confirm('$js_lt{"p_ctr1a"}\\n$js_lt{"p_ctr1b"}\\n\\n$js_lt{"p_ctr2a"} "'+oldtitle+'" $js_lt{"p_ctr2b"}')) { - targetform.submit(); - return; - } - } - if (param == 'copy') { - targetform.submit(); - return; - } - targetform.markcopy.value=''; - targetform.copyfolder.value=''; - targetform.cmd.value=''; - targetform.folderpath.value=''; - return; - } else { - if (document.getElementById(param+'_'+idx)) { - item = document.getElementById(param+'_'+idx); - if (item.type == 'checkbox') { - if (item.checked) { - item.checked = false; - } else { - item.checked = true; - singleCheck(item,idx,param); - } - } - } - } - } - return; -} - -function singleCheck(caller,idx,action) { - actions = new Array('cut','copy','remove'); - if (caller.checked) { - for (var i=0; i<actions.length; i++) { - if (actions[i] != action) { - if (document.getElementById(actions[i]+'_'+idx)) { - if (document.getElementById(actions[i]+'_'+idx).checked) { - document.getElementById(actions[i]+'_'+idx).checked = false; - } - } - } - } + picknumitem.value = 0; + targetform.changeparms.value='randompick'; + targetform.submit(); } - return; } function unselectInactive(nav) { @@ -7142,12 +4505,10 @@ for (i = 0; i < currentLis.length; i++) function hideAll(current, nav, data) { unselectInactive(nav); -if (current) { - if (current.className == 'right'){ +if(current.className == 'right'){ current.className = 'right active' - } else { + }else{ current.className = 'active'; - } } currentData = document.getElementById(data); currentDivs = currentData.getElementsByTagName('DIV'); @@ -7178,31 +4539,18 @@ function openTabs(pageId) { } function showPage(current, pageId, nav, data) { - currstate = current.className; hideAll(current, nav, data); openTabs(pageId); unselectInactive(nav); - if ((currstate == 'active') || (currstate == 'right active')) { - if (currstate == 'active') { - current.className = ''; - } else { - current.className = 'right'; - } - activeTab = ''; - toggleUpload(); - toggleMap(); - resize_scrollbox('contentscroll','1','0'); - return; - } else { - current.className = 'active'; - } + current.className = 'active'; 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') { @@ -7238,333 +4586,14 @@ 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; } -function togglePick(caller,value) { - var disp = 'none'; - if (document.getElementById('multi'+caller)) { - var curr = document.getElementById('multi'+caller).style.display; - if (value == 1) { - disp='block'; - } - if (curr == disp) { - return; - } - document.getElementById('multi'+caller).style.display=disp; - if (value == 1) { - document.getElementById('more'+caller).innerHTML = ' <a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$js_lt{'more'}</a>'; - } else { - document.getElementById('more'+caller).innerHTML = ''; - } - if (caller == 'actions') { - setClass(value); - setBoxes(value); - } - } - var showButton = multiSettings(); - if (showButton != 1) { - showButton = multiActions(); - } - if (document.getElementById('multisave')) { - if (showButton == 1) { - document.getElementById('multisave').style.display='block'; - } else { - document.getElementById('multisave').style.display='none'; - } - } - resize_scrollbox('contentscroll','1','1'); - return; -} - -function toggleCheckUncheck(caller,more) { - if (more == 1) { - document.getElementById('more'+caller).innerHTML = ' <a href="javascript:toggleCheckUncheck(\\''+caller+'\\',0);" style="text-decoration:none;">$js_lt{'less'}</a>'; - document.getElementById('allfields'+caller).style.display='block'; - } else { - document.getElementById('more'+caller).innerHTML = ' <a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$js_lt{'more'}</a>'; - document.getElementById('allfields'+caller).style.display='none'; - } - resize_scrollbox('contentscroll','1','1'); -} - -function multiSettings() { - var inuse = 0; - var settingsform = document.togglemultsettings; - if (settingsform.showmultpick.length > 1) { - for (var i=0; i<settingsform.showmultpick.length; i++) { - if (settingsform.showmultpick[i].checked) { - if (settingsform.showmultpick[i].value == 1) { - inuse = 1; - } - } - } - } - return inuse; -} - -function multiActions() { - var inuse = 0; - var actionsform = document.togglemultactions; - if (actionsform.showmultpick.length > 1) { - for (var i=0; i<actionsform.showmultpick.length; i++) { - if (actionsform.showmultpick[i].checked) { - if (actionsform.showmultpick[i].value == 1) { - inuse = 1; - } - } - } - } - return inuse; -} - -function checkSubmits() { - var numchanges = 0; - var form = document.saveactions; - var doactions = multiActions(); - var cutwarnings = 0; - var remwarnings = 0; - var removalinfo = 0; - if (doactions == 1) { - var remidxlist = document.cumulativeactions.allremoveidx.value; - if ((remidxlist != '') && (remidxlist != null)) { - var remidxs = remidxlist.split(','); - for (var i=0; i<remidxs.length; i++) { - if (document.getElementById('remove_'+remidxs[i])) { - if (document.getElementById('remove_'+remidxs[i]).checked) { - form.multiremove.value += remidxs[i]+','; - numchanges ++; - if (document.getElementById('skip_remove_'+remidxs[i])) { - if (document.getElementById('skip_remove_'+remidxs[i]).value == 0) { - remwarnings ++; - } - } - if (document.getElementById('confirm_removal_'+remidxs[i])) { - if (document.getElementById('confirm_removal_'+remidxs[i]).value == 1) { - removalinfo ++; - } - } - } - } - } - } - var cutidxlist = document.cumulativeactions.allcutidx.value; - if ((cutidxlist != '') && (cutidxlist != null)) { - var cutidxs = cutidxlist.split(','); - for (var i=0; i<cutidxs.length; i++) { - if (document.getElementById('cut_'+cutidxs[i])) { - if (document.getElementById('cut_'+cutidxs[i]).checked == true) { - form.multicut.value += cutidxs[i]+','; - numchanges ++; - if (document.getElementById('skip_cut_'+cutidxs[i])) { - if (document.getElementById('skip_cut_'+cutidxs[i]).value == 0) { - cutwarnings ++; - } - } - } - } - } - } - var copyidxlist = document.cumulativeactions.allcopyidx.value; - if ((copyidxlist != '') && (copyidxlist != null)) { - var copyidxs = copyidxlist.split(','); - for (var i=0; i<copyidxs.length; i++) { - if (document.getElementById('copy_'+copyidxs[i])) { - if (document.getElementById('copy_'+copyidxs[i]).checked) { - form.multicopy.value += copyidxs[i]+','; - numchanges ++; - } - } - } - } - if (numchanges > 0) { - form.multichange.value = numchanges; - } - } - var dosettings = multiSettings(); - var haschanges = 0; - if (dosettings == 1) { - form.allencrypturl.value = ''; - form.allhiddenresource.value = ''; - form.changeparms.value = 'all'; - var patt=new RegExp(",\$"); - var allidxlist = document.cumulativesettings.allidx.value; - if ((allidxlist != '') && (allidxlist != null)) { - var allidxs = allidxlist.split(','); - if (allidxs.length > 1) { - for (var i=0; i<allidxs.length; i++) { - if (document.getElementById('hiddenresource_'+allidxs[i])) { - if (document.getElementById('hiddenresource_'+allidxs[i]).checked) { - form.allhiddenresource.value += allidxs[i]+','; - } - } - if (document.getElementById('encrypturl_'+allidxs[i])) { - if (document.getElementById('encrypturl_'+allidxs[i]).checked) { - form.allencrypturl.value += allidxs[i]+','; - } - } - } - form.allhiddenresource.value = form.allhiddenresource.value.replace(patt,""); - form.allencrypturl.value = form.allencrypturl.value.replace(patt,""); - } - } - form.allrandompick.value = ''; - form.allrandomorder.value = ''; - var allmapidxlist = document.cumulativesettings.allmapidx.value; - if ((allmapidxlist != '') && (allmapidxlist != null)) { - var allmapidxs = allmapidxlist.split(','); - for (var i=0; i<allmapidxs.length; i++) { - var randompick = document.getElementById('randompick_'+allmapidxs[i]); - var rpicknum = document.getElementById('rpicknum_'+allmapidxs[i]); - var randorder = document.getElementById('randomorder_'+allmapidxs[i]); - if ((randompick.checked) && (rpicknum.value != '')) { - form.allrandompick.value += allmapidxs[i]+':'+rpicknum.value+','; - } - if (randorder.checked) { - form.allrandomorder.value += allmapidxs[i]+','; - } - } - form.allrandompick.value = form.allrandompick.value.replace(patt,""); - form.allrandomorder.value = form.allrandomorder.value.replace(patt,""); - } - if (document.cumulativesettings.currhiddenresource.value != form.allhiddenresource.value) { - haschanges = 1; - } - if (document.cumulativesettings.currencrypturl.value != form.allencrypturl.value) { - haschanges = 1; - } - if (document.cumulativesettings.currrandomorder.value != form.allrandomorder.value) { - haschanges = 1; - } - if (document.cumulativesettings.currrandompick.value != form.allrandompick.value) { - haschanges = 1; - } - } - if (doactions == 1) { - if (numchanges > 0) { - if ((cutwarnings > 0) || (remwarnings > 0) || (removalinfo > 0)) { - if (remwarnings > 0) { - if (!confirm('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr3a"} '+remwarnings+' $js_lt{"p_rmr3b"}')) { - return false; - } - } - if (removalinfo > 0) { - if (!confirm('$js_lt{"p_rmr4"}\\n$js_lt{"p_rmr5"}\\n\\n$js_lt{"p_rmr3a"} '+removalinfo+' $js_lt{"p_rmr3b"}')) { - return false; - } - } - if (cutwarnings > 0) { - if (!confirm('$js_lt{"p_ctr1a"}\\n$js_lt{"p_ctr1b"}\\n\\n$js_lt{"p_ctr3a"} '+cutwarnings+' $js_lt{"p_ctr3b"}')) { - return false; - } - } - } - form.submit(); - return true; - } - } - if (dosettings == 1) { - if (haschanges == 1) { - form.submit(); - return true; - } - } - if ((dosettings == 1) && (doactions == 1)) { - alert("$js_lt{'noor'}"); - } else { - if (dosettings == 1) { - alert("$js_lt{'noch'}"); - } else { - alert("$js_lt{'noac'}"); - } - } - return false; -} - -function setClass(value) { - var cutclass = 'LC_docs_cut'; - var copyclass = 'LC_docs_copy'; - var removeclass = 'LC_docs_remove'; - var cutreg = new RegExp("\\\\b"+cutclass+"\\\\b"); - var copyreg = new RegExp("\\\\b"+copyclass+"\\\\b"); - var removereg = new RegExp("\\\\"+removeclass+"\\\\b"); - var links = document.getElementsByTagName('a'); - for (var i=0; i<links.length; i++) { - var classes = links[i].className; - if (cutreg.test(classes)) { - links[i].className = cutclass; - if (value == 1) { - links[i].className += " LC_menubuttons_link"; - } - } else { - if (copyreg.test(classes)) { - links[i].className = copyclass; - if (value == 1) { - links[i].className += " LC_menubuttons_link"; - } - } else { - if (removereg.test(classes)) { - links[i].className = removeclass; - if (value == 1) { - links[i].className += " LC_menubuttons_link"; - } - } - } - } - } - return; -} - -function setBoxes(value) { - var remidxlist = document.cumulativeactions.allremoveidx.value; - if ((remidxlist != '') && (remidxlist != null)) { - var remidxs = remidxlist.split(','); - for (var i=0; i<remidxs.length; i++) { - if (document.getElementById('remove_'+remidxs[i])) { - var item = document.getElementById('remove_'+remidxs[i]); - if (value == 1) { - item.className = 'LC_docs_remove'; - } else { - item.className = 'LC_hidden'; - } - } - } - } - var cutidxlist = document.cumulativeactions.allcutidx.value; - if ((cutidxlist != '') && (cutidxlist != null)) { - var cutidxs = cutidxlist.split(','); - for (var i=0; i<cutidxs.length; i++) { - if (document.getElementById('cut_'+cutidxs[i])) { - var item = document.getElementById('cut_'+cutidxs[i]); - if (value == 1) { - item.className = 'LC_docs_cut'; - } else { - item.className = 'LC_hidden'; - } - } - } - } - var copyidxlist = document.cumulativeactions.allcopyidx.value; - if ((copyidxlist != '') && (copyidxlist != null)) { - var copyidxs = copyidxlist.split(','); - for (var i=0; i<copyidxs.length; i++) { - if (document.getElementById('copy_'+copyidxs[i])) { - var item = document.getElementById('copy_'+copyidxs[i]); - if (value == 1) { - item.className = 'LC_docs_copy'; - } else { - item.className = 'LC_hidden'; - } - } - } - } - return; -} - -ENDSCRIPT +ENDNEWSCRIPT } sub history_tab_js { @@ -7593,19 +4622,13 @@ ENDINJECT sub dump_switchserver_js { my @hosts = @_; - my %js_lt = &Apache::lonlocal::texthash( - dump => 'Copying content to Authoring Space requires switching server.', - swit => 'Switch server?', - ); - my %html_js_lt = &Apache::lonlocal::texthash( + my %lt = &Apache::lonlocal::texthash( + dump => 'Dumping to Authoring Space requires switching server.', swit => 'Switch server?', - duco => 'Copying Content to Authoring Space', + duco => 'Dump content to Authoring Space', yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.', chos => 'Choose server', ); - &js_escape(\%js_lt); - &html_escape(\%html_js_lt); - &js_escape(\%html_js_lt); my $role = $env{'request.role'}; my $js = <<"ENDSWJS"; <script type="text/javascript"> @@ -7646,7 +4669,7 @@ ENDSWJS function dump_needs_switchserver(url) { if (url!='' && url!= null) { - if (confirm("$js_lt{'dump'}\\n$js_lt{'swit'}")) { + if (confirm("$lt{'dump'}\\n$lt{'swit'}")) { go(url); } } @@ -7657,13 +4680,13 @@ function choose_switchserver_window() { newWindow = window.open('','ChooseServer','height=400,width=500,scrollbars=yes') newWindow.document.open(); newWindow.document.writeln('$startpage'); - newWindow.document.write('<h3>$html_js_lt{'duco'}<\\/h3>\\n'+ - '<p>$html_js_lt{'yone'}<\\/p>\\n'+ - '<div class="LC_left_float"><fieldset><legend>$html_js_lt{'chos'}<\\/legend>\\n'+ + newWindow.document.write('<h3>$lt{'duco'}<\\/h3>\\n'+ + '<p>$lt{'yone'}<\\/p>\\n'+ + '<div class="LC_left_float"><fieldset><legend>$lt{'chos'}<\\/legend>\\n'+ '<form name="setserver" method="post" action="" \\/>\\n'+ '$hostpicker\\n'+ '<br \\/><br \\/>\\n'+ - '<input type="button" name="makeswitch" value="$html_js_lt{'swit'}" '+ + '<input type="button" name="makeswitch" value="$lt{'swit'}" '+ 'onclick="write_switchserver();" \\/>\\n'+ '<\\/form><\\/fieldset><\\/div><br clear="all" \\/>\\n'); newWindow.document.writeln('$endpage'); @@ -7749,10 +4772,6 @@ Return hash with valid author names =item do_paste_from_buffer() -=item do_buffer_empty() - -=item clear_from_buffer() - =item get_newmap_url() =item dbcopy() @@ -7761,6 +4780,8 @@ Return hash with valid author names =item contained_map_check() +=item reinit_role() + =item url_paste_fixups() =item apply_fixups() @@ -7793,9 +4814,7 @@ check on this Verify Content -=item devalidateversioncache() - -=item checkversions() +=item devalidateversioncache() & checkversions() Check Versions