Diff for /loncom/publisher/lonpubdir.pm between versions 1.160.2.2 and 1.180

version 1.160.2.2, 2016/09/14 16:48:02 version 1.180, 2023/07/14 18:01:23
Line 48  sub handler { Line 48  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 80  sub handler { Line 80  sub handler {
         }          }
     }      }
     $thisdisfn=~s/^\Q$docroot\E\/priv//;      $thisdisfn=~s/^\Q$docroot\E\/priv//;
       
     my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory      my $resdir=$docroot.'/res'.$thisdisfn; # Resource directory
     my $targetdir='/res'.$thisdisfn; # Publication target directory.      my $targetdir='/res'.$thisdisfn; # Publication target directory.
     my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.      my $linkdir='/priv'.$thisdisfn;      # Full URL name of constr space.
   
       my $cstr = 'author';
       my ($crsauthor,$crstype);
       if ($env{'request.course.id'}) {
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           if ($thisdisfn =~ m{^/\Q$cdom/$cnum\E}) {
               $crsauthor = 1;
               $cstr = 'course';
               $crstype = &Apache::loncommon::course_type();
           }
       }
   
     my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);      my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom);
   
     &startpage($r, $uname, $udom, $thisdisfn);  # Put out the start of page.      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
       my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,
                                   "$londocroot/priv/$udom/$uname"); # expressed in kB
       my $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,
                                                    $cstr,$crstype); # expressed in MB
       # Put out the start of page.
   
       &startpage($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota, $crsauthor);
   
     if (!-d $fn) {      if (!-d $fn) {
         if (-e $fn) {          if (-e $fn) {
Line 108  sub handler { Line 127  sub handler {
         return OK;          return OK;
     }      }
   
     &dircontrols($r,$uname,$udom,$thisdisfn);   # Put out actions for directory,       # Put out actions for directory, browse/upload + new file page.
                                                 # browse/upload + new file page.      &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 173  sub handler { Line 192  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 187  sub handler { Line 206  sub handler {
         } else { $idx = 2; } # No arrow if column is not sorted          } else { $idx = 2; } # No arrow if column is not sorted
         $output .= (($columns{$key}{order}) ?          $output .= (($columns{$key}{order}) ?
             '<th'.($columns{$key}{colspan} ? ' colspan="'.$columns{$key}{colspan}.'"' : '')              '<th'.($columns{$key}{colspan} ? ' colspan="'.$columns{$key}{colspan}.'"' : '')
             .'><a href="'.$linkdir.'/?sortby='.$key.'&sortorder='              .'><a href="'.$linkdir.'/?sortby='.$key.'&amp;sortorder='
             .((($sortby eq $key) && ($sortorder ne 'rev')) ? 'rev' : '').'">'              .((($sortby eq $key) && ($sortorder ne 'rev')) ? 'rev' : '').'">'
             .$columns{$key}{text}.$arrows[$idx].'</a></th>' :              .$columns{$key}{text}.$arrows[$idx].'</a></th>' :
             '<th>'.$columns{$key}{text}.'</th>');              '<th>'.$columns{$key}{text}.'</th>');
     }      }
     $r->print(&Apache::loncommon::start_data_table()  
   my $result = "<script type=\"text/javascript\">
       sessionStorage.setItem('CSTRcache','".&prepareJsonData($uname,$udom,$thisdisfn)."');
       localStorage.setItem('CSTRtrans', '".&prepareJsonTranslations()."');
   </script>";
       $r->print($result);
   
       $r->print('<div id="currentFolder">'.&Apache::loncommon::start_data_table()
           .'<tr><th colspan="8" id="searchtitle" style="display:none"></th></tr>'
         .&Apache::loncommon::start_data_table_header_row() . $output          .&Apache::loncommon::start_data_table_header_row() . $output
         .&Apache::loncommon::end_data_table_header_row()          .&Apache::loncommon::end_data_table_header_row()
     );      );
Line 210  sub handler { Line 237  sub handler {
         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 240  sub handler { Line 272  sub handler {
             "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 274  sub handler { Line 306  sub handler {
         }          }
   
     # 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 285  sub handler { Line 317  sub handler {
     # Print the sorted resources      # Print the sorted resources
     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"},
Line 299  sub handler { Line 332  sub handler {
         }          }
     }      }
   
     $r->print( &Apache::loncommon::end_data_table()    $r->print(&Apache::loncommon::end_data_table()
         .&Apache::loncommon::end_page() );             .'</div><div id="otherplaces" style="display:none">'
              .&Apache::loncommon::start_data_table()
     return OK;             .'<tr><th colspan="7">'.&mt('Results in other directories:').'</th></tr>'
              .'<tr class="LC_header_row" id="otherplacestable">'
              .'<th>'.&mt('Type').'</th>'
              .'<th>'.&mt('Directory').'</th>'
              .'<th>'.&mt('Name').'</th>'
              .'<th>'.&mt('Title').'</th>'
              .'<th colspan="2">'.&mt('Status').'</th>'
              .'<th>'.&mt('Last Modified').'</th>'
              .'</tr>'
              .&Apache::loncommon::end_data_table()
              .'</div>'
              .&Apache::loncommon::end_page()
     );
     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);  #     startpage($r, $uame, $udom, $thisdisfn, $current_disk_usage, $disk_quota);
 #      $r     - The apache request object.  #      $r     - The apache request object.
 #      $uname - User name.  #      $uname - User name.
 #      $udom  - Domain name the user is logged in under.  #      $udom  - Domain name the user is logged in under.
 #      $thisdisfn - Displayable version of the filename.  #      $thisdisfn - Displayable version of the filename.
   #      $current_disk_usage - User's current disk usage (in kB).
   #      $disk_quota - Disk quota for user's authoring space (in MB).
   #      $crstype - Course type, if this is for "course author"
   
 sub startpage {  sub startpage {
     my ($r, $uname, $udom, $thisdisfn) = @_;      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;
   
     my $formaction='/priv'.$thisdisfn.'/';      my $formaction='/priv'.$thisdisfn.'/';
     $formaction=~s|/+|/|g;      $formaction=~s|/+|/|g;
     &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);  
       my $title;
       if ($crsauthor) {
           $title = 'Course Authoring';
       } else {
           $title = 'Authoring Space';
           &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);
       }
   
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb({      &Apache::lonhtmlcommon::add_breadcrumb({
         'text'  => 'Authoring Space',          '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;
     $r->print(&Apache::loncommon::start_page('Authoring Space'));      my $js = '<script type="text/javascript"
                   src="/res/adm/includes/file_upload.js"></script>';
     my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};      $r->print(&Apache::loncommon::start_page($title, $js));
     my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,"$londocroot/priv/$udom/$uname");  
     my $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,'author'); #expressed in MB      $disk_quota = 1024 * $disk_quota; # convert from MB to kB
     $disk_quota = 1000 * $disk_quota; # convert from MB to kB  
       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()));                      .&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('Authoring Space');      my $doctitle = 'LON-CAPA '.&mt($title);
     my $newname = &mt('New Name');      my $newname = &mt('New Name');
     my $pubdirscript=(<<ENDPUBDIRSCRIPT);      my $pubdirscript=(<<ENDPUBDIRSCRIPT);
 <script type="text/javascript">  <script type="text/javascript">
