--- loncom/interface/londocs.pm 2009/10/30 19:50:24 1.406 +++ loncom/interface/londocs.pm 2010/12/25 04:40:15 1.434.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.406 2009/10/30 19:50:24 raeburn Exp $ +# $Id: londocs.pm,v 1.434.2.3 2010/12/25 04:40:15 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -117,17 +117,22 @@ sub authorhosts { sub dumpbutton { my ($home,$other,%outhash)=&authorhosts(); - my $type = &Apache::loncommon::course_type(); + my $crstype = &Apache::loncommon::course_type(); if ($home+$other==0) { return ''; } if ($home) { - my $link = "".&mt('Dump '.$type.' DOCS to Construction Space').""; - return $link.' '. - &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs').'
'; - } else { - return '
'. - &mt('Dump '.$type. - ' DOCS to Construction Space: available on other servers'). - '
'; + my $link = + "" + .&mt('Dump '.$crstype.' Documents to Construction Space') + .''; + return + $link.' ' + .&Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs') + .'
'; + } else { + return + &mt('Dump '.$crstype.' Documents to Construction Space: available on other servers'); } } @@ -141,10 +146,10 @@ sub clean { sub dumpcourse { my ($r) = @_; - my $type = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space'). + my $crstype = &Apache::loncommon::course_type(); + $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Documents to Construction Space'). '
'); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$type.' 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'}; @@ -255,15 +260,15 @@ sub dumpcourse { $r->print(&Apache::loncommon::end_data_table()); &untiehash(); $r->print( - '

'); + '

'); } } sub exportbutton { - my $type = &Apache::loncommon::course_type(); - return "".&mt('IMS Export')."". + my $crstype = &Apache::loncommon::course_type(); + return "".&mt('IMS Export')."". &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'
'; } @@ -271,18 +276,28 @@ sub exportbutton { sub exportcourse { my $r=shift; - my $type = &Apache::loncommon::course_type(); + my $crstype = &Apache::loncommon::course_type(); my %discussiontime = &Apache::lonnet::dump('discussiontimes', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); my $numdisc = keys(%discussiontime); my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { - $r->print(&Apache::loncommon::start_page('Export '.$type.' to IMS Package'). + $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package'). '

'.&mt('IMS Export Failed').'

'. - '
'. - &mt('Unable to retrieve information about course contents'). - '
'.&mt('Return to Course Editor').''); - &Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($type).':'.$env{'request.course.id'}); + '
'); + if ($crstype eq 'Community') { + $r->print(&mt('Unable to retrieve information about community contents')); + } else { + $r->print(&mt('Unable to retrieve information about course contents')); + } + $r->print('
'); + if ($crstype eq 'Community') { + $r->print(&mt('Return to Community Editor')); + } else { + $r->print(&mt('Return to Course Editor')); + } + $r->print(''); + &Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); return; } my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef); @@ -331,20 +346,20 @@ sub exportcourse { open(OUTPUT, "zip -r $imszip * 2> /dev/null |"); close(OUTPUT); chdir $cwd; + $outcome .= '

' + .&mt('[_1]Your IMS package[_2] is ready for download.' + ,'','') + .'

'; if ($copyresult) { $outcome .= '

' .&mt('The following errors occurred during export - [_1]' ,$copyresult) .'

'; } - $outcome .= '

' - .&mt('[_1]Your IMS package[_2] is ready for download.' - ,'','') - .'

'; } else { $outcome = '

' .&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.') .'

' @@ -353,29 +368,31 @@ sub exportcourse { .'

