Diff for /loncom/publisher/lonpubdir.pm between versions 1.176 and 1.183

version 1.176, 2023/06/10 23:55:41 version 1.183, 2024/01/10 20:07:37
Line 36  use Apache::Constants qw(:common :http : Line 36  use Apache::Constants qw(:common :http :
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::londiff();  use Apache::londiff();
   use Apache::lonpublisher();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg;  use Apache::lonmsg;
 use Apache::lonmenu;  use Apache::lonmenu;
Line 48  sub handler { Line 49  sub handler {
   
     # Validate access to the construction space and get username:domain.      # Validate access to the construction space and get username:domain.
   
     my ($uname,$udom)=&Apache::lonnet::constructaccess($r->uri);       my ($uname,$udom)=&Apache::lonnet::constructaccess($r->uri);
     unless (($uname) && ($udom)) {      unless (($uname) && ($udom)) {
         return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
Line 86  sub handler { Line 87  sub handler {
     my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.      my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.
   
     my $cstr = 'author';      my $cstr = 'author';
     my ($crsauthor,$crstype);      my ($crsauthor,$crstype,$crstoplevel,$cdom,$cnum);
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         if ($thisdisfn =~ m{^/\Q$cdom/$cnum\E}) {          if ($thisdisfn =~ m{^/\Q$cdom/$cnum\E}) {
             $crsauthor = 1;              $crsauthor = 1;
             $cstr = 'course';              $cstr = 'course';
             $crstype = &Apache::loncommon::course_type();              $crstype = &Apache::loncommon::course_type();
               $crstoplevel = "$docroot/priv/$cdom/$cnum";
         }          }
     }      }
   
Line 104  sub handler { Line 106  sub handler {
                                 "$londocroot/priv/$udom/$uname"); # expressed in kB                                  "$londocroot/priv/$udom/$uname"); # expressed in kB
     my $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,      my $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,
                                                  $cstr,$crstype); # expressed in MB                                                   $cstr,$crstype); # expressed in MB
     my $diraction;  
     if (-d $fn) {  
         $diraction = &diractions($thisdisfn);  
     }  
   
     # Put out the start of page.      # Put out the start of page.
       
     &startpage($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota, $crsauthor, $diraction);  
   
       &startpage($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota, $crsauthor);
   
       my @files;
     if (!-d $fn) {      if (!-d $fn) {
         if (-e $fn) {          if (($crsauthor) && ($fn eq $crstoplevel)) {
             $r->print('<p class="LC_info">'.&mt('Requested item is a file not a directory.').'</p>');              my $path = "$docroot/priv/$cdom/$cnum";
               my $rightsfile = 'default.rights';
               my $sourcerights = "$path/$rightsfile";
               &Apache::loncommon::crsauthor_rights($rightsfile,$path,$docroot,$cnum,$cdom);
               my $targetrights = $docroot."/res/$cdom/$cnum/$rightsfile";
               if ((-e $sourcerights) && (-e "$sourcerights.meta")) {
                   if (!-e "$docroot/res/$cdom") {
                       mkdir("$docroot/res/$cdom",0755);
                   }
                   if (!-e "$docroot/res/$cdom/$cnum") {
                       mkdir("$docroot/res/$cdom/$cnum",0755);
                   }
                   if ((-e "$docroot/res/$cdom/$cnum") && (!-e $targetrights)) {
                       my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes'));
                       my $output = &Apache::lonpublisher::batchpublish($r,$sourcerights,$targetrights,$nokeyref,1);
                   }
               } else {
                   $r->print('<p class="LC_info">'.&mt('The requested subdirectory does not exist.').'</p>');
                   return OK;
               }
         } else {          } else {
             $r->print('<p class="LC_info">'.&mt('The requested subdirectory does not exist.').'</p>');              if (-e $fn) {
                   $r->print('<p class="LC_info">'.&mt('Requested item is a file not a directory.').'</p>');
               } else {
                   $r->print('<p class="LC_info">'.&mt('The requested subdirectory does not exist.').'</p>');
               }
               $r->print(&Apache::loncommon::end_page());
               return OK;
         }          }
         $r->print(&Apache::loncommon::end_page());  
         return OK;  
     }  
     my @files;  
     if (opendir(DIR,$fn)) {  
         @files = grep(!/^\.+$/,readdir(DIR));  
         closedir(DIR);  
     } else {      } else {
         $r->print('<p class="LC_error">'.&mt('Could not open directory.').'</p>');          if (opendir(DIR,$fn)) {
         $r->print(&Apache::loncommon::end_page());              @files = grep(!/^\.+$/,readdir(DIR));
         return OK;              closedir(DIR);
           } else {
               $r->print('<p class="LC_error">'.&mt('Could not open directory.').'</p>');
               $r->print(&Apache::loncommon::end_page());
               return OK;
           }
     }      }
   
     # Put out actions for directory, browse/upload + new file page.      # Put out actions for directory, browse/upload + new file page.
     &dircontrols($r,$uname,$udom,$thisdisfn, $current_disk_usage, $disk_quota);      &dircontrols($r,$uname,$udom,$thisdisfn,$current_disk_usage,$disk_quota,$crsauthor);
     &resourceactions($r,$uname,$udom,$thisdisfn); # Put out form used for printing/deletion etc.      &resourceactions($r,$uname,$udom,$thisdisfn); # Put out form used for printing/deletion etc.
   
     my $numdir = 0;      my $numdir = 0;
     my $numres = 0;      my $numres = 0;
     
     if ((@files == 0) && ($thisdisfn =~ m{^/$match_domain/$match_username})) {      if ((@files == 0) && ($thisdisfn =~ m{^/$match_domain/$match_username})) {
         if ($thisdisfn =~ m{^/$match_domain/$match_username$}) {          if ($thisdisfn =~ m{^/$match_domain/$match_username$}) {
             $r->print('<p class="LC_info">'.&mt('This Authoring Space is currently empty.').'</p>');              $r->print('<p class="LC_info">'.&mt('This Authoring Space is currently empty.').'</p>');
Line 197  sub handler { Line 218  sub handler {
                             order => 'ascending',                              order => 'ascending',
                             text  => &mt('Size').' (kB)',                              text  => &mt('Size').' (kB)',
                         },                          },
     );       );
   
     # Print column headers      # Print column headers
     my $output = '';      my $output = '';
Line 242  my $result = "<script type=\"text/javasc Line 263  my $result = "<script type=\"text/javasc
         my ($cmode,$csize,$cmtime)=(stat($fn.'/'.$filename))[2,7,9];          my ($cmode,$csize,$cmtime)=(stat($fn.'/'.$filename))[2,7,9];
         my $linkfilename = &HTML::Entities::encode('/priv'.$thisdisfn.'/'.$filename,'<>&"');          my $linkfilename = &HTML::Entities::encode('/priv'.$thisdisfn.'/'.$filename,'<>&"');
         # Identify type of file according to icon used          # Identify type of file according to icon used
         my ($filetype) = (&Apache::loncommon::icon($filename) =~ m{/(\w+).gif$});           my ($filetype) = (&Apache::loncommon::icon($filename) =~ m{/(\w+).gif$});
         my $cstr_dir = $r->dir_config('lonDocRoot').'/priv'.$thisdisfn;          my $cstr_dir = $r->dir_config('lonDocRoot').'/priv'.$thisdisfn;
         my $meta_same = &isMetaSame($cstr_dir, $resdir, $filename);          my $meta_same = &isMetaSame($cstr_dir, $resdir, $filename);
           
         # Store size, title, and status for files but not directories          # Store size, title, and status for files but not directories
         my $size = (!($cmode&$dirptr)) ? $csize/1024. : 0;          my $size = (!($cmode&$dirptr)) ? $csize/1024. : 0;
         my ($status, $pubstatus, $title, $fulltitle);          my ($status, $pubstatus, $title, $fulltitle);
         if (!($cmode&$dirptr)) {          if (!($cmode&$dirptr)) {
             ($status, $pubstatus) = &getStatus($resdir, $targetdir, $cstr_dir,               ($status, $pubstatus) = &getStatus($resdir, $targetdir, $cstr_dir,
                 $filename, $linkfilename, $cmtime, $meta_same);                  $filename, $linkfilename, $cmtime, $meta_same);
             ($fulltitle, $title) = &getTitle($resdir, $targetdir, $filename,               if (($crsauthor) && ($extension eq 'rights')) {
                                         $linkfilename, $meta_same, \%bombs);                  $title = &getTitleString($targetdir.'/'.$filename);
                   $fulltitle = $title;
               } else {
                   ($fulltitle, $title) = &getTitle($resdir, $targetdir, $filename,
                                                    $linkfilename, $meta_same, \%bombs);
               }
         } else {          } else {
             ($status, $pubstatus) = ('','');              ($status, $pubstatus) = ('','');
             ($fulltitle, $title) = ('','');              ($fulltitle, $title) = ('','');
Line 272  my $result = "<script type=\"text/javasc Line 298  my $result = "<script type=\"text/javasc
             "linkfilename"      => $linkfilename,              "linkfilename"      => $linkfilename,
         }          }
     }      }
      
     my @sorted_files;      my @sorted_files;
     # Sorting by something other than "Name".  Name is the secondary key.      # Sorting by something other than "Name".  Name is the secondary key.
     if ($sortby =~ m{cmtime|size}) {    # Numeric fields      if ($sortby =~ m{cmtime|size}) {    # Numeric fields
Line 306  my $result = "<script type=\"text/javasc Line 332  my $result = "<script type=\"text/javasc
         }          }
   
     # Sort by "Name" is the default      # Sort by "Name" is the default
     } else {       } else {
         if ($sortorder eq "rev") {          if ($sortorder eq "rev") {
             @sorted_files = sort {uc($b) cmp uc($a)} (keys(%{$filehash}));              @sorted_files = sort {uc($b) cmp uc($a)} (keys(%{$filehash}));
         } else {          } else {
Line 315  my $result = "<script type=\"text/javasc Line 341  my $result = "<script type=\"text/javasc
     }      }
   
     # Print the sorted resources      # Print the sorted resources
       my %editors = &Apache::loncommon::permitted_editors();
     foreach my $filename (@sorted_files) {      foreach my $filename (@sorted_files) {
         if ($filehash->{$filename}->{"cmode"}&$dirptr) {        # Directories          if ($filehash->{$filename}->{"cmode"}&$dirptr) {        # Directories
             &putdirectory($r, $thisdisfn, $linkdir, $filename,               &putdirectory($r, $thisdisfn, $linkdir, $filename,
                 $filehash->{$filename}->{"cmtime"},                   $filehash->{$filename}->{"cmtime"},
                 $targetdir, \%bombs, \$numdir);                  $targetdir, \%bombs, \$numdir);
         } else {                                                # Files          } else {                                                # Files
             &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,              &putresource($r, $udom, $uname, $filename, $thisdisfn, $resdir,
                 $targetdir, $linkdir, $filehash->{$filename}->{"cmtime"},                   $targetdir, $linkdir, $crsauthor,
                 $filehash->{$filename}->{"size"}, \$numres,                   $filehash->{$filename}->{"cmtime"},
                   $filehash->{$filename}->{"size"}, \$numres,
                 $filehash->{$filename}->{"linkfilename"},                  $filehash->{$filename}->{"linkfilename"},
                 $filehash->{$filename}->{"fulltitle"},                  $filehash->{$filename}->{"fulltitle"},
                 $filehash->{$filename}->{"status"},                  $filehash->{$filename}->{"status"},
                 $filehash->{$filename}->{"pubstatus"});                  $filehash->{$filename}->{"pubstatus"},
                   \%editors);
         }          }
     }      }
   
Line 347  my $result = "<script type=\"text/javasc Line 376  my $result = "<script type=\"text/javasc
            .'</div>'             .'</div>'
            .&Apache::loncommon::end_page()             .&Apache::loncommon::end_page()
   );    );
   return OK;      return OK;
 }  }
   
   
   
 #   Output the header of the page.  This includes:  #   Output the header of the page.  This includes:
 #   - The HTML header   #   - The HTML header
 #   - The H1/H3  stuff which includes the directory.  #   - The H1/H3  stuff which includes the directory.
 #  #
 #     startpage($r, $uame, $udom, $thisdisfn, $current_disk_usage, $disk_quota);  #     startpage($r, $uame, $udom, $thisdisfn, $current_disk_usage, $disk_quota);