Line 361  parent.lastknownpriv='/priv$esc_thisdisf Line 420  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 463  ENDPUBDIRSCRIPT Line 503  ENDPUBDIRSCRIPT
 }  }
   
 sub dircontrols {  sub dircontrols {
     my ($r,$uname,$udom,$thisdisfn) = @_;      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',
                                        mcdi => 'Must create new subdirectory inside a directory',                                         mcdi => 'Must create new subdirectory inside a directory',
                                        pubr => 'Publish this Resource',                                         pubr => 'Publish this Resource',
                                        pubd => 'Publish this Directory',  
                                        dedr => 'Delete Directory',  
                                        rtrv => 'Retrieve Old Version',                                         rtrv => 'Retrieve Old Version',
                                        list => 'List Directory',                                         list => 'List Directory',
                                        uplo => 'Upload file',                                           uplo => 'Upload file',
                                        dele => 'Delete',                                         dele => 'Delete',
                                        edit => 'Edit Metadata',   
                                        sela => 'Select Action',                                         sela => 'Select Action',
                                        nfil => 'New file',                                         nfil => 'New file',
                                        nhtm => 'New HTML file',                                         nhtm => 'New HTML file',
Line 492  sub dircontrols { Line 529  sub dircontrols {
                                        copy => 'Copy current file to',                                         copy => 'Copy current file to',
                                        type => 'Type Name Here',                                         type => 'Type Name Here',
                                        go   => 'Go',                                         go   => 'Go',
                                        prnt => 'Print contents of directory',                                         crea => 'Create a new subdirectory or document',
                                        crea => 'Create a new directory or LON-CAPA document',                                         qs   => 'Quick name search',
        acti => 'Actions for current directory',                                         cs   => 'Case Sensitive',
                                          re   => 'Regular Expression',
        updc => 'Upload a new document',         updc => 'Upload a new document',
        pick => 'Please select an action to perform using the new filename',         pick => 'Please select an action to perform using the new filename',
                                          shcu => 'Shortcuts',
                                       );                                        );
       my %js_lt = &Apache::lonlocal::texthash(
                                          nanf => 'Name of New File',
                                          nans => 'Name of New Subdirectory',
                                          psfn => 'Please specify file name',
       );
       &js_escape(\%js_lt);
     my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript      my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript
     $r->print(<<END);      # Calculate free space in bytes.
       # $disk_quota is in MB and $current_disk_usage is in kB
       my $free_space = 1024 * ((1024 * $disk_quota) - $current_disk_usage);
       $r->printf(<<END,&Apache::loncommon::help_open_topic('Quicksearch'));
 <div class="LC_columnSection">  <div class="LC_columnSection">
   <div>      <div>
     <form name="curractions" method="post" action="">        <fieldset style="display:inline">
       <fieldset>              <legend>$lt{'qs'}</legend>
         <legend>$lt{'acti'}</legend>                  <script type="text/javascript" src="/adm/quicksearch/quicksearch.js"></script>
         <select name="dirtask" onchange="currdiract(this.form)">                  <input type="text" id="quickfilter" placeholder="Enter search term" onkeyup="applyFilter()"/>
             <option>$lt{'sela'}</option>                  <input type="button" value="Clear" onclick="document.getElementById(\'quickfilter\').value=\'\'; applyFilter()" />
             <option value="publish">$lt{'pubd'}</option>                  %s
             <option value="editmeta">$lt{'edit'}</option>                  <br />
             <option value="printdir">$lt{'prnt'}</option>                  <label><input type="checkbox" id="casesens" onchange="applyFilter()"/>$lt{'cs'}&nbsp;&nbsp;</label>
             <option value="delete">$lt{'dedr'}</option>                  <label><input type="checkbox" id="regex" onchange="applyFilter()"/>$lt{'re'}&nbsp;&nbsp;</label>
         </select>          </fieldset>
         <input type="hidden" name="filename" value="/priv$thisdisfn/" />  
       </fieldset>  
     </form>  
     <form name="publishdir" method="post" action="/adm/publish" target="_parent">  
       <input type="hidden" name="pubrec" value="" />  
       <input type="hidden" name="filename" value="" />  
     </form>  
     <form name="printdir" method="post" action="/adm/printout" target="_parent">  
       <input type="hidden" name="postdata" value="" />  
     </form>  
   </div>    </div>
   END
   <div>      my %fileoptions = (
     <form name="upublisher" enctype="multipart/form-data" method="post" action="/adm/upload" target="_parent">                           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);
     <div style="padding-bottom: 2px">
       <form name="upublisher" enctype="multipart/form-data" method="post" action="/adm/upload">
       <fieldset>        <fieldset>
         <legend>$lt{'updc'}</legend>          <legend>$lt{'updc'}</legend>
         <input type="hidden" name="filename" value="/priv$thisdisfn/" />          <input type="hidden" name="filename" value="/priv$thisdisfn/" />
         <input type="file" name="upfile" size="20" />          <input type="file" name="upfile" class="LC_flUpload" />
           <input type="hidden" id="LC_free_space" value="$free_space" />
         <input type="button" value="$lt{'uplo'}"  onclick="checkUpload(this.form)" />          <input type="button" value="$lt{'uplo'}"  onclick="checkUpload(this.form)" />
       </fieldset>        </fieldset>
     </form>      </form>
   </div>    </div>
   
   <div>    <div>
     <form name="fileaction" method="post" action="/adm/cfile" target="_parent">      <form name="fileaction" method="post" action="/adm/cfile">
       <fieldset>        <fieldset>
               <legend>$lt{'crea'}</legend>                <legend>$lt{'crea'}</legend>
       <span class="LC_nobreak">        <span class="LC_nobreak">
Line 551  sub dircontrols { Line 617  sub dircontrols {
                         }                          }
                     }                      }
                   </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>   <br />
     <option value="newfile">$lt{'nfil'}:</option>                  <span>$lt{'shcu'}:
     <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" name="newfilename" placeholder="$lt{'type'}" value="" onfocus="if (this.value == is.empty()) this.value=''" />&nbsp;<input type="button" value="Go" onclick="validate_go();" />  
                 <br />  
                 <span>Quickactions:  
                  <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){
                            if (document.getElementById('newnameid')) {
                          if (document.getElementsByName(\'newfilename\')[0].value != \'\'){                               if (document.getElementById('newnameid').value == '') {
                              if (action == "blank") {                                   var newname;
                                                                  document.fileaction.action.value=\'newproblemfile\';                                   var prompttext = "$js_lt{'nanf'}";
                                                                  document.fileaction.mode.value=\'blank\';                                   if (action == 'folder') {
                                                          } else if (action == "problemtempl") {                                       prompttext = "$js_lt{'nans'}";
                                                                  document.fileaction.action.value=\'newproblemfile\';                                   }
                                  validate_go();                                   newname=prompt(prompttext);
                              } else if (action == "blankhtml") {                                   if (newname != '') {
                                  document.fileaction.action.value=\'newhtmlfile\';                                       document.getElementById('newnameid').value = newname;
                                  validate_go();                                   }
                              } else if (action == "folder") {                               }
                                  document.fileaction.action.value=\'newdir\';                               if (document.getElementById('newnameid').value != '') {
                                  document.fileaction.mode.value=\'folder\';                                   if (action == 'blank') {
        document.fileaction.action.value='newproblemfile';
        document.fileaction.mode.value='blank';
            } else if (action == 'problemtempl') {
        document.fileaction.action.value='newproblemfile';
                                        validate_go();
                                    } else if (action == 'blankhtml') {
                                        document.fileaction.action.value='newhtmlfile';
                                        validate_go();
                                    } else if (action == 'folder') {
                                        document.fileaction.action.value='newdir';
                                        document.fileaction.mode.value='folder';
                                    }
                                    fileaction.submit();
                                } else {
                                    alert("$js_lt{'psfn'}");
                              }                               }
                              fileaction.submit();  
                          } else {  
                              alert(\'Please specify file name.\');  
                              // TODO: ask for filename? if so, do some refactoring  
   
                          }                           }
                      }                       }
                  </script>                   </script>
  </span>   </span>
       </fieldset>        </fieldset>
     </form>      </form>
   </div>      </div>
 </div>  </div>
 END  END
 }  }
