--- loncom/interface/londocs.pm 2006/11/02 21:06:06 1.245 +++ loncom/interface/londocs.pm 2006/11/28 15:03:19 1.258 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.245 2006/11/02 21:06:06 albertel Exp $ +# $Id: londocs.pm,v 1.258 2006/11/28 15:03:19 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -35,7 +35,6 @@ use Apache::lonnet; use Apache::loncommon; use LONCAPA::map(); use Apache::lonratedt(); -use Apache::lonratsrv; use Apache::lonxml; use Apache::lonclonecourse; use Apache::lonnavmaps; @@ -148,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'}; @@ -316,6 +316,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 { @@ -457,6 +458,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.''. '

'. ''. $name.'' }); + $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); + 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)=@_; + $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'); + + my $countselect = + &Apache::lonmeta::selectbox('show',$env{'form.show'},undef, + (&mt('all'),10,20,50,100,1000,10000)); + + $r->print(''.&mt('[_1] Records',$countselect).''. + '

'); + $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))) { + my @changes=keys(%{$docslog{$id}{'logentry'}}); + 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 { @@ -1014,7 +1201,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.'

'); @@ -1024,68 +1211,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'}; @@ -1196,7 +1400,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.'

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

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

'); } } + &log_differences($plain); } # ---------------------------------------------------------------- End commands # ---------------------------------------------------------------- Print screen @@ -1241,8 +1446,8 @@ sub editor { $r->print(''); foreach (@LONCAPA::map::order) { my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]); - $name=&Apache::lonratsrv::qtescape($name); - $url=&Apache::lonratsrv::qtescape($url); + $name=&LONCAPA::map::qtescape($name); + $url=&LONCAPA::map::qtescape($url); unless ($name) { $name=(split(/\//,$url))[-1]; } unless ($name) { $idx++; next; } $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum)); @@ -1505,6 +1710,7 @@ ENDCOPY +
@@ -1536,6 +1742,7 @@ ENDCOPY + + + ENDPARMS } @@ -1788,6 +1995,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()) {
@@ -1807,6 +2015,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=();
@@ -1842,6 +2051,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='';
@@ -2133,6 +2343,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;
@@ -2161,20 +2387,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?
@@ -2353,6 +2587,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',
@@ -2368,6 +2603,7 @@ sub handler {
 					 'vc' => 'Verify Content',
 					 'cv' => 'Check/Set Resource Versions',
 					 'ls' => 'List Symbs',
+                                         'sl' => 'Show Log'
 					  );
 
        my $folderpath=$env{'form.folderpath'};
@@ -2391,7 +2627,7 @@ sub handler {
 $containertag
 
 
- + $uploadtag
@@ -2404,6 +2640,8 @@ $dumpbut $exportbut
@@ -1633,7 +1840,7 @@ END 'parameter_encrypturl'))[0]=~/^yes$/i); $url.='folderpath='.&escape($folderpath).$cpinfo; $parameterset=' - $parameterset + +
ENDCOURSEVERIFY @@ -2503,7 +2741,7 @@ ENDFORM
$uploadtag - + $help{'Adding_External_Resource'} @@ -2521,7 +2759,7 @@ ENDFORM $r->print(< - + $help{'Adding_Fold
- + $help{'Adding_Page
$uploadtag - + $help{'Syllabus'} @@ -2548,8 +2786,8 @@ value="Syllabus=/public/$coursedom/$cour
$uploadtag - + $help{'Navigate_Content'} @@ -2557,7 +2795,7 @@ $help{'Navigate_Content'}
$uploadtag - + $help{'Simple Page'} @@ -2565,7 +2803,7 @@ onClick="javascript:makesmppage();" /> $
$uploadtag - + $help{'Simple Problem'} @@ -2573,7 +2811,7 @@ onClick="javascript:makesmpproblem();" /
$uploadtag - + @@ -2581,7 +2819,7 @@ onClick="javascript:makedropbox();" />
$uploadtag - + @@ -2590,7 +2828,7 @@ $help{'Score_Upload_Form'}
$uploadtag - + @@ -2599,8 +2837,8 @@ $help{'Bulletin Board'}
$uploadtag - + $help{'My Personal Info'} @@ -2608,19 +2846,28 @@ $help{'My Personal Info'}
$uploadtag - +
+
+$uploadtag + + + +$help{'Group Files'} + +
ENDFORM } if ($env{'form.pagepath'}) { $r->print(< $uploadtag - + $help{'Simple Problem'} @@ -2628,7 +2875,7 @@ onClick="javascript:makesmpproblem();" /
$uploadtag - + @@ -2692,7 +2939,7 @@ $lt{'comment'}:
- + $help{'Adding_Fol
- + $help{'Adding_Ext
- + $help{'Syllabus'} @@ -2719,8 +2966,8 @@ $help{'Syllabus'}
- + $help{'My Personal Info'}