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

version 1.167, 2016/01/06 16:44:35 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 67  sub handler { Line 67  sub handler {
             $r->send_http_header;              $r->send_http_header;
   
             &Apache::lonhtmlcommon::clear_breadcrumbs();              &Apache::lonhtmlcommon::clear_breadcrumbs();
             my $js = '<script type="text/javascript"               $r->print(&Apache::loncommon::start_page('Authoring Space').
                         src="/res/adm/includes/file_upload.js"></script>';  
             $r->print(&Apache::loncommon::start_page('Authoring Space', $js).  
                       '<div class="LC_error">'.                        '<div class="LC_error">'.
                       '<br /><p>'.                        '<br /><p>'.
                       &mt('Your Authoring Space is currently in the location used by LON-CAPA version 2.10 and older, but your domain is using a newer LON-CAPA version ([_1]).',$version).'</p>'.                        &mt('Your Authoring Space is currently in the location used by LON-CAPA version 2.10 and older, but your domain is using a newer LON-CAPA version ([_1]).',$version).'</p>'.
Line 82  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);
   
     my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,      my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,
                                 "$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,
                                 'author'); # expressed in MB                                                   $cstr,$crstype); # expressed in MB
   
     # Put out the start of page.      # Put out the start of page.
     &startpage($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota);   
       &startpage($r, $uname, $udom, $thisdisfn, $current_disk_usage, $disk_quota, $crsauthor);
   
     if (!-d $fn) {      if (!-d $fn) {
         if (-e $fn) {          if (-e $fn) {
Line 118  sub handler { Line 128  sub handler {
     }      }
   
     # 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 182  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 227  my $result = "<script type=\"text/javasc Line 237  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 257  my $result = "<script type=\"text/javasc Line 272  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 291  my $result = "<script type=\"text/javasc Line 306  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 302  my $result = "<script type=\"text/javasc Line 317  my $result = "<script type=\"text/javasc
     # 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 332  my $result = "<script type=\"text/javasc Line 348  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 348  my $result = "<script type=\"text/javasc Line 364  my $result = "<script type=\"text/javasc
 #      $thisdisfn - Displayable version of the filename.  #      $thisdisfn - Displayable version of the filename.
 #      $current_disk_usage - User's current disk usage (in kB).  #      $current_disk_usage - User's current disk usage (in kB).
 #      $disk_quota - Disk quota for user's authoring space (in MB).  #      $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, $current_disk_usage, $disk_quota) = @_;      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;
     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('Authoring Space', $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 $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,$disk_quota)                      .&Apache::lonhtmlcommon::display_usage($current_disk_usage,
                                                              $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 391  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 493  ENDPUBDIRSCRIPT Line 503  ENDPUBDIRSCRIPT
 }  }
   
 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',
                                        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 522  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',
                                        qs   => 'Quick Search',  
                                        cs   => 'Case Sensitive',                                         cs   => 'Case Sensitive',
                                        re   => 'Regular Expression',                                         re   => 'Regular Expression',
        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',
                                          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
     # Calculate free space in bytes.      # Calculate free space in bytes.
     # $disk_quota is in MB and $current_disk_usage is in kB      # $disk_quota is in MB and $current_disk_usage is in kB
     my $free_space = 1024 * ((1024 * $disk_quota) - $current_disk_usage);      my $free_space = 1024 * ((1024 * $disk_quota) - $current_disk_usage);
     $r->printf(<<END,&Apache::loncommon::help_open_topic('Quicksearch'));      $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" class="flUpload testclass" size="20" />          <input type="file" name="upfile" class="LC_flUpload" />
         <input type="hidden" id="free_space" value=$free_space />          <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 588  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>  
     <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" 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>Quickactions:                  <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){
                            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>
Line 642  sub dircontrols { Line 669  sub dircontrols {
       </fieldset>        </fieldset>
     </form>      </form>
     </div>      </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>
 END  END
 }  }
Line 661  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 731  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 756  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 777  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 810  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 829  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 862  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 880  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 901  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 922  sub putresource { Line 942  sub putresource {
         }          }
     }      }
     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 956  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 995  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);
Line 1003  sub check_for_versions { Line 1025  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 1074  sub prepareJsonData_rec { Line 1096  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 1196  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 1211  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 1219  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.167  
changed lines
  Added in v.1.180


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