--- loncom/interface/londocs.pm 2012/04/05 15:22:39 1.480 +++ loncom/interface/londocs.pm 2012/05/15 01:23:04 1.486 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.480 2012/04/05 15:22:39 raeburn Exp $ +# $Id: londocs.pm,v 1.486 2012/05/15 01:23:04 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -100,12 +100,17 @@ sub authorhosts { my $allowed=0; my $myhome=&Apache::lonnet::homeserver($ca,$cd); my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } } + foreach my $id (@ids) { + if ($id eq $myhome) { + $allowed=1; + last; + } + } if ($allowed) { $home++; - $outhash{'home_'.$ca.'@'.$cd}=1; + $outhash{'home_'.$ca.':'.$cd}=1; } else { - $outhash{'otherhome_'.$ca.'@'.$cd}=$myhome; + $outhash{'otherhome_'.$ca.':'.$cd}=$myhome; $other++; } } @@ -114,27 +119,6 @@ sub authorhosts { } -sub dumpbutton { - my ($home,$other,%outhash)=&authorhosts(); - my $crstype = &Apache::loncommon::course_type(); - if ($home+$other==0) { return ''; } - if ($home) { - 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'); - } -} - sub clean { my ($title)=@_; $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs; @@ -146,16 +130,22 @@ sub clean { sub dumpcourse { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $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.' Documents to Construction Space')); + $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n". + &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n"); + $r->print(&startContentScreen('tools')); my ($home,$other,%outhash)=&authorhosts(); - unless ($home) { return ''; } + unless ($home) { + $r->print(&endContentScreen()); + return ''; + } my $origcrsid=$env{'request.course.id'}; my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid); if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) { # Do the dumping - unless ($outhash{'home_'.$env{'form.authorspace'}}) { return ''; } + unless ($outhash{'home_'.$env{'form.authorspace'}}) { + $r->print(&endContentScreen()); + return ''; + } my ($ca,$cd)=split(/\@/,$env{'form.authorspace'}); $r->print('<h3>'.&mt('Copying Files').'</h3>'); my $title=$env{'form.authorfolder'}; @@ -206,10 +196,15 @@ sub dumpcourse { } } } else { + $r->print(&mt('Searching ...').'<br />'); + $r->rflush(); # Input form + $r->print('<form name="dumpdoc" action="" method="post">'."\n"); unless ($home==1) { - $r->print( - '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">'); + $r->print('<div class="LC_left_float">'. + '<fieldset><legend>'. + &mt('Select the Authoring Space'). + '</legend><select name="authorspace">'); } foreach my $key (sort(keys(%outhash))) { if ($key=~/^home_(.+)$/) { @@ -218,20 +213,23 @@ sub dumpcourse { '<input type="hidden" name="authorspace" value="'.$1.'" />'); } else { $r->print('<option value="'.$1.'">'.$1.' - '. - &Apache::loncommon::plainname(split(/\@/,$1)).'</option>'); + &Apache::loncommon::plainname(split(/\:/,$1)).'</option>'); } } } unless ($home==1) { - $r->print('</select>'); + $r->print('</select></fieldset></div>'."\n"); } my $title=$origcrsdata{'description'}; $title=~s/[\/\s]+/\_/gs; $title=&clean($title); - $r->print('<h3>'.&mt('Folder in Construction Space').'</h3>' - .'<input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />'); + $r->print('<div class="LC_left_float">'. + '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'. + '<input type="text" size="50" name="authorfolder" value="'. + $title.'" />'. + '</fieldset></div><br clear="all" />'."\n"); &tiehash(); - $r->print('<h3>'.&mt('Filenames in Construction Space').'</h3>' + $r->print('<h4>'.&mt('Filenames in Authoring Space').'</h4>' .&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() .'<th>'.&mt('Internal Filename').'</th>' @@ -259,14 +257,9 @@ sub dumpcourse { $r->print(&Apache::loncommon::end_data_table()); &untiehash(); $r->print( - '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Documents").'" /></p></form>'); + '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Content").'" /></p></form>'); } -} - -sub exportbutton { - my $crstype = &Apache::loncommon::course_type(); - 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 />'; + $r->print(&endContentScreen()); } sub group_import { @@ -430,24 +423,48 @@ sub log_docs { } } - - - - sub docs_change_log { - my ($r)=@_; - my $folder=$env{'form.folder'}; - $r->print(&Apache::loncommon::start_page('Course Document Change Log')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log')); + my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_; + my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); + my $js = '<script type="text/javascript">'."\n". + '// <![CDATA['."\n". + &Apache::loncommon::display_filter_js('docslog')."\n". + &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag)."\n". + &history_tab_js()."\n". + &Apache::lonratedt::editscript('simple')."\n". + '// ]]>'."\n". + '</script>'."\n"; + $r->print(&Apache::loncommon::start_page('Content Change Log',$js)); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Change Log')); + $r->print(&startContentScreen('docs')); + my %orderhash; + my $container='sequence'; + my $pathitem; + if ($env{'form.pagepath'}) { + $container='page'; + $pathitem = '<input type="hidden" name="pagepath" value="'. + &HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'; + } else { + my $folderpath=$env{'form.folderpath'}; + if ($folderpath eq '') { + $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents')); + } + $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />'; + } + my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; + my $jumpto = $readfile; + $jumpto =~ s{^/}{}; + my $tid = 1; + my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype); + $r->print($breadcrumbtrail. + &generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto, + $readfile)); my %docslog=&Apache::lonnet::dump('nohist_docslog', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); } - $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'. - '<input type="hidden" name="docslog" value="1" />'); - my %saveable_parameters = ('show' => 'scalar',); &Apache::loncommon::store_course_settings('docs_log', \%saveable_parameters); @@ -461,9 +478,14 @@ sub docs_change_log { 'randomorder' => 'Randomly ordered', 'set' => 'set to', 'del' => 'deleted'); - $r->print(&Apache::loncommon::display_filter(). - '<input type="hidden" name="folder" value="'.$folder.'" />'. - '<input type="submit" value="'.&mt('Display').'" /></form>'); + my $filter = &Apache::loncommon::display_filter('docslog')."\n". + $pathitem."\n". + '<input type="hidden" name="folder" value="'.$env{'form.folder'}.'" />'. + (' 'x2).'<input type="submit" value="'.&mt('Display').'" />'; + $r->print('<div class="LC_left_float">'. + '<fieldset><legend>'.&mt('Display of Content Changes').'</legend>'."\n". + &makedocslogform($filter,1). + '</fieldset></div><br clear="all" />'); $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'. &mt('After').'</th>'. @@ -558,7 +580,10 @@ sub docs_change_log { if (!($env{'form.show'} eq &mt('all') || $shown<=$env{'form.show'})) { last; } } - $r->print(&Apache::loncommon::end_data_table()); + $r->print(&Apache::loncommon::end_data_table()."\n". + &makesimpleeditform($pathitem)."\n". + '</div></div>'); + $r->print(&endContentScreen()); } sub update_paste_buffer { @@ -816,6 +841,16 @@ sub editor { my $container= ($env{'form.pagepath'}) ? 'page' : 'sequence'; + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = + &breadcrumbs($allowed,$crstype); + $r->print($breadcrumbtrail); + + my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container"; + + unless ($allowed) { + $randompick = -1; + } + my ($errtext,$fatal) = &mapread($coursenum,$coursedom, $folder.'.'.$container); return $errtext if ($fatal); @@ -827,16 +862,6 @@ sub editor { $LONCAPA::map::resources[$idx]=''; } - my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = - &breadcrumbs($allowed,$crstype); - $r->print($breadcrumbtrail); - - my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container"; - - unless ($allowed) { - $randompick = -1; - } - # ------------------------------------------------------------ Process commands # ---------------- if they are for this folder and user allowed to make changes @@ -988,7 +1013,9 @@ sub editor { $tid = 2; } if ($allowed) { - $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto)); + my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; + $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, + $readfile)); &print_paste_buffer($r,$container); } else { if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { @@ -1293,12 +1320,12 @@ sub entryline { if (!$nocopy) { $copylink=(<<ENDCOPY); -<a href='javascript:markcopy("$esc_path","$index","$renametitle","$container","$symb","$folder");' class="LC_docs_copy">$lt{'cp'}</a> +<a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$symb','$folder');" class="LC_docs_copy">$lt{'cp'}</a> ENDCOPY } if (!$nocut) { $cutlink=(<<ENDCUT); -<a href='javascript:cutres("$esc_path","$index","$renametitle","$container","$symb","$folder",$skip_confirm);' class="LC_docs_cut">$lt{'ct'}</a> +<a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$symb','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a> ENDCUT } $form_start = ' @@ -1482,7 +1509,7 @@ $form_common.' if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>'; } elsif ($url) { - $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', + $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500); } else { $line.='<img src="'.$icon.'" alt="" class="LC_icon" />'; @@ -1491,7 +1518,7 @@ $form_common.' if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { $line.='<a href="'.$url.'">'.$title.'</a>'; } elsif ($url) { - $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', + $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', $title,600,500); } else { $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>'; @@ -1639,7 +1666,7 @@ sub checkonthis { =item list_symbs() -List Symbs +List Content Identifiers =cut @@ -1647,9 +1674,9 @@ sub list_symbs { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Symb List')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List')); - &startContentScreen($r,'tools'); + $r->print(&Apache::loncommon::start_page('List of Content Identifiers')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Identifiers')); + $r->print(&startContentScreen('tools')); my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { $r->print('<h2>'.&mt('Retrieval of List Failed').'</h2>'. @@ -1658,11 +1685,25 @@ sub list_symbs { '</div>'); &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); } else { - $r->print("<pre>\n"); + $r->print('<h4 class="LC_info">'.&mt("$crstype Content Identifiers").'</h4>'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '<th>'.&mt('Title').'</th><th>'.&mt('Identifier').'</th>'. + &Apache::loncommon::end_data_table_header_row()."\n"); + my $count; foreach my $res ($navmap->retrieveResources()) { - $r->print($res->compTitle()."\t".$res->symb()."\n"); + $r->print(&Apache::loncommon::start_data_table_row(). + '<td>'.$res->compTitle().'</td>'. + '<td>'.$res->symb().'</td>'. + &Apache::loncommon::start_data_table_row()); + $count ++; + } + if (!$count) { + $r->print(&Apache::loncommon::start_data_table_row(). + '<td colspan="2">'.&mt("$crstype is empty").'</td>'. + &Apache::loncommon::end_data_table_row()); } - $r->print("\n</pre>\n"); + $r->print(&Apache::loncommon::end_data_table()); } } @@ -1670,13 +1711,15 @@ sub list_symbs { sub verifycontent { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); - &startContentScreen($r,'tools'); + $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); + $r->print(&startContentScreen('tools')); + $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>'); $hashtied=0; undef %alreadyseen; %alreadyseen=(); &tiehash(); + foreach my $key (keys(%hash)) { if ($hash{$key}=~/\.(page|sequence)$/) { if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) { @@ -1706,7 +1749,7 @@ 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'); + $r->print(&startContentScreen('tools')); my $header=''; my $startsel=''; @@ -1820,6 +1863,7 @@ sub checkversions { 'lw' => 'Version changes since last Week', 'sy' => 'Version changes since Yesterday', 'al' => 'All Resources (possibly large output)', + 'cd' => 'Change display', 'sd' => 'Display', 'fi' => 'File', 'md' => 'Modification Date', @@ -1830,18 +1874,16 @@ sub checkversions { 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)', 'sc' => 'Set all Resource Versions to current Version (Fix Versions)', 'di' => 'Differences', - 'save' => 'Save', + 'save' => 'Save changes', + 'vers' => 'Version choice(s) for specific resources', 'act' => 'Actions'); $r->print(<<ENDHEADERS); +<h4 class="LC_info">$header</h4> <form action="/adm/coursedocs" method="post"> <input type="hidden" name="versions" value="1" /> -<div class="LC_columnSection"> +<div class="LC_left_float"> <fieldset> -<legend>$lt{'act'}</legend> -$lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" /><br /> -$lt{'sc'}: <input type="submit" name="setcurrent" value="Go" /> -</fieldset> -</div> +<legend>$lt{'cd'}</legend> <select name="timerange"> <option value='all' $allsel>$lt{'al'}</option> <option value="-1" $startsel>$lt{'st'}</option> @@ -1850,7 +1892,18 @@ $lt{'sc'}: <input type="submit" name="se <option value="86400" $daysel>$lt{'sy'}</option> </select> <input type="submit" name="display" value="$lt{'sd'}" /> -<h2>$header</h2> +</fieldset> +</div> +<div class="LC_left_float"> +<fieldset> +<legend>$lt{'act'}</legend> +$lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" /><br /> +$lt{'sc'}: <input type="submit" name="setcurrent" value="Go" /> +</fieldset> +</div> +<br clear="all" /> +<hr /> +<h4>$lt{'vers'}</h4> <input type="submit" name="setversions" value="$lt{'save'}" /> <table border="0"> ENDHEADERS @@ -2017,7 +2070,7 @@ $help{'Caching'}.'</p></form>'."\n\n"); sub init_breadcrumbs { my ($form,$text)=@_; &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs", + &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1", text=>&Apache::loncommon::course_type().' Editor', faq=>273, bug=>'Instructor Interface', @@ -2052,23 +2105,24 @@ sub create_form_ul { # sub startContentScreen { - my ($r,$mode)=@_; - $r->print('<ul class="LC_TabContentBigger" id="mainnav">'); + my ($mode) = @_; + my $output = '<ul class="LC_TabContentBigger" id="mainnav">'; if (($mode eq 'navmaps') || ($mode eq 'supplemental')) { - $r->print('<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b> '.&mt('Content Overview').' </b></a></li>'."\n"); - $r->print('<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b> '.&mt('Content Search').' </b></a></li>'."\n"); - $r->print('<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b> '.&mt('Content Index').' </b></a></li>'."\n"); - $r->print('<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>'); - } else { - $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 'suppdocs')?' class="active"':''). - '><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'); - } - $r->print("\n".'</ul>'."\n"); - $r->print('<div class="LC_DocsBox" style="clear:both;margin:0;" id="contenteditor">'. - '<div id="maincoursedoc" style="margin:0 0;padding:0 0;">'. - '<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">'); + $output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b> '.&mt('Content Overview').' </b></a></li>'."\n"; + $output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b> '.&mt('Content Search').' </b></a></li>'."\n"; + $output .= '<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b> '.&mt('Content Index').' </b></a></li>'."\n"; + $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>'; + } else { + $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b> '.&mt('Content Editor').' </b></a></li>'."\n"; + $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n"; + $output .= '<li '.(($mode eq 'tools')?' class="active"':'').'><a href="/adm/coursedocs?tools=1"><b> '.&mt('Content Utilities').' </b></a></li>'."\n"; + '><a href="/adm/coursedocs?tools=1"><b> '.&mt('Content Utilities').' </b></a></li>'; + } + $output .= "\n".'</ul>'."\n"; + $output .= '<div class="LC_DocsBox" style="clear:both;margin:0;" id="contenteditor">'. + '<div id="maincoursedoc" style="margin:0 0;padding:0 0;">'. + '<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">'; + return $output; } # @@ -2076,8 +2130,7 @@ sub startContentScreen { # sub endContentScreen { - my ($r)=@_; - $r->print('</div></div></div>'); + return '</div></div></div>'; } sub supplemental_base { @@ -2089,7 +2142,14 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; + +# get course data my $crstype = &Apache::loncommon::course_type(); + my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + +# graphics settings + $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL').'/'); # # --------------------------------------------- Initialize help topics for this @@ -2123,20 +2183,29 @@ sub handler { $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'}); } - if ($allowed && $env{'form.verify'}) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver', + 'inhibitmenu']); + if ($allowed && $env{'form.chooseserver'}) { + &choose_dump_server($r); + return OK; + } elsif ($allowed && $env{'form.verify'}) { &init_breadcrumbs('verify','Verify Content'); &verifycontent($r); } elsif ($allowed && $env{'form.listsymbs'}) { - &init_breadcrumbs('listsymbs','List Symbs'); + &init_breadcrumbs('listsymbs','List Content IDs'); &list_symbs($r); } elsif ($allowed && $env{'form.docslog'}) { &init_breadcrumbs('docslog','Show Log'); - &docs_change_log($r); + my $folder = $env{'form.folder'}; + if ($folder eq '') { + $folder='default'; + } + &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath); } elsif ($allowed && $env{'form.versions'}) { &init_breadcrumbs('versions','Check/Set Resource Versions'); &checkversions($r); } elsif ($allowed && $env{'form.dumpcourse'}) { - &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Documents to Construction Space'); + &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space'); &dumpcourse($r); } elsif ($allowed && $env{'form.exportcourse'}) { &init_breadcrumbs('exportcourse','IMS Export'); @@ -2144,22 +2213,23 @@ sub handler { } else { # # Done catching special calls -# The whole rest is for course and supplemental documents +# The whole rest is for course and supplemental documents and utilities menu # Get the parameters that may be needed # &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['folderpath','pagepath', 'pagesymb','forcesupplement','forcestandard', - 'symb','command']); + 'tools','symb','command']); # standard=1: this is a "new-style" course with an uploaded map as top level # standard=2: this is a "old-style" course, and there is nothing we can do my $standard=($env{'request.course.uri'}=~/^\/uploaded\//); -# Decide whether this should display supplemental or main content +# Decide whether this should display supplemental or main content or utilities # supplementalflag=1: show supplemental documents # supplementalflag=0: show standard documents +# toolsflag=1: show utilities my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); @@ -2170,6 +2240,8 @@ sub handler { if ($env{'form.forcestandard'}) { $supplementalflag=0; } unless ($allowed) { $supplementalflag=1; } unless ($standard) { $supplementalflag=1; } + my $toolsflag=0; + if ($env{'form.tools'}) { $toolsflag=1; } my $script=''; my $showdoc=0; @@ -2292,81 +2364,90 @@ sub handler { } # 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)); - $env{'form.folder'}=pop(@folderpath); - $container='sequence'; - } - if ($env{'form.pagepath'}) { - my (@pagepath)=split('&',$env{'form.pagepath'}); - $env{'form.pagename'}=&unescape(pop(@pagepath)); - $env{'form.folder'}=pop(@pagepath); - $container='page'; - $containertag = '<input type="hidden" name="pagepath" value="" />'. - '<input type="hidden" name="pagesymb" value="" />'; - $uploadtag = - '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'. - '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'. - '<input type="hidden" name="folderpath" value="" />'; - } else { - my $folderpath=$env{'form.folderpath'}; - if (!$folderpath) { - if ($env{'form.folder'} eq '' || - $env{'form.folder'} eq 'supplemental') { - $folderpath='default&'. - &escape(&mt('Main '.$crstype.' Documents')); + unless ($toolsflag) { + &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)); + $env{'form.folder'}=pop(@folderpath); + $container='sequence'; + } + if ($env{'form.pagepath'}) { + my (@pagepath)=split('&',$env{'form.pagepath'}); + $env{'form.pagename'}=&unescape(pop(@pagepath)); + $env{'form.folder'}=pop(@pagepath); + $container='page'; + $containertag = '<input type="hidden" name="pagepath" value="" />'. + '<input type="hidden" name="pagesymb" value="" />'; + $uploadtag = + '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'. + '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'. + '<input type="hidden" name="folderpath" value="" />'; + } else { + my $folderpath=$env{'form.folderpath'}; + if (!$folderpath) { + if ($env{'form.folder'} eq '' || + $env{'form.folder'} eq 'supplemental') { + $folderpath='default&'. + &escape(&mt('Main '.$crstype.' Documents')); + } + } + $containertag = '<input type="hidden" name="folderpath" value="" />'; + $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />'; + } + if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { + $showdoc='/'.$1; + } + if ($showdoc) { # got called in sequence from course + $allowed=0; + } else { + if ($allowed) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); + $script=&Apache::lonratedt::editscript('simple'); } } - $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; - } - if ($showdoc) { # got called in sequence from course - $allowed=0; - } else { - if ($allowed) { - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); - $script=&Apache::lonratedt::editscript('simple'); - } } -# get course data - my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; - my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; - # get personal data my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom)); -# graphics settings - - $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/"); - if ($allowed) { - my @tabids; - if ($supplementalflag) { - @tabids = ('002','ee2','ff2'); + if ($toolsflag) { + $script .= &inject_data_js(); + my ($home,$other,%outhash)=&authorhosts(); + if (!$home && $other) { + my @hosts; + foreach my $aurole (keys(%outhash)) { + unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) { + push(@hosts,$outhash{$aurole}); + } + } + $script .= &dump_switchserver_js(@hosts); + } } else { - @tabids = ('aa1','bb1','cc1','ff1'); - unless ($env{'form.pagepath'}) { - unshift(@tabids,'001'); - push(@tabids,('dd1','ee1')); + 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,$supplementalflag). + &history_tab_js(). + &inject_data_js(). + &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr); + $addentries = { + onload => "javascript:resize_scrollbox('contentscroll','1','1');", + }; } - my $tabidstr = join("','",@tabids); - $script .= &editing_js($udom,$uname,$supplementalflag). - &resize_contentdiv_js($tabidstr); - $addentries = { - onload => "javascript:resize_contentdiv('contentscroll','1','1');", - }; } # -------------------------------------------------------------------- Body tag $script = '<script type="text/javascript">'."\n" @@ -2387,7 +2468,7 @@ sub handler { }) .&Apache::loncommon::help_open_menu('','',273,'RAT') .&Apache::lonhtmlcommon::breadcrumbs( - 'Editing the Table of Contents for your '.$crstype, + 'Editing '.$crstype.' Contents', 'Docs_Adding_Course_Doc') ); } else { @@ -2432,10 +2513,11 @@ sub handler { 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()); + my $result = + &Apache::loncommon::modify_html_refs('coursedoc',$destination, + $docuname,$docudom,undef, + $dir_root); + $r->print($result.&return_to_editor()); } elsif ($env{'form.phase'} eq 'decompress_uploaded') { $uploadphase = 'decompress_phase_one'; $r->print(&decompression_phase_one(). @@ -2447,7 +2529,11 @@ sub handler { } } - unless ($showdoc || $uploadphase) { + if ($allowed && $toolsflag) { + $r->print(&startContentScreen('tools')); + $r->print(&generate_admin_menu($crstype)); + $r->print(&endContentScreen()); + } elsif ((!$showdoc) && (!$uploadphase)) { # ----------------------------------------------------------------------------- my %lt=&Apache::lonlocal::texthash( 'uplm' => 'Upload a new main '.lc($crstype).' document', @@ -2550,13 +2636,6 @@ ERFORM if ($allowed) { &update_paste_buffer($coursenum,$coursedom); - my %lt=&Apache::lonlocal::texthash( - 'vc' => 'Verify Content', - 'cv' => 'Check/Set Resource Versions', - 'ls' => 'List Symbs', - 'sl' => 'Show Log' - ); - $r->print(<<HIDDENFORM); <form name="renameform" method="post" action="/adm/coursedocs"> <input type="hidden" name="title" /> @@ -2565,11 +2644,12 @@ ERFORM <input type="hidden" name="copyfolder" /> $containertag </form> - <form name="simpleedit" method="post" action="/adm/coursedocs"> - <input type="hidden" name="importdetail" value="" /> - $uploadtag - </form> + HIDDENFORM + $r->print(&makesimpleeditform($uploadtag)."\n". + &makedocslogform($uploadtag."\n". + '<input type="hidden" name="folder" value="'. + $env{'form.folder'}.'" />'."\n")); } # Generate the tabs @@ -2577,7 +2657,7 @@ HIDDENFORM if (($supplementalflag) && (!$allowed)) { &Apache::lonnavdisplay::startContentScreen($r,'supplemental'); } else { - &startContentScreen($r,($supplementalflag?'suppdocs':'docs')); + $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs'))); } # @@ -2614,14 +2694,6 @@ HIDDENFORM } my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container; - - - my $recoverform=(<<RFORM); - <form action="/adm/groupsort" method="post" name="recover"> - <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" /> @@ -2805,28 +2877,19 @@ NGFFORM ); $communityform = &create_form_ul(&create_list_elements(@communityforma)); - - -my @tools = ( -# {'<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 = ( 'aa' => ['Import Documents',$fileuploadform], 'bb' => ['Published Resources',$simpleeditdefaultform], 'cc' => ['Grading Resources',$gradingform], - 'ff' => ['Tools', &create_form_ul(&create_list_elements(@tools)).&generate_admin_options(\%help,\%env)], ); unless ($env{'form.pagepath'}) { $orderhash{'00'} = ['Newfolder',$newfolderform]; - $orderhash{'dd'} = ['Community Resources',$communityform]; + $orderhash{'dd'} = ['Collaboration',$communityform]; $orderhash{'ee'} = ['Special Documents',$specialdocumentsform]; } $hadchanges=0; - unless ($supplementalflag) { + unless (($supplementalflag || $toolsflag)) { my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, $supplementalflag,\%orderhash,$iconpath); if ($error) { @@ -2953,7 +3016,7 @@ my %suporderhash = ( } } - &endContentScreen($r); + $r->print(&endContentScreen()); if ($allowed) { $r->print(' @@ -2964,14 +3027,12 @@ my %suporderhash = ( <input type="hidden" name="residx" /> </form>'); } - } else { - unless ($uploadphase) { + } elsif ($showdoc) { # -------------------------------------------------------- This is showdoc mode - $r->print("<h1>".&mt('Uploaded Document').' - '. + $r->print("<h1>".&mt('Uploaded Document').' - '. &Apache::lonnet::gettitle($r->uri).'</h1><p>'. &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>". - &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>'); - } + &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>'); } } $r->print(&Apache::loncommon::end_page()); @@ -3047,7 +3108,13 @@ sub decompression_phase_one { $error = &mt('Archive file "[_1]" not in the expected location.',$env{'form.archiveurl'}); } else { my $file = $1; - $output = &Apache::loncommon::process_decompression($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem); + $output = + &Apache::loncommon::process_decompression($docudom,$docuname,$file, + $destination,$dir_root, + $hiddenelem); + if ($env{'form.autoextract_camtasia'}) { + $output .= &remove_archive($docudom,$docuname,$container); + } } if ($error) { $output .= '<p class="LC_error">'.&mt('Not extracted.').'<br />'. @@ -3062,12 +3129,12 @@ sub decompression_phase_one { sub decompression_phase_two { my ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,$hiddenelem)= &decompression_info(); - my ($output,$url); + my $output; if ($env{'form.archivedelete'}) { - ($output,$url) = &remove_archive($docudom,$docuname,$container); + $output = &remove_archive($docudom,$docuname,$container); } $output .= - &Apache::loncommon::process_extracted_files('coursedocs',$docudom,$docuname,$url, + &Apache::loncommon::process_extracted_files('coursedocs',$docudom,$docuname, $destination,$dir_root,$hiddenelem); return $output; } @@ -3075,7 +3142,7 @@ sub decompression_phase_two { sub remove_archive { my ($docudom,$docuname,$container) = @_; my $map = $env{'form.folder'}.'.'.$container; - my ($output,$delwarning,$delresult,$url,$outcome); + my ($output,$delwarning,$delresult,$url); my ($errtext,$fatal) = &mapread($docuname,$docudom,$map); if ($fatal) { if ($container eq 'page') { @@ -3100,9 +3167,8 @@ sub remove_archive { $delwarning = &mt('An error occurred updating the contents of the current folder.'); } } else { - $outcome = 'ok'; + $delresult = &mt('Archive file removed.'); } - $delresult = &mt('Archive file removed.'); } } $env{'form.cmd'} = $currcmd; @@ -3117,46 +3183,95 @@ sub remove_archive { $delresult. '</p>'; } - return ($output,$url,$outcome); + return $output; } -sub generate_admin_options { - my ($help_ref,$env_ref) = @_; - my %lt=&Apache::lonlocal::texthash( - 'vc' => 'Verify Content', - 'cv' => 'Check/Set Resource Versions', - 'ls' => 'List Symbs', - '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" 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" src="/res/adm/pages/dump.png" alt="'.$lt{dcd}.'" />'=>$dumpbut}; - } - 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>'; - +sub generate_admin_menu { + my ($crstype) = @_; + my $lc_crstype = lc($crstype); + my ($home,$other,%outhash)=&authorhosts(); + my %lt=&Apache::lonlocal::texthash ( + 'vc' => 'Verify Content', + 'cv' => 'Check/Set Resource Versions', + 'ls' => 'List Resource Identifiers', + 'imse' => 'Export contents to IMS Archive', + 'dcd' => "Dump $crstype Content to Authoring Space", + ); + my ($candump,$dumpurl); + if ($home + $other > 0) { + $candump = 'F'; + if ($home) { + $dumpurl = "javascript:injectData(document.courseverify,'dummy','dumpcourse','$lt{'dcd'}')"; + } else { + my @hosts; + foreach my $aurole (keys(%outhash)) { + unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) { + push(@hosts,$outhash{$aurole}); + } + } + if (@hosts == 1) { + my $switchto = '/adm/switchserver?otherserver='.$hosts[0]. + '&role='. + &HTML::Entities::encode($env{'request.role'},'"<>&').'&origurl='. + &HTML::Entities::encode('/adm/coursedocs?dumpcourse=1','"<>&'); + $dumpurl = "javascript:dump_needs_switchserver('$switchto')"; + } else { + $dumpurl = "javascript:choose_switchserver_window()"; + } + } + } + my @menu= + ({ categorytitle=>'Administration', + items =>[ + { linktext => $lt{'vc'}, + url => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')", + permission => 'F', + help => 'Verify_Content', + icon => 'verify.png', + linktitle => 'Verify contents can be retrieved/rendered', + }, + { linktext => $lt{'cv'}, + url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')", + permission => 'F', + help => 'Check_Resource_Versions', + icon => 'resversion.png', + linktitle => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions", + }, + { linktext => $lt{'ls'}, + url => "javascript:injectData(document.courseverify,'dummy','listsymbs','$lt{'ls'}')", + permission => 'F', + #help => '', + icon => 'symbs.png', + linktitle => "List the unique identifier used for each resource instance in your $lc_crstype" + }, + ] + }, + { categorytitle=>'Export', + items =>[ + { linktext => $lt{'imse'}, + url => "javascript:injectData(document.courseverify,'dummy','exportcourse','$lt{'imse'}')", + permission => 'F', + help => 'Docs_Export_Course_Docs', + icon => 'imsexport.png', + linktitle => $lt{'imse'}, + }, + { linktext => $lt{'dcd'}, + url => $dumpurl, + permission => $candump, + #help => '', + icon => 'dump.png', + linktitle => $lt{'dcd'}, + }, + ] + }); + return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n". + '<input type="hidden" id="dummy" />'."\n". + &Apache::lonhtmlcommon::generate_menu(@menu)."\n". + '</form>'; } - sub generate_edit_table { - my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto) = @_; + my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile) = @_; return unless(ref($orderhash_ref) eq 'HASH'); my %orderhash = %{$orderhash_ref}; my $form; @@ -3166,13 +3281,29 @@ sub generate_edit_table { $activetab = $env{'form.active'}; } my $backicon = $iconpath.'clickhere.gif'; - my $backtext = &mt('Back to Overview'); + my $backtext = &mt('To Overview'); $form = '<div class="LC_Box" style="margin:0;">'. - '<ul id="navigation'.$tid.'" class="LC_TabContent">'. + '<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n". '<li class="goback">'. '<a href="javascript:toContents('."'$jumpto'".');">'. '<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'. - ' alt="'.$backtext.'" />'.$backtext.'</a></li>'; + ' alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n"; + if ($tid == 1) { + $form .= '<li>'. + '<a href="javascript:groupopen('."'$readfile'".',1);">'. + &mt('Undo Delete').'</a></li>'."\n"; + if ($env{'form.docslog'}) { + $form .= '<li class="active">'; + } else { + $form .= '<li>'; + } + $form .= '<a href="javascript:toggleHistoryDisp(1);">'. + &mt('History').'</a></li>'."\n"; + if ($env{'form.docslog'}) { + $form .= '<li><a href="javascript:toggleHistoryDisp(0);">'. + &mt('Edit').'</a></li>'."\n"; + } + } foreach my $name (reverse(sort(keys(%orderhash)))) { if($name ne '00'){ if($activetab eq '' || $activetab ne $name){ @@ -3182,17 +3313,17 @@ sub generate_edit_table { } $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>'; + .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n"; } else { - $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'; + $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n"; } } - $form .= '</ul>'; - $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'; + $form .= '</ul>'."\n"; + $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'."\n"; if ($to_show ne '') { - $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'; + $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'."\n"; } foreach my $field (keys(%orderhash)){ if($field ne '00'){ @@ -3203,11 +3334,12 @@ sub generate_edit_table { } $form .= '<div id="'.$field.$tid.'"' .' class="LC_ContentBox" '.$active.'>'.${$orderhash{$field}}[1] - .'</div>'; + .'</div>'."\n"; } } - $form .= '</div></div>'; - + unless ($env{'form.docslog'}) { + $form .= '</div></div>'."\n"; + } return $form; } @@ -3553,17 +3685,10 @@ function showPage(current, pageId, nav, } } } - resize_contentdiv('contentscroll','1','0'); + resize_scrollbox('contentscroll','1','0'); return false; } -function injectData(current, hiddenField, name, value) { - currentElement = document.getElementById(hiddenField); - currentElement.name = name; - currentElement.value = value; - current.submit(); -} - function toContents(jumpto) { var newurl = '$backtourl'; if (jumpto != '') { @@ -3576,194 +3701,125 @@ function toContents(jumpto) { 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; +sub history_tab_js { + return <<"ENDHIST"; +function toggleHistoryDisp(choice) { + document.docslogform.docslog.value = choice; + document.docslogform.submit(); + return; +} - if (document.getElementById("contenteditor") == null) { - return; - } +ENDHIST +} - if (document.getElementById(scrollboxid) == null) { - return; - } else { - scrollbox = document.getElementById(scrollboxid); - } +sub inject_data_js { + return <<ENDINJECT; - if (document.getElementById(scrolltableid) == null) { - return; - } else { - scrolltable = document.getElementById(scrolltableid); - } +function injectData(current, hiddenField, name, value) { + currentElement = document.getElementById(hiddenField); + currentElement.name = name; + currentElement.value = value; + current.submit(); +} - 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; - } - } - } - } +ENDINJECT +} - 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"; - } +sub dump_switchserver_js { + my @hosts = @_; + my %lt = &Apache::lonlocal::texthash( + dump => 'Dumping to Authoring Space requires switching server.', + swit => 'Switch server?', + duco => 'Dump content to Authoring Space', + yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.', + chos => 'Choose server', + ); + my $role = $env{'request.role'}; + my $js = <<"ENDSWJS"; +<script type="text/javascript"> +function write_switchserver() { + var server; + if (document.setserver.posshosts.length > 0) { + for (var i=0; i<document.setserver.posshosts.length; i++) { + if (document.setserver.posshosts[i].checked) { + server = document.setserver.posshosts[i].value; } + } + opener.document.location.href="/adm/switchserver?otherserver="+server+"&role=$role&origurl=/adm/coursedocs"; + } + window.close(); +} +</script> - if (newscrollboxw != scrollboxw) { - var newscrolltablew = newscrollboxw+offsetw; - scrolltable.style.width = newscrolltablew+"px"; - } - } +ENDSWJS - if (contentlistid.offsetWidth != contentlistwstart) { - listwchange = 1; - } + my $startpage = &Apache::loncommon::start_page('Choose server',$js, + {'only_body' => 1, + 'js_ready' => 1,}); + my $endpage = &Apache::loncommon::end_page({'js_ready' => 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"; - } - } - } + my $hostpicker; + my $count = 0; + foreach my $host (sort(@hosts)) { + my $checked; + if ($count == 0) { + $checked = ' checked="checked"'; } + $hostpicker .= '<label><input type="radio" name="posshosts" value="'. + $host.'"'.$checked.' />'.$host.'</label> '; + $count++; } - 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; + + return <<"ENDSWITCHJS"; - if (scrollboxscrollheight <= scrollboxheight) { - if ((contentlistheight+offsetv)<scrollboxheight) { - newscrollheight = contentlistheight+offsetv; - scrollbox.style.height = newscrollheight+"px"; - } +function dump_needs_switchserver(url) { + if (url!='' && url!= null) { + if (confirm("$lt{'dump'}\\n$lt{'swit'}")) { + go(url); } } return; } -function resizeContentEditor() { - var timer; - clearTimeout(timer) - timer=setTimeout('resize_contentdiv("contentscroll","1","1")',500); +function choose_switchserver_window() { + newWindow = window.open('','ChooseServer','height=400,width=500,scrollbars=yes') + newWindow.document.open(); + newWindow.document.writeln('$startpage'); + newWindow.document.write('<h3>$lt{'duco'}<\\/h3>\\n'+ + '<p>$lt{'yone'}<\\/p>\\n'+ + '<div class="LC_left_float"><fieldset><legend>$lt{'chos'}<\\/legend>\\n'+ + '<form name="setserver" method="post" action="" \\/>\\n'+ + '$hostpicker\\n'+ + '<br \\/><br \\/>\\n'+ + '<input type="button" name="makeswitch" value="$lt{'swit'}" '+ + 'onclick="write_switchserver();" \\/>\\n'+ + '<\\/form><\\/fieldset><\\/div><br clear="all" \\/>\\n'); + newWindow.document.writeln('$endpage'); + newWindow.document.close(); + newWindow.focus(); +} + +ENDSWITCHJS +} + +sub makedocslogform { + my ($formelems,$docslog) = @_; + return <<"LOGSFORM"; + <form action="/adm/coursedocs" method="post" name="docslogform"> + <input type="hidden" name="docslog" value="$docslog" /> + $formelems + </form> +LOGSFORM } -ENDRESIZESCRIPT - return; +sub makesimpleeditform { + my ($formelems) = @_; + return <<"SIMPFORM"; + <form name="simpleedit" method="post" action="/adm/coursedocs"> + <input type="hidden" name="importdetail" value="" /> + $formelems + </form> +SIMPFORM } 1; @@ -3798,21 +3854,12 @@ sets @resources - array with the resourc Return hash with valid author names -=item dumpbutton() - -Generate "dump" button - =item clean() =item dumpcourse() Actually dump course - -=item exportbutton() - - Generate "export" button - =item group_import() Imports the given (name, url) resources into the course @@ -3872,6 +3919,48 @@ Check Versions Breadcrumbs for special functions +=item create_list_elements() + +=item create_form_ul() + +=item startContentScreen() + +=item endContentScreen() + +=item supplemental_base() + +=item embedded_form_elems() + +=item embedded_destination() + +=item return_to_editor() + +=item decompression_info() + +=item decompression_phase_one() + +=item decompression_phase_two() + +=item remove_archive() + +=item generate_admin_menu() + +=item generate_edit_table() + +=item editing_js() + +=item history_tab_js() + +=item inject_data_js() + +=item dump_switchserver_js() + +=item resize_scrollbox_js() + +=item makedocslogform() + +=item makesimpleeditform() + =back =cut