Line 366  my $result = "<script type=\"text/javasc Line 395  my $result = "<script type=\"text/javasc
 #      $crstype - Course type, if this is for "course author"  #      $crstype - Course type, if this is for "course author"
   
 sub startpage {  sub startpage {
     my ($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota, $crsauthor, $diraction) = @_;      my ($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota, $crsauthor) = @_;
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
   
Line 386  sub startpage { Line 415  sub startpage {
         'text'  => $title,          'text'  => $title,
         'href'  => &Apache::loncommon::authorspace($formaction),          'href'  => &Apache::loncommon::authorspace($formaction),
     });      });
     # breadcrumbs (and tools) will be created       # breadcrumbs (and tools) will be created
     # in start_page->bodytag->innerregister      # in start_page->bodytag->innerregister
   
     $env{'request.noversionuri'}=$formaction;      $env{'request.noversionuri'}=$formaction;
     my $js = '<script type="text/javascript"       my $js = '<script type="text/javascript"
                 src="/res/adm/includes/file_upload.js"></script>';                  src="/res/adm/includes/file_upload.js"></script>';
     $r->print(&Apache::loncommon::start_page($title, $js));      $r->print(&Apache::loncommon::start_page($title, $js));
   
     $disk_quota = 1024 * $disk_quota; # convert from MB to kB      $disk_quota = 1024 * $disk_quota; # convert from MB to kB
   
     my $heading = &mt('Directory');      my $headertext = &mt('Directory');
       if ($crsauthor) {
           $headertext = &mt('Course Authoring Directory');
       }
     $r->print(&Apache::loncommon::head_subbox(      $r->print(&Apache::loncommon::head_subbox(
                      '<div style="float:right;padding-top:0;margin-top;0">'                       '<div style="float:right;padding-top:0;margin-top;0">'
                     .&Apache::lonhtmlcommon::display_usage($current_disk_usage,                      .&Apache::lonhtmlcommon::display_usage($current_disk_usage,
                                                            $disk_quota,'authoring')                                                             $disk_quota,'authoring')
                     .'</div>'                      .'</div>'
                     .&Apache::loncommon::CSTR_pageheader('','',$heading,$diraction)));                      .&Apache::loncommon::CSTR_pageheader('','',$headertext)));
   
     my $esc_thisdisfn = &Apache::loncommon::escape_single($thisdisfn);      my $esc_thisdisfn = &Apache::loncommon::escape_single($thisdisfn);
     my $doctitle = 'LON-CAPA '.&mt($title);      my $doctitle = 'LON-CAPA '.&mt($title);
