--- loncom/interface/londocs.pm 2006/11/11 18:36:43 1.246 +++ loncom/interface/londocs.pm 2007/06/15 19:12:56 1.277 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.246 2006/11/11 18:36:43 raeburn Exp $ +# $Id: londocs.pm,v 1.277 2007/06/15 19:12:56 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use HTML::Entities; use GDBM_File; use Apache::lonlocal; use Cwd; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); my $iconpath; @@ -99,7 +99,7 @@ sub authorhosts { $ca=$env{'user.name'}; $cd=$env{'user.domain'}; } else { - ($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/); + ($cd,$ca)=($realm=~/^\/($match_domain)\/($match_username)$/); } my $allowed=0; my $myhome=&Apache::lonnet::homeserver($ca,$cd); @@ -147,6 +147,7 @@ sub dumpcourse { my $type = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space'). '
'); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$type.' DOCS to Construction Space')); my ($home,$other,%outhash)=&authorhosts(); unless ($home) { return ''; } my $origcrsid=$env{'request.course.id'}; @@ -234,7 +235,6 @@ sub dumpcourse { my ($ext)=($_=~/\.(\w+)$/); my $title=$hash{'title_'.$hash{ 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}}; - $title=~s/:/:/g; $r->print(''.($title?$title:' ').''); if (!$title) { $title=$_; @@ -315,6 +315,7 @@ sub exportcourse { } } $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package')); $r->print($outcome); $r->print(&Apache::loncommon::end_page()); } else { @@ -364,7 +365,7 @@ sub exportcourse { if (ref($curRes)) { my $symb = $curRes->symb(); my $ressymb = $symb; - if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) { + if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) { unless ($ressymb =~ m|adm/wrapper/adm|) { $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard'; } @@ -456,6 +457,7 @@ function containerCheck(item) { |; $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package', $scripttag)); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package')); $r->print($display.''. '

'. '$url.$cpinfo, 'title'=>$name, 'text'=>''. - $name.'' + $name.'', + 'no_mt'=>1, }); + $plain.=$name.' > '; } + $plain=~s/\>\;\s*$//; return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp', - 'LC_docs_path'),$randompick,$ishidden,$isencrypted); + 'LC_docs_path'),$randompick,$ishidden,$isencrypted,$plain); +} + +sub log_docs { + return &Apache::lonnet::instructor_log('docslog',@_); +} + +{ + my @oldresources=(); + my @oldorder=(); + my $parmidx; + my %parmaction=(); + my %parmvalue=(); + my $changedflag; + + sub snapshotbefore { + @oldresources=@LONCAPA::map::resources; + @oldorder=@LONCAPA::map::order; + $parmidx=undef; + %parmaction=(); + %parmvalue=(); + $changedflag=0; + } + + sub remember_parms { + my ($idx,$parameter,$action,$value)=@_; + $parmidx=$idx; + $parmaction{$parameter}=$action; + $parmvalue{$parameter}=$value; + $changedflag=1; + } + + sub log_differences { + my ($plain)=@_; + my %storehash=('folder' => $plain, + 'currentfolder' => $env{'form.folder'}); + if ($parmidx) { + $storehash{'parameter_res'}=$oldresources[$parmidx]; + foreach my $parm (keys %parmaction) { + $storehash{'parameter_action_'.$parm}=$parmaction{$parm}; + $storehash{'parameter_value_'.$parm}=$parmvalue{$parm}; + } + } + my $maxidx=$#oldresources; + if ($#LONCAPA::map::resources>$#oldresources) { + $maxidx=$#LONCAPA::map::resources; + } + for (my $idx=0; $idx<=$maxidx; $idx++) { + if ($LONCAPA::map::resources[$idx] ne $oldresources[$idx]) { + $storehash{'before_resources_'.$idx}=$oldresources[$idx]; + $storehash{'after_resources_'.$idx}=$LONCAPA::map::resources[$idx]; + $changedflag=1; + } + if ($LONCAPA::map::order[$idx] ne $oldorder[$idx]) { + $storehash{'before_order_res_'.$idx}=$oldresources[$oldorder[$idx]]; + $storehash{'after_order_res_'.$idx}=$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]; + $changedflag=1; + } + } + $storehash{'maxidx'}=$maxidx; + if ($changedflag) { &log_docs(\%storehash); } + } +} + + +# +# Docs Change Log +# +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 %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(''. + ''); + + my %saveable_parameters = ('show' => 'scalar',); + &Apache::loncommon::store_course_settings('docs_log', + \%saveable_parameters); + &Apache::loncommon::restore_course_settings('docs_log', + \%saveable_parameters); + if (!$env{'form.show'}) { $env{'form.show'}=10; } + my %lt=('hiddenresource' => 'Resources hidden', + 'encrypturl' => 'URL hidden', + 'randompick' => 'Randomly pick', + 'set' => 'set to', + 'del' => 'deleted'); + $r->print(&Apache::loncommon::display_filter(). + ''. + '