Line 612  END Line 676  END
 sub resourceactions {  sub resourceactions {
     my ($r,$uname,$udom,$thisdisfn) = @_;      my ($r,$uname,$udom,$thisdisfn) = @_;
     $r->print(<<END);      $r->print(<<END);
        <form name="moveresource" action="/adm/cfile" target="_parent" method="post">         <form name="moveresource" action="/adm/cfile" method="post">
          <input type="hidden" name="filename" value="" />           <input type="hidden" name="filename" value="" />
          <input type="hidden" name="newfilename" value="" />           <input type="hidden" name="newfilename" value="" />
          <input type="hidden" name="action" value="" />           <input type="hidden" name="action" value="" />
        </form>         </form>
        <form name="delresource" action="/adm/cfile" target="_parent" method="post">         <form name="delresource" action="/adm/cfile" method="post">
          <input type="hidden" name="filename" value="" />           <input type="hidden" name="filename" value="" />
          <input type="hidden" name="action" value="delete" />           <input type="hidden" name="action" value="delete" />
        </form>         </form>
        <form name="pubresource" action="/adm/publish" target="_parent" method="post">         <form name="pubresource" action="/adm/publish" method="post">
          <input type="hidden" name="filename" value="" />           <input type="hidden" name="filename" value="" />
          <input type="hidden" name="makeobsolete" value="0" />           <input type="hidden" name="makeobsolete" value="0" />
        </form>         </form>
        <form name="printresource" action="/adm/printout" target="_parent" method="post">         <form name="printresource" action="/adm/printout" method="post">
            <input type="hidden" name="postdata" value="" />             <input type="hidden" name="postdata" value="" />
        </form>         </form>
        <form name="retrieveres" action="/adm/retrieve" target="_parent" method="post">         <form name="retrieveres" action="/adm/retrieve" method="post">
            <input type="hidden" name="filename" value="" />             <input type="hidden" name="filename" value="" />
        </form>         </form>
        <form name="cleanup" action="/adm/cleanup" target="_parent" method="post">         <form name="cleanup" action="/adm/cleanup" method="post">
            <input type="hidden" name="filename" value="" />             <input type="hidden" name="filename" value="" />
        </form>         </form>
 END  END
Line 682  sub putdirectory { Line 746  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 707  sub putdirectory { Line 771  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" target="_parent">'.                      '" action="/adm/publish">'.
                     '<select name="diraction" onchange="SetPubDir(this.form,document)">'.                      '<select name="diraction" onchange="SetPubDir(this.form,document)">'.
                       '<option selected="selected">'.&mt('Select action').'</option>'.                        '<option selected="selected">'.&mt('Select action').'</option>'.
                       '<option value="open">'.&mt('Open').'</option>'.                        '<option value="open">'.&mt('Open').'</option>'.
Line 728  sub putdirectory { Line 792  sub putdirectory {
   '<td><img src="'.    '<td><img src="'.
   $Apache::lonnet::perlvar{'lonIconsURL'}.'/navmap.folder.closed.gif" alt="folder" /></td>'.    $Apache::lonnet::perlvar{'lonIconsURL'}.'/navmap.folder.closed.gif" alt="folder" /></td>'.
   '<td>'.$actionitem.'</td>'.    '<td>'.$actionitem.'</td>'.
   '<td><span class="LC_filename"><a href="'.&HTML::Entities::encode($here.'/'.$dirname,'<>&"').'/" target="_parent">'.    '<td><span class="LC_filename"><a href="'.&HTML::Entities::encode($here.'/'.$dirname,'<>&"').'/">'.
   $disfilename.'</a></span></td>'.    $disfilename.'</a></span></td>'.
         '<td colspan="3">'.($kaputt?&Apache::lonhtmlcommon::authorbombs($targetdir.'/'.$disfilename.'/'):'').$Apache::lonpublisher::metadatafields{'title'});          '<td colspan="3">'.($kaputt?&Apache::lonhtmlcommon::authorbombs($targetdir.'/'.$disfilename.'/'):'').$Apache::lonpublisher::metadatafields{'title'});
  if ($Apache::lonpublisher::metadatafields{'subject'} ne '') {   if ($Apache::lonpublisher::metadatafields{'subject'} ne '') {
Line 761  sub getTitle { Line 825  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 780  sub isMetaSame { Line 844  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 813  sub getStatus { Line 876  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 831  sub getStatus { Line 896  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 852  sub getStatus { Line 921  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) = @_;
     &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);      &Apache::lonnet::devalidate_cache_new('meta',$targetdir.'/'.$filename);
   
     my $editlink='';      my $editlink='';
Line 866  sub putresource { Line 935  sub putresource {
  $editlink=' (<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=editxml">'.&mt('EditXML').'</a>)';   $editlink=' (<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=editxml">'.&mt('EditXML').'</a>)';
  $editlink2=' <br />(<a href="'.$linkdir.'/'.$filename.'?editmode=Edit&amp;problemmode=edit">'.&mt('Edit').'</a>)';   $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 ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {
               my $daxeurl = '/daxepage'.$linkdir.'/'.$filename;
               $editlink .= ' (<a href="'.$daxeurl.'" target="_blank">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)$/) {
  $editlink.=' (<a href="/adm/cleanup?filename='.$linkfilename.'" target="_parent">'.&mt('Clean Up').')</a>';   $editlink.=' (<a href="/adm/cleanup?filename='.$linkfilename.'">'.&mt('Clean Up').')</a>';
     }      }
     if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {      if ($filename=~/\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {
  $editlink=' (<a target="_parent" href="/adm/cfile?decompress='.$linkfilename.'">'.&mt('Decompress').'</a>)';   $editlink=' (<a href="/adm/cfile?decompress='.$linkfilename.'">'.&mt('Decompress').'</a>)';
     }      }
     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>'.
               '<td>'.$pub_select.'</td>'.                '<td>'.$pub_select.'</td>'.
       '<td><span class="LC_filename">'.        '<td><span class="LC_filename">'.
       '<a href="'.$linkdir.'/'.$filename.'" target="_parent">'.        '<a href="'.$linkdir.'/'.$filename.'">'.
                $filename.'</a></span>'.$editlink2.$editlink.                 $filename.'</a></span>'.$editlink2.$editlink.
       '</td>'.        '</td>'.
       '<td>'.$title.'</td>'.        '<td>'.$title.'</td>'.
Line 901  sub create_pubselect { Line 978  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 940  sub check_for_versions { Line 1017  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);
     return $versions;      return $versions;
 }  }
   
   sub prepareJsonTranslations {
       my $json =
           '{"translations":{'.
               '"edit":"'.&mt('Edit').'",'.
               '"editxml":"'.&mt('EditXML').'",'.
               '"editmeta":"'.&mt('Edit Metadata').'",'.
               '"obsolete":"'.&mt('Obsolete').'",'.
               '"modified":"'.&mt('Modified').'",'.
               '"published":"'.&mt('Published').'",'.
               '"unpublished":"'.&mt('Unpublished').'",'.
               '"diff":"'.&mt('Diff').'",'.
               '"retrieve":"'.&mt('Retrieve').'",'.
               '"directory":"'.&mt('Directory').'",'.
               '"results":"'.&mt('Show results for keyword:').'"'.
           '}}';
   }
   
   # gathers all files in the working directory except the ones that are already on screen
   sub prepareJsonData {
       my ($uname, $udom, $pathToSkip) = @_;
       my $path = "/home/httpd/html/priv/$udom/$uname/";
   
       # maximum number of entries, to limit workload and required storage space
       my $entries = 100;
       my $firstfile = 1;
       my $firstdir = 1;
   
       my $json = '{"resources":[';
       $json .= &prepareJsonData_rec($path, \$entries, \$firstfile, \$firstdir, $pathToSkip);
       $json .= ']}';
   
       # if the json string is invalid the whole search breaks.
       # so we want to make sure that the string is valid in any case.
       $json =~ s/,\s*,/,/g;
       $json =~ s/\}\s*\{/\},\{/g;
       $json =~ s/\}\s*,\s*\]/\}\]/g;
       return $json;
   }
   
   # recursive part of json file gathering
   sub prepareJsonData_rec {
       my ($path, $entries, $firstfile, $firstdir, $pathToSkip) = @_;
       my $json;
       my $skipThisFolder = $path =~ m/$pathToSkip\/$/?1:0;
   
       my @dirs;
       my @resources;
       my @ignored = qw(bak log meta save . ..);
   
   # Phase 1: Gathering
       opendir(DIR,$path);
       my @files=sort {uc($a) cmp uc($b)} (readdir(DIR));
       foreach my $filename (@files) {
           next if ($filename eq '.DS_Store');
   
           # gather all resources
           if ($filename !~ /\./) {
               # its a folder
               push(@dirs, $filename);
           } else {
               # only push files we dont want to ignore
               next if ($skipThisFolder);
   
               $filename =~ /\.(\w+?)$/;
               unless (grep /$1/, @ignored) {
                   push(@resources, $filename);
               }
           }
       }
       closedir(DIR);
       # nothing to do here if both lists are empty
       return unless ( @dirs || @resources );
   
   # Phase 2: Working
       $$firstfile = 1;
   
       foreach (@dirs) {
           $json .= '{"name":"'.$_.'",'.
                     '"path":"'.$path.$_.'",'.
                     '"title":"",'.
                     '"status":"",'.
                     '"cmtime":""},';
       }
   
       foreach (@resources) {
           last if ($$entries < 1);
           my $title = &getTitleString($path.$_);
   
           my $privpath = $path.$_;
           my $respath = $privpath;
           $respath =~ s/httpd\/html\/priv\//httpd\/html\/res\//;
   
           my $cmtime = (stat($privpath))[9];
           my $rmtime = (stat($respath))[9];
   
           unless ($$firstfile) { $json .= ','; } else { $$firstfile = 0; }
   
           my $status = 'unpublished';
   
           # if a resource is published, the published version (/html/res/filepath) gets its own modification time
           # this is newer or equal then the version in your authoring space (/html/priv/filepath)
           if ($rmtime >= $cmtime) {
               # obsolete
               if (&Apache::lonnet::metadata($respath, 'obsolete')) {
                   $status = 'obsolete';
               }else{
                   $status = 'published';
               }
           } else {
               $status = 'modified';
           }
   
           $json .= '{"name":"'.$_.'",'.
                     '"path":"'.$path.'",'.
                     '"title":"'.$title.'",'.
                     '"status":"'.$status.'",'.
                     '"cmtime":"'.&Apache::lonlocal::locallocaltime($cmtime).'"}';
           $$entries--;
       }
   
       foreach(@dirs) {
           next if ($$entries < 1);
           $json .= ',';
           $json .= &prepareJsonData_rec
                       ($path.$_.'/', $entries, $firstfile, $firstdir, $pathToSkip);
       }
       return $json;
   }
 1;  1;
 __END__  __END__
   
Line 1013  run through list of files and attempt to Line 1218  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 1028  Output the header of the page.  This inc Line 1233  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 1036  Output the header of the page.  This inc Line 1241  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.160.2.2  
changed lines
  Added in v.1.180


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