Line 416  parent.lastknownpriv='/priv$esc_thisdisf Line 448  parent.lastknownpriv='/priv$esc_thisdisf
   
 // Confirmation dialogues  // Confirmation dialogues
   
     function currdiract(theform) {  
         if (theform.dirtask.options[theform.dirtask.selectedIndex].value == 'publish') {  
             document.publishdir.filename.value = theform.filename.value;  
     document.publishdir.submit();  
         }  
         if (theform.dirtask.options[theform.dirtask.selectedIndex].value == 'editmeta') {  
             top.location=theform.filename.value+'default.meta'  
         }  
         if (theform.dirtask.options[theform.dirtask.selectedIndex].value == 'printdir' ) {  
             document.printdir.postdata.value=theform.filename.value  
             document.printdir.submit();  
         }  
         if (theform.dirtask.options[theform.dirtask.selectedIndex].value == "delete") {  
               var delform = document.delresource  
               delform.filename.value = theform.filename.value  
               delform.submit()  
         }  
     }  
     
     function checkUpload(theform) {      function checkUpload(theform) {
         if (theform.file == '') {          if (theform.file == '') {
             alert("Please use 'Browse..' to choose a file first, before uploading")              alert("Please use 'Browse..' to choose a file first, before uploading")
             return               return
         }          }
         theform.submit()            theform.submit()
     }      }
   
     function SetPubDir(theform,printForm) {      function SetPubDir(theform,printForm) {
Line 517  ENDPUBDIRSCRIPT Line 530  ENDPUBDIRSCRIPT
     $r->print($pubdirscript);      $r->print($pubdirscript);
 }  }
   
 sub diractions {  
     my ($thisdisfn) = @_;  
     my %lt=&Apache::lonlocal::texthash(  
                                        acti => 'Actions for current directory',  
                                        sela => 'Select Action',  
                                        pubd => 'Publish this Directory',  
                                        prnt => 'Print contents of directory',  
                                        edit => 'Edit Metadata',  
                                        dedr => 'Delete Directory',  
     );  
     return <<END;  
 <div style="display:inline-block;padding-left:20px">  
 <b>$lt{'acti'}</b><br />  
 <form name="curractions" method="post" action="">  
     <select name="dirtask" onchange="currdiract(this.form)">  
         <option>$lt{'sela'}</option>  
         <option value="publish">$lt{'pubd'}</option>  
         <option value="editmeta">$lt{'edit'}</option>  
         <option value="printdir">$lt{'prnt'}</option>  
         <option value="delete">$lt{'dedr'}</option>  
     </select>  
     <input type="hidden" name="filename" value="/priv$thisdisfn/" />  
 </form>  
 <form name="publishdir" method="post" action="/adm/publish">  
   <input type="hidden" name="pubrec" value="" />  
   <input type="hidden" name="filename" value="" />  
 </form>  
 <form name="printdir" method="post" action="/adm/printout">  
   <input type="hidden" name="postdata" value="" />  
 </form>  
 </div>  
 END  
   
 }  
   
 sub dircontrols {  sub dircontrols {
     my ($r,$uname,$udom,$thisdisfn, $current_disk_usage, $disk_quota) = @_;      my ($r,$uname,$udom,$thisdisfn,$current_disk_usage,$disk_quota,$crsauthor) = @_;
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                                        cnpd => 'Cannot publish directory',                                         cnpd => 'Cannot publish directory',
                                        cnrd => 'Cannot retrieve directory',                                         cnrd => 'Cannot retrieve directory',
Line 561  sub dircontrols { Line 539  sub dircontrols {
                                        pubr => 'Publish this Resource',                                         pubr => 'Publish this Resource',
                                        rtrv => 'Retrieve Old Version',                                         rtrv => 'Retrieve Old Version',
                                        list => 'List Directory',                                         list => 'List Directory',
                                        uplo => 'Upload file',                                           uplo => 'Upload file',
                                        dele => 'Delete',                                         dele => 'Delete',
                                        sela => 'Select Action',                                         sela => 'Select Action',
                                        nfil => 'New file',                                         nfil => 'New file',
Line 591  sub dircontrols { Line 569  sub dircontrols {
                                        nanf => 'Name of New File',                                         nanf => 'Name of New File',
                                        nans => 'Name of New Subdirectory',                                         nans => 'Name of New Subdirectory',
                                        psfn => 'Please specify file name',                                         psfn => 'Please specify file name',
     );       );
     &js_escape(\%js_lt);      &js_escape(\%js_lt);
     my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript      my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript
     # Calculate free space in bytes.      # Calculate free space in bytes.
Line 612  sub dircontrols { Line 590  sub dircontrols {
         </fieldset>          </fieldset>
   </div>    </div>
 END  END
       my %fileoptions = (
                            none => "$lt{'sela'}:",
                            newfile => "$lt{'nfil'}:",
                            newhtmlfile => "$lt{'nhtm'}:",
                            newproblemfile => "$lt{'nprb'}:",
                            newdir => "$lt{'nsub'}:",
                         );
       $fileoptions{'select_form_order'} = ['none','newfile','newhtmlfile','newproblemfile'];
       if ($crsauthor) {
           push(@{$fileoptions{'select_form_order'}},'newdir');
       } else {
           my %extraoptions = (
                                 newpagefile => "$lt{'npag'}:",
                                 newsequencefile => "$lt{'nseq'}:",
                                 newrightsfile => "$lt{'ncrf'}:",
                                 newstyfile => "$lt{'nsty'}:",
                                 newtaskfile => "$lt{'nbt'}:",
                                 newlibraryfile => "$lt{'nlib'}:",
           );
           %fileoptions = (%fileoptions,%extraoptions);
           push(@{$fileoptions{'select_form_order'}},('newpagefile','newsequencefile',
                                                      'newrightsfile','newstyfile',
                                                      'newtaskfile','newlibraryfile',
                                                      'newdir'));
       }
       my $selectbox = &Apache::loncommon::select_form('none','action',\%fileoptions);
     $r->print(<<END);      $r->print(<<END);
   <div style="padding-bottom: 2px">    <div style="padding-bottom: 2px">
     <form name="upublisher" enctype="multipart/form-data" method="post" action="/adm/upload">      <form name="upublisher" enctype="multipart/form-data" method="post" action="/adm/upload">
Line 641  END Line 645  END
                         }                          }
                     }                      }
                   </script>                    </script>
   <select name="action">    $selectbox&nbsp;<input type="text" id="newnameid" name="newfilename" placeholder="$lt{'type'}" value="" onfocus="if (this.value == is.empty()) this.value=''" />&nbsp;<input type="button" value="Go" onclick="validate_go();" />
     <option value="none">$lt{'sela'}</option>  
     <option value="newfile">$lt{'nfil'}:</option>  
     <option value="newhtmlfile">$lt{'nhtm'}:</option>  
     <option value="newproblemfile">$lt{'nprb'}:</option>  
                     <option value="newpagefile">$lt{'npag'}:</option>  
                     <option value="newsequencefile">$lt{'nseq'}:</option>  
                     <option value="newrightsfile">$lt{'ncrf'}:</option>  
                     <option value="newstyfile">$lt{'nsty'}:</option>  
                     <option value="newtaskfile">$lt{'nbt'}:</option>  
                     <option value="newlibraryfile">$lt{'nlib'}:</option>  
             <option value="newdir">$lt{'nsub'}:</option>  
   </select>&nbsp;<input type="text" id="newnameid" name="newfilename" placeholder="$lt{'type'}" value="" onfocus="if (this.value == is.empty()) this.value=''" />&nbsp;<input type="button" value="Go" onclick="validate_go();" />  
  <br />   <br />
                 <span>$lt{'shcu'}:                  <span>$lt{'shcu'}:
                  <input type="hidden" name="mode"/>                   <input type="hidden" name="mode"/>
                  <a href="javascript:void(0)" onclick="javascript:validate_action('blank')">                   <a href="javascript:void(0)" onclick="javascript:validate_action('blank')">
     <img src="/adm/lonIcons/unknown.gif" title="Create blank problem file"></a>      <img src="/adm/lonIcons/unknown.gif" title="Create blank problem file" alt="file icon" /></a>
                  <a href="javascript:void(0)" onclick="javascript:validate_action('problemtempl')">                    <a href="javascript:void(0)" onclick="javascript:validate_action('problemtempl')"> 
                     <img src="/adm/lonIcons/problem.gif" title="Create new problem from template"></a>                      <img src="/adm/lonIcons/problem.gif" title="Create new problem from template" alt="problem icon" /></a>
                  <a href="javascript:void(0)" onclick="javascript:validate_action('blankhtml')">                    <a href="javascript:void(0)" onclick="javascript:validate_action('blankhtml')"> 
                     <img src="/adm/lonIcons/html.gif" title="Create new blank HTML file"></a>                      <img src="/adm/lonIcons/html.gif" title="Create new blank HTML file" alt="web page icon" /></a>
                  <a href="javascript:void(0)" onclick="javascript:validate_action('folder')">                    <a href="javascript:void(0)" onclick="javascript:validate_action('folder')"> 
     <img src="/adm/lonIcons/navmap.folder.closed.gif" title="Create new subdirectory"></a>      <img src="/adm/lonIcons/navmap.folder.closed.gif" title="Create new subdirectory" alt="folder icon" /></a>
                 </span>                  </span>
                  <script type="text/javascript">                   <script type="text/javascript">
                      function validate_action(action){                       function validate_action(action){
Line 782  sub putdirectory { Line 774  sub putdirectory {
     my ($r, $reqfile, $here, $dirname, $modtime, $targetdir, $bombs, $numdir) = @_;      my ($r, $reqfile, $here, $dirname, $modtime, $targetdir, $bombs, $numdir) = @_;
   
 # construct the display filename: the directory name unless ..:  # construct the display filename: the directory name unless ..:
      
     my $actionitem;      my $actionitem;
    
     my $disfilename = $dirname;      my $disfilename = $dirname;
 # Don't display directory itself, and there is no way up from root directory  # Don't display directory itself, and there is no way up from root directory
     unless ((($dirname eq '..') && ($reqfile=~/^\/[^\/]+\/[^\/]+$/)) || ($dirname eq '.')) {      unless ((($dirname eq '..') && ($reqfile=~/^\/[^\/]+\/[^\/]+$/)) || ($dirname eq '.')) {
Line 807  sub putdirectory { Line 799  sub putdirectory {
             $actionitem = &mt('Go to ...');              $actionitem = &mt('Go to ...');
             $disfilename = '<i>'.&mt('Parent Directory').'</i>';              $disfilename = '<i>'.&mt('Parent Directory').'</i>';
         } else {          } else {
             $actionitem =               $actionitem =
                     '<form name="dirselect_'.$$numdir.                      '<form name="dirselect_'.$$numdir.
                     '" action="/adm/publish">'.                      '" action="/adm/publish">'.
                     '<select name="diraction" onchange="SetPubDir(this.form,document)">'.                      '<select name="diraction" onchange="SetPubDir(this.form,document)">'.
Line 861  sub getTitle { Line 853  sub getTitle {
                 &Apache::loncommon::modal_link(                  &Apache::loncommon::modal_link(
                     '/adm/retrieve?filename='.$linkfilename.'.meta&amp;inhibitmenu=yes&amp;add_modal=yes',                      '/adm/retrieve?filename='.$linkfilename.'.meta&amp;inhibitmenu=yes&amp;add_modal=yes',
                     &mt('Retrieve Metadata'),600,500);                      &mt('Retrieve Metadata'),600,500);
         }           }
     }      }
     # Allow editing metadata of published and unpublished resources      # Allow editing metadata of published and unpublished resources
     $title .= "\n".'<br />' if ($title);      $title .= "\n".'<br />' if ($title);
Line 880  sub isMetaSame { Line 872  sub isMetaSame {
     my $meta_cmtime = (stat($cstr_dir.'/'.$filename.'.meta'))[9];      my $meta_cmtime = (stat($cstr_dir.'/'.$filename.'.meta'))[9];
     my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];      my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];
     return (&Apache::londiff::are_different_files($resdir.'/'.$filename.'.meta',      return (&Apache::londiff::are_different_files($resdir.'/'.$filename.'.meta',
             $cstr_dir.'/'.$filename.'.meta') && $meta_rmtime < $meta_cmtime)               $cstr_dir.'/'.$filename.'.meta') && $meta_rmtime < $meta_cmtime)
         ? 0 : 1;          ? 0 : 1;
 }  }
       
   
 sub getStatus {      sub getStatus {
     my ($resdir, $targetdir, $cstr_dir, $filename,        my ($resdir, $targetdir, $cstr_dir, $filename,
             $linkfilename, $cmtime, $meta_same) = @_;          $linkfilename, $crsauthor, $cmtime, $meta_same) = @_;
     my $pubstatus = 'unpublished';      my $pubstatus = 'unpublished';
     my $status = &mt('Unpublished');      my $status = &mt('Unpublished');
   
Line 913  sub getStatus { Line 904  sub getStatus {
         );          );
         $rights_status .=          $rights_status .=
             $lt_SourceRight{&getSourceRightString($targetdir.'/'.$filename)};              $lt_SourceRight{&getSourceRightString($targetdir.'/'.$filename)};
           if (($crsauthor) && ($filename =~ /\.rights$/)) {
               $rights_status =~ s/,\s+$//;
           }
  if ($same) {   if ($same) {
     if (&Apache::lonnet::metadata($targetdir.'/'.$filename,'obsolete')) {      if (&Apache::lonnet::metadata($targetdir.'/'.$filename,'obsolete')) {
                 $pubstatus = 'obsolete';                  $pubstatus = 'obsolete';
Line 931  sub getStatus { Line 924  sub getStatus {
             $pubstatus = 'modified';              $pubstatus = 'modified';
     $status=&mt('Modified').      $status=&mt('Modified').
  '<br />'. $rights_status;   '<br />'. $rights_status;
     if (&Apache::loncommon::fileembstyle(($filename=~/\.(\w+)$/)) eq 'ssi') {              unless (($crsauthor) && ($filename =~ /\.rights$/)) {
  $status.='<br />'.          if (&Apache::loncommon::fileembstyle(($filename=~/\.(\w+)$/)) eq 'ssi') {
                          &Apache::loncommon::modal_link(      $status.='<br />'.
                              '/adm/diff?filename='.$linkfilename.'&amp;versiontwo=priv',                               &Apache::loncommon::modal_link(
                              &mt('Diffs'),600,500);                                   '/adm/diff?filename='.$linkfilename.'&amp;versiontwo=priv',
                                    &mt('Diffs'),600,500);
           }
     }      }
  }    }
   
  $status.="\n".'<br />'.          unless (($crsauthor) && ($filename =~ /\.rights$/)) {
              &Apache::loncommon::modal_link(      $status.="\n".'<br />'.
                  '/adm/retrieve?filename='.$linkfilename.'&amp;inhibitmenu=yes&amp;add_modal=yes',&mt('Retrieve'),600,500);                   &Apache::loncommon::modal_link(
                        '/adm/retrieve?filename='.$linkfilename.'&amp;inhibitmenu=yes&amp;add_modal=yes',&mt('Retrieve'),600,500);
           }
     }      }
   
     return ($status, $pubstatus);      return ($status, $pubstatus);
Line 952  sub getStatus { Line 949  sub getStatus {
 #   Put a table row for a file resource.  #   Put a table row for a file resource.
 #  #
 sub putresource {  sub putresource {
     my ($r, $udom, $uname, $filename, $thisdisfn, $resdir, $targetdir,       my ($r, $udom, $uname, $filename, $thisdisfn, $resdir,
             $linkdir, $cmtime, $size, $numres, $linkfilename, $title,           $targetdir, $linkdir, $crsauthor, $cmtime, $size,
             $status, $pubstatus) = @_;          $numres, $linkfilename, $title, $status, $pubstatus,
           $editors) = @_;
     &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);      &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);
   
     my $editlink='';      my $editlink='';
     my $editlink2='';      my $editlink2='';
     if ($filename=~/\.(xml|html|htm|xhtml|xhtm|sty)$/) {      if ($filename=~/\.(xml|html|htm|xhtml|xhtm|sty|txt|css|js)$/) {
  $editlink=' <br />(<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=edit">'.&mt('Edit').'</a>)';   $editlink=' <br />(<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=edit">'.&mt('Edit').'</a>)';
     }      }
     if ($filename=~/$LONCAPA::assess_re/) {      if ($filename=~/$LONCAPA::assess_re/) {
  $editlink=' (<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=editxml">'.&mt('EditXML').'</a>)';          if ($editors->{'xml'}) { 
  $editlink2=' <br />(<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=edit">'.&mt('Edit').'</a>)';      $editlink=' (<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=editxml">'.&mt('EditXML').'</a>)';
           }
           if ($editors->{'edit'}) {
       $editlink2=' <br />(<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=edit">'.&mt('Edit').'</a>)';
           }
     }      }
     if ($filename=~/\.(xml|html|htm|xhtml|xhtm)$/ || $filename=~/$LONCAPA::assess_re/) {      if ($filename=~/\.(xml|html|htm|xhtml|xhtm)$/ || $filename=~/$LONCAPA::assess_re/) {
         if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {          if (($editors->{'daxe'}) &&
               ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9)) {
             my $daxeurl = '/daxepage'.$linkdir.'/'.$filename;              my $daxeurl = '/daxepage'.$linkdir.'/'.$filename;
             $editlink .= ' (<a href="'.$daxeurl.'" target="_blank">Daxe</a>)';              $editlink .= ' (<a href="'.$daxeurl.'">Daxe</a>)';
         }          }
     }      }
     if ($filename=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm|sty)$/) {      if ($filename=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm|sty)$/) {
Line 980  sub putresource { Line 983  sub putresource {
     }      }
     my $publish_button = (-e $resdir.'/'.$filename) ? &mt('Re-publish') : &mt('Publish');      my $publish_button = (-e $resdir.'/'.$filename) ? &mt('Re-publish') : &mt('Publish');
     my $pub_select = '';      my $pub_select = '';
     &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres);      unless (($crsauthor) && ($filename=~ /\.rights$/)) {
           &create_pubselect($r,\$pub_select,$udom,$uname,$thisdisfn,$filename,$resdir,$pubstatus,$publish_button,$numres);
       }
     $r->print(&Apache::loncommon::start_data_table_row().      $r->print(&Apache::loncommon::start_data_table_row().
       '<td>'.($filename=~/[\#\~]$/?'&nbsp;':        '<td>'.($filename=~/[\#\~]$/?'&nbsp;':
       '<img src="'.&Apache::loncommon::icon($filename).'" alt="" />').'</td>'.        '<img src="'.&Apache::loncommon::icon($filename).'" alt="" />').'</td>'.
Line 1007  sub create_pubselect { Line 1012  sub create_pubselect {
 <option>'.&mt('Select action').'</option>'.  <option>'.&mt('Select action').'</option>'.
 '<option value="copy">'.&mt('Copy').'</option>';  '<option value="copy">'.&mt('Copy').'</option>';
     if ($pubstatus eq 'obsolete' || $pubstatus eq 'unpublished') {      if ($pubstatus eq 'obsolete' || $pubstatus eq 'unpublished') {
         $$pub_select .=           $$pub_select .=
 '<option value="rename">'.&mt('Rename').'</option>'.  '<option value="rename">'.&mt('Rename').'</option>'.
 '<option value="move">'.&mt('Move').'</option>'.  '<option value="move">'.&mt('Move').'</option>'.
 '<option value="delete">'.&mt('Delete').'</option>';  '<option value="delete">'.&mt('Delete').'</option>';
Line 1046  sub check_for_versions { Line 1051  sub check_for_versions {
     opendir(DIR,$resdir);      opendir(DIR,$resdir);
     while (my $filename=readdir(DIR)) {      while (my $filename=readdir(DIR)) {
         if ($filename=~/^\Q$main\E\.(\d+)\.\Q$suffix\E$/) {          if ($filename=~/^\Q$main\E\.(\d+)\.\Q$suffix\E$/) {
             $versions ++;                      $versions ++;
         }          }
     }      }
     closedir(DIR);      closedir(DIR);
Line 1054  sub check_for_versions { Line 1059  sub check_for_versions {
 }  }
   
 sub prepareJsonTranslations {  sub prepareJsonTranslations {
     my $json =       my $json =
         '{"translations":{'.          '{"translations":{'.
             '"edit":"'.&mt('Edit').'",'.              '"edit":"'.&mt('Edit').'",'.
             '"editxml":"'.&mt('EditXML').'",'.              '"editxml":"'.&mt('EditXML').'",'.
Line 1125  sub prepareJsonData_rec { Line 1130  sub prepareJsonData_rec {
     closedir(DIR);      closedir(DIR);
     # nothing to do here if both lists are empty      # nothing to do here if both lists are empty
     return unless ( @dirs || @resources );      return unless ( @dirs || @resources );
       
 # Phase 2: Working  # Phase 2: Working
     $$firstfile = 1;      $$firstfile = 1;
   
Line 1247  run through list of files and attempt to Line 1252  run through list of files and attempt to
 =item startpage($r, $uame, $udom, $thisdisfn)  =item startpage($r, $uame, $udom, $thisdisfn)
   
 Output the header of the page.  This includes:  Output the header of the page.  This includes:
  - The HTML header    - The HTML header
  - The H1/H3  stuff which includes the directory.   - The H1/H3  stuff which includes the directory.
    
     startpage($r, $uame, $udom, $thisdisfn);      startpage($r, $uame, $udom, $thisdisfn);
         $r     - The apache request object.          $r     - The apache request object.
         $uname - User name.          $uname - User name.
Line 1262  Output the header of the page.  This inc Line 1267  Output the header of the page.  This inc
     Without the latter substitution, it's impossible to examine metadata for      Without the latter substitution, it's impossible to examine metadata for
     untitled resources.  Resources may be legitimately untitled, to prevent      untitled resources.  Resources may be legitimately untitled, to prevent
     searches from locating them.      searches from locating them.
       
     $str = getTitleString($fullname);      $str = getTitleString($fullname);
         $fullname - Fully qualified filename to check.          $fullname - Fully qualified filename to check.
   
Line 1270  Output the header of the page.  This inc Line 1275  Output the header of the page.  This inc
                    $numdir)                     $numdir)
   
     Put out a directory table row:      Put out a directory table row:
       
         $r        - Apache request object.          $r        - Apache request object.
         $reqfile  - File in request.          $reqfile  - File in request.
         $here     - Where we are in directory tree.          $here     - Where we are in directory tree.

Removed from v.1.176  
changed lines
  Added in v.1.183


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>