--- loncom/interface/londocs.pm 2010/11/08 19:47:04 1.411.2.6 +++ loncom/interface/londocs.pm 2011/12/04 15:51:58 1.467 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.411.2.6 2010/11/08 19:47:04 raeburn Exp $ +# $Id: londocs.pm,v 1.467 2011/12/04 15:51:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -41,7 +41,6 @@ use Apache::lonratedt(); use Apache::lonxml; use Apache::lonclonecourse; use Apache::lonnavmaps; -use Apache::londocsgci; use HTML::Entities; use GDBM_File; use Apache::lonlocal; @@ -121,14 +120,19 @@ sub dumpbutton { my $crstype = &Apache::loncommon::course_type(); if ($home+$other==0) { return ''; } if ($home) { - my $link = "<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"dumpcourse\", \"".&mt('Dump '.$crstype.' DOCS to Construction Space')."\")'>".&mt('Dump '.$crstype.' DOCS to Construction Space')."</a>"; - return $link.' '. - &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs').'<br />'; - } else { - return '<div>'. - &mt('Dump '.$crstype. - ' DOCS to Construction Space: available on other servers'). - '</div>'; + my $link = + "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"dumpcourse\", \"" + .&mt('Dump '.$crstype.' Documents to Construction Space') + ."\")'>" + .&mt('Dump '.$crstype.' Documents to Construction Space') + .'</a>'; + return + $link.' ' + .&Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs') + .'<br />'; + } else { + return + &mt('Dump '.$crstype.' Documents to Construction Space: available on other servers'); } } @@ -143,9 +147,9 @@ sub clean { sub dumpcourse { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' DOCS to Construction Space'). + $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Documents to Construction Space'). '<form name="dumpdoc" action="" method="post">'); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' DOCS to Construction Space')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Documents to Construction Space')); my ($home,$other,%outhash)=&authorhosts(); unless ($home) { return ''; } my $origcrsid=$env{'request.course.id'}; @@ -172,7 +176,7 @@ sub dumpcourse { $newfilename=&clean($newfilename); $newfilename.='.'.$ext; my @dirs=split(/\//,$newfilename); - my $path='/home/'.$ca.'/public_html'; + my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca"; my $makepath=$path; my $fail=0; for (my $i=0;$i<$#dirs;$i++) { @@ -256,7 +260,7 @@ sub dumpcourse { $r->print(&Apache::loncommon::end_data_table()); &untiehash(); $r->print( - '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype DOCS").'" /></p></form>'); + '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Documents").'" /></p></form>'); } } @@ -264,7 +268,7 @@ sub dumpcourse { sub exportbutton { my $crstype = &Apache::loncommon::course_type(); - return "<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"exportcourse\", \"".&mt('IMS Export')."\")'>".&mt('IMS Export')."</a>". + return "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"exportcourse\", \"".&mt('IMS Export')."\")'>".&mt('IMS Export')."</a>". &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'<br />'; } @@ -276,6 +280,7 @@ sub exportcourse { my %discussiontime = &Apache::lonnet::dump('discussiontimes', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); my $numdisc = keys(%discussiontime); + my $numprobs = 0; my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package'). @@ -306,6 +311,7 @@ sub exportcourse { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['archive','discussion']); + my $format = $env{'form.format'}; my @exportitems = &Apache::loncommon::get_env_multiple('form.archive'); my @discussions = &Apache::loncommon::get_env_multiple('form.discussion'); if (@exportitems == 0 && @discussions == 0) { @@ -327,9 +333,10 @@ sub exportcourse { my $imsresources; my $tempexport; my $copyresult; - my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport); + my $testbank; + my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport,$format,\$testbank); if ($manifestok) { - &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest); + &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest,$format,$testbank); close($ims_manifest); #Create zip file in prtspool @@ -342,20 +349,20 @@ sub exportcourse { open(OUTPUT, "zip -r $imszip * 2> /dev/null |"); close(OUTPUT); chdir $cwd; + $outcome .= '<p>' + .&mt('[_1]Your IMS package[_2] is ready for download.' + ,'<a href="'.$imszipfile.'">','</a>') + .'</p>'; if ($copyresult) { $outcome .= '<p class="LC_error">' .&mt('The following errors occurred during export - [_1]' ,$copyresult) .'</p>'; } - $outcome .= '<p>' - .&mt('[_1]Your IMS package[_2] is ready for download.' - ,'<a href="'.$imszipfile.'">','</a>') - .'</p>'; } else { $outcome = '<p class="LC_error">' .&mt('Unfortunately you will not be able to retrieve' - .' an IMS archive of this posts at this time,' + .' an IMS archive of your course at this time,' .' because there was a problem creating a' .' manifest file.') .'</p>' @@ -369,24 +376,26 @@ sub exportcourse { $r->print($outcome); $r->print(&Apache::loncommon::end_page()); } else { - my $display; - $display = '<form name="exportdoc" action="" method="post">'."\n"; - $display .= '<p>' - .&mt('Choose which items you wish to export from your '.$crstype.'.') - .'</p>'; - $display .= '<div class="LC_columnSection"><fieldset>'. + my $display='<form name="exportdoc" action="" method="post">'."\n". + '<p>'. + &mt('Choose which items you wish to export from your '.$crstype.'.'). + '</p>'. + '<div class="LC_columnSection"><fieldset>'. '<legend>'.&mt('Content items').'</legend>'. '<input type="button" value="'.&mt('check all').'" '. 'onclick="javascript:checkAll(document.exportdoc.archive)" />'. ' <input type="button" value="'.&mt('uncheck all').'"'. - ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset>'. - '<fieldset>'. - '<legend>'.&mt('Discussion posts').'</legend>'. - '<input type="button" value="'.&mt('check all').'"'. - ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'. - ' <input type="button" value="'.&mt('uncheck all').'"'. - ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" />'. - '</fieldset></div>'; + ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset>'; + if ($numdisc > 0) { + $display .= '<fieldset>'. + '<legend>'.&mt('Discussion posts').'</legend>'. + '<input type="button" value="'.&mt('check all').'"'. + ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'. + ' <input type="button" value="'.&mt('uncheck all').'"'. + ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" />'. + '</fieldset>'; + } + $display .= '</div>'; my $curRes; my $depth = 0; my $count = 0; @@ -397,15 +406,11 @@ sub exportcourse { my $lastcontainer = $startcount; $display .= &Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() - .'<th>'.&mt('Export content item?').'</th>' - .'<th>'; + .'<th>'.&mt('Export content item?').'</th>'; if ($numdisc > 0) { - $display .= &mt('Export discussion posts?'); - } else { - $display .= ' '; + $display .= '<th>'.&mt('Export discussion posts?').'</th>'; } - $display .= '</th>' - .&Apache::loncommon::end_data_table_header_row(); + $display .= &Apache::loncommon::end_data_table_header_row(); while ($curRes = $it->next()) { if (ref($curRes)) { $count ++; @@ -426,37 +431,35 @@ sub exportcourse { $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard'; } } + my $currelem = $count+$boards+$startcount; $display .= &Apache::loncommon::start_data_table_row() .'<td>'."\n" .'<input type="checkbox" name="archive" value="'.$count.'" '; if (($curRes->is_sequence()) || ($curRes->is_page())) { - my $checkitem = $count + $boards + $startcount; - $display .= 'onclick="javascript:propagateCheck('."'$checkitem'".')"'; + $lastcontainer = $currelem; + $display .= 'onclick="javascript:propagateCheck('."'$currelem'".')"'; + } elsif ($curRes->is_problem()) { + $numprobs ++; } $display .= ' />'."\n"; for (my $i=0; $i<$depth; $i++) { - $display .= '<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />' - .'<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />'."\n"; + $display .= ('<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />' x2)."\n"; } if ($curRes->is_sequence()) { $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" /> '."\n"; - $lastcontainer = $count + $startcount + $boards; } elsif ($curRes->is_page()) { $display .= '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" /> '."\n"; - $lastcontainer = $count + $startcount + $boards; } - my $currelem = $count+$boards+$startcount; $children{$parent{$depth}} .= $currelem.':'; $display .= ' '.$curRes->title().'</td>'."\n"; # Existing discussion posts? if ($discussiontime{$ressymb} > 0) { $boards ++; - $currelem = $count+$boards+$startcount; $display .= '<td align="right">' .'<input type="checkbox" name="discussion" value="'.$count.'" />' .'</td>'."\n"; - } else { + } elsif ($numdisc > 0) { $display .= '<td> </td>'."\n"; } $display .= &Apache::loncommon::end_data_table_row(); @@ -521,6 +524,16 @@ function containerCheck(item) { $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package', $scripttag)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export')); + if ($numprobs > 0) { + $display .= '<p><span class="LC_nobreak">'. + &mt('Export format for LON-CAPA problems:'). + '<label><input type="radio" name="format" value="xml" checked="checked" />'. + ' '.&mt('XML').'</label>'.(' ' x3). + '<label><input type="radio" name="format" value="html" />'. + ' '.&mt('HTML').'</label>'.(' ' x3). + '<label><input type="radio" name="format" value="plaintext" />'. + ' '.&mt('Text').'</label></span></p>'; + } $r->print($display. '<p><input type="hidden" name="finishexport" value="1" />'. '<input type="submit" name="exportcourse" value="'. @@ -529,7 +542,7 @@ function containerCheck(item) { } sub create_ims_store { - my ($now,$manifestok,$outcome,$tempexport) = @_; + my ($now,$manifestok,$outcome,$tempexport,$format,$testbank) = @_; $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports'; my $ims_manifest; if (!-e $$tempexport) { @@ -573,7 +586,11 @@ sub create_ims_store { ' <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n". ' <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'. ' structure="hierarchical">'."\n". -' <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>' +' <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'; + if ($format eq 'plaintext') { + my $testbankfilename = $$tempexport.'/testbank.txt'; + $$testbank = Apache::File->new('>'.$testbankfilename); + } } else { $$outcome .= 'An error occurred opening the IMS manifest file.<br />' ; @@ -582,7 +599,8 @@ sub create_ims_store { } sub build_package { - my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_; + my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult, + $ims_manifest,$format,$testbank) = @_; # first iterator to look for dependencies my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef); my $curRes; @@ -621,6 +639,7 @@ sub build_package { $count = 0; my $imsresources; my $pkgdepth; + my $currdirpath = 'Top'; while ($curRes = $it->next()) { if ($curRes == $it->BEGIN_MAP()) { $prevdepth = $depth; @@ -658,10 +677,28 @@ sub build_package { '<title>'.$curRes->title().'</title>'; print $ims_manifest "\n".$itementry; - unless ($curRes->is_sequence()) { + if ($curRes->is_sequence()) { + $currdirpath = 'Top'; + my $pcslist = $curRes->map_hierarchy(); + if ($pcslist ne '') { + foreach my $pc (split(/,/,$pcslist),$curRes->map_pc()) { + next if ($pc <= 1); + my $res = $navmap->getByMapPc($pc); + if (ref($res)) { + my $encloser = $res->title(); + if ($encloser) { + if ($currdirpath) { + $currdirpath .= ' -> '; + } + $currdirpath .= $encloser; + } + } + } + } + } else { my $content_file; my @hrefs = (); - &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport); + &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport,$format,$currdirpath,$testbank); if ($content_file) { $imsresources .= "\n". ' <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count. @@ -722,7 +759,7 @@ sub get_dependencies { } sub process_content { - my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_; + my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport,$format,$currdirpath,$testbank) = @_; my $content_type; my $message; my @uploads = (); @@ -779,10 +816,15 @@ sub process_content { $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 { - $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit'); + if (($format eq 'html') || ($format eq 'plaintext')) { + my $title = $curRes->title; + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,$format,$currdirpath,$title,$testbank); + } elsif ($format eq 'xml') { + if ($canedit) { + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource'); + } else { + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit'); + } } } elsif ($symb =~ m-uploaded/$cdom/$cnum-) { $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded'); @@ -802,7 +844,8 @@ sub process_content { } sub replicate_content { - my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_; + my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller,$currdirpath, + $title,$testbank) = @_; my ($map,$ind,$url); if ($caller eq 'templateupload') { $url = $symb; @@ -846,10 +889,71 @@ sub replicate_content { } else { $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n"; } - } elsif ($caller eq 'noedit') { + } elsif (($caller eq 'noedit') || ($caller eq 'html') || + ($caller eq 'plaintext')) { # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. + my %form = ( + grade_symb => $symb, + grade_courseid => $cdom.'_'.$cnum, + grade_domain => $env{'user.domain'}, + grade_username => $env{'user.name'}, + grade_imsexport => 1, + instructor_comments => 'hide', + ); + my $feedurl=&Apache::lonnet::clutter($url); + my ($userview,$response)=&Apache::lonnet::ssi_body($feedurl,%form); + if (ref($response)) { + if ($response->is_success) { + $content = $userview; + $content =~ s/\Qonchange="javascript:setSubmittedPart('\E[^\']+\Q');"\E//g; + $content =~ s/^\s*[\n\r]+$//; + if ($caller eq 'plaintext') { + my @lines = split(/[\n\r]+/,$content); + my @tosave; + my $foilcounter = 0; + my @alphabet = ('a'..'z'); + my $mc_answer; + foreach my $line (@lines) { + next if ($line =~ /^\s*$/); + if ($line =~ m{(|\Q<\label>\E)\Q<br />Incorrect:<label>\E}) { + $foilcounter ++; + } elsif ($line =~ m{(|\Q</label>\E)\Q<br />Correct:<b><label>\E}) { + $foilcounter ++; + $mc_answer = $alphabet[$foilcounter-1]; + } elsif ($line !~ m{\Q</label>\E(|\Q</b>\E)\Q<br />\E}) { + $line =~ s/^(\s+|\s+)$//g; + $line =~ s{^\Q<b>\E([^<]+)\Q</b>\E$}{1}; + $tosave[$foilcounter] .= $line.' '; + } + $content = join("\t",@tosave); + if ($mc_answer) { + $content .= "\t".$mc_answer."\n"; + } + } + if (@tosave) { + my $qtype; + if ($mc_answer) { + $qtype = 'MC'; + } + $content = $currdirpath."\t".$title."\t$qtype\t".join("\t",@tosave); + if ($mc_answer) { + $content .= "\t".$mc_answer; + } + $content .= "\n"; + } + } else { + $content = '<html><body>'.$content.'</body></html>'; + } + if (($caller eq 'plaintext') && ($testbank)) { + print $testbank $content; + } + } else { + $content = 'Not the owner of this resource'; + } + } else { + $content = 'Not the owner of this resource'; + } $repstatus = 'ok'; - $content = 'Not the owner of this resource'; } if ($repstatus eq 'ok') { print $copiedfile $content; @@ -907,7 +1011,6 @@ sub extract_media { $repstatus = 'ok'; } } elsif ($caller eq 'uploaded') { - $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode); } if ($repstatus eq 'ok') { @@ -1152,6 +1255,7 @@ sub docs_change_log { &Apache::loncommon::restore_course_settings('docs_log', \%saveable_parameters); if (!$env{'form.show'}) { $env{'form.show'}=10; } +# FIXME: internationalization seems wrong here my %lt=('hiddenresource' => 'Resources hidden', 'encrypturl' => 'URL hidden', 'randompick' => 'Randomly pick', @@ -1240,6 +1344,7 @@ sub docs_change_log { $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>'); foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder') { if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) { +# FIXME: internationalization seems wrong here $r->print('<li>'. &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]', $docslog{$id}{'logentry'}{'parameter_value_'.$parameter}) @@ -1472,7 +1577,7 @@ sub handle_edit_cmd { if ($cmd eq 'del') { if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && - ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) { + ($url!~/$LONCAPA::assess_page_seq_re/)) { &Apache::lonnet::removeuploadedurl($url); } else { &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]); @@ -1508,7 +1613,8 @@ sub handle_edit_cmd { } sub editor { - my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype)=@_; + my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype, + $supplementalflag,$orderhash)=@_; my $container= ($env{'form.pagepath'}) ? 'page' : 'sequence'; @@ -1523,12 +1629,11 @@ sub editor { $LONCAPA::map::resources[$idx]=''; } - my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order); - if ($allowed) { - ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = &breadcrumbs($allowed,$crstype); $r->print($breadcrumbtrail); - } else { + + unless ($allowed) { $randompick = -1; } @@ -1609,13 +1714,12 @@ sub editor { my $shown=0; if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) { $r->print('<div class="LC_Box">'. - '<p>'.&mt('Parameters:'). - '<ul>'. + '<ol class="LC_docs_parameters"><li class="LC_docs_parameters_title">'.&mt('Parameters:').'</li>'. ($randompick>=0?'<li>'.&mt('randomly pick [quant,_1,resource]',$randompick).'</li>':''). ($ishidden?'<li>'.&mt('contents hidden').'</li>':''). ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':''). ($is_random_order?'<li>'.&mt('random order').'</li>':''). - '</ul></p>'); + '</ol>'); if ($randompick>=0) { $r->print('<p class="LC_warning">' .&mt('Caution: this folder is set to randomly pick a subset' @@ -1639,7 +1743,9 @@ sub editor { $r->print('</div>'); } - my $output; + 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]); $name=&LONCAPA::map::qtescape($name); @@ -1651,29 +1757,41 @@ sub editor { $idx++; $shown++; } + &Apache::loncommon::end_data_table_count(); + if ($shown) { - $r->print(&Apache::loncommon::start_data_table()); + $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll') + .&Apache::loncommon::start_data_table(undef,'contentlist'); if ($allowed) { - $r->print(&Apache::loncommon::start_data_table_header_row() + $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>'); + .'<th colspan="2">'.&mt('Document').'</th>'; if ($folder !~ /^supplemental/) { - $->print('<th colspan="4">'.&mt('Settings').'</th>'); + $to_show .= '<th colspan="4">'.&mt('Settings').'</th>'; } - $r->print(&Apache::loncommon::end_data_table_header_row()); + $to_show .= &Apache::loncommon::end_data_table_header_row(); } - $r->print($output + $to_show .= $output.' ' .&Apache::loncommon::end_data_table() - ); + .'<br style="line-height:2px;" />' + .&Apache::loncommon::end_scrollbox(); } else { - $r->print('<p class="LC_info">' + $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll') + .'<div class="LC_info" id="contentlist">' .&mt('Currently no documents.') - .'</p>' - ); + .'</div>' + .&Apache::loncommon::end_scrollbox(); + } + my $tid = 1; + if ($supplementalflag) { + $tid = 2; } if ($allowed) { + $r->print(&generate_edit_table($tid,$orderhash,$to_show)); &print_paste_buffer($r,$container); + } else { + $r->print($to_show); } return; } @@ -1681,11 +1799,10 @@ sub editor { sub process_file_upload { my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_; # upload a file, if present - my $parseaction; - if ($env{'form.parserflag'}) { + my ($parseaction,$showupload,$nextphase,$mimetype); + if ($env{'form.parserflag'}) { $parseaction = 'parse'; } - my $phase_status; my $folder=$env{'form.folder'}; if ($folder eq '') { $folder='default'; @@ -1704,7 +1821,8 @@ sub process_file_upload { $LONCAPA::map::resources[1]=''; } if ($fatal) { - return 'failed'; + $$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/) { @@ -1715,13 +1833,23 @@ sub process_file_upload { } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { $destination .= $2.'/'; } -# this is for a course, not a user, so set coursedoc flag -# probably the only place in the system where this should be "1" +# this is for a course, not a user, so set context to coursedoc. my $newidx=&LONCAPA::map::getresidx(); $destination .= $newidx; - my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination, + my $url=&Apache::lonnet::userfileupload('uploaddoc','coursedoc',$destination, $parseaction,$allfiles, - $codebase); + $codebase,undef,undef,undef,undef, + undef,undef,\$mimetype); + if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E.*/([^/]+)$}) { + my $stored = $1; + $showupload = '<p>'.&mt('Uploaded [_1]','<span class="LC_filename">'. + $stored.'</span>').'</p>'; + } else { + my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$}); + + $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('Unable to save file [_1].','<span class="LC_filename">'.$filename.'</span>').'</div>'; + return; + } my $ext='false'; if ($url=~m{^http://}) { $ext='true'; } $url = &LONCAPA::map::qtunescape($url); @@ -1738,51 +1866,38 @@ sub process_file_upload { ($errtext,$fatal)=&storemap($coursenum,$coursedom, $folder.'.'.$container); if ($fatal) { - $$upload_output .= '<p><span class="LC_error">'.$errtext.'</span></p>'; - return 'failed'; + $$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>'; + return; } else { - if ($parseaction eq 'parse') { + if ($parseaction eq 'parse' && $mimetype eq 'text/html') { + $$upload_output = $showupload; my $total_embedded = scalar(keys(%{$allfiles})); if ($total_embedded > 0) { - my $num = 0; - my $state = ' - <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> - <input type="hidden" name="cmd" value="upload_embedded" /> - <input type="hidden" name="newidx" value="'.$newidx.'" /> - <input type="hidden" name="primaryurl" value="'.&escape($url).'" /> - <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />'; - $phase_status = 'phasetwo'; - - $$upload_output .= - 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'. - &Apache::loncommon::ask_for_embedded_content( - '/adm/coursedocs',$state,$allfiles,$codebase); + my $uploadphase = 'upload_embedded'; + my $primaryurl = &HTML::Entities::encode($url,'<>&"'); + my $state = &embedded_form_elems($uploadphase,$primaryurl,$newidx); + my ($embedded,$num) = + &Apache::loncommon::ask_for_embedded_content( + '/adm/coursedocs',$state,$allfiles,$codebase,{'docs_url' => $url}); + if ($embedded) { + if ($num) { + $$upload_output .= + '<p>'.&mt('This file contains embedded multimedia objects, which need to be uploaded.').'</p>'.$embedded; + $nextphase = $uploadphase; + } else { + $$upload_output .= $embedded; + } + } else { + $$upload_output .= &mt('Embedded item(s) already present, so no additional upload(s) required').'<br />'; + } } else { - $$upload_output .= 'No embedded items identified<br />'; + $$upload_output .= &mt('No embedded items identified').'<br />'; } + $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>'; } } } - return $phase_status; -} - -sub process_secondary_uploads { - my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_; - my $folder=$env{'form.folder'}; - my $destination = 'docs/'; - if ($folder =~ /^supplemental/) { - $destination = 'supplemental/'; - } - if (($folder eq 'default') || ($folder eq 'supplemental')) { - $destination .= 'default/'; - } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { - $destination .= $2.'/'; - } - $destination .= $newidx; - my ($url,$filename); - $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination); - ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$}); - return $filename; + return $nextphase; } sub is_supplemental_title { @@ -1803,6 +1918,7 @@ sub parse_supplemental_title { $foldertitle=&Apache::lontexconvert::msgtexconverted($4); my $name = &Apache::loncommon::plainname($uname,$udom); $name = &HTML::Entities::encode($name,'"<>&\''); + $renametitle = &HTML::Entities::encode($renametitle,'"<>&\''); $title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '. $name.': <br />'.$foldertitle; } @@ -1846,7 +1962,7 @@ sub entryline { } if ($env{'form.pagepath'}) { $type = $container = 'page'; - $esc_path=&escape($path = $env{'form.pagepath'}); + $esc_path=&escape($env{'form.pagepath'}); $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"'); $symb=&escape($env{'form.pagesymb'}); } @@ -2104,14 +2220,13 @@ END $form_start <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label> $form_end - </td> - <td class="LC_docs_entry_parameter"> + <br /> $form_start <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">$form_start $rand_order_text $form_end</td> - <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end</td> + <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end<br /> + $form_start $rand_order_text $form_end</td> ENDPARMS } $line.=&Apache::loncommon::end_data_table_row(); @@ -2240,6 +2355,7 @@ sub list_symbs { my $crstype = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page('Symb List')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List')); + &startContentScreen($r,'tools'); my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { $r->print('<h2>'.&mt('Retrieval of List Failed').'</h2>'. @@ -2250,21 +2366,19 @@ sub list_symbs { } else { $r->print("<pre>\n"); foreach my $res ($navmap->retrieveResources()) { - $r->print($res->compTitle()."\t".$res->symb()."\n"); + $r->print($res->compTitle()."\t".$res->symb()."\n"); } $r->print("\n</pre>\n"); } - $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>'); } sub verifycontent { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - my $loaderror=&Apache::lonnet::overloaderror($r); - if ($loaderror) { return $loaderror; } $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); + &startContentScreen($r,'tools'); $hashtied=0; undef %alreadyseen; %alreadyseen=(); @@ -2273,9 +2387,9 @@ sub verifycontent { if ($hash{$key}=~/\.(page|sequence)$/) { if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) { $r->print('<hr /><span class="LC_error">'. - &mt('The following sequence or page is included more than once in your '.$crstype.': '). + &mt('The following sequence or page is included more than once in your '.$crstype.':').' '. &unescape($hash{$key}).'</span><br />'. - &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />')); + &mt('Note that grading records for problems included in this sequence or folder will overlap.').'<hr />'); } } if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) { @@ -2283,8 +2397,7 @@ sub verifycontent { } } &untiehash(); - $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'. - &mt('Return to DOCS').'</a>'); + $r->print('<p class="LC_success">'.&mt('Done').'</p>'); } @@ -2299,6 +2412,8 @@ sub checkversions { my $crstype = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions")); $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions")); + &startContentScreen($r,'tools'); + my $header=''; my $startsel=''; my $monthsel=''; @@ -2476,11 +2591,11 @@ ENDHEADERS # Set version $r->print(&Apache::loncommon::select_form($setversions{$linkurl}, 'set_version_'.$linkurl, - ('select_form_order' => + {'select_form_order' => ['',1..$currentversion,'mostrecent'], '' => '', 'mostrecent' => &mt('most recent'), - map {$_,$_} (1..$currentversion)))); + map {$_,$_} (1..$currentversion)})); $r->print('</span></td></tr><tr><td></td>'); my $lastold=1; for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { @@ -2516,7 +2631,7 @@ ENDHEADERS $r->print(' <a href="/adm/diff?filename='. &Apache::lonnet::clutter($root.'.'.$extension). '&versionone='.$prevvers. - '">'.&mt('Diffs').'</a>'); + '" target="diffs">'.&mt('Diffs').'</a>'); } $r->print('</span><br />'); if (++$entries_count % $entries_per_col == 0) { @@ -2534,7 +2649,7 @@ ENDHEADERS } } $r->print('</table></form>'); - $r->print('<h1>'.&mt('Done').'.</h1>'); + $r->print('<p class="LC_success">'.&mt('Done').'</p>'); &untiehash(); } @@ -2609,8 +2724,67 @@ sub init_breadcrumbs { bug=>'Instructor Interface'}); } +# subroutine to list form elements +sub create_list_elements { + my @formarr = @_; + my $list = ''; + for my $button (@formarr){ + for my $picture(keys %$button) { + $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'}); + } + } + return $list; +} + +# subroutine to create ul from list elements +sub create_form_ul { + my $list = shift; + my $ul = &Apache::lonhtmlcommon::htmltag('ul',$list, {class => 'LC_ListStyleNormal'}); + return $ul; +} + +# +# Start tabs +# +sub startContentScreen { + my ($r,$mode)=@_; + $r->print('<ul class="LC_TabContentBigger" id="mainnav">'); + $r->print('<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b> '.&mt('Content Overview').' </b></a></li>'); + my $active = ''; +# does this user have privileges to modify docs? + my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); + + my $onclick; + my $href; + + if ($allowed) { + $r->print('<li '.(($mode eq 'docs')?' class="active"':''). + ' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b> '.&mt('Content Editor').' </b></a></li>'); + } + $r->print('<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b> '.&mt('Content Search').' </b></a></li>'); + $r->print('<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b> '.&mt('Content Index').' </b></a></li>'); + $r->print('<li '.(($mode eq 'supdocs')?' class="active"':''). + '><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Documents').'</b></a></li>'); + $r->print('</ul>'); + $r->print('<div class="LC_DocsBox" style="clear:both;margin:0;" id="contenteditor">' + .'<div id="maincoursedoc" style="margin:0 0;padding:0 0">'); + $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">'); +} + +# +# End tabs +# + +sub endContentScreen { + my ($r)=@_; + $r->print('</div></div></div>'); +} + +sub supplemental_base { + return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Documents')); +} sub handler { my $r = shift; @@ -2619,16 +2793,7 @@ sub handler { return OK if $r->header_only; my $crstype = &Apache::loncommon::course_type(); - my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; - if ($coursedom eq 'gcitest') { - my $coursenum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); - if ($allowed) { - &concept_test_builder($r,$coursedom,$coursenum); - return OK; - } - } - +# # --------------------------------------------- Initialize help topics for this foreach my $topic ('Adding_Course_Doc','Main_Course_Documents', 'Adding_External_Resource','Navigate_Content', @@ -2667,51 +2832,150 @@ sub handler { &init_breadcrumbs('versions','Check/Set Resource Versions'); &checkversions($r); } elsif ($allowed && $env{'form.dumpcourse'}) { - &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space'); + &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Documents to Construction Space'); &dumpcourse($r); } elsif ($allowed && $env{'form.exportcourse'}) { &init_breadcrumbs('exportcourse','IMS Export'); &exportcourse($r); } else { -# is this a standard course? +# +# Done catching special calls +# The whole rest is for course and supplemental documents +# Get the parameters that may be needed +# + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['folderpath','pagepath', + 'pagesymb','forcesupplement','forcestandard', + '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 my $standard=($env{'request.course.uri'}=~/^\/uploaded\//); - my $forcestandard = 0; - my $forcesupplement; + +# Decide whether this should display supplemental or main content +# supplementalflag=1: show supplemental documents +# supplementalflag=0: show standard documents + + + 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; } + if ($env{'form.forcestandard'}) { $supplementalflag=0; } + unless ($allowed) { $supplementalflag=1; } + unless ($standard) { $supplementalflag=1; } + my $script=''; my $showdoc=0; + my $addentries = {}; my $containertag; my $uploadtag; +# Do we directly jump somewhere? + + if ($env{'form.command'} eq 'direct') { + my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'}); + if ($resurl=~/\.(sequence|page)$/) { + $mapurl=$resurl; + } + 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'}=''; + } + } + +# Where do we store these for when we come back? + my $stored_folderpath='docs_folderpath'; + if ($supplementalflag) { + $stored_folderpath='docs_sup_folderpath'; + } - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['folderpath','pagepath', - 'pagesymb']); # No folderpath, no pagepath, see if we have something stored if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) { - &Apache::loncommon::restore_course_settings('docs_folderpath', + &Apache::loncommon::restore_course_settings($stored_folderpath, {'folderpath' => 'scalar'}); } + +# If we are not allowed to make changes, all we can see are supplemental docs if (!$allowed) { - unless($env{'form.folderpath'} =~ /^supplemental/) { - $env{'form.folderpath'} = ''; + $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('docs_folderpath', + &Apache::loncommon::restore_course_settings($stored_folderpath, {'pagepath' => 'scalar'}); } - if ($env{'form.pagepath'}) { - $env{'form.folderpath'}=''; - } +# 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&'. - &escape(&mt('Supplemental '.$crstype.' Documents')).'&'. + $env{'form.folderpath'} = &supplemental_base() + .'&'. $env{'form.folderpath'}; } - &Apache::loncommon::store_course_settings('docs_folderpath', +# If after all of this, we still don't have any paths, make them + unless (($env{'form.pagepath'}) || ($env{'form.folderpath'})) { + if ($supplementalflag) { + $env{'form.folderpath'}=&supplemental_base(); + } else { + $env{'form.folderpath'}='default'; + } + } + +# Store this + &Apache::loncommon::store_course_settings($stored_folderpath, {'pagepath' => 'scalar', 'folderpath' => 'scalar'}); + if ($env{'form.folderpath'}) { my (@folderpath)=split('&',$env{'form.folderpath'}); $env{'form.foldername'}=&unescape(pop(@folderpath)); @@ -2722,9 +2986,22 @@ sub handler { $env{'form.pagename'}=&unescape(pop(@pagepath)); $env{'form.folder'}=pop(@pagepath); $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="pagesymb" value="" />'; + $uploadtag = + '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'. + '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'. + '<input type="hidden" name="folderpath" value="" />'; + } else { + my $folderpath=$env{'form.folderpath'}; + if (!$folderpath) { + if ($env{'form.folder'} eq '' || + $env{'form.folder'} eq 'supplemental') { + $folderpath='default&'. + &escape(&mt('Main '.$crstype.' Documents')); + } + } + $containertag = '<input type="hidden" name="folderpath" value="" />'; + $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />'; } if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { $showdoc='/'.$1; @@ -2732,38 +3009,12 @@ sub handler { if ($showdoc) { # got called in sequence from course $allowed=0; } else { - if (($env{'form.folder'}=~/^(?:group|default)_/) || - ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) { - $forcestandard = 1; - } - $forcesupplement=($env{'form.folder'}=~/^supplemental_/); - if ($allowed) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); $script=&Apache::lonratedt::editscript('simple'); } } -# subroutine to list form elements -sub create_list_elements { - my @formarr = @_; - my $list = ''; - for my $button (@formarr){ - for my $picture(keys %$button) { - #my $link = Apache::lonhtmlcommon::htmltag('a' ,$button->{$picture}, {href => "test"}); - $list .= Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'}); - } - } - return $list; -} - -# subroutine to create ul from list elements -sub create_form_ul { - my $list = shift; - my $ul = Apache::lonhtmlcommon::htmltag('ul',$list, {class => 'LC_ListStyleNormal'}); - return $ul; -} - # get course data my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -2778,7 +3029,22 @@ sub create_form_ul { $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/"); if ($allowed) { - $script .= &editing_js($udom,$uname); + my @tabids; + if ($supplementalflag) { + @tabids = ('002','ee2','ff2'); + } else { + @tabids = ('aa1','bb1','cc1','ff1'); + unless ($env{'form.pagepath'}) { + unshift(@tabids,'001'); + push(@tabids,('dd1','ee1')); + } + } + my $tabidstr = join("','",@tabids); + $script .= &editing_js($udom,$uname). + &resize_contentdiv_js($tabidstr); + $addentries = { + onload => "javascript:resize_contentdiv('contentscroll','1','1');", + }; } # -------------------------------------------------------------------- Body tag $script = '<script type="text/javascript">'."\n" @@ -2789,141 +3055,91 @@ sub create_form_ul { # Breadcrumbs &Apache::lonhtmlcommon::clear_breadcrumbs(); - if ($allowed) { + unless ($showdoc) { &Apache::lonhtmlcommon::add_breadcrumb({ - href=>"/adm/coursedocs",text=>"$crstype Editor"}); + href=>"/adm/coursedocs",text=>"$crstype Contents"}); - $r->print(&Apache::loncommon::start_page("$crstype Editor", $script, - {'force_register' => $showdoc,}) + $r->print(&Apache::loncommon::start_page("$crstype Contents", $script, + {'force_register' => $showdoc, + 'add_entries' => $addentries, + }) .&Apache::loncommon::help_open_menu('','',273,'RAT') .&Apache::lonhtmlcommon::breadcrumbs( 'Editing the Table of Contents for your '.$crstype, 'Docs_Adding_Course_Doc') ); - } elsif ($showdoc) { + } else { $r->print(&Apache::loncommon::start_page("$crstype documents",undef, {'force_register' => $showdoc,})); - } else { - my $folder=$env{'form.folder'}; - if ($folder eq '' || $folder eq 'supplemental') { - $env{'form.folderpath'} = 'supplemental&'. - &escape(&mt('Supplemental '.$crstype.' Documents')); - } - my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype); - $r->print(&Apache::loncommon::start_page("Supplemental documents"). - $breadcrumbtrail); } my %allfiles = (); my %codebase = (); - my ($upload_result,$upload_output); + my ($upload_result,$upload_output,$uploadphase); if ($allowed) { if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) { -# Process file upload - phase one - upload and parse primary file. + my $context = $1; + # Process file upload - phase one - upload and parse primary file. undef($hadchanges); - $upload_result = &process_file_upload(\$upload_output,$coursenum, - $coursedom,\%allfiles, - \%codebase,$1); + $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom, + \%allfiles,\%codebase,$context); if ($hadchanges) { &mark_hash_old(); } - if ($upload_result eq 'phasetwo') { - $r->print($upload_output); - } - } elsif ($env{'form.phasetwo'}) { - my %newname = (); - my %origname = (); - my %attribs = (); - my $updateflag = 0; - my $residx = $env{'form.newidx'}; - 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} = &unescape($env{'form.embedded_orig_'.$i}); - if (exists($env{'form.embedded_codebase_'.$i})) { - $javacodebase = &unescape($env{'form.embedded_codebase_'.$i}); - $origname{$i} =~ s#^\Q$javacodebase\E/##; - } - my @attributes = (); - if ($env{'form.embedded_attrib_'.$i} =~ /:/) { - @attributes = split(/:/,$env{'form.embedded_attrib_'.$i}); - } else { - @attributes = ($env{'form.embedded_attrib_'.$i}); - } - foreach my $attr (@attributes) { - push(@{$attribs{$i}},&unescape($attr)); - } - if ($javacodebase) { - $codebase{$i} = $javacodebase; - $codebase{$i} =~ s#/$##; - $updateflag = 1; - } - } - unless ($newname{$i} eq $origname{$i}) { - $updateflag = 1; - } - } -# Process file upload - phase three - modify primary file - if ($updateflag) { - my ($content,$rtncode); - my $updateflag = 0; - my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode); - if ($getstatus eq 'ok') { - foreach my $item (keys(%newname)) { - if ($newname{$item} ne $origname{$item}) { - my $attrib_regexp = ''; - if (@{$attribs{$item}} > 1) { - $attrib_regexp = join('|',@{$attribs{$item}}); - } else { - $attrib_regexp = $attribs{$item}[0]; - } - if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) { - } - $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; #' stupid emacs - } - } -# Save edited file. - my $saveresult; - my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; - my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'}; - my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult); - } else { - &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); - } - } + $r->print($upload_output); + } elsif ($env{'form.phase'} eq 'upload_embedded') { + # Process file upload - phase two - upload embedded objects + $uploadphase = 'check_embedded'; + my $primaryurl = &HTML::Entities::encode($env{'form.primaryurl'},'<>&"'); + my $state = &embedded_form_elems($uploadphase,$primaryurl, + $env{'form.newidx'}); + my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + my ($destination,$dir_root) = &embedded_destination(); + my $url_root = '/uploaded/'.$docudom.'/'.$docuname; + my $actionurl = '/adm/coursedocs'; + my ($result,$flag) = + &Apache::loncommon::upload_embedded('coursedoc',$destination, + $docuname,$docudom,$dir_root,$url_root,undef,undef,undef,$state, + $actionurl); + $r->print($result.&return_to_editor()); + } elsif ($env{'form.phase'} eq 'check_embedded') { + # Process file upload - phase three - modify references in HTML file + $uploadphase = 'modified_orightml'; + my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + my ($destination,$dir_root) = &embedded_destination(); + $r->print(&Apache::loncommon::modify_html_refs('coursedoc',$destination, + $docuname,$docudom,undef, + $dir_root). + &return_to_editor()); } } - unless ($showdoc || $upload_result eq 'phasetwo') { + unless ($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', - 'upld' => 'Upload Document', + 'upld' => 'Import Document', 'srch' => 'Search', 'impo' => 'Import', - 'book' => 'Import Bookmarks', + 'wish' => 'Import from Wishlist', 'selm' => 'Select Map', 'load' => 'Load Map', - 'reco' => 'Recover Deleted Resources', + 'reco' => 'Recover Deleted Documents', 'newf' => 'New Folder', 'newp' => 'New Composite Page', 'extr' => 'External Resource', 'syll' => 'Syllabus', - 'navc' => 'Navigate Contents', + 'navc' => 'Table of Contents', 'sipa' => 'Simple Course Page', 'sipr' => 'Simple Problem', 'drbx' => 'Drop Box', - 'scuf' => 'Score Upload Form', + 'scuf' => 'External Scores (handgrade, upload, clicker)', 'bull' => 'Discussion Board', 'mypi' => 'My Personal Information Page', 'grpo' => 'Group Portfolio', @@ -2955,59 +3171,53 @@ FIUP </label> CHBO - my $fileuploada = "<input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}"; + my $fileuploada = "<br clear='all' /><input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}"; my $fileuploadform=(<<FUFORM); <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="50" name="comment" /> + <input type="text" size="60" name="comment" /> $uploadtag <input type="hidden" name="cmd" value="upload_default" /> <br /> - <span class="LC_nobreak"> + <span class="LC_nobreak" style="float:left"> $checkbox </span> FUFORM - #$list .= Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'}); - #$fileuploadform .= create_form_ul(create_list_elements(@fileuploada)); - $fileuploadform .= create_form_ul(Apache::lonhtmlcommon::htmltag('li',$fileuploada,{class => 'LC_menubuttons_inline_text'})); - $fileuploadform .= (<<FUFORM); - </form> -FUFORM + $fileuploadform .= $fileuploada.'</form>'; my $simpleeditdefaultform=(<<SEDFFORM); <form action="/adm/coursedocs" method="post" name="simpleeditdefault"> <input type="hidden" name="active" value="bb" /> SEDFFORM my @simpleeditdefaultforma = ( - { '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/src.png" alt="'.&mt('Search').'" />' => "$uploadtag<a onclick='javascript:groupsearch()'>$lt{'srch'}</a>" }, - { '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/res.png" alt="'.&mt('Import').'" />' => "<a onclick='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" }, - { '<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/vbkm.png" alt="'.&mt('Import Bookmarks').'" />' => "<a onclick='javascript:groupopen(0,1,1);'>$lt{'book'}</a>" }, + { '<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{wish}.'" onclick="javascript:open_Wishlist_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_Wishlist_Import();'>$lt{'wish'}</a>" }, ); - $simpleeditdefaultform .= create_form_ul(create_list_elements(@simpleeditdefaultforma)); + $simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma)); $simpleeditdefaultform .=(<<SEDFFORM); - <hr /> - <p> + <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"><input type="button" + <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> - </p> </form> SEDFFORM - my $extresourcesform=(<<ERFORM); - <form action="/adm/coursedocs" method="post" name="newext"> - $uploadtag - <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makenewext('newext');">$lt{'extr'}</a>$help{'Adding_External_Resource'} - </form> + 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) { &update_paste_buffer($coursenum,$coursedom); my %lt=&Apache::lonlocal::texthash( @@ -3017,18 +3227,6 @@ ERFORM 'sl' => 'Show Log' ); - my $folderpath=$env{'form.folderpath'}; - if (!$folderpath) { - if ($env{'form.folder'} eq '' || - $env{'form.folder'} eq 'supplemental') { - $folderpath='default&'. - &escape(&mt('Main '.$crstype.' Documents')); - } - } - unless ($env{'form.pagepath'}) { - $containertag = '<input type="hidden" name="folderpath" value="" />'; - $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />'; - } $r->print(<<HIDDENFORM); <form name="renameform" method="post" action="/adm/coursedocs"> <input type="hidden" name="title" /> @@ -3043,55 +3241,21 @@ ERFORM </form> HIDDENFORM } -# --------------------------------------------------------- Main tab structure - - my $activeClass = 1; - my $active = ''; - my %tabtitles = ( - main => { - Course => &mt('Main Course Documents'), - Community => &mt('Main Community Documents'), - }, - supplemental => { - Course => &mt('Supplemental Course Documents'), - Community => &mt('Supplemental Community Documents'), - }, - ); + +# Generate the tabs + &startContentScreen($r,($supplementalflag?'supdocs':'docs')); + + +# + + my $savefolderpath; + if ($allowed) { - $r->print('<ul class="LC_TabContentBigger" id="mainnav">'); - if (($standard) && ($allowed) && (!$forcesupplement) && (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'}eq"" || ($env{'form.pagepath'}))) { - if($activeClass == 1){ - $active = 'class="active"'; - $activeClass = 0; - } - } - $r->print('<li '.$active.' onclick="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'main'}{$crstype}.'</b></a></li>'); - $active = ''; - if (!$forcestandard || ($env{'form.folderpath'}=~/^supplemental/)) { - if($activeClass == 1){ - $active = 'class="active"'; - } - } - $r->print('<li '.$active.' onclick="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'supplemental'}{$crstype}.'</b></a></li>'); - $r->print('</ul>'); - } else { - $r->print('<br />'); - } - $r->print('<div class="LC_Box" style="clear:both;margin:0;">' - .'<div id="maincoursedoc" style="margin:0 0;padding:0 0;">'); -# --------------------------------------------------------- Standard documents - my $savefolderpath; - $active = 'style="display: none;"'; - if($activeClass == 0){ - $active = 'style="display: block;"'; - } - if ($allowed) { - $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" '.$active.'>'); my $folder=$env{'form.folder'}; - if ($folder eq '' || $folder=~/^supplemental/) { + if ($folder eq '' || $supplementalflag) { $folder='default'; $savefolderpath = $env{'form.folderpath'}; - $env{'form.folderpath'}='default&'.&escape($tabtitles{'main'}{$crstype}); + $env{'form.folderpath'}='default&'.&escape(&mt('Content')); $uploadtag = '<input type="hidden" name="folderpath" value="'. &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'; } @@ -3120,14 +3284,14 @@ HIDDENFORM my $recoverform=(<<RFORM); <form action="/adm/groupsort" method="post" name="recover"> - <a onclick="javascript:groupopen('$readfile',1,0)">$lt{'reco'}</a> + <a class="LC_menubuttons_link" href="javascript:groupopen('$readfile',1)">$lt{'reco'}</a> </form> RFORM my $imspform=(<<IMSPFORM); <form action="/adm/imsimportdocs" method="post" name="ims"> <input type="hidden" name="folder" value="$folder" /> - <a onclick="javascript:makeims();">$lt{'imsf'}</a> + <a class="LC_menubuttons_link" href="javascript:makeims();">$lt{'imsf'}</a> </form> IMSPFORM @@ -3137,7 +3301,7 @@ IMSPFORM $uploadtag <input type="hidden" name="importdetail" value="$lt{'navc'}=/adm/navmaps" /> - <a onclick="document.newnav.submit()">$lt{'navc'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newnav.submit()">$lt{'navc'}</a> $help{'Navigate_Content'} </form> NNFORM @@ -3146,7 +3310,7 @@ NNFORM <input type="hidden" name="active" value="cc" /> $uploadtag <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makesmppage();"> $lt{'sipa'}</a> + <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a> $help{'Simple Page'} </form> NSPFORM @@ -3156,7 +3320,7 @@ NSPFORM <input type="hidden" name="active" value="cc" /> $uploadtag <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makesmpproblem();">$lt{'sipr'}</a> + <a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a> $help{'Simple Problem'} </form> @@ -3167,7 +3331,7 @@ NSPROBFORM <input type="hidden" name="active" value="cc" /> $uploadtag <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makedropbox();">$lt{'drbx'}</a> + <a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a> </form> NDBFORM @@ -3176,7 +3340,7 @@ NDBFORM <input type="hidden" name="active" value="cc" /> $uploadtag <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makeexamupload();">$lt{'scuf'}</a> + <a class="LC_menubuttons_link" href="javascript:makeexamupload();">$lt{'scuf'}</a> $help{'Score_Upload_Form'} </form> NEXUFORM @@ -3186,7 +3350,7 @@ NEXUFORM <input type="hidden" name="active" value="cc" /> $uploadtag <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makebulboard();" >$lt{'bull'}</a> + <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a> $help{'Bulletin Board'} </form> NBFORM @@ -3197,7 +3361,7 @@ NBFORM $uploadtag <input type="hidden" name="importdetail" value="$plainname=/adm/$udom/$uname/aboutme" /> - <a onclick="document.newaboutme.submit()">$lt{'mypi'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newaboutme.submit()">$lt{'mypi'}</a> $help{'My Personal Information Page'} </form> NAMFORM @@ -3207,7 +3371,7 @@ NAMFORM <input type="hidden" name="active" value="cc" /> $uploadtag <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makeabout();">$lt{'abou'}</a> + <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a> </form> NASOFORM @@ -3218,25 +3382,28 @@ NASOFORM $uploadtag <input type="hidden" name="importdetail" value="$lt{'rost'}=/adm/viewclasslist" /> - <a onclick="document.newroster.submit()">$lt{'rost'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a> $help{'Course Roster'} </form> NROSTFORM my $specialdocumentsform; my @specialdocumentsforma; +my $gradingform; +my @gradingforma; +my $communityform; +my @communityforma; my $newfolderform; my $newfolderb; - unless ($env{'form.pagepath'}) { - my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); my $newpageform=(<<NPFORM); <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="cc" /> - <a onclick="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a> + <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a> $help{'Adding_Pages'} </form> NPFORM @@ -3247,7 +3414,7 @@ NPFORM <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="" /> <input type="hidden" name="active" value="aa" /> - <a onclick="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'} + <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'} </form> NFFORM @@ -3257,7 +3424,7 @@ NFFORM $uploadtag <input type="hidden" name="importdetail" value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" /> - <a onclick="document.newsyl.submit()">$lt{'syll'}</a> + <a class="LC_menubuttons_link" href="javascript:document.newsyl.submit()">$lt{'syll'}</a> $help{'Syllabus'} </form> @@ -3269,82 +3436,85 @@ NSYLFORM $uploadtag <input type="hidden" name="importdetail" value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" /> - <a onclick="document.newgroupfiles.submit()">$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" align="left" src="/res/adm/pages/page.png" alt="'.&mt('New Composite Page').'" />'=>$newpageform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/syllabus.png" alt="'.&mt('Syllabus').'" />'=>$newsylform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/groupportfolio.png" alt="'.&mt('Group Portfolio').'" />'=>$newgroupfileform}, - ); - - } - push @specialdocumentsforma, ({'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/navigation.png" alt="'.&mt('Navigate Contents').'" />'=>$newnavform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simple.png" alt="'.&mt('Simple Course Page').'" />'=>$newsmppageform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simpprob.png" alt="'.&mt('Simple Problem').'" />'=>$newsmpproblemform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/dropbox.png" alt="'.&mt('Drop Box').'" />'=>$newdropboxform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/scoreupfrm.png" alt="'.&mt('Score Upload Form').'" />'=>$newexuploadform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/bchat.png" alt="'.&mt('Discussion Board').'" />'=>$newbulform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/myaboutme.png" alt="'.&mt('My Personal Information Page').'" />'=>$newaboutmeform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/aboutme.png" alt="'.&mt('Personal Information Page for a User').'" />'=>$newaboutsomeoneform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/chrt.png" alt="'.&mt('Course Roster').'" />'=>$newrosterform},); + {'<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="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}, + ); + $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="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}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform}, + + ); + $gradingform = &create_form_ul(&create_list_elements(@gradingforma)); + + @communityforma=( + {'<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="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)); - $specialdocumentsform = create_form_ul(create_list_elements(@specialdocumentsforma)); -if($env{'form.pagepath'}) { - - @specialdocumentsforma=( - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/simpprob.png" alt="'.&mt('Simple Problem').'" />'=>$newsmpproblemform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/scoreupfrm.png" alt="'.&mt('Score Upload Form').'" />'=>$newexuploadform} - ); - $specialdocumentsform= create_form_ul(create_list_elements(@specialdocumentsforma)); -} my @tools = ( - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.&mt('External Resource').'" />'=>$extresourcesform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/ims.png" alt="'.&mt('IMS Import').'" />'=>$imspform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/recover.png" alt="'.&mt('Recover Deleted Resources').'" />'=>$recoverform}, +# {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" />'=>$extresourcesform}, +# {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" />'=>$imspform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/recover.png" alt="'.$lt{reco}.'" onclick="javascript:groupopen(\''.$readfile.'\',1)" />'=>$recoverform}, ); my %orderhash = ( - '00' => ['Newfolder',$newfolderform], - 'aa' => ['Upload Document',$fileuploadform], + 'aa' => ['Import Documents',$fileuploadform], 'bb' => ['Published Resources',$simpleeditdefaultform], - 'cc' => ['Special Documents',$specialdocumentsform], - 'dd' => ['Tools', create_form_ul(create_list_elements(@tools)).&generate_admin_options($containertag,$uploadtag,\%help,\%env)], + 'cc' => ['Grading Resources',$gradingform], + 'ff' => ['Tools', &create_form_ul(&create_list_elements(@tools)).&generate_admin_options(\%help,\%env)], ); -my $tid='1'; +unless ($env{'form.pagepath'}) { + $orderhash{'00'} = ['Newfolder',$newfolderform]; + $orderhash{'dd'} = ['Community Resources',$communityform]; + $orderhash{'ee'} = ['Special Documents',$specialdocumentsform]; +} + $hadchanges=0; - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); - if ($error) { - $r->print('<p><span class="LC_error">'.$error.'</span></p>'); - } - if ($hadchanges) { - &mark_hash_old(); - } + unless ($supplementalflag) { + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, + $supplementalflag,\%orderhash); + if ($error) { + $r->print('<p><span class="LC_error">'.$error.'</span></p>'); + } + if ($hadchanges) { + &mark_hash_old(); + } + + &changewarning($r,''); + } + } - &changewarning($r,''); -$r->print(&generate_edit_table($tid,\%orderhash)); +# Supplemental documents start here -$r->print('</div>'); - } - if ($env{'form.pagepath'}) { - } -# ----------------------------------------------------- Supplemental documents - $active = 'style="display: none;"'; - if($activeClass == 1){ - $active = 'style="display: block;"'; - } - $r->print('<div class="LC_ContentBox" id="supplCourseDocuments" '.$active.'>'); my $folder=$env{'form.folder'}; - unless ($folder=~/^supplemental/) { + unless ($supplementalflag) { $folder='supplemental'; } if ($folder =~ /^supplemental$/ && (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) { - $env{'form.folderpath'} = 'supplemental&'. - &escape(&mt('Supplemental '.$crstype.' Documents')); + $env{'form.folderpath'} = &supplemental_base(); } elsif ($allowed) { $env{'form.folderpath'} = $savefolderpath; } @@ -3373,14 +3543,14 @@ $r->print('</div>'); <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="cmd" value="upload_supplemental" /> SUPDOCFORM - $supupdocform .= create_form_ul(Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>"; + $supupdocform .= &create_form_ul(&Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>"; my $supnewfolderform=(<<SNFFORM); <form action="/adm/coursedocs" method="post" name="supnewfolder"> <input type="hidden" name="active" value="ee" /> <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> + <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> $help{'Adding_Folders'} </form> SNFFORM @@ -3391,7 +3561,7 @@ SNFFORM <input type="hidden" name="active" value="ff" /> <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="" /> - <a onclick="javascript:makenewext('supnewext');">$lt{'extr'}</a> $help{'Adding_External_Resource'} + <a class="LC_menubuttons_link" href="javascript:makenewext('supnewext');">$lt{'extr'}</a> $help{'Adding_External_Resource'} </form> SNEFORM @@ -3401,7 +3571,7 @@ SNEFORM <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="Syllabus=/public/$coursedom/$coursenum/syllabus" /> - <a onclick="document.supnewsyl.submit()">$lt{'syll'}</a> + <a class="LC_menubuttons_link" href="javascript:document.supnewsyl.submit()">$lt{'syll'}</a> $help{'Syllabus'} </form> SNSFORM @@ -3412,40 +3582,44 @@ SNSFORM <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="importdetail" value="$plainname=/adm/$udom/$uname/aboutme" /> - <a onclick="document.supnewaboutme.submit()">$lt{'mypi'}</a> + <a class="LC_menubuttons_link" href="javascript:document.supnewaboutme.submit()">$lt{'mypi'}</a> $help{'My Personal Information Page'} </form> SNAMFORM my @specialdocs = ( - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.&mt('External Resource').'" />'=>$supnewextform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/syllabus.png" alt="'.&mt('Syllabus').'" />'=>$supnewsylform}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/myaboutme.png" alt="'.&mt('My Personal Information Page').'" />'=>$supnewaboutmeform}, + {'<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="document.supnewaboutme.submit()" />' + =>$supnewaboutmeform}, ); +my @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 Document',$supupdocform], - 'ff' => ['Special Documents',create_form_ul(create_list_elements(@specialdocs))] + 'ee' => ['Import Documents',$supupdocform], + 'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))] ); - - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); - if ($error) { - $r->print('<p><span class="LC_error">'.$error.'</span></p>'); + if ($supplementalflag) { + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, + $supplementalflag,\%suporderhash); + if ($error) { + $r->print('<p><span class="LC_error">'.$error.'</span></p>'); + } } - my $tid='2'; - $r->print(&generate_edit_table($tid,\%suporderhash)); - } else { - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); + } elsif ($supplementalflag) { + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, + $supplementalflag); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } } - -$r->print('</div>'); -$r->print('</div></div>'); - + &endContentScreen($r); if ($allowed) { $r->print(' @@ -3457,7 +3631,7 @@ $r->print('</div></div>'); </form>'); } } else { - unless ($upload_result eq 'phasetwo') { + unless ($uploadphase) { # -------------------------------------------------------- This is showdoc mode $r->print("<h1>".&mt('Uploaded Document').' - '. &Apache::lonnet::gettitle($r->uri).'</h1><p>'. @@ -3470,36 +3644,79 @@ $r->print('</div></div>'); return OK; } +sub embedded_form_elems { + my ($phase,$primaryurl,$newidx) = @_; + my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + return <<STATE; + <input type="hidden" name="folderpath" value="$folderpath" /> + <input type="hidden" name="cmd" value="upload_embedded" /> + <input type="hidden" name="newidx" value="$newidx" /> + <input type="hidden" name="phase" value="$phase" /> + <input type="hidden" name="primaryurl" value="$primaryurl" /> +STATE +} + +sub embedded_destination { + my $folder=$env{'form.folder'}; + my $destination = 'docs/'; + if ($folder =~ /^supplemental/) { + $destination = 'supplemental/'; + } + if (($folder eq 'default') || ($folder eq 'supplemental')) { + $destination .= 'default/'; + } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { + $destination .= $2.'/'; + } + $destination .= $env{'form.newidx'}; + my $dir_root = '/userfiles'; + return ($destination,$dir_root); +} + +sub return_to_editor { + my $actionurl = '/adm/coursedocs'; + return '<p><form name="backtoeditor" method="post" action="'.$actionurl.'" />'."\n". + '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /></form>'."\n". + '<a href="javascript:document.backtoeditor.submit();">'.&mt('Return to Editor'). + '</a></p>'; +} + sub generate_admin_options { - my ($containertag,$uploadtag,$help_ref,$env_ref) = @_; - my %lt=&Apache::lonlocal::texthash( + my ($help_ref,$env_ref) = @_; + my %lt=&Apache::lonlocal::texthash( 'vc' => 'Verify Content', 'cv' => 'Check/Set Resource Versions', 'ls' => 'List Symbs', - 'sl' => 'Show Log' + 'sl' => 'Show Log', + 'imse' => 'IMS Export', + 'dcd' => 'Dump Course Documents to Construction Space: available on other servers' ); my %help = %{$help_ref}; my %env = %{$env_ref}; my $dumpbut=&dumpbutton(); my $exportbut=&exportbutton(); my @list = ( - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/verify.png" alt="'.&mt('Verify Content').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"verify\", \"$lt{'vc'}\")'>$lt{'vc'}</a>$help{'Verify_Content'}"}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/resversion.png" alt="'.&mt('Check/Set Resource Versions').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"versions\", \"$lt{'cv'}\")'>$lt{'cv'}</a>$help{'Check_Resource_Versions'}"}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/verify.png" alt="'.$lt{vc}.'" onclick=\'javascript:injectData(document.courseverify, "dummy", "verify", "'.$lt{'vc'}.'")\' />' + => "<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"verify\", \"$lt{'vc'}\")'>$lt{'vc'}</a>$help{'Verify_Content'}"}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/resversion.png" alt="'.$lt{cv}.'" onclick=\'javascript:injectData(document.courseverify, "dummy", "versions", "'.$lt{'cv'}.'")\' />' + =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"versions\", \"$lt{'cv'}\")'>$lt{'cv'}</a>$help{'Check_Resource_Versions'}"}, ); if($dumpbut ne ''){ - push @list, {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/dump.png" alt="'.&mt('Dump Course DOCS to Construction Space: available on other servers').'" />'=>$dumpbut}; + push @list, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dump.png" alt="'.$lt{dcd}.'" />'=>$dumpbut}; } - push @list, ({'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/imsexport.png" alt="'.&mt('IMS Export').'" />'=>$exportbut}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/symbs.png" alt="'.&mt('List Symbs').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"listsymbs\", \"$lt{'ls'}\")'>$lt{'ls'}</a><input type='hidden' name='folder' value='$env{'form.folder'}' />"}, - {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/log.png" alt="'.&mt('Show Log').'" />'=>"<a onclick='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"}, + push @list, ({'<img class="LC_noBorder LC_middle" src="/res/adm/pages/imsexport.png" alt="'.$lt{imse}.'" onclick="javascript:injectData(document.courseverify, \'dummy\', \'exportcourse\', \''.&mt('IMS Export').'\');" />' + =>$exportbut}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/symbs.png" alt="'.$lt{ls}.'" onclick=\'javascript:injectData(document.courseverify, "dummy", "listsymbs", "'.$lt{'ls'}.'")\' />' + =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"listsymbs\", \"$lt{'ls'}\")'>$lt{'ls'}</a><input type='hidden' name='folder' value='$env{'form.folder'}' />"}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/document-properties.png" alt="'.$lt{sl}.'" onclick=\'javascript:injectData(document.courseverify, "dummy", "docslog", "'.$lt{'sl'}.'")\' />' + =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"}, ); - return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.create_form_ul(create_list_elements(@list)).'</form>'; + return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.&create_form_ul(&create_list_elements(@list)).'</form>'; } sub generate_edit_table { - my ($tid,$orderhash_ref) = @_; + my ($tid,$orderhash_ref,$to_show) = @_; return unless(ref($orderhash_ref) eq 'HASH'); my %orderhash = %{$orderhash_ref}; my $form; @@ -3508,33 +3725,39 @@ sub generate_edit_table { if($env{'form.active'} ne ''){ $activetab = $env{'form.active'}; } - $form = '<div class="LC_Box">'; - $form .= '<ul id="navigation'.$tid.'" class="LC_TabContent">'; - foreach my $name (sort(keys(%orderhash))){ + $form = '<div class="LC_Box" style="margin:0;">'. + '<ul id="navigation'.$tid.'" class="LC_TabContent">'; + foreach my $name (reverse(sort(keys(%orderhash)))) { if($name ne '00'){ if($activetab eq '' || $activetab ne $name){ $active = ''; }elsif($activetab eq $name){ $active = 'class="active"'; } - $form .= '<li '.$active.' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');">'.&mt(${$orderhash{$name}}[0]).'</li>'; + $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>'; } else { - $form .= '<li '.$active.'>'.${$orderhash{$name}}[1].'</li>'; + $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'; } } $form .= '</ul>'; - $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; clear: both;">'; + $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'; + + if ($to_show ne '') { + $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'; + } foreach my $field (keys(%orderhash)){ if($field ne '00'){ - if($activetab eq '' || $activetab ne $field){ - $active = 'style="display: none;"'; - }elsif($activetab eq $field){ - $active = 'style="display:block;"'; - } - $form .= '<div id="'.$field.$tid.'"' - .' class="LC_ContentBox" '.$active.'>'.${$orderhash{$field}}[1] - .'</div>'; + if($activetab eq '' || $activetab ne $field){ + $active = 'style="display: none;float:left"'; + }elsif($activetab eq $field){ + $active = 'style="display:block;float:left"'; + } + $form .= '<div id="'.$field.$tid.'"' + .' class="LC_ContentBox" '.$active.'>'.${$orderhash{$field}}[1] + .'</div>'; } } $form .= '</div></div>'; @@ -3542,74 +3765,6 @@ sub generate_edit_table { return $form; } -sub concept_test_builder { - my ($r,$cdom,$cnum) = @_; - &Apache::londocsgci::setdefaults(); - if ($env{'form.context'} eq 'requestcrs') { - if ($env{'form.phase'} eq 'storemap') { - &Apache::londocsgci::evaluate(); - my $error = &Apache::londocsgci::store('requestcrs',$cdom,$cnum); - my $output = '<p>'; - if ($error) { - $output .= '<span class="LC_error">'. - &mt('An error occurred saving your concept test: [_1].',$error). - '</span>'; - } else { - &Apache::lonuserstate::readmap($cdom.'/'.$cnum); - $output .= &mt('Your concept test has been saved.'); - } - $output .= '</p>'; - if (&Apache::lonrequestcourse::generate_page($r,'new','chooseitems')) { - my $formname = 'requestcrs'; - $r->print('<br /><form name="'.$formname.'" method="post" action="/adm/requestcourse">'); - my $title = &mt('Concept Test Created'); - &Apache::lonrequestcourse::roster_upload_form($r,$output,$formname,$title); - } - $r->print(&Apache::loncommon::end_page()); - return; - } - } - my $js = ' -<script type="text/javascript"> -// <![CDATA[ -'. -&Apache::londocsgci::builder_javascript(). -' -// ]]> -</script> -'; - $r->print(&Apache::loncommon::start_page('Assemble Test',$js)); - &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/coursedocs', - text=>"Assemble Test"}); - if ($env{'form.phase'} eq 'storemap') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/coursedocs?phase=storemap', - text=>"Validate Test"}); - &Apache::londocsgci::evaluate(); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - ('Build Concept Test','Concept_Test_Assembly')); - $r->print(&Apache::londocsgci::store('edit',$cdom,$cnum)); - } elsif ($env{'form.phase'} eq 'storeparms') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/coursedocs?phase=storeparms', - text=>"Set Availability"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - ('Build Concept Test','Concept_Test_Assembly')); - $r->print(&Apache::londocsgci::store_dates_parms($cdom,$cnum)); - $r->print(&Apache::loncommon::end_page()); - return; - } else { - $r->print(&Apache::lonhtmlcommon::breadcrumbs - ('Build Concept Test','Concept_Test_Assembly')); - } - &Apache::londocsgci::load(); - &Apache::londocsgci::listresources($r,'edit',$cdom,$cnum); - $r->print(&Apache::loncommon::end_page()); - return; -} - sub editing_js { my ($udom,$uname) = @_; my $now = time(); @@ -3618,7 +3773,7 @@ sub editing_js { t_mnf => 'New Folder', p_mnp => 'Name of New Page', t_mnp => 'New Page', - p_mxu => 'Title for the Uploaded Score', + p_mxu => 'Title for the External Score', p_msp => 'Name of Simple Course Page', p_msb => 'Title for the Problem', p_mdb => 'Title for the Drop Box', @@ -3637,6 +3792,18 @@ sub editing_js { p_ctr2b => '?[_98]' ); + 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 ($docs_folderpath eq '') { + if ($docs_pagepath ne '') { + $main_container_page = 1; + } + } + my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents'; + my $toplevelsupp = &supplemental_base(); + return <<ENDNEWSCRIPT; function makenewfolder(targetform,folderseq) { var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}'); @@ -3848,6 +4015,9 @@ function openTabs(pageId) { if(currentLis[i].className == 'active') { funcString = currentLis[i].onclick.toString(); tab = funcString.split('"'); + if(tab.length < 2) { + tab = funcString.split("'"); + } currentData = document.getElementById(tab[1]); currentData.style.display = 'block'; } @@ -3862,6 +4032,42 @@ function showPage(current, pageId, nav, current.className = 'active'; currentData = document.getElementById(pageId); currentData.style.display = 'block'; + activeTab = pageId; + 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') { + if (storedpage == 1) { + document.simpleedit.folderpath.value = ''; + document.uploaddocument.folderpath.value = ''; + } else { + if (reg.test(storedpath)) { + document.simpleedit.folderpath.value = '$toplevelmain'; + document.uploaddocument.folderpath.value = '$toplevelmain'; + document.newext.folderpath.value = '$toplevelmain'; + } else { + document.simpleedit.folderpath.value = storedpath; + document.uploaddocument.folderpath.value = storedpath; + document.newext.folderpath.value = storedpath; + } + } + } else { + if (reg.test(storedpath)) { + document.simpleedit.folderpath.value = storedpath; + document.supuploaddocument.folderpath.value = storedpath; + document.supnewext.folderpath.value = storedpath; + } else { + document.simpleedit.folderpath.value = '$toplevelsupp'; + document.supuploaddocument.folderpath.value = '$toplevelsupp'; + document.supnewext.folderpath.value = '$toplevelsupp'; + } + } + } + resize_contentdiv('contentscroll','1','0'); return false; } @@ -3874,6 +4080,197 @@ function injectData(current, hiddenField ENDNEWSCRIPT } + +sub resize_contentdiv_js { + my ($tabidstr) = @_; + my $viewport_js = &Apache::loncommon::viewport_geometry_js(); + return <<ENDRESIZESCRIPT; + +window.onresize=resizeContentEditor; + +var activeTab; + +$viewport_js + +function resize_contentdiv(scrollboxname,chkw,chkh) { + var scrollboxid = 'div_'+scrollboxname; + var scrolltableid = 'table_'+scrollboxname; + var scrollbox; + var scrolltable; + + if (document.getElementById("contenteditor") == null) { + return; + } + + if (document.getElementById(scrollboxid) == null) { + return; + } else { + scrollbox = document.getElementById(scrollboxid); + } + + if (document.getElementById(scrolltableid) == null) { + return; + } else { + scrolltable = document.getElementById(scrolltableid); + } + + init_geometry(); + var vph = Geometry.getViewportHeight(); + var vpw = Geometry.getViewportWidth(); + + var alltabs = ['$tabidstr']; + var listwchange; + if (chkw == 1) { + var contenteditorw = document.getElementById("contenteditor").offsetWidth; + var contentlistw; + var contentlistid = document.getElementById("contentlist"); + if (contentlistid != null) { + contentlistw = document.getElementById("contentlist").offsetWidth; + } + var contentlistwstart = contentlistw; + + var scrollboxw = scrollbox.offsetWidth; + var scrollboxscrollw = scrollbox.scrollWidth; + + var offsetw = parseInt(vpw * 0.015); + var paddingw = parseInt(vpw * 0.09); + + var minscrollboxw = 250; + + var maxtabw = 0; + var actabw = 0; + for (var i=0; i<alltabs.length; i++) { + if (activeTab == alltabs[i]) { + actabw = document.getElementById(alltabs[i]).offsetWidth; + if (actabw > maxtabw) { + maxtabw = actabw; + } + } else { + if (document.getElementById(alltabs[i]) != null) { + var thistab = document.getElementById(alltabs[i]); + thistab.style.visibility = 'hidden'; + thistab.style.display = 'block'; + var tabw = document.getElementById(alltabs[i]).offsetWidth; + thistab.style.display = 'none'; + thistab.style.visibility = ''; + if (tabw > maxtabw) { + maxtabw = tabw; + } + } + } + } + + if (maxtabw > 0) { + var newscrollboxw; + if (maxtabw+paddingw+scrollboxscrollw<contenteditorw) { + newscrollboxw = contenteditorw-paddingw-maxtabw; + if (newscrollboxw < minscrollboxw) { + newscrollboxw = minscrollboxw; + } + scrollbox.style.width = newscrollboxw+"px"; + if (newscrollboxw != scrollboxw) { + var newcontentlistw = newscrollboxw-offsetw; + contentlistid.style.width = newcontentlistw+"px"; + } + } else { + newscrollboxw = contenteditorw-paddingw-maxtabw; + if (newscrollboxw < minscrollboxw) { + newscrollboxw = minscrollboxw; + } + scrollbox.style.width = newscrollboxw+"px"; + if (newscrollboxw != scrollboxw) { + var newcontentlistw = newscrollboxw-offsetw; + contentlistid.style.width = newcontentlistw+"px"; + } + } + + if (newscrollboxw != scrollboxw) { + var newscrolltablew = newscrollboxw+offsetw; + scrolltable.style.width = newscrolltablew+"px"; + } + } + + if (contentlistid.offsetWidth != contentlistwstart) { + listwchange = 1; + } + + if (activeTab == 'cc1') { + if (document.getElementById('cc_hrule') != null) { + document.getElementById('cc_hrule').style.width=actabw+"px"; + } + } else { + if (activeTab == 'bb1') { + if (document.getElementById('bb_hrule') != null) { + document.getElementById('bb_hrule').style.width=actabw+"px"; + } + } else { + if (activeTab == 'ee2') { + if (document.getElementById('ee_hrule') != null) { + document.getElementById('ee_hrule').style.width=actabw+"px"; + } + } + } + } + } + if ((chkh == 1) || (listwchange)) { + var primaryheight = document.getElementById("LC_nav_bar").offsetHeight; + var secondaryheight = document.getElementById("LC_secondary_menu").offsetHeight; + var crumbsheight = document.getElementById("LC_breadcrumbs").offsetHeight; + var dccidheight = document.getElementById("dccid").offsetHeight; + + var uploadresultheight = 0; + if (document.getElementById("uploadfileresult") != null) { + uploadresultheight = document.getElementById("uploadfileresult").offsetHeight; + } + var tabbedheight = document.getElementById("tabbededitor").offsetHeight; + var contenteditorheight = document.getElementById("contenteditor").offsetHeight; + var scrollboxheight = scrollbox.offsetHeight; + var scrollboxscrollheight = scrollbox.scrollHeight; + var freevspace = vph-(primaryheight+secondaryheight+crumbsheight+dccidheight+uploadresultheight+tabbedheight+contenteditorheight); + + var minvscrollbox = 200; + var offsetv = 20; + var newscrollboxheight; + if (freevspace < 0) { + newscrollboxheight = scrollboxheight+freevspace-offsetv; + if (newscrollboxheight < minvscrollbox) { + newscrollboxheight = minvscrollbox; + } + scrollbox.style.height = newscrollboxheight + "px"; + } else { + if (scrollboxscrollheight > scrollboxheight) { + if (freevspace > offsetv) { + newscrollboxheight = scrollboxheight+freevspace-offsetv; + if (newscrollboxheight < minvscrollbox) { + newscrollboxheight = minvscrollbox; + } + scrollbox.style.height = newscrollboxheight+"px"; + } + } + } + scrollboxheight = scrollbox.offsetHeight; + var contentlistheight = document.getElementById("contentlist").offsetHeight; + + if (scrollboxscrollheight <= scrollboxheight) { + if ((contentlistheight+offsetv)<scrollboxheight) { + newscrollheight = contentlistheight+offsetv; + scrollbox.style.height = newscrollheight+"px"; + } + } + } + return; +} + +function resizeContentEditor() { + var timer; + clearTimeout(timer) + timer=setTimeout('resize_contentdiv("contentscroll","1","1")',500); +} + +ENDRESIZESCRIPT + return; +} + 1; __END__