'); + $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). + ''.&mt('Time').''.&mt('User').''.&mt('Folder').''.&mt('Before').''. + &mt('After').''. + &Apache::loncommon::end_data_table_header_row()); + my $shown=0; + foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) { + if ($env{'form.displayfilter'} eq 'currentfolder') { + if ($docslog{$id}{'logentry'}{'currentfolder'} ne $folder) { next; } + } + my @changes=keys(%{$docslog{$id}{'logentry'}}); + if ($env{'form.displayfilter'} eq 'containing') { + my $wholeentry=$docslog{$id}{'exe_uname'}.':'.$docslog{$id}{'exe_udom'}.':'. + &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},$docslog{$id}{'exe_udom'}); + foreach my $key (@changes) { + $wholeentry.=':'.$docslog{$id}{'logentry'}{$key}; + } + if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; } + } + my $count = 0; + my $time = + &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'}); + my $plainname = + &Apache::loncommon::plainname($docslog{$id}{'exe_uname'}, + $docslog{$id}{'exe_udom'}); + my $about_me_link = + &Apache::loncommon::aboutmewrapper($plainname, + $docslog{$id}{'exe_uname'}, + $docslog{$id}{'exe_udom'}); + my $send_msg_link=''; + if ((($docslog{$id}{'exe_uname'} ne $env{'user.name'}) + || ($docslog{$id}{'exe_udom'} ne $env{'user.domain'}))) { + $send_msg_link ='
'. + &Apache::loncommon::messagewrapper(&mt('Send message'), + $docslog{$id}{'exe_uname'}, + $docslog{$id}{'exe_udom'}); + } + $r->print(&Apache::loncommon::start_data_table_row()); + $r->print(''.$time.' + '.$about_me_link. + '
'.$docslog{$id}{'exe_uname'}. + ':'.$docslog{$id}{'exe_udom'}.''. + $send_msg_link.''. + $docslog{$id}{'logentry'}{'folder'}.''); +# Before + for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { + my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; + my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; + if ($oldname ne $newname) { + $r->print(&LONCAPA::map::qtescape($oldname)); + } + } + $r->print(''); +# After + $r->print(''); + + for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { + my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; + my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; + if ($oldname ne $newname) { + $r->print(&LONCAPA::map::qtescape($newname)); + } + } + $r->print(''); + if ($docslog{$id}{'logentry'}{'parameter_res'}) { + $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':'); + } +# End + $r->print(''.&Apache::loncommon::end_data_table_row()); + $shown++; + if (!($env{'form.show'} eq &mt('all') + || $shown<=$env{'form.show'})) { last; } + } + $r->print(&Apache::loncommon::end_data_table()); + $r->print(&Apache::loncommon::end_page()); } sub editor { @@ -1013,7 +1210,7 @@ sub editor { $env{'form.markedcopy_title'}=$title; $env{'form.markedcopy_url'}=$url; } - my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted)=&breadcrumbs($folder); + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain)=&breadcrumbs($folder); $r->print($breadcrumbtrail); if ($fatal) { $r->print('

'.$errtext.'

'); @@ -1023,68 +1220,85 @@ sub editor { # ---------------- if they are for this folder and user allowed to make changes if (($allowed) && ($env{'form.folder'} eq $folder)) { # set parameters and change order - if (defined($env{'form.setparms'})) { + &snapshotbefore(); + if ($env{'form.changeparms'}) { my $idx=$env{'form.setparms'}; # set parameters - if ($env{'form.randpick_'.$idx}) { - &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos'); - } else { - &LONCAPA::map::delparameter($idx,'parameter_randompick'); + if ($env{'form.changeparms'} eq 'randompick') { + if ($env{'form.randpick_'.$idx}) { + &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos'); + &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx}); + } else { + &LONCAPA::map::delparameter($idx,'parameter_randompick'); + &remember_parms($idx,'randompick','del'); + } } - if ($env{'form.hidprs_'.$idx}) { - &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno'); - } else { - &LONCAPA::map::delparameter($idx,'parameter_hiddenresource'); + if ($env{'form.changeparms'} eq 'hiddenresource') { + if ($env{'form.hidprs_'.$idx}) { + &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno'); + &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx}); + } else { + &LONCAPA::map::delparameter($idx,'parameter_hiddenresource'); + &remember_parms($idx,'hiddenresource','del'); + } } - if ($env{'form.encprs_'.$idx}) { - &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno'); - } else { - &LONCAPA::map::delparameter($idx,'parameter_encrypturl'); + if ($env{'form.changeparms'} eq 'encrypturl') { + if ($env{'form.encprs_'.$idx}) { + &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno'); + &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx}); + } else { + &LONCAPA::map::delparameter($idx,'parameter_encrypturl'); + &remember_parms($idx,'encrypturl','del'); + } + } +# store the changed version + ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); + if ($fatal) { + $r->print('

'.$errtext.'

'); + return; } + } - if ($env{'form.newpos'}) { + if ($env{'form.newpos'}) { # change order - - my $newpos=$env{'form.newpos'}-1; - my $currentpos=$env{'form.currentpos'}-1; - my $i; - my @neworder=(); - if ($newpos>$currentpos) { + my $newpos=$env{'form.newpos'}-1; + my $currentpos=$env{'form.currentpos'}-1; + my $i; + my @neworder=(); + if ($newpos>$currentpos) { # moving stuff up - for ($i=0;$i<$currentpos;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } - for ($i=$currentpos;$i<$newpos;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i+1]; - } - $neworder[$newpos]=$LONCAPA::map::order[$currentpos]; - for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } - } else { + for ($i=0;$i<$currentpos;$i++) { + $neworder[$i]=$LONCAPA::map::order[$i]; + } + for ($i=$currentpos;$i<$newpos;$i++) { + $neworder[$i]=$LONCAPA::map::order[$i+1]; + } + $neworder[$newpos]=$LONCAPA::map::order[$currentpos]; + for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) { + $neworder[$i]=$LONCAPA::map::order[$i]; + } + } else { # moving stuff down - for ($i=0;$i<$newpos;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } - $neworder[$newpos]=$LONCAPA::map::order[$currentpos]; - for ($i=$newpos+1;$i<$currentpos+1;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i-1]; - } - for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } + for ($i=0;$i<$newpos;$i++) { + $neworder[$i]=$LONCAPA::map::order[$i]; + } + $neworder[$newpos]=$LONCAPA::map::order[$currentpos]; + for ($i=$newpos+1;$i<$currentpos+1;$i++) { + $neworder[$i]=$LONCAPA::map::order[$i-1]; + } + for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) { + $neworder[$i]=$LONCAPA::map::order[$i]; } - @LONCAPA::map::order=@neworder; } + @LONCAPA::map::order=@neworder; # store the changed version - ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); if ($fatal) { $r->print('

'.$errtext.'

'); return; } - } + if ($env{'form.pastemarked'}) { # paste resource to end of list my $url=$env{'form.markedcopy_url'}; @@ -1096,18 +1310,16 @@ sub editor { $url=~/^(.+)\.(\w+)$/; my $newurl=$1.$newid.'.'.$2; my $storefn=$newurl; - $storefn=~s/^\/\w+\/\w+\/\w+\///; + $storefn=~s{^/\w+/$match_domain/$match_username/}{}; &Apache::lonclonecourse::writefile ($env{'request.course.id'},$storefn, &Apache::lonnet::getfile($url)); $url=$newurl; } - $title=~s/\/\>\;/g; - $title=~s/\:/\:/g; + $title = &LONCAPA::map::qtunescape($title); my $ext='false'; if ($url=~/^http\:\/\//) { $ext='true'; } - $url=~s/\:/\:/g; + $url = &LONCAPA::map::qtunescape($url); # Now insert the URL at the bottom my $newidx=&LONCAPA::map::getresidx($url); $LONCAPA::map::resources[$newidx]= @@ -1159,19 +1371,14 @@ sub editor { my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]; my ($rtitle,@rrest)=split(/\:/, $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]); - my $comment= - &HTML::Entities::decode($env{'form.title'}); - $comment=~s/\/\>\;/g; - $comment=~s/\:/\:/g; + my $comment=$env{'form.title'}; + $comment = &LONCAPA::map::qtunescape($comment); if ($comment=~/\S/) { $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]= $comment.':'.join(':',@rrest); } # Devalidate title cache - my $renamed_url=$rrest[0]; -# Has the :-escaping - $renamed_url=~s/\&colon\;/\:/g; + my $renamed_url=&LONCAPA::map::qtescape($rrest[0]); &Apache::lonnet::devalidate_title_cache($renamed_url); } # Store the changed version @@ -1195,7 +1402,7 @@ sub editor { } } # Store the changed version - ($errtext,$fatal)=group_import($coursenum, $coursedom, $folder, + ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder, $container,'londocs',@imports); if ($fatal) { $r->print('

'.$errtext.'

'); @@ -1222,6 +1429,7 @@ sub editor { $r->print('

'.&mt('No map selected.').'

'); } } + &log_differences($plain); } # ---------------------------------------------------------------- End commands # ---------------------------------------------------------------- Print screen @@ -1324,11 +1532,9 @@ sub process_file_upload { $codebase); my $ext='false'; if ($url=~/^http\:\/\//) { $ext='true'; } - $url=~s/\:/\:/g; + $url = &LONCAPA::map::qtunescape($url); my $comment=$env{'form.comment'}; - $comment=~s/\/\>\;/g; - $comment=~s/\:/\:/g; + $comment = &LONCAPA::map::qtunescape($comment); if ($folder=~/^supplemental/) { $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'. $env{'user.domain'}.'___&&&___'.$comment; @@ -1347,38 +1553,18 @@ sub process_file_upload { my $total_embedded = keys(%{$allfiles}); if ($total_embedded > 0) { my $num = 0; - $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.
-
- + my $state = ' + + '; - $$upload_output .= 'Upload embedded files:
- '; - foreach my $embed_file (keys(%{$allfiles})) { - $$upload_output .= ''; - $num ++; - } - $phase_status = 'phasetwo'; - $$upload_output .= '
'.$embed_file. - ' - '; - my $attrib; - if (@{$$allfiles{$embed_file}} > 1) { - $attrib = join(':',@{$$allfiles{$embed_file}}); - } else { - $attrib = $$allfiles{$embed_file}[0]; - } - $$upload_output .= - ''; - if (exists($$codebase{$embed_file})) { - $$upload_output .= - ''; - } - $$upload_output .= '

- -
'; + $phase_status = 'phasetwo'; + + $$upload_output .= + 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.
'. + &ask_for_embedded_content('/adm/coursedocs', + $state,$allfiles,$codebase); } else { $$upload_output .= 'No embedded items identified
'; } @@ -1388,6 +1574,55 @@ sub process_file_upload { return $phase_status; } +sub ask_for_embedded_content { + my ($actionurl,$state,$allfiles,$codebase,$args)=@_; + my $upload_output = ' +
'; + $upload_output .= $state; + $upload_output .= 'Upload embedded files:
'. + &Apache::loncommon::start_data_table(); + + my $num = 0; + foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) { + $upload_output .= &Apache::loncommon::start_data_table_row(). + ''.$embed_file.''; + if ($args->{'ignore_remote_references'} + && $embed_file =~ m{^\w+://}) { + $upload_output.=''.&mt("URL points to other server.").''; + } elsif ($args->{'error_on_invalid_names'} + && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) { + + $upload_output.=''.&mt("Invalid characters").''; + + } else { + + $upload_output .=' + + '; + my $attrib = join(':',@{$$allfiles{$embed_file}}); + $upload_output .= + "\n\t\t". + ''; + if (exists($$codebase{$embed_file})) { + $upload_output .= + "\n\t\t". + ''; + } + } + $upload_output .= ''.&Apache::loncommon::end_data_table_row(); + $num++; + } + $upload_output .= &Apache::loncommon::end_data_table().'
+ + + '.&mt('(only files for which a location has been provided will be uploaded)').' +
'; + return $upload_output; +} + sub process_secondary_uploads { my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_; my $folder=$env{'form.folder'}; @@ -1403,7 +1638,7 @@ sub process_secondary_uploads { $destination .= $newidx; my ($url,$filename); $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination); - ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-); + ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$}); return $filename; } @@ -1411,14 +1646,12 @@ sub process_secondary_uploads { sub entryline { my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_; - $title=~s/\&colon\;/\:/g; - $title=&HTML::Entities::encode(&HTML::Entities::decode( - &unescape($title)),'"<>&\''); + $title=&HTML::Entities::encode($title,'"<>&\''); my $renametitle=$title; my $foldertitle=$title; my $pagetitle=$title; my $orderidx=$LONCAPA::map::order[$index]; - if ($title=~ /^(\d+)___&&&___(\w+)___&&&___(\w+)___&&&___(.*)$/ ) { + if ($title=~ /^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/ ) { $foldertitle=&Apache::lontexconvert::msgtexconverted($4); $renametitle=$4; $title=''.&Apache::lonlocal::locallocaltime($1).' '. @@ -1480,6 +1713,7 @@ sub entryline { 'rn' => 'Rename', 'cp' => 'Copy'); my $nocopy=0; + my $nocut=0; if ($url=~/\.(page|sequence)$/) { foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) { my ($title,$url,$ext,$type)=split(/\:/,$_); @@ -1489,13 +1723,24 @@ sub entryline { } } } + if ($url=~/^\/res\/lib\/templates\//) { + $nocopy=1; + $nocut=1; + } my $copylink=' '; + my $cutlink=' '; if ($env{'form.pagepath'}) { - unless ($nocopy) { + if (!$nocopy) { $copylink=(< $lt{'cp'} ENDCOPY + } + if (!$nocut) { + $cutlink=(< +$lt{'ct'} +ENDCUT } $line.=(< @@ -1504,6 +1749,7 @@ ENDCOPY + ENDCOPY } + if (!$nocut) { + $cutlink=(< +$lt{'ct'} +ENDCUT + } $line.=(< +
@@ -1516,25 +1762,31 @@ ENDCOPY $lt{'rm'} - -$lt{'ct'} +$cutlink $lt{'rn'} $copylink END } else { - unless ($nocopy) { + if (!$nocopy) { $copylink=(< $lt{'cp'} + + ENDPARMS } @@ -1787,6 +2038,7 @@ sub list_symbs { my ($r) = @_; $r->print(&Apache::loncommon::start_page('Symb List')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List')); my $navmap = Apache::lonnavmaps::navmap->new(); $r->print("
\n");
     foreach my $res ($navmap->retrieveResources()) {
@@ -1806,6 +2058,7 @@ sub verifycontent {
    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'));
    $hashtied=0;
    undef %alreadyseen;
    %alreadyseen=();
@@ -1841,6 +2094,7 @@ 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 $header='';
     my $startsel='';
     my $monthsel='';
@@ -1892,9 +2146,9 @@ sub checkversions {
         if (&Apache::lonnet::put('resourceversions',\%newsetversions,
 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
 			  $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {		
-	    $r->print('

'.&mt('Your Version Settings have been Stored').'

'); + $r->print('

'.&mt('Your Version Settings have been Saved').'

'); } else { - $r->print('

'.&mt('An Error Occured while Attempting to Store your Version Settings').'

'); + $r->print('

'.&mt('An Error Occured while Attempting to Save your Version Settings').'

'); } &mark_hash_old(); } @@ -2132,6 +2386,22 @@ sub changewarning { $help{'Caching'}.''."\n\n"); } +# =========================================== Breadcrumbs for special functions + +sub init_breadcrumbs { + my ($form,$text)=@_; + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs", + text=>&Apache::loncommon::course_type()." Documents", + faq=>273, + bug=>'Instructor Interface', + help => 'Docs_Adding_Course_Doc'}); + &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1', + text=>$text, + faq=>273, + bug=>'Instructor Interface'}); +} + # ================================================================ Main Handler sub handler { my $r = shift; @@ -2160,20 +2430,28 @@ sub handler { 'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages'); $help{'My Personal Info'} = &Apache::loncommon::help_open_topic( 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages'); + $help{'Group Files'} = &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'}); - if ($allowed && $env{'form.verify'}) { + &init_breadcrumbs('verify','Verify Content'); &verifycontent($r); } elsif ($allowed && $env{'form.listsymbs'}) { + &init_breadcrumbs('listsymbs','List Symbs'); &list_symbs($r); + } elsif ($allowed && $env{'form.docslog'}) { + &init_breadcrumbs('docslog','Show Log'); + &docs_change_log($r); } 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().' DOCS to Construction Space'); &dumpcourse($r); } elsif ($allowed && $env{'form.exportcourse'}) { + &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS'); &exportcourse($r); } else { # is this a standard course? @@ -2247,7 +2525,8 @@ sub handler { my %codebase = (); my ($upload_result,$upload_output); if ($allowed) { - if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) { + if (($env{'form.uploaddoc.filename'}) && + ($env{'form.cmd'}=~/^upload_(\w+)/)) { # Process file upload - phase one - upload and parse primary file. $upload_result = &process_file_upload(\$upload_output,$coursenum, $coursedom,\%allfiles, @@ -2352,6 +2631,7 @@ sub handler { 'scuf' => 'Score Upload Form', 'bull' => 'Bulletin Board', 'mypi' => 'My Personal Info', + 'grpo' => 'Group Files', 'abou' => 'About User', 'imsf' => 'Import IMS package', 'file' => 'File', @@ -2367,6 +2647,7 @@ sub handler { 'vc' => 'Verify Content', 'cv' => 'Check/Set Resource Versions', 'ls' => 'List Symbs', + 'sl' => 'Show Log' ); my $folderpath=$env{'form.folderpath'}; @@ -2390,7 +2671,7 @@ sub handler { $containertag
- + $uploadtag
@@ -2403,6 +2684,9 @@ $dumpbut $exportbut
@@ -1547,8 +1799,7 @@ ENDCOPY $lt{'rm'} - -$lt{'ct'} +$cutlink $lt{'rn'} $copylink @@ -1567,13 +1818,13 @@ END if ($uploaded) { if ($extension eq 'sequence') { $icon=$iconpath.'/folder_closed.gif'; - $url=~/$coursenum\/([\/\w]+)\.sequence$/; + $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/; $url='/adm/coursedocs?'; $folderarg=$1; $isfolder=1; } elsif ($extension eq 'page') { $icon=$iconpath.'/page.gif'; - $url=~/$coursenum\/([\/\w]+)\.page$/; + $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/; $pagearg=$1; $url='/adm/coursedocs?'; $ispage=1; @@ -1632,11 +1883,11 @@ END 'parameter_encrypturl'))[0]=~/^yes$/i); $url.='folderpath='.&escape($folderpath).$cpinfo; $parameterset=''; +''.&mt('Save').''; } if ($ispage) { @@ -1671,9 +1922,9 @@ END ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':''); $line.=(< - - $parameterset + + +
ENDCOURSEVERIFY @@ -2502,7 +2786,7 @@ ENDFORM
$uploadtag - + $help{'Adding_External_Resource'} @@ -2520,7 +2804,7 @@ ENDFORM $r->print(< - + $help{'Adding_Fold
- + $help{'Adding_Page
$uploadtag - + $help{'Syllabus'} @@ -2547,8 +2831,8 @@ value="Syllabus=/public/$coursedom/$cour
$uploadtag - + $help{'Navigate_Content'} @@ -2556,7 +2840,7 @@ $help{'Navigate_Content'}
$uploadtag - + $help{'Simple Page'} @@ -2564,7 +2848,7 @@ onClick="javascript:makesmppage();" /> $
$uploadtag - + $help{'Simple Problem'} @@ -2572,7 +2856,7 @@ onClick="javascript:makesmpproblem();" /
$uploadtag - + @@ -2580,7 +2864,7 @@ onClick="javascript:makedropbox();" />
$uploadtag - + @@ -2589,7 +2873,7 @@ $help{'Score_Upload_Form'}
$uploadtag - + @@ -2598,8 +2882,8 @@ $help{'Bulletin Board'}
$uploadtag - + $help{'My Personal Info'} @@ -2607,19 +2891,28 @@ $help{'My Personal Info'}
$uploadtag - +
+
+$uploadtag + + + +$help{'Group Files'} + +
ENDFORM } if ($env{'form.pagepath'}) { $r->print(< $uploadtag - + $help{'Simple Problem'} @@ -2627,7 +2920,7 @@ onClick="javascript:makesmpproblem();" /
$uploadtag - + @@ -2691,7 +2984,7 @@ $lt{'comment'}:
- + $help{'Adding_Fol
- + $help{'Adding_Ext
- + $help{'Syllabus'} @@ -2718,8 +3011,8 @@ $help{'Syllabus'}
- + $help{'My Personal Info'}