--- loncom/interface/londocs.pm 2005/07/24 19:31:00 1.194 +++ loncom/interface/londocs.pm 2006/06/26 22:31:56 1.233 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.194 2005/07/24 19:31:00 raeburn Exp $ +# $Id: londocs.pm,v 1.233 2006/06/26 22:31:56 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,6 +42,8 @@ use HTML::Entities; use GDBM_File; use Apache::lonlocal; use Cwd; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; my $iconpath; @@ -119,16 +121,18 @@ sub authorhosts { sub dumpbutton { my ($home,$other,%outhash)=&authorhosts(); + my $type = &Apache::loncommon::course_type(); if ($home+$other==0) { return ''; } my $output='</td><td bgcolor="#DDDDCC">'; if ($home) { return '</td><td bgcolor="#DDDDCC">'. '<input type="submit" name="dumpcourse" value="'. - &mt('Dump Course DOCS to Construction Space').'" />'. + &mt('Dump '.$type.' DOCS to Construction Space').'" />'. &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs'); } else { return'</td><td bgcolor="#DDDDCC">'. - &mt('Dump Course DOCS to Construction Space: available on other servers'); + &mt('Dump '.$type. + ' DOCS to Construction Space: available on other servers'); } } @@ -140,10 +144,9 @@ sub clean { # -------------------------------------------------------- Actually dump course sub dumpcourse { - my $r=shift; - my $html=&Apache::lonxml::xmlbegin(); - $r->print($html.'<head><title>Dump DOCS</title></head>'. - &Apache::loncommon::bodytag('Dump Course DOCS to Construction Space'). + my ($r) = @_; + my $type = &Apache::loncommon::course_type(); + $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space'). '<form name="dumpdoc" method="post">'); my ($home,$other,%outhash)=&authorhosts(); unless ($home) { return ''; } @@ -166,7 +169,10 @@ sub dumpcourse { $crs=~s/\_/\//g; foreach (keys %replacehash) { my $newfilename=$title.'/'.$replacehash{$_}; + $newfilename=~s/\.(\w+)$//; + my $ext=$1; $newfilename=&clean($newfilename); + $newfilename.='.'.$ext; my @dirs=split(/\//,$newfilename); my $path='/home/'.$ca.'/public_html'; my $makepath=$path; @@ -219,7 +225,7 @@ sub dumpcourse { $r->print('</select>'); } my $title=$origcrsdata{'description'}; - $title=~s/\s+/\_/gs; + $title=~s/[\/\s]+/\_/gs; $title=&clean($title); $r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />'); &tiehash(); @@ -242,22 +248,23 @@ sub dumpcourse { $r->print("</table>\n"); &untiehash(); $r->print( - '<p><input type="submit" name="dumpcourse" value="'.&mt('Dump Course DOCS').'" /></p></form>'); + '<p><input type="submit" name="dumpcourse" value="'.&mt('Dump [_1] DOCS',$type).'" /></p></form>'); } } # ------------------------------------------------------ Generate "export" button sub exportbutton { - return ''; + my $type = &Apache::loncommon::course_type(); return '</td><td bgcolor="#DDDDCC">'. '<input type="submit" name="exportcourse" value="'. - &mt('Export Course to IMS').'" />'. - &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs'); + &mt('Export '.$type.' to IMS').'" />'. + &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs'); } sub exportcourse { my $r=shift; + my $type = &Apache::loncommon::course_type(); my %discussiontime = &Apache::lonnet::dump('discussiontimes', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); my $numdisc = keys %discussiontime; @@ -298,7 +305,7 @@ sub exportcourse { open(OUTPUT, "zip -r $imszip * 2> /dev/null |"); close(OUTPUT); chdir $cwd; - $outcome .= 'Download the zip file from <a href="'.$imszipfile.'">IMS course archive</a><br />'; + $outcome .= &mt('Download the zip file from <a href="[_1]">IMS '.lc($type).' archive</a><br />',$imszipfile,); if ($copyresult) { $outcome .= 'The following errors occurred during export - '.$copyresult; } @@ -306,15 +313,13 @@ sub exportcourse { $outcome = '<br />Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.<br />'; } } - my $html=&Apache::lonxml::xmlbegin(); - $r->print($html.'<head><title>Export Course</title></head>'. - &Apache::loncommon::bodytag('Export course to IMS content package')); + $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package')); $r->print($outcome); - $r->print('</body></html>'); + $r->print(&Apache::loncommon::end_page()); } else { my $display; $display = '<form name="exportdoc" method="post">'."\n"; - $display .= 'Choose which items you wish to export from your course.<br /><br />'; + $display .= &mt('Choose which items you wish to export from your '.$type.'.<br /><br />'); $display .= '<table border="0" cellspacing="0" cellpadding="3">'. '<tr><td><fieldset><legend> <b>Content items</b></legend>'. '<input type="button" value="check all" '. @@ -448,15 +453,13 @@ function containerCheck(item) { </script> |; - my $html=&Apache::lonxml::xmlbegin(); - $r->print($html.'<head><title>Export Course</title>'.$scripttag.'</head>'. - &Apache::loncommon::bodytag('Export course to IMS content package' -)); - - $r->print($display.'</table>'. + $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package', + $scripttag)); + $r->print($display.'</table>'. '<p><input type="hidden" name="finishexport" value="1">'. '<input type="submit" name="exportcourse" value="'. - &mt('Export Course DOCS').'" /></p></form></body></html>'); + &mt('Export '.$type.' DOCS').'" /></p></form>'. + &Apache::loncommon::end_page()); } } @@ -491,10 +494,21 @@ sub create_ims_store { ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'. ' xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'. ' http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n". +' <metadata> + <schema></schema> + <imsmd:lom> + <imsmd:general> + <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier> + <imsmd:title> + <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring> + </imsmd:title> + </imsmd:general> + </imsmd:lom> + </metadata>'."\n". ' <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n". ' <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'. ' structure="hierarchical">'."\n". -' <title>'.$env{'request.'.$env{'request.course.id'}.'.description'}.'</title>' +' <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>' } else { $$outcome .= 'An error occurred opening the IMS manifest file.<br />' ; @@ -542,7 +556,6 @@ sub build_package { $count = 0; my $imsresources; my $pkgdepth; - my $included = 0; while ($curRes = $it->next()) { if ($curRes == $it->BEGIN_MAP()) { $prevdepth = $depth; @@ -565,10 +578,13 @@ sub build_package { unless ($curRes->is_sequence()) { $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"'; } - if (($depth <= $prevdepth) && ($count > 1) && ($included)) { - print $ims_manifest "\n".' </item>'."\n"; + my $step = $prevdepth - $depth; + if (($step >= 0) && ($count > 1)) { + while ($step >= 0) { + print $ims_manifest "\n".' </item>'."\n"; + $step --; + } } - $included = 1; $prevdepth = $depth; my $itementry = @@ -610,8 +626,6 @@ sub build_package { } } $pkgdepth = $depth; - } else { - $included = 0; } } } @@ -646,7 +660,6 @@ sub process_content { my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_; my $content_type; my $message; -# find where user is author or co-author my @uploads = (); if ($curRes->is_sequence()) { $content_type = 'sequence'; @@ -700,6 +713,7 @@ sub process_content { if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'}) { $canedit= 1; } +# only include problem code where current user is author if ($canedit) { $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource'); } else { @@ -748,11 +762,13 @@ sub replicate_content { if ($copiedfile = Apache::File->new('>'.$destination)) { my $content; if ($caller eq 'resource') { - $content = &Apache::lonnet::getfile('/home/httpd/html/res/'.$url); + my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res'; + my $filepath = &Apache::lonnet::filelocation($respath,$url); + $content = &Apache::lonnet::getfile($filepath); if ($content eq -1) { $$message = 'Could not copy file '.$filename; } else { - &extract_media($content,$count,$tempexport,$href,'resource'); + &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource'); $repstatus = 'ok'; } } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') { @@ -760,10 +776,10 @@ sub replicate_content { $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode); if ($repstatus eq 'ok') { if ($url =~ /\.html?$/i) { - &extract_media(\$content,$count,$tempexport,$href,'uploaded'); + &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded'); } } else { - $$message = 'Could not render '.$url.' server message - '.$rtncode; + $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n"; } } elsif ($caller eq 'noedit') { # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. @@ -775,23 +791,85 @@ sub replicate_content { } close($copiedfile); } else { - $$message = 'Could not open destination file for '.$filename."\n"; + $$message = 'Could not open destination file for '.$filename."<br />\n"; } } else { - $$message = 'Could not determine name of file for '.$symb."\n"; + $$message = 'Could not determine name of file for '.$symb."<br />\n"; } if ($repstatus eq 'ok') { - $content_name = $count.'/'.$filename; + $content_name = 'resources/'.$count.'/'.$filename; } return $content_name; } sub extract_media { - my ($content,$count,$tempexport,$href,$caller) = @_; -# @$href will contain path to any embedded resources in the content. -# For LON-CAPA problems this would be images. applets etc. -# For uploaded HTML files this would be images etc. -# paths will be in the form $count/res/$file, and urls in the $content will be rewritten with the new paths. + my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_; + my ($dirpath,$container); + my %allfiles = (); + my %codebase = (); + if ($url =~ m-(.*/)([^/]+)$-) { + $dirpath = $1; + $container = $2; + } else { + $dirpath = $url; + $container = ''; + } + &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content); + foreach my $embed_file (keys(%allfiles)) { + my $filename; + if ($embed_file =~ m#([^/]+)$#) { + $filename = $1; + } else { + $filename = $embed_file; + } + my $newname = 'res/'.$filename; + my ($rtncode,$embed_content,$repstatus); + my $embed_url; + if ($embed_file =~ m-^/-) { + $embed_url = $embed_file; # points to absolute path + } else { + if ($embed_file =~ m-https?://-) { + next; # points to url + } else { + $embed_url = $dirpath.$embed_file; # points to relative path + } + } + if ($caller eq 'resource') { + my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res'; + my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url); + $embed_content = &Apache::lonnet::getfile($embed_path); + unless ($embed_content eq -1) { + $repstatus = 'ok'; + } + } elsif ($caller eq 'uploaded') { + + $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode); + } + if ($repstatus eq 'ok') { + my $destination = $tempexport.'/resources/'.$count.'/res'; + if (!-e "$destination") { + mkdir($destination,0755); + } + $destination .= '/'.$filename; + my $copiedfile; + if ($copiedfile = Apache::File->new('>'.$destination)) { + print $copiedfile $embed_content; + push @{$href}, 'resources/'.$count.'/res/'.$filename; + my $attrib_regexp = ''; + if (@{$allfiles{$embed_file}} > 1) { + $attrib_regexp = join('|',@{$allfiles{$embed_file}}); + } else { + $attrib_regexp = $allfiles{$embed_file}[0]; + } + $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi; + if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) { + $$content =~ s#\Q$embed_file\E#$newname#gi; + } + } + } else { + $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n"; + } + } return; } @@ -812,9 +890,9 @@ sub store_template { close($storetemplate); } if ($content_type eq 'external') { - return $count.'/'.$content_type.'.html'; + return 'resources/'.$count.'/'.$content_type.'.html'; } else { - return $count.'/'.$content_type.'.xml'; + return 'resources/'.$count.'/'.$content_type.'.xml'; } } } @@ -876,11 +954,10 @@ sub breadcrumbs { my $folderpath; my $cpinfo=''; if ($env{'form.markedcopy_url'}) { - &Apache::lonnet::logthis('Found '.$env{'form.markedcopy_url'}); $cpinfo='&markedcopy_url='. - &Apache::lonnet::escape($env{'form.markedcopy_url'}). + &escape($env{'form.markedcopy_url'}). '&markedcopy_title='. - &Apache::lonnet::escape($env{'form.markedcopy_title'}); + &escape($env{'form.markedcopy_title'}); } while (@folders) { my $folder=shift(@folders); @@ -888,18 +965,17 @@ sub breadcrumbs { if ($folderpath) {$folderpath.='&';} $folderpath.=$folder.'&'.$foldername; my $url='/adm/coursedocs?folderpath='. - &Apache::lonnet::escape($folderpath); + &escape($folderpath); &Apache::lonhtmlcommon::add_breadcrumb( {'href'=>$url.$cpinfo, - 'title'=>&Apache::lonnet::unescape($foldername), + 'title'=>&unescape($foldername), 'text'=>'<font size="+1">'. - &Apache::lonnet::unescape($foldername).'</font>' + &unescape($foldername).'</font>' }); } - return &Apache::lonhtmlcommon::breadcrumbs(undef,undef,undef,undef,undef, - 0,'nohelp'); + return &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp'); } sub editor { @@ -1037,7 +1113,7 @@ sub editor { if ($cmd eq 'del') { my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]); if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && - ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library)$/)) { + ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) { &Apache::lonnet::removeuploadedurl($url); } else { &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]); @@ -1099,8 +1175,8 @@ sub editor { foreach (split(/\&/,$env{'form.importdetail'})) { if (defined($_)) { my ($name,$url)=split(/\=/,$_); - $name=&Apache::lonnet::unescape($name); - $url=&Apache::lonnet::unescape($url); + $name=&unescape($name); + $url=&unescape($url); push @imports, $name, $url; } } @@ -1113,22 +1189,25 @@ sub editor { } } # Loading a complete map - if (($env{'form.importmap'}) && ($env{'form.loadmap'})) { - foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) { - my ($title,$url,$ext,$type)=split(/\:/,$_); - my $idx=&Apache::lonratedt::getresidx($url); - $Apache::lonratedt::resources[$idx]=$_; - $Apache::lonratedt::order - [$#Apache::lonratedt::order+1]=$idx; - } - + if ($env{'form.loadmap'}) { + if ($env{'form.importmap'}=~/\w/) { + foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) { + my ($title,$url,$ext,$type)=split(/\:/,$_); + my $idx=&Apache::lonratedt::getresidx($url); + $Apache::lonratedt::resources[$idx]=$_; + $Apache::lonratedt::order + [$#Apache::lonratedt::order+1]=$idx; + } # Store the changed version - ($errtext,$fatal)=&storemap($coursenum,$coursedom, + ($errtext,$fatal)=&storemap($coursenum,$coursedom, $folder.'.'.$container); - if ($fatal) { - $r->print('<p><font color="red">'.$errtext.'</font></p>'); - return; - } + if ($fatal) { + $r->print('<p><font color="red">'.$errtext.'</font></p>'); + return; + } + } else { + $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>'); + } } } # ---------------------------------------------------------------- End commands @@ -1138,6 +1217,8 @@ sub editor { $r->print('<table>'); foreach (@Apache::lonratedt::order) { my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]); + $name=&Apache::lonratsrv::qtescape($name); + $url=&Apache::lonratsrv::qtescape($url); unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $idx++; next; } $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum)); @@ -1248,14 +1329,14 @@ sub process_file_upload { method="post" enctype="multipart/form-data"> <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" /> <input type="hidden" name="cmd" value="upload_embedded" /> <input type="hidden" name="newidx" value="'.$newidx.'" /> - <input type="hidden" name="primaryurl" value="'.&Apache::lonnet::escape($url).'" /> + <input type="hidden" name="primaryurl" value="'.&escape($url).'" /> <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />'; $$upload_output .= '<b>Upload embedded files</b>:<br /> <table>'; foreach my $embed_file (keys(%{$allfiles})) { $$upload_output .= '<tr><td>'.$embed_file. '<input name="embedded_item_'.$num.'" type="file" /> - <input name="embedded_orig_'.$num.'" type="hidden" value="'.&Apache::lonnet::escape($embed_file).'" />'; + <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />'; my $attrib; if (@{$$allfiles{$embed_file}} > 1) { $attrib = join(':',@{$$allfiles{$embed_file}}); @@ -1266,7 +1347,7 @@ sub process_file_upload { '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />'; if (exists($$codebase{$embed_file})) { $$upload_output .= - '<input name="codebase_'.$num.'" type="hidden" value="'.&Apache::lonnet::escape($$codebase{$embed_file}).'" />'; + '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />'; } $$upload_output .= '</td></tr>'; $num ++; @@ -1288,10 +1369,13 @@ sub process_secondary_uploads { my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_; my $folder=$env{'form.folder'}; my $destination = 'docs/'; - if ($folder eq 'default') { + if ($folder =~ /^supplemental/) { + $destination = 'supplemental/'; + } + if (($folder eq 'default') || ($folder eq 'supplemental')) { $destination .= 'default/'; - } elsif ($folder =~ /^default_(\d+)$/) { - $destination .= $1.'/'; + } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { + $destination .= $2.'/'; } $destination .= $newidx; my ($url,$filename); @@ -1306,7 +1390,7 @@ sub entryline { my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_; $title=~s/\&colon\;/\:/g; $title=&HTML::Entities::encode(&HTML::Entities::decode( - &Apache::lonnet::unescape($title)),'"<>&\''); + &unescape($title)),'"<>&\''); my $renametitle=$title; my $foldertitle=$title; my $pagetitle=$title; @@ -1318,6 +1402,7 @@ sub entryline { &Apache::loncommon::plainname($2,$3).': <br />'. $foldertitle; } + $renametitle=~s/\\/\\\\/g; $renametitle=~s/\"\;/\\\"/g; my $line='<tr>'; # Edit commands @@ -1325,21 +1410,21 @@ sub entryline { my $folderpath; if ($env{'form.folderpath'}) { $container = 'sequence'; - $folderpath=&Apache::lonnet::escape($env{'form.folderpath'}); + $folderpath=&escape($env{'form.folderpath'}); # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"'); } my ($pagepath,$pagesymb); if ($env{'form.pagepath'}) { $container = 'page'; - $pagepath=&Apache::lonnet::escape($env{'form.pagepath'}); - $pagesymb=&Apache::lonnet::escape($env{'form.pagesymb'}); + $pagepath=&escape($env{'form.pagepath'}); + $pagesymb=&escape($env{'form.pagesymb'}); } my $cpinfo=''; if ($env{'form.markedcopy_url'}) { $cpinfo='&markedcopy_url='. - &Apache::lonnet::escape($env{'form.markedcopy_url'}). + &escape($env{'form.markedcopy_url'}). '&markedcopy_title='. - &Apache::lonnet::escape($env{'form.markedcopy_title'}); + &escape($env{'form.markedcopy_title'}); } if ($allowed) { my $incindex=$index+1; @@ -1371,7 +1456,24 @@ sub entryline { 'ct' => 'Cut', 'rn' => 'Rename', 'cp' => 'Copy'); + my $nocopy=0; + if ($url=~/\.(page|sequence)$/) { + foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) { + my ($title,$url,$ext,$type)=split(/\:/,$_); + if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) { + $nocopy=1; + last; + } + } + } + my $copylink=' '; if ($env{'form.pagepath'}) { + unless ($nocopy) { + $copylink=(<<ENDCOPY); +<a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'> +<font size="-2" color="#000099">$lt{'cp'}</font></a></td> +ENDCOPY + } $line.=(<<END); <form name="entry_$index" action="/adm/coursedocs" method="post"> <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" /> @@ -1395,10 +1497,15 @@ sub entryline { <font size="-2" color="#550044">$lt{'ct'}</font></a> <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'> <font size="-2" color="#009900">$lt{'rn'}</font></a> -<a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'> -<font size="-2" color="#000099">$lt{'cp'}</font></a></td> +$copylink END } else { + unless ($nocopy) { + $copylink=(<<ENDCOPY); +<a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'> +<font size="-2" color="#000099">$lt{'cp'}</font></a></td> +ENDCOPY + } $line.=(<<END); <form name="entry_$index" action="/adm/coursedocs" method="post"> <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" /> @@ -1421,8 +1528,7 @@ END <font size="-2" color="#550044">$lt{'ct'}</font></a> <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'> <font size="-2" color="#009900">$lt{'rn'}</font></a> -<a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'> -<font size="-2" color="#000099">$lt{'cp'}</font></a></td> +$copylink END } } @@ -1452,7 +1558,7 @@ END &Apache::lonnet::allowuploaded('/adm/coursedoc',$url); } } - $url=~s/^http\&colon\;\/\//\/adm\/wrapper\/ext\//; + $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-; if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) { my $symb=&Apache::lonnet::symbclean( &Apache::lonnet::declutter('uploaded/'. @@ -1476,21 +1582,21 @@ END } elsif ($url=~m|^/ext/|) { $url='/adm/wrapper'.$url; } - $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb); + $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); if ($container eq 'page') { my $symb=$env{'form.pagesymb'}; $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]); - $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb); + $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); } } my $parameterset=' '; - if ($isfolder) { - my $foldername=&Apache::lonnet::escape($foldertitle); + if ($isfolder || $extension eq 'sequence') { + my $foldername=&escape($foldertitle); my $folderpath=$env{'form.folderpath'}; if ($folderpath) { $folderpath.='&' }; $folderpath.=$folderarg.'&'.$foldername; - $url.='folderpath='.&Apache::lonnet::escape($folderpath).$cpinfo; + $url.='folderpath='.&escape($folderpath).$cpinfo; $parameterset='<label>'.&mt('Randomly Pick: '). '<input type="text" size="4" onChange="this.form.submit()" name="randpick_'.$orderidx.'" value="'. (&Apache::lonratedt::getparameter($orderidx, @@ -1500,7 +1606,7 @@ END } if ($ispage) { - my $pagename=&Apache::lonnet::escape($pagetitle); + my $pagename=&escape($pagetitle); my $pagepath; my $folderpath=$env{'form.folderpath'}; if ($folderpath) { $pagepath = $folderpath.'&' }; @@ -1514,12 +1620,12 @@ END $residx, $path.$pagearg.'.page'); } - $url.='pagepath='.&Apache::lonnet::escape($pagepath). - '&pagesymb='.&Apache::lonnet::escape($symb).$cpinfo; + $url.='pagepath='.&escape($pagepath). + '&pagesymb='.&escape($symb).$cpinfo; } $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon. '" border="0"></a></td>'. - "<td bgcolor='#FFFFBB'><a href='$url'>$title</a></td>"; + "<td bgcolor='#FFFFBB'><a href=\"$url\">$title</a></td>"; if (($allowed) && ($folder!~/^supplemental/)) { my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', @@ -1563,13 +1669,14 @@ sub tiehash { sub untiehash { if ($hashtied) { untie %hash; } $hashtied=0; + return OK; } # --------------------------------------------------------------- check on this sub checkonthis { my ($r,$url,$level,$title)=@_; - $url=&Apache::lonnet::unescape($url); + $url=&unescape($url); $alreadyseen{$url}=1; $r->rflush(); if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) { @@ -1639,29 +1746,45 @@ sub checkonthis { # +# ----------------------------------------------------------------- List Symbs +# +sub list_symbs { + my ($r) = @_; + + $r->print(&Apache::loncommon::start_page('Symb List')); + my $navmap = Apache::lonnavmaps::navmap->new(); + $r->print("<pre>\n"); + foreach my $res ($navmap->retrieveResources()) { + $r->print($res->compTitle()."\t".$res->symb()."\n"); + } + $r->print("\n</pre>\n"); + $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>'); +} + + +# # -------------------------------------------------------------- Verify Content # sub verifycontent { - my $r=shift; + my ($r) = @_; + my $type = &Apache::loncommon::course_type(); my $loaderror=&Apache::lonnet::overloaderror($r); if ($loaderror) { return $loaderror; } - my $html=&Apache::lonxml::xmlbegin(); - $r->print($html.'<head><title>Verify Content</title></head>'. - &Apache::loncommon::bodytag('Verify Course Documents')); + $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents')); $hashtied=0; undef %alreadyseen; %alreadyseen=(); &tiehash(); foreach (keys %hash) { if ($hash{$_}=~/\.(page|sequence)$/) { - if (($_=~/^src_/) && ($alreadyseen{&Apache::lonnet::unescape($hash{$_})})) { + if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) { $r->print('<hr /><font color="red">'. - &mt('The following sequence or page is included more than once in your course: '). - &Apache::lonnet::unescape($hash{$_}).'</font><br />'. + &mt('The following sequence or page is included more than once in your '.$type.': '). + &unescape($hash{$_}).'</font><br />'. &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />')); } } - if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&Apache::lonnet::unescape($hash{$_})})) { + if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) { &checkonthis($r,$hash{$_},0,$hash{'title_'.$1}); } } @@ -1680,10 +1803,9 @@ sub devalidateversioncache { } sub checkversions { - my $r=shift; - my $html=&Apache::lonxml::xmlbegin(); - $r->print($html.'<head><title>Check Versions</title></head>'. - &Apache::loncommon::bodytag('Check Course Document Versions')); + my ($r) = @_; + my $type = &Apache::loncommon::course_type(); + $r->print(&Apache::loncommon::start_page("Check $type Document Versions")); my $header=''; my $startsel=''; my $monthsel=''; @@ -1744,7 +1866,7 @@ sub checkversions { &changewarning($r,''); if ($env{'form.timerange'} eq 'all') { # show all documents - $header=&mt('All Documents in Course'); + $header=&mt('All Documents in '.$type); $allsel=1; foreach (keys %hash) { if ($_=~/^ids\_(\/res\/.+)$/) { @@ -1789,7 +1911,7 @@ sub checkversions { $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); my %lt=&Apache::lonlocal::texthash - ('st' => 'Version changes since start of Course', + ('st' => 'Version changes since start of '.$type, 'lm' => 'Version changes since last Month', 'lw' => 'Version changes since last Week', 'sy' => 'Version changes since Yesterday', @@ -1798,9 +1920,9 @@ sub checkversions { 'fi' => 'File', 'md' => 'Modification Date', 'mr' => 'Most recently published Version', - 've' => 'Version used in Course', - 'vu' => 'Set Version to be used in Course', -'sv' => 'Set Versions to be used in Course according to Selections below', + 've' => 'Version used in '.$type, + 'vu' => 'Set Version to be used in '.$type, +'sv' => 'Set Versions to be used in '.$type.' according to Selections below', 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)', 'sc' => 'Set all Resource Versions to current Version (Fix Versions)', 'di' => 'Differences'); @@ -1847,7 +1969,7 @@ ENDHEADERS '<td title="'.$lt{'mr'}.'"><nobr>Most Recent: '. '<font size="+1">'.$currentversion.'</font>'. '</nobr></td>'. - '<td title="'.$lt{'ve'}.'"><nobr>In Course: '. + '<td title="'.$lt{'ve'}.'"><nobr>In '.$type.': '. '<font size="+1">'); # Used in course my $usedversion=$hash{'version_'.$linkurl}; @@ -1951,15 +2073,16 @@ sub changewarning { my ($r,$postexec,$message,$url)=@_; if (!&is_hash_old()) { return; } my $pathvar='folderpath'; - my $path=&Apache::lonnet::escape($env{'form.folderpath'}); + my $path=&escape($env{'form.folderpath'}); if (!defined($url)) { if (defined($env{'form.pagepath'})) { $pathvar='pagepath'; - $path=&Apache::lonnet::escape($env{'form.pagepath'}); - $path.='&pagesymb='.&Apache::lonnet::escape($env{'form.pagesymb'}); + $path=&escape($env{'form.pagepath'}); + $path.='&pagesymb='.&escape($env{'form.pagesymb'}); } $url='/adm/coursedocs?'.$pathvar.'='.$path; } + my $course_type = &Apache::loncommon::course_type(); if (!defined($message)) { $message='Changes will become active for your current session after [_1], or the next time you log in.'; } @@ -1970,7 +2093,7 @@ sub changewarning { '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'. &mt($message,' <input type="hidden" name="'. $env{'request.role'}.'" value="1" /><input type="button" value="'. - &mt('re-initializing course').'" onClick="reinit(this.form)" />'). + &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />'). $help{'Caching'}.'</font></h3></form>'."\n\n"); } @@ -1980,16 +2103,17 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; + my $type = &Apache::loncommon::course_type(); # --------------------------------------------- Initialize help topics for this - foreach ('Adding_Course_Doc','Main_Course_Documents', - 'Adding_External_Resource','Navigate_Content', - 'Adding_Folders','Docs_Overview', 'Load_Map', - 'Supplemental','Score_Upload_Form','Adding_Pages', - 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive', - 'Check_Resource_Versions','Verify_Content') { - $help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_); - } + foreach ('Adding_Course_Doc','Main_Course_Documents', + 'Adding_External_Resource','Navigate_Content', + 'Adding_Folders','Docs_Overview', 'Load_Map', + 'Supplemental','Score_Upload_Form','Adding_Pages', + 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive', + 'Check_Resource_Versions','Verify_Content') { + $help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_); + } # Composite help files $help{'Syllabus'} = &Apache::loncommon::help_open_topic( 'Docs_About_Syllabus,Docs_Editing_Templated_Pages'); @@ -2003,13 +2127,18 @@ sub handler { 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages'); $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching'); - if ($env{'form.verify'}) { +# does this user have privileges to modify docs + my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); + + if ($allowed && $env{'form.verify'}) { &verifycontent($r); - } elsif ($env{'form.versions'}) { + } elsif ($allowed && $env{'form.listsymbs'}) { + &list_symbs($r); + } elsif ($allowed && $env{'form.versions'}) { &checkversions($r); - } elsif ($env{'form.dumpcourse'}) { + } elsif ($allowed && $env{'form.dumpcourse'}) { &dumpcourse($r); - } elsif ($env{'form.exportcourse'}) { + } elsif ($allowed && $env{'form.exportcourse'}) { &exportcourse($r); } else { # is this a standard course? @@ -2018,21 +2147,21 @@ sub handler { my $forcestandard = 0; my $forcesupplement; my $script=''; - my $allowed; - my $events=''; my $showdoc=0; my $containertag; my $uploadtag; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['folderpath','pagepath','pagesymb','markedcopy_url','markedcopy_title']); + ['folderpath','pagepath', + 'pagesymb','markedcopy_url', + 'markedcopy_title']); if ($env{'form.folderpath'}) { my (@folderpath)=split('&',$env{'form.folderpath'}); - $env{'form.foldername'}=&Apache::lonnet::unescape(pop(@folderpath)); + $env{'form.foldername'}=&unescape(pop(@folderpath)); $env{'form.folder'}=pop(@folderpath); } if ($env{'form.pagepath'}) { my (@pagepath)=split('&',$env{'form.pagepath'}); - $env{'form.pagename'}=&Apache::lonnet::unescape(pop(@pagepath)); + $env{'form.pagename'}=&unescape(pop(@pagepath)); $env{'form.folder'}=pop(@pagepath); $containertag = '<input type="hidden" name="pagepath" value="" />'. '<input type="hidden" name="pagesymb" value="" />'; @@ -2044,213 +2173,42 @@ sub handler { } unless ($showdoc) { # got called from remote if (($env{'form.folder'}=~/^default_/) || - ($env{'form.folder'} =~ m#^\d+/(pages|sequences)/#)) { + ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) { $forcestandard = 1; } $forcesupplement=($env{'form.folder'}=~/^supplemental_/); -# does this user have privileges to post, etc? - $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); if ($allowed) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); $script=&Apache::lonratedt::editscript('simple'); } } else { # got called in sequence from course $allowed=0; - $script='</script>'.&Apache::lonmenu::registerurl(1,undef).'<script>'; - $events='onLoad="'.&Apache::lonmenu::loadevents. - '" onUnload="'.&Apache::lonmenu::unloadevents.'"'; } # get course data my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; -# get personal data - +# get personal data my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; - my $plainname=&Apache::lonnet::escape( + my $plainname=&escape( &Apache::loncommon::plainname($uname,$udom)); # graphics settings $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/"); - my $now=time; - -# print screen - my $html=&Apache::lonxml::xmlbegin(); - $r->print(<<ENDDOCUMENT); -$html -<head> -<title>The LearningOnline Network with CAPA</title> -<script> -$script -</script> -ENDDOCUMENT - if ($allowed) { - $r->print(<<ENDNEWSCRIPT); -<script> -function makenewfolder(targetform,folderseq) { - var foldername=prompt('Name of New Folder','New Folder'); - if (foldername) { - targetform.importdetail.value=foldername+"="+folderseq; - targetform.submit(); - } -} - -function makenewpage(targetform,folderseq) { - var pagename=prompt('Name of New Page','New Page'); - if (pagename) { - targetform.importdetail.value=pagename+"="+folderseq; - targetform.submit(); - } -} - -function makenewext(targetname) { - this.document.forms.extimport.useform.value=targetname; - window.open('/adm/rat/extpickframe.html'); -} - -function makeexamupload() { - var title=prompt('Listed Title for the Uploaded Score'); - if (title) { - this.document.forms.newexamupload.importdetail.value= - title+'=/res/lib/templates/examupload.problem'; - this.document.forms.newexamupload.submit(); - } -} - -function makesmppage() { - var title=prompt('Listed Title for the Page'); - if (title) { - this.document.forms.newsmppg.importdetail.value= - title+'=/adm/$udom/$uname/$now/smppg'; - this.document.forms.newsmppg.submit(); - } -} - -function makesmpproblem() { - var title=prompt('Listed Title for the Problem'); - if (title) { - this.document.forms.newsmpproblem.importdetail.value= - title+'=/res/lib/templates/simpleproblem.problem'; - this.document.forms.newsmpproblem.submit(); - } -} - -function makebulboard() { - var title=prompt('Listed Title for the Bulletin Board'); - if (title) { - this.document.forms.newbul.importdetail.value= - title+'=/adm/$udom/$uname/$now/bulletinboard'; - this.document.forms.newbul.submit(); - } -} - -function makeabout() { - var user=prompt("Enter user\@domain for User's 'About Me' Page"); - 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= - 'About '+user+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme'; - this.document.forms.newaboutsomeone.submit(); - } else { - alert("Not a valid user\@domain"); - } - } else { - alert("Please enter both user and domain in the format user\@domain"); - } - } -} - -function makeims() { - var caller = document.forms.ims.folder.value; - var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one"; - newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes"); - newWindow.location.href = newlocation; -} - - -function finishpick() { - var title=this.document.forms.extimport.title.value; - var url=this.document.forms.extimport.url.value; - var form=this.document.forms.extimport.useform.value; - eval - ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+ - '";this.document.forms.'+form+'.submit();'); -} - -function changename(folderpath,index,oldtitle,container,pagesymb) { - var title=prompt('New Title',oldtitle); - if (title) { - 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; - } - if (container == 'page') { - this.document.forms.renameform.pagepath.value=folderpath; - this.document.forms.renameform.pagesymb.value=pagesymb; - } - this.document.forms.renameform.submit(); - } -} - -function removeres(folderpath,index,oldtitle,container,pagesymb) { - if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) { - this.document.forms.renameform.cmd.value='del_'+index; - if (container == 'sequence') { - this.document.forms.renameform.folderpath.value=folderpath; - } - if (container == 'page') { - this.document.forms.renameform.pagepath.value=folderpath; - this.document.forms.renameform.pagesymb.value=pagesymb; - } - this.document.forms.renameform.submit(); - } -} - -function cutres(folderpath,index,oldtitle,container,pagesymb) { - if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) { - this.document.forms.renameform.cmd.value='cut_'+index; - this.document.forms.renameform.markcopy.value=index; - if (container == 'sequence') { - this.document.forms.renameform.folderpath.value=folderpath; - } - if (container == 'page') { - this.document.forms.renameform.pagepath.value=folderpath; - this.document.forms.renameform.pagesymb.value=pagesymb; - } - this.document.forms.renameform.submit(); - } -} - -function markcopy(folderpath,index,oldtitle,container,pagesymb) { - this.document.forms.renameform.markcopy.value=index; - if (container == 'sequence') { - this.document.forms.renameform.folderpath.value=folderpath; - } - if (container == 'page') { - this.document.forms.renameform.pagepath.value=folderpath; - this.document.forms.renameform.pagesymb.value=pagesymb; + if ($allowed) { + $script .= &editing_js($udom,$uname); } - this.document.forms.renameform.submit(); -} - -</script> - -ENDNEWSCRIPT - } # -------------------------------------------------------------------- Body tag - $r->print('</head>'. - &Apache::loncommon::bodytag('Course Documents','',$events, - '','',$showdoc). - &Apache::loncommon::help_open_menu('','','','',273,'RAT')); + $script = '<script type="text/javascript">'."\n".$script."\n".'</script>'; + $r->print(&Apache::loncommon::start_page("$type Documents", $script, + {'force_register' => $showdoc,}). + &Apache::loncommon::help_open_menu('','',273,'RAT')); + my %allfiles = (); my %codebase = (); my ($upload_result,$upload_output); @@ -2269,15 +2227,15 @@ ENDNEWSCRIPT my %attribs = (); my $updateflag = 0; my $residx = $env{'form.newidx'}; - my $primary_url = &Apache::lonnet::unescape($env{'form.primaryurl'}); + my $primary_url = &unescape($env{'form.primaryurl'}); # Process file upload - phase two - gather secondary files. for (my $i=0; $i<$env{'form.phasetwo'}; $i++) { if ($env{'form.embedded_item_'.$i.'.filename'}) { my $javacodebase; $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx); - $origname{$i} = &Apache::lonnet::unescape($env{'form.embedded_orig_'.$i}); + $origname{$i} = &unescape($env{'form.embedded_orig_'.$i}); if (exists($env{'form.embedded_codebase_'.$i})) { - $javacodebase = &Apache::lonnet::unescape($env{'form.embedded_codebase_'.$i}); + $javacodebase = &unescape($env{'form.embedded_codebase_'.$i}); $origname{$i} =~ s#^\Q$javacodebase\E/##; } my @attributes = (); @@ -2287,7 +2245,7 @@ ENDNEWSCRIPT @attributes = ($env{'form.embedded_attrib_'.$i}); } foreach (@attributes) { - push(@{$attribs{$i}},&Apache::lonnet::unescape($_)); + push(@{$attribs{$i}},&unescape($_)); } if ($javacodebase) { $codebase{$i} = $javacodebase; @@ -2318,7 +2276,7 @@ ENDNEWSCRIPT $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; } if (exists($codebase{$item})) { - $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; + $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs } } # Save edited file. @@ -2336,8 +2294,8 @@ ENDNEWSCRIPT unless ($showdoc || $upload_result eq 'phasetwo') { # ----------------------------------------------------------------------------- my %lt=&Apache::lonlocal::texthash( - 'uplm' => 'Upload a new main course document', - 'upls' => 'Upload a new supplemental course document', + 'uplm' => 'Upload a new main '.lc($type).' document', + 'upls' => 'Upload a new supplemental '.lc($type).' document', 'impp' => 'Import a document', 'pubd' => 'Published documents', 'copm' => 'All documents out of a published map into this folder', @@ -2345,6 +2303,7 @@ ENDNEWSCRIPT 'upld' => 'Upload Document', 'srch' => 'Search', 'impo' => 'Import', + 'book' => 'Import Bookmarks', 'selm' => 'Select Map', 'load' => 'Load Map', 'reco' => 'Recover Deleted Resources', @@ -2355,6 +2314,7 @@ ENDNEWSCRIPT 'navc' => 'Navigate Contents', 'sipa' => 'Simple Page', 'sipr' => 'Simple Problem', + 'drbx' => 'Drop Box', 'scuf' => 'Score Upload Form', 'bull' => 'Bulletin Board', 'mypi' => 'My Personal Info', @@ -2372,6 +2332,7 @@ ENDNEWSCRIPT my %lt=&Apache::lonlocal::texthash( 'vc' => 'Verify Content', 'cv' => 'Check/Set Resource Versions', + 'ls' => 'List Symbs', ); my $folderpath=$env{'form.folderpath'}; @@ -2379,7 +2340,7 @@ ENDNEWSCRIPT if ($env{'form.folder'} eq '' || $env{'form.folder'} eq 'supplemental') { $folderpath='default&'. - &Apache::lonnet::escape(&mt('Main Course Documents')); + &escape(&mt('Main '.$type.' Documents')); } } unless ($env{'form.pagepath'}) { @@ -2406,11 +2367,13 @@ $uploadtag <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'} $dumpbut $exportbut +</td><td bgcolor="#DDDDCC"> + <input type="submit" name="listsymbs" value="$lt{'ls'}" /> </td></tr></table> </form> ENDCOURSEVERIFY $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc', - &mt('Editing the Table of Contents for your Course'))); + &mt('Editing the Table of Contents for your '.$type))); } # --------------------------------------------------------- Standard documents $r->print('<table border=2 cellspacing=4 cellpadding=4>'); @@ -2421,7 +2384,7 @@ ENDCOURSEVERIFY my $folder=$env{'form.folder'}; if ($folder eq '' || $folder eq 'supplemental') { $folder='default'; - $env{'form.folderpath'}='default&'.&Apache::lonnet::escape(&mt('Main Course Documents')); + $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents')); } my $postexec=''; if ($folder eq 'default') { @@ -2477,11 +2440,14 @@ $uploadtag <form action="/adm/coursedocs" method="post" name="simpleeditdefault"> $lt{'pubd'}<br /> $uploadtag -<input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}"> +<input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" /> +<br /> <nobr> -<input type=button onClick="javascript:groupimport();" value="$lt{'impo'}"> +<input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" /> $help{'Importing_LON-CAPA_Resource'} </nobr> +<br /> +<input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" /> <p> <hr /> $lt{'copm'}<br /> @@ -2494,7 +2460,7 @@ $help{'Load_Map'}</nobr> </form> <hr /> <form action="/adm/groupsort" method="post" name="recover"> -<input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1)" value="$lt{'reco'}" /> +<input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" /> </form> ENDFORM unless ($env{'form.pagepath'}) { @@ -2508,7 +2474,7 @@ $uploadtag value="$lt{'extr'}" /> $help{'Adding_External_Resource'} </nobr> </form> -<form action="/adm/imsimportdocs" method="post" name="ims"> +<br /><form action="/adm/imsimportdocs" method="post" name="ims"> <input type="hidden" name="folder" value="$folder" /> <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" /> </nobr> @@ -2518,7 +2484,7 @@ ENDFORM $r->print('</td><td bgcolor="#DDDDDD">'); unless ($env{'form.pagepath'}) { $r->print(<<ENDFORM); -<form action="/adm/coursedocs" method="post" name="newfolder"> +<br /><form action="/adm/coursedocs" method="post" name="newfolder"> <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" /> <input type=hidden name="importdetail" value=""> <nobr> @@ -2527,7 +2493,7 @@ onClick="javascript:makenewfolder(this.f value="$lt{'newf'}" />$help{'Adding_Folders'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newpage"> +<br /><form action="/adm/coursedocs" method="post" name="newpage"> <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" /> <input type=hidden name="importdetail" value=""> <nobr> @@ -2536,7 +2502,7 @@ onClick="javascript:makenewpage(this.for value="$lt{'newp'}" />$help{'Adding_Pages'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newsyl"> +<br /><form action="/adm/coursedocs" method="post" name="newsyl"> $uploadtag <input type=hidden name="importdetail" value="Syllabus=/public/$coursedom/$coursenum/syllabus"> @@ -2545,7 +2511,7 @@ value="Syllabus=/public/$coursedom/$cour $help{'Syllabus'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newnav"> +<br /><form action="/adm/coursedocs" method="post" name="newnav"> $uploadtag <input type=hidden name="importdetail" value="Navigate Content=/adm/navmaps"> @@ -2554,7 +2520,7 @@ value="Navigate Content=/adm/navmaps"> $help{'Navigate_Content'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newsmppg"> +<br /><form action="/adm/coursedocs" method="post" name="newsmppg"> $uploadtag <input type=hidden name="importdetail" value=""> <nobr> @@ -2562,7 +2528,7 @@ $uploadtag onClick="javascript:makesmppage();" /> $help{'Simple Page'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newsmpproblem"> +<br /><form action="/adm/coursedocs" method="post" name="newsmpproblem"> $uploadtag <input type=hidden name="importdetail" value=""> <nobr> @@ -2570,7 +2536,15 @@ $uploadtag onClick="javascript:makesmpproblem();" />$help{'Simple Problem'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newexamupload"> +<br /><form action="/adm/coursedocs" method="post" name="newdropbox"> +$uploadtag +<input type=hidden name="importdetail" value=""> +<nobr> +<input name="newdropbox" type="button" value="$lt{'drbx'}" +onClick="javascript:makedropbox();" /> +</nobr> +</form> +<br /><form action="/adm/coursedocs" method="post" name="newexamupload"> $uploadtag <input type=hidden name="importdetail" value=""> <nobr> @@ -2579,7 +2553,7 @@ onClick="javascript:makeexamupload();" / $help{'Score_Upload_Form'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newbul"> +<br /><form action="/adm/coursedocs" method="post" name="newbul"> $uploadtag <input type=hidden name="importdetail" value=""> <nobr> @@ -2588,7 +2562,7 @@ onClick="javascript:makebulboard();" /> $help{'Bulletin Board'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newaboutme"> +<br /><form action="/adm/coursedocs" method="post" name="newaboutme"> $uploadtag <input type=hidden name="importdetail" value="$plainname=/adm/$udom/$uname/aboutme"> @@ -2597,7 +2571,7 @@ value="$plainname=/adm/$udom/$uname/abou $help{'My Personal Info'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newaboutsomeone"> +<br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone"> $uploadtag <input type=hidden name="importdetail" value=""> <nobr> @@ -2617,7 +2591,7 @@ $uploadtag onClick="javascript:makesmpproblem();" />$help{'Simple Problem'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="newexamupload"> +<br /><form action="/adm/coursedocs" method="post" name="newexamupload"> $uploadtag <input type=hidden name="importdetail" value=""> <nobr> @@ -2644,7 +2618,7 @@ ENDBLOCK if ($folder =~ /^supplemental$/ && $env{'form.folderpath'} =~ /^default\&/) { $env{'form.folderpath'}='supplemental&'. - &Apache::lonnet::escape(&mt('Supplemental Course Documents')); + &escape(&mt('Supplemental '.$type.' Documents')); } &editor($r,$coursenum,$coursedom,$folder,$allowed); if ($allowed) { @@ -2660,7 +2634,15 @@ ENDBLOCK <tr><td bgcolor="#DDDDDD"> <form action="/adm/coursedocs" method="post" enctype="multipart/form-data"> <input type="file" name="uploaddoc" size="40"> -<br />$lt{'comment'}:<br /> +<br /> +<br /> +<nobr> +<label>$lt{'parse'}? +<input type="checkbox" name="parserflag" /> +</label> +</nobr> +<br /><br /> +$lt{'comment'}:<br /> <textarea cols=50 rows=4 name='comment'> </textarea> <br /> @@ -2682,7 +2664,7 @@ onClick="javascript:makenewfolder(this.f value="$lt{'newf'}" /> $help{'Adding_Folders'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="supnewext"> +<br /><form action="/adm/coursedocs" method="post" name="supnewext"> <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" /> <input type=hidden name="importdetail" value=""> <nobr> @@ -2691,7 +2673,7 @@ onClick="javascript:makenewext('supnewex value="$lt{'extr'}" /> $help{'Adding_External_Resource'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="supnewsyl"> +<br /><form action="/adm/coursedocs" method="post" name="supnewsyl"> <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" /> <input type=hidden name="importdetail" value="Syllabus=/public/$coursedom/$coursenum/syllabus"> @@ -2700,7 +2682,7 @@ value="Syllabus=/public/$coursedom/$cour $help{'Syllabus'} </nobr> </form> -<form action="/adm/coursedocs" method="post" name="subnewaboutme"> +<br /><form action="/adm/coursedocs" method="post" name="subnewaboutme"> <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" /> <input type=hidden name="importdetail" value="$plainname=/adm/$udom/$uname/aboutme"> @@ -2728,9 +2710,176 @@ ENDSUPFORM } } } - $r->print('</body></html>'); + $r->print(&Apache::loncommon::end_page()); return OK; } + +sub editing_js { + my ($udom,$uname) = @_; + my $now = time(); + + return <<ENDNEWSCRIPT; +function makenewfolder(targetform,folderseq) { + var foldername=prompt('Name of New Folder','New Folder'); + if (foldername) { + targetform.importdetail.value=foldername+"="+folderseq; + targetform.submit(); + } +} + +function makenewpage(targetform,folderseq) { + var pagename=prompt('Name of New Page','New Page'); + if (pagename) { + targetform.importdetail.value=pagename+"="+folderseq; + targetform.submit(); + } +} + +function makenewext(targetname) { + this.document.forms.extimport.useform.value=targetname; + window.open('/adm/rat/extpickframe.html'); +} + +function makeexamupload() { + var title=prompt('Listed Title for the Uploaded Score'); + if (title) { + this.document.forms.newexamupload.importdetail.value= + title+'=/res/lib/templates/examupload.problem'; + this.document.forms.newexamupload.submit(); + } +} + +function makesmppage() { + var title=prompt('Listed Title for the Page'); + if (title) { + this.document.forms.newsmppg.importdetail.value= + title+'=/adm/$udom/$uname/$now/smppg'; + this.document.forms.newsmppg.submit(); + } +} + +function makesmpproblem() { + var title=prompt('Listed Title for the Problem'); + if (title) { + this.document.forms.newsmpproblem.importdetail.value= + title+'=/res/lib/templates/simpleproblem.problem'; + this.document.forms.newsmpproblem.submit(); + } +} + +function makedropbox() { + var title=prompt('Listed Title for the Drop Box'); + if (title) { + this.document.forms.newdropbox.importdetail.value= + title+'=/res/lib/templates/DropBox.problem'; + this.document.forms.newdropbox.submit(); + } +} + +function makebulboard() { + var title=prompt('Listed Title for the Bulletin Board'); + if (title) { + this.document.forms.newbul.importdetail.value= + title+'=/adm/$udom/$uname/$now/bulletinboard'; + this.document.forms.newbul.submit(); + } +} + +function makeabout() { + var user=prompt("Enter user\@domain for User's 'About Me' Page"); + 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= + 'About '+user+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme'; + this.document.forms.newaboutsomeone.submit(); + } else { + alert("Not a valid user\@domain"); + } + } else { + alert("Please enter both user and domain in the format user\@domain"); + } + } +} + +function makeims() { + var caller = document.forms.ims.folder.value; + var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one"; + newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes"); + newWindow.location.href = newlocation; +} + + +function finishpick() { + var title=this.document.forms.extimport.title.value; + var url=this.document.forms.extimport.url.value; + var form=this.document.forms.extimport.useform.value; + eval + ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+ + '";this.document.forms.'+form+'.submit();'); +} + +function changename(folderpath,index,oldtitle,container,pagesymb) { + var title=prompt('New Title',oldtitle); + if (title) { + 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; + } + if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; + } + this.document.forms.renameform.submit(); + } +} + +function removeres(folderpath,index,oldtitle,container,pagesymb) { + if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) { + this.document.forms.renameform.cmd.value='del_'+index; + if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; + } + if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; + } + this.document.forms.renameform.submit(); + } +} + +function cutres(folderpath,index,oldtitle,container,pagesymb) { + if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) { + this.document.forms.renameform.cmd.value='cut_'+index; + this.document.forms.renameform.markcopy.value=index; + if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; + } + if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; + } + this.document.forms.renameform.submit(); + } +} + +function markcopy(folderpath,index,oldtitle,container,pagesymb) { + this.document.forms.renameform.markcopy.value=index; + if (container == 'sequence') { + this.document.forms.renameform.folderpath.value=folderpath; + } + if (container == 'page') { + this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; + } + this.document.forms.renameform.submit(); +} + +ENDNEWSCRIPT +} 1; __END__