'; } } - $r->print(&Apache::loncommon::start_page('Export '.$type.' to IMS Package')); + $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export')); $r->print($outcome); $r->print(&Apache::loncommon::end_page()); } else { - my $display; - $display = '
'."\n"; - $display .= '

' - .&mt('Choose which items you wish to export from your '.$type.'.') - .'

'; - $display .= '
'. + my $display=''."\n". + '

'. + &mt('Choose which items you wish to export from your '.$crstype.'.'). + '

'. + '
'. ''.&mt('Content items').''. ''. '  
'. - '
'. - ''.&mt('Discussion posts').''. - ''. - '  '. - '
'; + ' onclick="javascript:uncheckAll(document.exportdoc.archive)" />
'; + if ($numdisc > 0) { + $display .= '
'. + ''.&mt('Discussion posts').''. + ''. + '  '. + '
'; + } + $display .= '
'; my $curRes; my $depth = 0; my $count = 0; @@ -386,15 +403,11 @@ sub exportcourse { my $lastcontainer = $startcount; $display .= &Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() - .''.&mt('Export content item?').'' - .''; + .''.&mt('Export content item?').''; if ($numdisc > 0) { - $display .= &mt('Export discussion posts?'); - } else { - $display .= ' '; + $display .= ''.&mt('Export discussion posts?').''; } - $display .= '' - .&Apache::loncommon::end_data_table_header_row(); + $display .= &Apache::loncommon::end_data_table_header_row(); while ($curRes = $it->next()) { if (ref($curRes)) { $count ++; @@ -415,37 +428,33 @@ sub exportcourse { $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard'; } } + my $currelem = $count+$boards+$startcount; $display .= &Apache::loncommon::start_data_table_row() .''."\n" .'is_sequence()) || ($curRes->is_page())) { - my $checkitem = $count + $boards + $startcount; - $display .= 'onclick="javascript:propagateCheck('."'$checkitem'".')"'; + $lastcontainer = $currelem; + $display .= 'onclick="javascript:propagateCheck('."'$currelem'".')"'; } $display .= ' />'."\n"; for (my $i=0; $i<$depth; $i++) { - $display .= '' - .''."\n"; + $display .= ('' x2)."\n"; } if ($curRes->is_sequence()) { $display .= ' '."\n"; - $lastcontainer = $count + $startcount + $boards; } elsif ($curRes->is_page()) { $display .= ' '."\n"; - $lastcontainer = $count + $startcount + $boards; } - my $currelem = $count+$boards+$startcount; $children{$parent{$depth}} .= $currelem.':'; $display .= ' '.$curRes->title().''."\n"; # Existing discussion posts? if ($discussiontime{$ressymb} > 0) { $boards ++; - $currelem = $count+$boards+$startcount; $display .= '' .'' .''."\n"; - } else { + } elsif ($numdisc > 0) { $display .= ' '."\n"; } $display .= &Apache::loncommon::end_data_table_row(); @@ -507,7 +516,7 @@ function containerCheck(item) { // ]]> |; - $r->print(&Apache::loncommon::start_page('Export '.$type.' to IMS Package', + $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package', $scripttag)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export')); $r->print($display. @@ -998,7 +1007,7 @@ sub group_import { } sub breadcrumbs { - my ($allowed,$type)=@_; + my ($allowed,$crstype)=@_; &Apache::lonhtmlcommon::clear_breadcrumbs(); my (@folders); if ($env{'form.pagepath'}) { @@ -1041,7 +1050,7 @@ sub breadcrumbs { if ($3) { $isencrypted=1; } if ($4 ne '') { $is_random_order = 1; } if ($folder eq 'supplemental') { - $name = &mt('Supplemental '.$type.' Documents'); + $name = &mt('Supplemental '.$crstype.' Documents'); } &Apache::lonhtmlcommon::add_breadcrumb( {'href'=>$url.$cpinfo, @@ -1497,7 +1506,7 @@ sub handle_edit_cmd { } sub editor { - my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_; + my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype)=@_; my $container= ($env{'form.pagepath'}) ? 'page' : 'sequence'; @@ -1515,7 +1524,7 @@ sub editor { my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order); if ($allowed) { ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = - &breadcrumbs($allowed,$type); + &breadcrumbs($allowed,$crstype); $r->print($breadcrumbtrail); } else { $randompick = -1; @@ -1598,13 +1607,12 @@ sub editor { my $shown=0; if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) { $r->print('
'. - '

'.&mt('Parameters:'). - '

'); + ''); if ($randompick>=0) { $r->print('

' .&mt('Caution: this folder is set to randomly pick a subset' @@ -1628,7 +1636,9 @@ sub editor { $r->print('

