Diff for /loncom/publisher/lonpubdir.pm between versions 1.158 and 1.163

version 1.158, 2014/06/29 03:33:23 version 1.163, 2015/01/19 15:36:11
Line 115  sub handler { Line 115  sub handler {
     my $numdir = 0;      my $numdir = 0;
     my $numres = 0;      my $numres = 0;
       
     # Retrieving value for "sortby" and "sortorder" from QUERY_STRING  
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},  
         ['sortby','sortorder']);  
   
     # Sort by name as default, not reversed  
     if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'filename' }  
     if (! exists($env{'form.sortorder'})) { $env{'form.sortorder'} = '' }  
   
     my $sortby = $env{'form.sortby'};  
     my $sortorder = $env{'form.sortorder'};  
   
     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 136  sub handler { Line 125  sub handler {
         return OK;          return OK;
     }      }
   
     # Start off the directory table.      # Retrieving value for "sortby" and "sortorder" from QUERY_STRING
     $r->print(&Apache::loncommon::start_data_table()      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         .&Apache::loncommon::start_data_table_header_row()          ['sortby','sortorder']);
         .'<th><a href="'.$linkdir.'/?sortby=filetype&sortorder='  
             .((($sortby eq "filetype") && ($sortorder ne 'rev')) ? 'rev' : '')       # Sort by name as default, not reversed
             .'">'.&mt('Type')      if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'filename' }
             .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'      if (! exists($env{'form.sortorder'})) { $env{'form.sortorder'} = '' }
         .'<th>'.&mt('Actions').'</th>'      my $sortby = $env{'form.sortby'};
         .'<th><a href="'.$linkdir.'/?sortby=filename&sortorder='      my $sortorder = $env{'form.sortorder'};
             .((($sortby eq "filename") && ($sortorder ne 'rev')) ? 'rev' : '')   
             .'">'.&mt('Name')      # Order in which columns are displayed from left to right
             .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'      my @order = ('filetype','actions','filename','title',
         .'<th><a href="'.$linkdir.'/?sortby=title&sortorder='                      'pubstatus','cmtime','size');
             .((($sortby eq "title") && ($sortorder ne 'rev')) ? 'rev' : '')   
             .'">'.&mt('Title')      # Up and down arrows to indicate sort order
             .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'      my @arrows = ('&nbsp;&#9650;','&nbsp;&#9660;','');
         .'<th colspan="2"><a href="'.$linkdir.'/?sortby=pubstatus&sortorder='  
             .((($sortby eq "pubstatus") && ($sortorder ne 'rev')) ? 'rev' : '')       # Default sort order and column title
             .'">'.&mt('Status')      my %columns = (
             .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'          filetype =>     {
         .'<th><a href="'.$linkdir.'/?sortby=cmtime&sortorder='                              order => 'ascending',
             .((($sortby eq "cmtime") && ($sortorder ne 'rev')) ? 'rev' : '')                               text  => &mt('Type'),
             .'">'.&mt('Last Modified')                          },
             .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'          actions =>      {
         .'<th><a href="'.$linkdir.'/?sortby=size&sortorder='                              # Not sortable
             .((($sortby eq "size") && ($sortorder ne 'rev')) ? 'rev' : '')                               text  => &mt('Actions'),
             .'">'.&mt('Size').' (kB)'                          },
             .'<span class="LC_fontsize_small"> &#9660;</span></a></th>'          filename =>     {
                               order => 'ascending',
                               text  => &mt('Name'),
                           },
           title =>        {
                               order => 'ascending',
                               text  => &mt('Title'),
                           },
           pubstatus =>    {
                               order => 'ascending',
                               text  => &mt('Status'),
                               colspan => '2',
                           },
           cmtime =>       {
                               order => 'descending',
                               text  => &mt('Last Modified'),
                           },
           size =>         {
                               order => 'ascending',
                               text  => &mt('Size').' (kB)',
                           },
       ); 
   
       # Print column headers
       my $output = '';
       foreach my $key (@order) {
           my $idx;
           # Append an up or down arrow to sorted column
           if ($sortby eq $key) {
               $idx = ($columns{$key}{order} eq 'ascending') ? 0:1;
               if ($sortorder eq 'rev') { $idx ++; }
               $idx = $idx%2;
           } else { $idx = 2; } # No arrow if column is not sorted
           $output .= (($columns{$key}{order}) ?
               '<th'.($columns{$key}{colspan} ? ' colspan="'.$columns{$key}{colspan}.'"' : '')
               .'><a href="'.$linkdir.'/?sortby='.$key.'&amp;sortorder='
               .((($sortby eq $key) && ($sortorder ne 'rev')) ? 'rev' : '').'">'
               .$columns{$key}{text}.$arrows[$idx].'</a></th>' :
               '<th>'.$columns{$key}{text}.'</th>');
       }
   
   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::end_data_table_header_row()          .&Apache::loncommon::end_data_table_header_row()
     );      );
   
     my $dirptr=16384; # Mask indicating a directory in stat.cmode.      my $dirptr=16384; # Mask indicating a directory in stat.cmode.
     my $filehash = {};      my $filehash = {};
     foreach my $filename (@files) {      foreach my $filename (@files) {
         # Skip .DS_Store and hidden files          # Skip .DS_Store, .DAV and hidden files
         my ($extension) = ($filename=~/\.(\w+)$/);          my ($extension) = ($filename=~/\.(\w+)$/);
         next if (($filename eq '.DS_Store')          next if (($filename eq '.DS_Store')
                   || ($filename eq '.DAV')
                 || (&Apache::loncommon::fileembstyle($extension) eq 'hdn')                  || (&Apache::loncommon::fileembstyle($extension) eq 'hdn')
                 || ($filename =~ /^\._/));                  || ($filename =~ /^\._/));
   
Line 268  sub handler { Line 307  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;  
 }  }
   
   
Line 462  sub dircontrols { Line 514  sub dircontrols {
                                        go   => 'Go',                                         go   => 'Go',
                                        prnt => 'Print contents of directory',                                         prnt => 'Print contents of directory',
                                        crea => 'Create a new directory or LON-CAPA document',                                         crea => 'Create a new directory or LON-CAPA document',
                                          qs   => 'Quick Search',
                                          cs   => 'Case Sensitive',
                                          re   => 'Regular Expression',
        acti => 'Actions for current directory',         acti => 'Actions for current directory',
        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',
                                       );                                        );
     my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript      my $mytype = $lt{'type'}; # avoid conflict with " and ' in javascript
     $r->print(<<END);      $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="">      <form name="curractions" method="post" action="">
Line 531  sub dircontrols { Line 586  sub dircontrols {
                     <option value="newtaskfile">$lt{'nbt'}:</option>                      <option value="newtaskfile">$lt{'nbt'}:</option>
                     <option value="newlibraryfile">$lt{'nlib'}:</option>                      <option value="newlibraryfile">$lt{'nlib'}:</option>
             <option value="newdir">$lt{'nsub'}:</option>              <option value="newdir">$lt{'nsub'}:</option>
   </select>&nbsp;<input type="text" name="newfilename" value="$lt{'type'}" onfocus="if (this.value == '$mytype') this.value=''" />&nbsp;<input type="button" value="Go" onclick="validate_go();" />    </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"/>
                    <a href="javascript:void(0)" onclick="javascript:validate_action('blank')">
       <img src="/adm/lonIcons/unknown.gif" title="Create blank problem file"></a>
                    <a href="javascript:void(0)" onclick="javascript:validate_action('problemtempl')"> 
                       <img src="/adm/lonIcons/problem.gif" title="Create new problem from template"></a>
                    <a href="javascript:void(0)" onclick="javascript:validate_action('blankhtml')"> 
                       <img src="/adm/lonIcons/html.gif" title="Create new blank HTML file"></a>
                    <a href="javascript:void(0)" onclick="javascript:validate_action('folder')"> 
       <img src="/adm/lonIcons/navmap.folder.closed.gif" title="Create new subdirectory"></a>
                   </span>
                    <script type="text/javascript">
                        function validate_action(action){
   
                            if (document.getElementsByName(\'newfilename\')[0].value != \'\'){
                                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(\'Please specify file name.\');
                                // TODO: ask for filename? if so, do some refactoring
   
                            }
                        }
                    </script>
  </span>   </span>
       </fieldset>        </fieldset>
     </form>      </form>
       </div>
       <div>
         <fieldset style="display:inline">
               <legend>$lt{'qs'}</legend>
                   <script type="text/javascript" src="/adm/quicksearch/quicksearch.js"></script>
                   <input type="text" id="quickfilter" placeholder="Enter search term" onkeyup="applyFilter()"/>
                   <input type="button" value="Clear" onclick="document.getElementById(\'quickfilter\').value=\'\'; applyFilter()" />
                   %s
                   <br />
                   <label><input type="checkbox" id="casesens" onchange="applyFilter()"/>$lt{'cs'}&nbsp;&nbsp;</label>
                   <label><input type="checkbox" id="regex" onchange="applyFilter()"/>$lt{'re'}&nbsp;&nbsp;</label>
           </fieldset>
   </div>    </div>
 </div>  </div>
 END  END
Line 878  sub check_for_versions { Line 982  sub check_for_versions {
     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__
   

Removed from v.1.158  
changed lines
  Added in v.1.163


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