--- loncom/interface/londocs.pm 2011/07/04 16:47:03 1.455
+++ loncom/interface/londocs.pm 2011/12/25 20:41:53 1.472
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.455 2011/07/04 16:47:03 raeburn Exp $
+# $Id: londocs.pm,v 1.472 2011/12/25 20:41:53 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -41,6 +41,7 @@ use Apache::lonratedt();
use Apache::lonxml;
use Apache::lonclonecourse;
use Apache::lonnavmaps;
+use Apache::lonnavdisplay();
use HTML::Entities;
use GDBM_File;
use Apache::lonlocal;
@@ -176,7 +177,7 @@ sub dumpcourse {
$newfilename=&clean($newfilename);
$newfilename.='.'.$ext;
my @dirs=split(/\//,$newfilename);
- my $path='/home/'.$ca.'/public_html';
+ my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";
my $makepath=$path;
my $fail=0;
for (my $i=0;$i<$#dirs;$i++) {
@@ -681,7 +682,8 @@ sub build_package {
$currdirpath = 'Top';
my $pcslist = $curRes->map_hierarchy();
if ($pcslist ne '') {
- foreach my $pc (split(/,/,$pcslist)) {
+ foreach my $pc (split(/,/,$pcslist),$curRes->map_pc()) {
+ next if ($pc <= 1);
my $res = $navmap->getByMapPc($pc);
if (ref($res)) {
my $encloser = $res->title();
@@ -896,7 +898,8 @@ sub replicate_content {
grade_courseid => $cdom.'_'.$cnum,
grade_domain => $env{'user.domain'},
grade_username => $env{'user.name'},
- grade_imsexport => 1,
+ grade_imsexport => 1,
+ instructor_comments => 'hide',
);
my $feedurl=&Apache::lonnet::clutter($url);
my ($userview,$response)=&Apache::lonnet::ssi_body($feedurl,%form);
@@ -917,11 +920,11 @@ sub replicate_content {
$foilcounter ++;
} elsif ($line =~ m{(|\Q\E)\Q Correct:\E}) {
$foilcounter ++;
- $mc_answer = $alphabet[$foilcounter];
+ $mc_answer = $alphabet[$foilcounter-1];
} elsif ($line !~ m{\Q \E(|\Q \E)\Q \E}) {
$line =~ s/^(\s+|\s+)$//g;
$line =~ s{^\Q\E([^<]+)\Q \E$}{1};
- push(@tosave,$line);
+ $tosave[$foilcounter] .= $line.' ';
}
$content = join("\t",@tosave);
if ($mc_answer) {
@@ -1125,37 +1128,33 @@ sub breadcrumbs {
my $isencrypted=0;
my $ishidden=0;
my $is_random_order=0;
- if (!$allowed) {
- my $description = $env{'course.'.$env{'request.course.id'}.'.description'};
- &Apache::lonhtmlcommon::add_breadcrumb(
- {'href' => '/adm/menu',
- 'title'=> 'Go to main menu',
- 'text' => $description,
- });
- $plain .= $description.' >';
- }
while (@folders) {
my $folder=shift(@folders);
my $foldername=shift(@folders);
if ($folderpath) {$folderpath.='&';}
$folderpath.=$folder.'&'.$foldername;
- my $url='/adm/coursedocs?folderpath='.
- &escape($folderpath);
- my $name=&unescape($foldername);
+ my $url;
+ if ($allowed) {
+ $url = '/adm/coursedocs?folderpath=';
+ } else {
+ $url = '/adm/supplemental?folderpath=';
+ }
+ $url .= &escape($folderpath);
+ my $name=&unescape($foldername);
# randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername
- $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;
- if ($1 ne '') {
- $randompick=$1;
- } else {
- $randompick=-1;
- }
- if ($2) { $ishidden=1; }
- if ($3) { $isencrypted=1; }
- if ($4 ne '') { $is_random_order = 1; }
- if ($folder eq 'supplemental') {
- $name = &mt('Supplemental '.$crstype.' Documents');
- }
- &Apache::lonhtmlcommon::add_breadcrumb(
+ $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;
+ if ($1 ne '') {
+ $randompick=$1;
+ } else {
+ $randompick=-1;
+ }
+ if ($2) { $ishidden=1; }
+ if ($3) { $isencrypted=1; }
+ if ($4 ne '') { $is_random_order = 1; }
+ if ($folder eq 'supplemental') {
+ $name = &mt('Supplemental '.$crstype.' Content');
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb(
{'href'=>$url.$cpinfo,
'title'=>$name,
'text'=>$name,
@@ -1165,7 +1164,8 @@ sub breadcrumbs {
}
$plain=~s/\>\;\s*$//;
return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
- undef, undef, 1 ),$randompick,$ishidden,$isencrypted,$plain,$is_random_order);
+ undef, undef, 1 ),$randompick,$ishidden,
+ $isencrypted,$plain,$is_random_order);
}
sub log_docs {
@@ -1575,7 +1575,7 @@ sub handle_edit_cmd {
if ($cmd eq 'del') {
if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
- ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
+ ($url!~/$LONCAPA::assess_page_seq_re/)) {
&Apache::lonnet::removeuploadedurl($url);
} else {
&LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
@@ -1611,7 +1611,8 @@ sub handle_edit_cmd {
}
sub editor {
- my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype)=@_;
+ my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype,
+ $supplementalflag,$orderhash,$iconpath)=@_;
my $container= ($env{'form.pagepath'}) ? 'page'
: 'sequence';
@@ -1627,8 +1628,10 @@ sub editor {
}
my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
- &breadcrumbs($allowed,$crstype);
- $r->print($breadcrumbtrail);
+ &breadcrumbs($allowed,$crstype);
+ $r->print($breadcrumbtrail);
+
+ my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";
unless ($allowed) {
$randompick = -1;
@@ -1740,7 +1743,7 @@ sub editor {
$r->print('');
}
- my $output;
+ my ($to_show,$output);
&Apache::loncommon::start_data_table_count(); #setup a row counter
foreach my $res (@LONCAPA::map::order) {
@@ -1757,30 +1760,51 @@ sub editor {
&Apache::loncommon::end_data_table_count();
if ($shown) {
- $r->print(&Apache::loncommon::start_scrollbox('900px','880px','400px')
- .&Apache::loncommon::start_data_table());
+ $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
+ .&Apache::loncommon::start_data_table(undef,'contentlist');
if ($allowed) {
- $r->print(&Apache::loncommon::start_data_table_header_row()
+ $to_show .= &Apache::loncommon::start_data_table_header_row()
.'
'.&mt('Move').' '
.''.&mt('Actions').' '
- .''.&mt('Document').' ');
+ .''.&mt('Document').' ';
if ($folder !~ /^supplemental/) {
- $r->print(''.&mt('Settings').' ');
+ $to_show .= ''.&mt('Settings').' ';
}
- $r->print(&Apache::loncommon::end_data_table_header_row());
+ $to_show .= &Apache::loncommon::end_data_table_header_row();
}
- $r->print($output
+ $to_show .= $output.' '
.&Apache::loncommon::end_data_table()
- .&Apache::loncommon::end_scrollbox()
- );
+ .' '
+ .&Apache::loncommon::end_scrollbox();
} else {
- $r->print(''
+ $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
+ .'
'
.&mt('Currently no documents.')
- .''
- );
+ .'
'
+ .&Apache::loncommon::end_scrollbox();
+ }
+ my $tid = 1;
+ if ($supplementalflag) {
+ $tid = 2;
}
if ($allowed) {
+ $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto));
&print_paste_buffer($r,$container);
+ } else {
+ if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
+ #Function Box for Supplemental Content for users with mdc priv.
+ my $funcname = &mt('Folder Editor');
+ $r->print(
+ &Apache::loncommon::head_subbox(
+ &Apache::lonhtmlcommon::start_funclist().
+ &Apache::lonhtmlcommon::add_item_funclist(
+ ''.
+ ' '.
+ ' ').
+ &Apache::lonhtmlcommon::end_funclist()));
+ }
+ $r->print($to_show);
}
return;
}
@@ -1810,7 +1834,7 @@ sub process_file_upload {
$LONCAPA::map::resources[1]='';
}
if ($fatal) {
- $$upload_output = ''.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'
';
+ $$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/';
@@ -1836,7 +1860,7 @@ sub process_file_upload {
} else {
my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$});
- $$upload_output = ''.&mt('Unable to save file [_1].',''.$filename.' ').'
';
+ $$upload_output = ''.&mt('Unable to save file [_1].',''.$filename.' ').'
';
return;
}
my $ext='false';
@@ -1855,7 +1879,7 @@ sub process_file_upload {
($errtext,$fatal)=&storemap($coursenum,$coursedom,
$folder.'.'.$container);
if ($fatal) {
- $$upload_output = ''.$errtext.'
';
+ $$upload_output = ''.$errtext.'
';
return;
} else {
if ($parseaction eq 'parse' && $mimetype eq 'text/html') {
@@ -1882,6 +1906,7 @@ sub process_file_upload {
} else {
$$upload_output .= &mt('No embedded items identified').' ';
}
+ $$upload_output = ''.$$upload_output.'
';
}
}
}
@@ -1958,8 +1983,7 @@ sub entryline {
if ($allowed) {
my $incindex=$index+1;
my $selectbox='';
- if (($folder!~/^supplemental/) &&
- ($#LONCAPA::map::order>0) &&
+ if (($#LONCAPA::map::order>0) &&
((split(/\:/,
$LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1]
ne '') &&
@@ -2075,18 +2099,23 @@ END
my $pagearg;
my $pagefile;
if ($uploaded) {
- if ($extension eq 'sequence') {
- $icon=$iconpath.'/navmap.folder.closed.gif';
- $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
- $url='/adm/coursedocs?';
- $folderarg=$1;
- $isfolder=1;
- } elsif ($extension eq 'page') {
- $icon=$iconpath.'/page.gif';
- $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
- $pagearg=$1;
- $url='/adm/coursedocs?';
- $ispage=1;
+ if (($extension eq 'sequence') || ($extension eq 'page')) {
+ $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
+ my $containerarg = $1;
+ if ($extension eq 'sequence') {
+ $icon=$iconpath.'navmap.folder.closed.gif';
+ $folderarg=$containerarg;
+ $isfolder=1;
+ } else {
+ $icon=$iconpath.'page.gif';
+ $pagearg=$containerarg;
+ $ispage=1;
+ }
+ if ($allowed) {
+ $url='/adm/coursedocs?';
+ } else {
+ $url='/adm/supplemental?';
+ }
} else {
&Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
}
@@ -2188,13 +2217,25 @@ END
} else {
$reinit = &mt('(re-initialize course to access)');
}
- $line.='
-
- '.($url?'':'').' '.($url?' ':'').'
-
-
- '.($url?"":'').$title.($url?' ':' '.$reinit.' ').$external."
- ";
+ $line.='';
+ if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
+ $line.=' ';
+ } elsif ($url) {
+ $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes',
+ ' ',600,500);
+ } else {
+ $line.=' ';
+ }
+ $line.=' ';
+ if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
+ $line.=''.$title.' ';
+ } elsif ($url) {
+ $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes',
+ $title,600,500);
+ } else {
+ $line.=$title.' '.$reinit.' ';
+ }
+ $line.=$external." ";
if (($allowed) && ($folder!~/^supplemental/)) {
my %lt=&Apache::lonlocal::texthash(
'hd' => 'Hidden',
@@ -2208,14 +2249,13 @@ END
$form_start
$lt{'hd'}
$form_end
-
-
+
$form_start
$lt{'ec'}
$form_end
- $form_start $rand_order_text $form_end
- $form_start $parameterset $form_end
+ $form_start $parameterset $form_end
+ $form_start $rand_order_text $form_end
ENDPARMS
}
$line.=&Apache::loncommon::end_data_table_row();
@@ -2620,7 +2660,7 @@ ENDHEADERS
$r->print(' '.&mt('Diffs').' ');
+ '" target="diffs">'.&mt('Diffs').'');
}
$r->print(' ');
if (++$entries_count % $entries_per_col == 0) {
@@ -2739,27 +2779,19 @@ sub create_form_ul {
sub startContentScreen {
my ($r,$mode)=@_;
$r->print('');
- $r->print(' '.&mt('Content Overview').' ');
-
- my $active = '';
-# does this user have privileges to modify docs?
- my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
-
- my $onclick;
- my $href;
-
- if ($allowed) {
+ if (($mode eq 'navmaps') || ($mode eq 'supplemental')) {
+ $r->print(' '.&mt('Content Overview').' '."\n");
+ $r->print(' '.&mt('Content Search').' '."\n");
+ $r->print(' '.&mt('Content Index').' '."\n");
+ $r->print(''.&mt('Supplemental Content').' ');
+ } else {
$r->print(' '.&mt('Content Editor').' ');
+ ' id="tabbededitor"> '.&mt('Content Editor').' ');
+ $r->print(''.&mt('Supplemental Content Editor').' ');
}
- $r->print(' '.&mt('Content Search').' ');
- $r->print(' '.&mt('Content Index').' ');
- $r->print(''.&mt('Supplemental Documents').' ');
- $r->print(' ');
- $r->print(''
- .'
');
- $r->print('
');
+ $r->print("\n".''."\n");
+ $r->print('
');
}
#
@@ -2772,7 +2804,7 @@ sub endContentScreen {
}
sub supplemental_base {
- return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Documents'));
+ return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content'));
}
sub handler {
@@ -2806,8 +2838,14 @@ sub handler {
$help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
$help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
-# does this user have privileges to modify docs
- my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+
+ my $allowed;
+# URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
+ unless ($r->uri eq '/adm/supplemental') {
+ # does this user have privileges to modify content.
+ $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+ }
+
if ($allowed && $env{'form.verify'}) {
&init_breadcrumbs('verify','Verify Content');
&verifycontent($r);
@@ -2834,7 +2872,8 @@ sub handler {
#
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['folderpath','pagepath',
- 'pagesymb','forcesupplement','forcestandard']);
+ 'pagesymb','forcesupplement','forcestandard',
+ 'symb','command']);
# standard=1: this is a "new-style" course with an uploaded map as top level
# standard=2: this is a "old-style" course, and there is nothing we can do
@@ -2857,15 +2896,90 @@ sub handler {
my $script='';
my $showdoc=0;
+ my $addentries = {};
my $containertag;
my $uploadtag;
+# Do we directly jump somewhere?
+
+ if ($env{'form.command'} eq 'direct') {
+ my ($mapurl,$id,$resurl);
+ if ($env{'form.symb'} ne '') {
+ ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'});
+ if ($resurl=~/\.(sequence|page)$/) {
+ $mapurl=$resurl;
+ } elsif ($resurl eq 'adm/navmaps') {
+ $mapurl=$env{'course.'.$env{'request.course.id'}.'.url'};
+ }
+ my $mapresobj;
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ $mapresobj = $navmap->getResourceByUrl($mapurl);
+ }
+ $mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1};
+ my $type=$2;
+ my $path;
+ if (ref($mapresobj)) {
+ my $pcslist = $mapresobj->map_hierarchy();
+ if ($pcslist ne '') {
+ foreach my $pc (split(/,/,$pcslist)) {
+ next if ($pc <= 1);
+ my $res = $navmap->getByMapPc($pc);
+ if (ref($res)) {
+ my $thisurl = $res->src();
+ $thisurl=~s{^.*/([^/]+)\.\w+$}{$1};
+ my $thistitle = $res->title();
+ $path .= '&'.
+ &Apache::lonhtmlcommon::entity_encode($thisurl).'&'.
+ &Apache::lonhtmlcommon::entity_encode($thistitle).
+ ':'.$res->randompick().
+ ':'.$res->randomout().
+ ':'.$res->encrypted().
+ ':'.$res->randomorder();
+ }
+ }
+ }
+ $path .= '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
+ &Apache::lonhtmlcommon::entity_encode($mapresobj->title()).
+ ':'.$mapresobj->randompick().
+ ':'.$mapresobj->randomout().
+ ':'.$mapresobj->encrypted().
+ ':'.$mapresobj->randomorder();
+ } else {
+ my $maptitle = &Apache::lonnet::gettitle($mapurl);
+ $path = '&default&...::::'.
+ '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
+ &Apache::lonhtmlcommon::entity_encode($maptitle).'::::';
+ }
+ $path = 'default&'.
+ &Apache::lonhtmlcommon::entity_encode('Main Course Documents').
+ $path;
+ if ($type eq 'sequence') {
+ $env{'form.folderpath'}=$path;
+ $env{'form.pagepath'}='';
+ } else {
+ $env{'form.pagepath'}=$path;
+ $env{'form.folderpath'}='';
+ }
+ } elsif ($env{'form.supppath'} ne '') {
+ $env{'form.folderpath'}=$env{'form.supppath'};
+ }
+ } elsif ($env{'form.command'} eq 'editdocs') {
+ $env{'form.folderpath'} = 'default&'.
+ &Apache::lonhtmlcommon::entity_encode('Main Course Content');
+ $env{'form.pagepath'}='';
+ } elsif ($env{'form.command'} eq 'editsupp') {
+ $env{'form.folderpath'} = 'default&'.
+ &Apache::lonhtmlcommon::entity_encode('Supplemental Content');
+ $env{'form.pagepath'}='';
+ }
+
# Where do we store these for when we come back?
my $stored_folderpath='docs_folderpath';
if ($supplementalflag) {
$stored_folderpath='docs_sup_folderpath';
}
-
+
# No folderpath, no pagepath, see if we have something stored
if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
&Apache::loncommon::restore_course_settings($stored_folderpath,
@@ -2897,7 +3011,7 @@ sub handler {
} else {
$env{'form.folderpath'}='default';
}
- }
+ }
# Store this
&Apache::loncommon::store_course_settings($stored_folderpath,
@@ -2957,7 +3071,22 @@ sub handler {
$iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
if ($allowed) {
- $script .= &editing_js($udom,$uname);
+ my @tabids;
+ if ($supplementalflag) {
+ @tabids = ('002','ee2','ff2');
+ } else {
+ @tabids = ('aa1','bb1','cc1','ff1');
+ unless ($env{'form.pagepath'}) {
+ unshift(@tabids,'001');
+ push(@tabids,('dd1','ee1'));
+ }
+ }
+ my $tabidstr = join("','",@tabids);
+ $script .= &editing_js($udom,$uname,$supplementalflag).
+ &resize_contentdiv_js($tabidstr);
+ $addentries = {
+ onload => "javascript:resize_contentdiv('contentscroll','1','1');",
+ };
}
# -------------------------------------------------------------------- Body tag
$script = '