'); } - my $output; + my $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); @@ -1636,10 +1646,12 @@ sub editor { unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $idx++; next; } $output .= &entryline($idx,$name,$url,$folder,$allowed,$res, - $coursenum); + $coursenum,$crstype); $idx++; $shown++; } + &Apache::loncommon::end_data_table_count(); + if ($shown) { $r->print(&Apache::loncommon::start_data_table()); if ($allowed) { @@ -1670,11 +1682,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'; @@ -1693,7 +1704,8 @@ sub process_file_upload { $LONCAPA::map::resources[1]=''; } if ($fatal) { - return 'failed'; + $$upload_output = '

'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'

'; + return; } my $destination = 'docs/'; if ($folder =~ /^supplemental/) { @@ -1704,13 +1716,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 = '

'.&mt('Uploaded [_1]',''. + $stored.'').'

'; + } else { + my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$}); + + $$upload_output = '

'.&mt('Unable to save file [_1].',''.$filename.'').'

'; + return; + } my $ext='false'; if ($url=~m{^http://}) { $ext='true'; } $url = &LONCAPA::map::qtunescape($url); @@ -1727,51 +1749,37 @@ sub process_file_upload { ($errtext,$fatal)=&storemap($coursenum,$coursedom, $folder.'.'.$container); if ($fatal) { - $$upload_output .= '

'.$errtext.'

'; - return 'failed'; + $$upload_output = '

'.$errtext.'

'; + 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 = ' - - - - - '; - $phase_status = 'phasetwo'; - - $$upload_output .= - 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.
'. - &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 .= + '

'.&mt('This file contains embedded multimedia objects, which need to be uploaded.').'

'.$embedded; + $nextphase = $uploadphase; + } else { + $$upload_output .= $embedded; + } + } else { + $$upload_output .= &mt('Embedded item(s) already present, so no additional upload(s) required').'
'; + } } else { - $$upload_output .= 'No embedded items identified
'; + $$upload_output .= &mt('No embedded items identified').'
'; } } } } - 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 { @@ -1792,6 +1800,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=''.&Apache::lonlocal::locallocaltime($time).' '. $name.':
'.$foldertitle; } @@ -1804,7 +1813,7 @@ sub parse_supplemental_title { # --------------------------------------------------------------- An entry line sub entryline { - my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_; + my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_; my ($foldertitle,$pagetitle,$renametitle); if (&is_supplemental_title($title)) { ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title); @@ -1835,7 +1844,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'}); } @@ -2067,12 +2076,18 @@ END } else { undef($external); } + my $reinit; + if ($crstype eq 'Community') { + $reinit = &mt('(re-initialize community to access)'); + } else { + $reinit = &mt('(re-initialize course to access)'); + } $line.=' '.($url?'':'').''.($url?'':'').' - '.($url?"":'').$title.($url?'':' '.&mt('(re-initialize course to access)').'').$external." + '.($url?"":'').$title.($url?'':' '.$reinit.'').$external." "; if (($allowed) && ($folder!~/^supplemental/)) { my %lt=&Apache::lonlocal::texthash( @@ -2220,7 +2235,7 @@ List Symbs sub list_symbs { my ($r) = @_; - my $type = &Apache::loncommon::course_type(); + my $crstype = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page('Symb List')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List')); my $navmap = Apache::lonnavmaps::navmap->new(); @@ -2229,25 +2244,23 @@ sub list_symbs { '
'. &mt('Unable to retrieve information about course contents'). '
'); - &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($type).':'.$env{'request.course.id'}); + &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); } else { $r->print("
\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
\n"); } - $r->print(''.&mt('Return to DOCS').''); + $r->print('
'.&mt('Back to Course Editor').''); } sub verifycontent { my ($r) = @_; - my $type = &Apache::loncommon::course_type(); - my $loaderror=&Apache::lonnet::overloaderror($r); - if ($loaderror) { return $loaderror; } - $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents')); + my $crstype = &Apache::loncommon::course_type(); + $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); $hashtied=0; undef %alreadyseen; %alreadyseen=(); @@ -2256,9 +2269,9 @@ sub verifycontent { if ($hash{$key}=~/\.(page|sequence)$/) { if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) { $r->print('
'. - &mt('The following sequence or page is included more than once in your '.$type.': '). + &mt('The following sequence or page is included more than once in your '.$crstype.':').' '. &unescape($hash{$key}).'
'. - &mt('Note that grading records for problems included in this sequence or folder will overlap.
')); + &mt('Note that grading records for problems included in this sequence or folder will overlap.').'
'); } } if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) { @@ -2266,8 +2279,13 @@ sub verifycontent { } } &untiehash(); - $r->print('

'.&mt('Done').'.

'.''. - &mt('Return to DOCS').''); + $r->print( + '

'.&mt('Done').'

' + .'
' + .'

' + .&mt('Back to Course Editor') + .'

' + ); } @@ -2279,9 +2297,9 @@ sub devalidateversioncache { sub checkversions { my ($r) = @_; - my $type = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page("Check $type Document Versions")); - $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions")); + 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")); my $header=''; my $startsel=''; my $monthsel=''; @@ -2342,7 +2360,7 @@ sub checkversions { &changewarning($r,''); if ($env{'form.timerange'} eq 'all') { # show all documents - $header=&mt('All Documents in '.$type); + $header=&mt('All Documents in '.$crstype); $allsel=1; foreach my $key (keys(%hash)) { if ($key=~/^ids\_(\/res\/.+)$/) { @@ -2387,7 +2405,7 @@ sub checkversions { $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); my %lt=&Apache::lonlocal::texthash - ('st' => 'Version changes since start of '.$type, + ('st' => 'Version changes since start of '.$crstype, 'lm' => 'Version changes since last Month', 'lw' => 'Version changes since last Week', 'sy' => 'Version changes since Yesterday', @@ -2396,9 +2414,9 @@ sub checkversions { 'fi' => 'File', 'md' => 'Modification Date', 'mr' => 'Most recently published Version', - 've' => 'Version used in '.$type, - 'vu' => 'Set Version to be used in '.$type, -'sv' => 'Set Versions to be used in '.$type.' according to Selections below', + 've' => 'Version used in '.$crstype, + 'vu' => 'Set Version to be used in '.$crstype, +'sv' => 'Set Versions to be used in '.$crstype.' according to Selections below', 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)', 'sc' => 'Set all Resource Versions to current Version (Fix Versions)', 'di' => 'Differences'); @@ -2445,7 +2463,7 @@ ENDHEADERS 'Most Recent: '. ''.$currentversion.''. ''. - 'In '.$type.': '. + 'In '.$crstype.': '. ''); # Used in course my $usedversion=$hash{'version_'.$linkurl}; @@ -2459,11 +2477,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' => 'most recent', - map {$_,$_} (1..$currentversion)))); + 'mostrecent' => &mt('most recent'), + map {$_,$_} (1..$currentversion)})); $r->print(''); my $lastold=1; for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { @@ -2517,7 +2535,7 @@ ENDHEADERS } } $r->print(''); - $r->print('

'.&mt('Done').'.

'); + $r->print('

'.&mt('Done').'

'); &untiehash(); } @@ -2600,7 +2618,7 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; - my $type = &Apache::loncommon::course_type(); + my $crstype = &Apache::loncommon::course_type(); # --------------------------------------------- Initialize help topics for this @@ -2641,7 +2659,7 @@ 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'); @@ -2666,7 +2684,12 @@ sub handler { &Apache::loncommon::restore_course_settings('docs_folderpath', {'folderpath' => 'scalar'}); } - if (!$env{'form.folderpath'}) { + if (!$allowed) { + unless($env{'form.folderpath'} =~ /^supplemental/) { + $env{'form.folderpath'} = ''; + } + } + if (!$env{'form.folderpath'} && $allowed) { &Apache::loncommon::restore_course_settings('docs_folderpath', {'pagepath' => 'scalar'}); } @@ -2675,7 +2698,7 @@ sub handler { } if ($env{'form.folderpath'} =~ /^supplemental_\d+/) { $env{'form.folderpath'} = 'supplemental&'. - &escape(&mt('Supplemental '.$type.' Documents')).'&'. + &escape(&mt('Supplemental '.$crstype.' Documents')).'&'. $env{'form.folderpath'}; } &Apache::loncommon::store_course_settings('docs_folderpath', @@ -2691,9 +2714,22 @@ sub handler { $env{'form.pagename'}=&unescape(pop(@pagepath)); $env{'form.folder'}=pop(@pagepath); $containertag = ''. - ''; - $uploadtag = ''. - ''; + ''; + $uploadtag = + ''. + ''. + ''; + } 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 = ''; + $uploadtag = ''; } if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { $showdoc='/'.$1; @@ -2760,135 +2796,92 @@ sub create_form_ul { &Apache::lonhtmlcommon::clear_breadcrumbs(); if ($allowed) { &Apache::lonhtmlcommon::add_breadcrumb({ - href=>"/adm/coursedocs",text=>"$type Editor"}); + href=>"/adm/coursedocs",text=>"$crstype Editor"}); - $r->print(&Apache::loncommon::start_page("$type Editor", $script, + $r->print(&Apache::loncommon::start_page("$crstype Editor", $script, {'force_register' => $showdoc,}) .&Apache::loncommon::help_open_menu('','',273,'RAT') .&Apache::lonhtmlcommon::breadcrumbs( - 'Editing the Table of Contents for your '.$type, + 'Editing the Table of Contents for your '.$crstype, 'Docs_Adding_Course_Doc') ); } elsif ($showdoc) { - $r->print(&Apache::loncommon::start_page("$type documents",undef, + $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 '.$type.' Documents')); + &escape(&mt('Supplemental '.$crstype.' Documents')); } - my ($breadcrumbtrail) = &breadcrumbs($allowed,$type); + 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. - undef($hadchanges); - $upload_result = &process_file_upload(\$upload_output,$coursenum, - $coursedom,\%allfiles, - \%codebase,$1); + my $context = $1; + # Process file upload - phase one - upload and parse primary file. + undef($hadchanges); + $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom, + \%allfiles,\%codebase,$context); 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($type).' document', - 'upls' => 'Upload a new supplemental '.lc($type).' document', + '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', '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', @@ -2931,7 +2924,7 @@ CHBO $fileupload
$lt{'title'}:
- + $uploadtag
@@ -2951,9 +2944,9 @@ FUFORM SEDFFORM my @simpleeditdefaultforma = ( - { 'pic03' => "$uploadtag$lt{'srch'}" }, - { 'pic04' => "$lt{'impo'}$help{'Importing_LON-CAPA_Resource'}" }, - { 'pic05' => "$lt{'book'}" }, + { ''.$lt{srch}.'' => "$uploadtag$lt{'srch'}" }, + { ''.$lt{impo}.'' => "$lt{'impo'}$help{'Importing_LON-CAPA_Resource'}" }, + { ''.$lt{book}.'' => "$lt{'book'}" }, ); $simpleeditdefaultform .= create_form_ul(create_list_elements(@simpleeditdefaultforma)); $simpleeditdefaultform .=(< $uploadtag - $lt{'extr'}$help{'Adding_External_Resource'} + $lt{'extr'}$help{'Adding_External_Resource'} ERFORM @@ -2986,18 +2979,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 '.$type.' Documents')); - } - } - unless ($env{'form.pagepath'}) { - $containertag = ''; - $uploadtag = ''; - } $r->print(< @@ -3016,7 +2997,16 @@ HIDDENFORM 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'), + }, + ); if ($allowed) { $r->print(''); } else { $r->print('
'); @@ -3051,7 +3043,7 @@ HIDDENFORM if ($folder eq '' || $folder=~/^supplemental/) { $folder='default'; $savefolderpath = $env{'form.folderpath'}; - $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents')); + $env{'form.folderpath'}='default&'.&escape($tabtitles{'main'}{$crstype}); $uploadtag = ''; } @@ -3080,14 +3072,14 @@ HIDDENFORM my $recoverform=(< - $lt{'reco'} + $lt{'reco'} RFORM my $imspform=(< - $lt{'imsf'} + $lt{'imsf'} IMSPFORM @@ -3097,7 +3089,7 @@ IMSPFORM $uploadtag - $lt{'navc'} + $lt{'navc'} $help{'Navigate_Content'} NNFORM @@ -3106,7 +3098,7 @@ NNFORM $uploadtag - $lt{'sipa'} + $lt{'sipa'} $help{'Simple Page'} NSPFORM @@ -3116,7 +3108,7 @@ NSPFORM $uploadtag - $lt{'sipr'} + $lt{'sipr'} $help{'Simple Problem'} @@ -3127,7 +3119,7 @@ NSPROBFORM $uploadtag - $lt{'drbx'} + $lt{'drbx'} NDBFORM @@ -3136,7 +3128,7 @@ NDBFORM $uploadtag - $lt{'scuf'} + $lt{'scuf'} $help{'Score_Upload_Form'} NEXUFORM @@ -3146,7 +3138,7 @@ NEXUFORM $uploadtag - $lt{'bull'} + $lt{'bull'} $help{'Bulletin Board'} NBFORM @@ -3157,7 +3149,7 @@ NBFORM $uploadtag - $lt{'mypi'} + $lt{'mypi'} $help{'My Personal Information Page'} NAMFORM @@ -3167,7 +3159,7 @@ NAMFORM $uploadtag - $lt{'abou'} + $lt{'abou'} NASOFORM @@ -3178,7 +3170,7 @@ NASOFORM $uploadtag - $lt{'rost'} + $lt{'rost'} $help{'Course Roster'} NROSTFORM @@ -3196,7 +3188,7 @@ my $newfolderb; - $lt{'newp'} + $lt{'newp'} $help{'Adding_Pages'} NPFORM @@ -3207,7 +3199,7 @@ NPFORM - $lt{'newf'}$help{'Adding_Folders'} + $lt{'newf'}$help{'Adding_Folders'} NFFORM @@ -3217,7 +3209,7 @@ NFFORM $uploadtag - $lt{'syll'} + $lt{'syll'} $help{'Syllabus'} @@ -3229,54 +3221,62 @@ NSYLFORM $uploadtag - $lt{'grpo'} + $lt{'grpo'} $help{'Group Portfolio'} NGFFORM @specialdocumentsforma=( - {'pic06'=>$newpageform}, - {'pic07'=>$newsylform}, - {'pic08'=>$newgroupfileform}, - ); - - } - push @specialdocumentsforma, ({'pic09'=>$newnavform}, - {'pic10'=>$newsmppageform}, - {'pic11'=>$newsmpproblemform}, - {'pic12'=>$newdropboxform}, - {'pic13'=>$newexuploadform}, - {'pic14'=>$newbulform}, - {'pic15'=>$newaboutmeform}, - {'pic16'=>$newaboutsomeoneform}, - {'pic17'=>$newrosterform},); + {''.$lt{newp}.''=>$newpageform}, + {''.$lt{syll}.''=>$newsylform}, + {''.$lt{grpo}.''=>$newgroupfileform}, + ); + + my @importdoc = ( + {''.$lt{extr}.''=>$extresourcesform}, + {''.$lt{imsf}.''=>$imspform},); + $fileuploadform = create_form_ul(create_list_elements(@importdoc)) . '
' . $fileuploadform; + + push @specialdocumentsforma, ({''.$lt{navc}.''=>$newnavform}, + {''.$lt{sipa}.''=>$newsmppageform}, + {''.$lt{sipr}.''=>$newsmpproblemform}, + {''.$lt{drbx}.''=>$newdropboxform}, + {''.$lt{scuf}.''=>$newexuploadform}, + {''.$lt{bull}.''=>$newbulform}, + {''.$lt{mypi}.''=>$newaboutmeform}, + {''.$lt{abou}.''=>$newaboutsomeoneform}, + {''.$lt{rost}.''=>$newrosterform},); $specialdocumentsform = create_form_ul(create_list_elements(@specialdocumentsforma)); + } if($env{'form.pagepath'}) { @specialdocumentsforma=( - {'pic32'=>$newsmpproblemform}, - {'pic33'=>$newexuploadform} + {''.&mt('Simple Problem').''=>$newsmpproblemform}, + {''.&mt('Score Upload Form').''=>$newexuploadform} ); $specialdocumentsform= create_form_ul(create_list_elements(@specialdocumentsforma)); } my @tools = ( - {'pic18'=>$extresourcesform}, - {'pic19'=>$imspform}, - {'pic20'=>$recoverform}, +# {''.$lt{extr}.''=>$extresourcesform}, +# {''.$lt{imsf}.''=>$imspform}, + {''.$lt{reco}.''=>$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)], + 'dd' => ['Tools', create_form_ul(create_list_elements(@tools)).&generate_admin_options(\%help,\%env)], ); +unless($env{'form.pagepath'}) { + $orderhash{'00'} = ['Newfolder',$newfolderform]; +} + my $tid='1'; $hadchanges=0; - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type); + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); if ($error) { $r->print('

'.$error.'

'); } @@ -3289,8 +3289,6 @@ $r->print(&generate_edit_table($tid,\%or $r->print(''); } - if ($env{'form.pagepath'}) { - } # ----------------------------------------------------- Supplemental documents $active = 'style="display: none;"'; if($activeClass == 1){ @@ -3304,7 +3302,7 @@ $r->print(''); if ($folder =~ /^supplemental$/ && (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) { $env{'form.folderpath'} = 'supplemental&'. - &escape(&mt('Supplemental '.$type.' Documents')); + &escape(&mt('Supplemental '.$crstype.' Documents')); } elsif ($allowed) { $env{'form.folderpath'} = $savefolderpath; } @@ -3340,7 +3338,7 @@ SUPDOCFORM - $lt{'newf'} + $lt{'newf'} $help{'Adding_Folders'} SNFFORM @@ -3351,7 +3349,7 @@ SNFFORM - $lt{'extr'} $help{'Adding_External_Resource'} + $lt{'extr'} $help{'Adding_External_Resource'} SNEFORM @@ -3361,7 +3359,7 @@ SNEFORM - $lt{'syll'} + $lt{'syll'} $help{'Syllabus'} SNSFORM @@ -3372,31 +3370,37 @@ SNSFORM - $lt{'mypi'} + $lt{'mypi'} $help{'My Personal Information Page'} SNAMFORM my @specialdocs = ( - {'pic29'=>$supnewextform}, - {'pic30'=>$supnewsylform}, - {'pic31'=>$supnewaboutmeform}, + {''.$lt{syll}.'' + =>$supnewsylform}, + {''.$lt{mypi}.'' + =>$supnewaboutmeform}, ); +my @supimportdoc = ( + {''.$lt{extr}.'' + =>$supnewextform}, + ); +$supupdocform = create_form_ul(create_list_elements(@supimportdoc)) . '
' . $supupdocform; my %suporderhash = ( '00' => ['Supnewfolder', $supnewfolderform], - 'ee' => ['Upload Document',$supupdocform], + 'ee' => ['Import Documents',$supupdocform], 'ff' => ['Special Documents',create_form_ul(create_list_elements(@specialdocs))] ); - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type); + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); if ($error) { $r->print('

'.$error.'

'); } my $tid='2'; $r->print(&generate_edit_table($tid,\%suporderhash)); } else { - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type); + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); if ($error) { $r->print('

'.$error.'

'); } @@ -3417,7 +3421,7 @@ $r->print(''); '); } } else { - unless ($upload_result eq 'phasetwo') { + unless ($uploadphase) { # -------------------------------------------------------- This is showdoc mode $r->print("

".&mt('Uploaded Document').' - '. &Apache::lonnet::gettitle($r->uri).'

'. @@ -3430,28 +3434,71 @@ $r->print(''); return OK; } +sub embedded_form_elems { + my ($phase,$primaryurl,$newidx) = @_; + my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + return < + + + + +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 '

'."\n". + '
'."\n". + ''.&mt('Return to Editor'). + '

'; +} + 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 = ( - {'pic21'=>"$lt{'vc'}$help{'Verify_Content'}"}, - {'pic22'=>"$lt{'cv'}$help{'Check_Resource_Versions'}"}, + {''.$lt{vc}.'' + => "$lt{'vc'}$help{'Verify_Content'}"}, + {''.$lt{cv}.'' + =>"$lt{'cv'}$help{'Check_Resource_Versions'}"}, ); if($dumpbut ne ''){ - push @list, {'pic23'=>$dumpbut}; + push @list, {''.$lt{dcd}.''=>$dumpbut}; } - push @list, ({'pic24'=>$exportbut}, - {'pic25'=>"$lt{'ls'}"}, - {'pic26'=>"$lt{'sl'}"}, + push @list, ({''.$lt{imse}.'' + =>$exportbut}, + {''.$lt{ls}.'' + =>"$lt{'ls'}"}, + {''.$lt{sl}.'' + =>"$lt{'sl'}"}, ); return '
'.create_form_ul(create_list_elements(@list)).'
'; @@ -3468,7 +3515,7 @@ sub generate_edit_table { if($env{'form.active'} ne ''){ $activetab = $env{'form.active'}; } - $form = '
'; + $form = '
'; $form .= '
'; @@ -3529,6 +3578,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&Supplemental%20'.$crstype.'%20Documents'; + return <