Diff for /loncom/interface/loncoursegroups.pm between versions 1.84 and 1.109

version 1.84, 2008/12/16 16:44:28 version 1.109, 2010/01/27 13:08:01
Line 54  sub handler { Line 54  sub handler {
     if (! ($env{'request.course.fn'})) {      if (! ($env{'request.course.fn'})) {
         # Not in a course          # Not in a course
         $env{'user.error.msg'}=          $env{'user.error.msg'}=
      "/adm/coursegroups:mdg:0:0:Cannot edit or view course groups";       "/adm/coursegroups:mdg:0:0:Cannot edit or view course/community groups";
         return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
   
Line 75  sub handler { Line 75  sub handler {
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
   
     my %functions = (      my %functions = (
                       email => 'E-mail',                        email => 'Send Messages', 
                       discussion => 'Discussion Boards',                        discussion => 'Discussion Boards',
                       chat => 'Chat',                        chat => 'Chat Room',
                       files => 'File Repository',                        files => 'Group Portfolio',
                       roster => 'Membership Roster',                        roster => 'Membership Roster',
                       homepage => $ucgpterm.' home page',                        homepage => $ucgpterm.' home page',
                     );                      );
Line 141  function openGroupRoster(group,status) { Line 141  function openGroupRoster(group,status) {
     rosterbrowser = open(url,title,options,'1');      rosterbrowser = open(url,title,options,'1');
     rosterbrowser.focus();      rosterbrowser.focus();
 }\n|;  }\n|;
     $r->print(&header('Groups',$jscript,$action,$state));      $r->print(&header('My Space',$jscript,$action,$state));
     if ($env{'form.refpage'} eq 'cusr') {      if ($env{'form.refpage'} eq 'cusr') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"/adm/createuser",              ({href=>"/adm/createuser",
Line 349  END Line 349  END
       '<td align="right">'.$quota.'</td>'.        '<td align="right">'.$quota.'</td>'.
       '<td align="right">'.$totalmembers.'</td>'.        '<td align="right">'.$totalmembers.'</td>'.
       '<td align="right">'.        '<td align="right">'.
                                   '<div class="LC_nobreak">'.&mt('Files: [_1]',$totalfiles).'</div>'.                                    '<span class="LC_nobreak">'.&mt('Files: [_1]',$totalfiles).'</span><br />'.
                                   '<div class="LC_nobreak">'.&mt('Folders: [_1]',$totaldirs).'</div>'.                                    '<span class="LC_nobreak">'.&mt('Folders: [_1]',$totaldirs).'</span>'.
                                   '</td>'.                                    '</td>'.
       '<td align="right">'.$boards.'</td>'.        '<td align="right">'.$boards.'</td>'.
       '<td align="right">'.$diskuse.'</td>'.        '<td align="right">'.$diskuse.'</td>'.
Line 537  sub group_administration { Line 537  sub group_administration {
   
     if (ref($stored{'autorole'}) eq 'ARRAY') {      if (ref($stored{'autorole'}) eq 'ARRAY') {
         foreach my $role (@{$stored{'autorole'}}) {          foreach my $role (@{$stored{'autorole'}}) {
             unless ($role eq 'cc') {              unless (($role eq 'cc') || ($role eq 'co')) {
                 $elements{'modify'}{'change_settings'}{'sec_'.$role} =                   $elements{'modify'}{'change_settings'}{'sec_'.$role} = 
                                                                    'selectbox';                                                                     'selectbox';
             }              }
Line 785  sub group_administration { Line 785  sub group_administration {
     }      }
     var maxposs = '.sprintf("%.2f",$maxposs).';      var maxposs = '.sprintf("%.2f",$maxposs).';
     if (newquota > maxposs) {      if (newquota > maxposs) {
         alert("The file repository quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number.");          alert("The group portfolio quota you entered for this group ("+newquota+" Mb) exceeds the maximum possible ("+maxposs+" Mb). Please enter a smaller number.");
         return;          return;
     }      }
     var re_quota = '.$float_check.';      var re_quota = '.$float_check.';
Line 804  sub group_administration { Line 804  sub group_administration {
             }              }
         }          }
         if (warn_zero == 1) {          if (warn_zero == 1) {
             alert("You have indicated that the file repository should be enabled, but you have set the respository quota to 0 Mb.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature.");              alert("You have indicated that the group portfolio should be enabled, but you have set the respository quota to 0 Mb.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature.");
             return;              return;
         }          }
     }       } 
Line 915  function changeSort(caller) { Line 915  function changeSort(caller) {
                             result => 'Re-enabled'                              result => 'Re-enabled'
                           );                            );
     my %navbuttons = &Apache::lonlocal::texthash(      my %navbuttons = &Apache::lonlocal::texthash(
                              gtns => 'Go to next step',                               gtns => 'Next',#'Go to next step',
                              gtps => 'Go to previous step',                               gtps => 'Back',#'Go to previous step',
                              crgr => 'Create '.$gpterm,                               crgr => 'Create '.$gpterm,
                              mose => 'Modify settings',                               mose => 'Save',#'Modify settings',
                              gtpp => 'Go to previous page',                               gtpp => 'Back',#'Go to previous page',
                              adme => 'Add members',                               adme => 'Add members',
     );      );
     if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) &&      if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) &&
Line 1086  sub display_control { Line 1086  sub display_control {
             &add_members_form($r,$cdom,$cnum,$action,$state,$page,$startdate,              &add_members_form($r,$cdom,$cnum,$action,$state,$page,$startdate,
                               $enddate,$groupname,$description,$granularity,                                $enddate,$groupname,$description,$granularity,
                               $quota,$sectioncount,$tools,$functions,$stored,                                $quota,$sectioncount,$tools,$functions,$stored,
                               $states,$navbuttons,$gpterm,$ucgpterm);                                $states,$navbuttons,$gpterm,$ucgpterm,$crstype);
         } elsif ($state eq 'pick_members') {          } elsif ($state eq 'pick_members') {
             &choose_members_form($r,$cdom,$cnum,$action,$state,$page,              &choose_members_form($r,$cdom,$cnum,$action,$state,$page,
                                  $groupname,$description,$granularity,$quota,                                   $groupname,$description,$granularity,$quota,
Line 1119  sub display_control { Line 1119  sub display_control {
         my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);          my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
         if ($state eq 'verify') {          if ($state eq 'verify') {
             &verify_delete($r,$groupname,$state,$action,$page,$states,              &verify_delete($r,$groupname,$state,$action,$page,$states,
                            \%stored);                             \%stored,$crstype);
         } elsif ($state eq 'result') {          } elsif ($state eq 'result') {
             &delete_group($r,$cdom,$cnum,$groupname);              &delete_group($r,$cdom,$cnum,$groupname,$crstype);
         }          }
     } elsif ($action eq 'reenable') {      } elsif ($action eq 'reenable') {
         my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);          my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action);
         if ($state eq 'verify') {          if ($state eq 'verify') {
             &verify_reenable($r,$groupname,$state,$action,$page,$states,              &verify_reenable($r,$groupname,$state,$action,$page,$states,
                            \%stored);                             \%stored,$crstype);
         } elsif ($state eq 'result') {          } elsif ($state eq 'result') {
             &reenable_group($r,$cdom,$cnum,$groupname);              &reenable_group($r,$cdom,$cnum,$groupname,$crstype);
         }          }
     }      }
 }  }
   
 sub verify_delete {  sub verify_delete {
     my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;      my ($r,$groupname,$formname,$action,$page,$states,$stored,$crstype) = @_;
     $r->print(&Apache::lonhtmlcommon::echo_form_input([]));      $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
     $r->print(&mt('You have requested deletion of the group [_1].'      $r->print(&mt('You have requested deletion of the group [_1].'
                  ,'<i>'.$stored->{'description'}.'</i>').                   ,'<i>'.$stored->{'description'}.'</i>').
               '<br /><br />'.&mt('When a group is deleted the following occurs:').'<ul>'.                '<br /><br />'.&mt('When a group is deleted the following occurs:').'<ul>'.
               '<li>'.&mt('All group membership is terminated.').'</li>'.                '<li>'.&mt('All group membership is terminated.').'</li>'.
               '<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>'.                '<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>');
               '<li>'.&mt('The group folder is removed from the folder containing it - normally this is the "Course Groups" folder which contains folders for all groups in the course.').'</li>'.      if ($crstype eq 'Community') {
               '</ul>'.&mt('Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future.'));          $r->print( '<li>'.&mt("The group folder is removed from the folder containing it - normally this is the 'Community Groups' folder which contains folders for all groups in the community.").'</li>'.
                      '</ul>'.&mt("Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same community in the future."));
       } else { 
           $r->print( '<li>'.&mt("The group folder is removed from the folder containing it - normally this is the 'Course Groups' folder which contains folders for all groups in the course.").'</li>'.
                      '</ul>'.&mt("Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future."));
       }
     my $prevtext = &mt('Go back');      my $prevtext = &mt('Go back');
     my $nexttext = &mt('Delete group');      my $nexttext = &mt('Delete group');
     my $prev;      my $prev;
Line 1156  sub verify_delete { Line 1161  sub verify_delete {
 }  }
   
 sub delete_group {  sub delete_group {
     my ($r,$cdom,$cnum,$groupname) = @_;      my ($r,$cdom,$cnum,$groupname,$crstype) = @_;
     my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,      my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
                                                            $groupname);                                                             $groupname);
     my $now = time;      my $now = time;
Line 1198  sub delete_group { Line 1203  sub delete_group {
                  .&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.'                   .&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.'
                      ,$num_fail,$num_users)                       ,$num_fail,$num_users)
                  .'</div>');                   .'</div>');
           
     } else {      } else {
         my ($result,$message) =           my ($result,$message) = 
              &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,               &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,
                                                         $groupname,'delete');                                                          $groupname,'delete');
         if ($result eq 'ok') {          if ($result eq 'ok') {
             my $outcome = &modify_folders($cdom,$cnum,$groupname);              my $outcome = &modify_folders($cdom,$cnum,$groupname,$crstype);
             if ($outcome eq '') {              if ($outcome eq '') {
                 $r->print('<div class="LC_success">'                  my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Group successfully deleted.'));
                          .&mt('Group successfully deleted.')                  $message = &Apache::loncommon::confirmwrapper($message);
                          .'</div>');                  $r->print($message);
             } else {              } else {
                 $r->print('<div class="LC_error">'                  $r->print('<div class="LC_error">');
                          .&mt("Although the group was deleted, an error occurred when removing"                  if ($crstype eq 'Community') {
                              ." the group's folder from the 'Course Groups' folder: [_1]",$outcome)                      $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Community Groups' folder: [_1]",$outcome));
                          .'</div>');                  } else {
                       $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Course Groups' folder: [_1]",$outcome));
                   }
                   $r->print('</div>');
             }              }
         } else {          } else {
             $r->print('<div class="LC_error">'              my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('Group deletion failed.'),1);
                      .&mt('Group deletion failed.')              $msg = &Apache::loncommon::confirmwrapper($msg);
                      .'</div>');              $r->print($msg);
         }          }
     }      }
     return;      return;
 }  }
   
 sub reenable_folder {  sub reenable_folder {
     my ($cdom,$cnum,$groupname,$description) = @_;      my ($cdom,$cnum,$groupname,$description,$crstype) = @_;
     my $outcome;      my $outcome;
     my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';      my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
     my $allgrpsmap = $crspath.'group_allfolders.sequence';      my $allgrpsmap = $crspath.'group_allfolders.sequence';
     my $foldertitle = &mt('Course Folder -[_1]',$description);      my $foldertitle;
       if ($crstype eq 'Community') {
           $foldertitle = &mt("Community Folder -[_1]",$description);
       } else {
           $foldertitle = &mt("Course Folder -[_1]",$description);
       }
     my $mapurl = $crspath.'group_folder_'.      my $mapurl = $crspath.'group_folder_'.
                    $groupname.'.sequence';                     $groupname.'.sequence';
     my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap);      my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap);
Line 1258  sub reenable_folder { Line 1270  sub reenable_folder {
 }  }
   
 sub modify_folders {  sub modify_folders {
     my ($cdom,$cnum,$groupname) = @_;      my ($cdom,$cnum,$groupname,$crstype) = @_;
     my $outcome;      my ($outcome,$groupmap,$groupmapres,$map,$id,$src);
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'.      if (!defined($navmap)) {
           $outcome = '<div class="LC_error">';
           if ($crstype eq 'Community') {
               $outcome .= &mt("Error reading community contents.").' '.
                      &mt("You need to re-initialize the community.");
           } else {
               $outcome .= &mt("Error reading course contents.").' '.
                      &mt("You need to re-initialize the course.");
           }
           $outcome .= '</div>';
           return $outcome;
       }
       $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'.
                    $groupname.'.sequence';                     $groupname.'.sequence';
     my $groupmapres = $navmap->getResourceByUrl($groupmap);      $groupmapres = $navmap->getResourceByUrl($groupmap);
     my ($map,$id,$src);  
     if ($groupmapres) {      if ($groupmapres) {
         ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb());          ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb());
     }      }
Line 1314  sub modify_folders { Line 1337  sub modify_folders {
 }  }
   
 sub verify_reenable {  sub verify_reenable {
     my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_;      my ($r,$groupname,$formname,$action,$page,$states,$stored,$crstype) = @_;
     $r->print(&Apache::lonhtmlcommon::echo_form_input([]));      $r->print(&Apache::lonhtmlcommon::echo_form_input([]));
     $r->print(&mt('You have requested enabling the previously deleted group [_1].'      $r->print(&mt('You have requested enabling the previously deleted group [_1].'
                  ,'<i>'.$stored->{'description'}.'</i>').                   ,'<i>'.$stored->{'description'}.'</i>').
               '<br /><br />'.&mt('When a deleted group is re-enabled the following occurs:').'<ul>'.                '<br /><br />'.&mt('When a deleted group is re-enabled the following occurs:').'<ul>'.
               '<li>'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'</li>'.                '<li>'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'</li><li>');
               '<li>'.&mt('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'</li></ul>');      if ($crstype eq 'Community') {
           $r->print(&mt("A group folder is added to the 'Community Groups' folder which contains folders for all groups in the community."));
       } else {
           $r->print(&mt("A group folder is added to the 'Course Groups' folder which contains folders for all groups in the course."));
       }
       $r->print('</li></ul>');
     my $prevtext = &mt('Go back');      my $prevtext = &mt('Go back');
     my $nexttext = &mt('Reenable group');      my $nexttext = &mt('Reenable group');
     my $prev;      my $prev;
Line 1333  sub verify_reenable { Line 1361  sub verify_reenable {
 }  }
   
 sub reenable_group {  sub reenable_group {
     my ($r,$cdom,$cnum,$groupname) = @_;      my ($r,$cdom,$cnum,$groupname,$crstype) = @_;
     my %groups =       my %groups = 
         &Apache::longroup::coursegroups($cdom,$cnum,$groupname,          &Apache::longroup::coursegroups($cdom,$cnum,$groupname,
                                         'deleted_groups');                                          'deleted_groups');
Line 1407  $context) eq 'ok') { Line 1435  $context) eq 'ok') {
                      .&mt('There were no group members to reinstate, as none were removed when the group was deleted.')                       .&mt('There were no group members to reinstate, as none were removed when the group was deleted.')
                      .'</div>');                       .'</div>');
         }          }
         my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description);          my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description,$crstype);
         if ($outcome eq '') {          if ($outcome eq '') {
             $r->print('<div class="LC_success">'              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Group successfully re-enabled.'));
                      .&mt('Group successfully re-enabled.')              $message = &Apache::loncommon::confirmwrapper($message);
                      .'</div>');              $r->print($message);
         } else {          } else {
             $r->print('<div class="LC_error">'              $r->print('<div class="LC_error">');
                      .&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome)              if ($crstype eq 'Community') {
                      .'</div>');                  $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Community Groups' folder: [_1]",$outcome));
               } else {
                   $r->print(&mt("Although the group was re-enabled, an error occurred when adding the group's folder to the 'Course Groups' folder: [_1]",$outcome));
               }
               $r->print('</div>');
         }          }
     } else {      } else {
         $r->print('<div class="LC_error">'          my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Re-enabling group failed.'),1);
                  .&mt('Re-enabling group failed.')          $message = &Apache::loncommon::confirmwrapper($message);
                  .'</div>');          $r->print($message);
     }      }
     return;      return;
 }  }
Line 1434  sub header { Line 1466  sub header {
        {'add_entries' => $loaditems,});         {'add_entries' => $loaditems,});
     my $output = <<"END";      my $output = <<"END";
 $start_page  $start_page
 <form method="POST" name="$state">  <form method="post" name="$state">
   
 END  END
     if ($action eq 'create' || $action eq 'modify') {      if ($action eq 'create' || $action eq 'modify') {
Line 1573  sub general_settings_form { Line 1605  sub general_settings_form {
     &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);      &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm);
     if ($action eq 'create') {      if ($action eq 'create') {
         &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3,          &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3,
                             $gpterm,$ucgpterm);                              $gpterm,$ucgpterm,$crstype);
         $nexttext = $$navbuttons{'gtns'};          $nexttext = $$navbuttons{'gtns'};
     } else {      } else {
         my @available = ();          my @available = ();
Line 1582  sub general_settings_form { Line 1614  sub general_settings_form {
         @{$tools} = sort(keys(%{$functions}));          @{$tools} = sort(keys(%{$functions}));
         &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs,          &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs,
        $fixedprivs,\@available,$formname,         $fixedprivs,\@available,$formname,
        $gpterm,$ucgpterm);         $gpterm,$ucgpterm,$functions,$crstype);
         &mapping_options($r,$action,$formname,$page,$sectioncount,          &mapping_options($r,$action,$formname,$page,$sectioncount,
                          $states,$stored,$navbuttons,4,5,                           $states,$stored,$navbuttons,4,5,
  $gpterm,$ucgpterm,$crstype,$cdom,$cnum);   $gpterm,$ucgpterm,$crstype,$cdom,$cnum);
Line 1606  sub groupsettings_options { Line 1638  sub groupsettings_options {
         'lett' => 'Letters, numbers and underscore only',          'lett' => 'Letters, numbers and underscore only',
         'doyo' => 'Different subsets of the chosen collaborative tools '.          'doyo' => 'Different subsets of the chosen collaborative tools '.
                   'for different group members?',                    'for different group members?',
           'gran' => 'Granularity',
           'dquo' => 'Disk quota',
     );      );
     my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);      my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored);
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}).'      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}));
      <table class="LC_descriptive_input">  
       <tr>      # Group Name
        <td class="LC_description">'.$lt{'gnam'}.':</td>      $r->print(&Apache::lonhtmlcommon::start_pick_box()
        <td colspan="5">               .&Apache::lonhtmlcommon::row_title($lt{'gnam'})
 ');      );
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print('<input type="text" name="groupname" size="25" />&nbsp;('.          $r->print('<input type="text" name="groupname" size="25" />'
                   $lt{'lett'}.')');                   .' <span class="LC_nobreak">('
                    .$lt{'lett'}.')</span>'
           );
     } else {      } else {
         $r->print('<input type="hidden" name="groupname" value="'.          $r->print('<input type="hidden" name="groupname" value="'.
                          $env{'form.groupname'}.'" />'.$env{'form.groupname'});                           $env{'form.groupname'}.'" />'.$env{'form.groupname'});
     }      }
     $r->print(<<"END");      $r->print(&Apache::lonhtmlcommon::row_closure());
        </td>  
       <tr>      # Group Title
       <tr>      $r->print(&Apache::lonhtmlcommon::row_title($lt{'desc'})
        <td class="LC_description">$lt{'desc'}:</td>               .'<input type="text" name="description" size="40" value="" />'
        <td colspan="5"><input type="text" name="description" size="40"               .&Apache::lonhtmlcommon::row_closure()
                                                     value="" />      );
        </td>  
       <tr>      # Collaborative Tools
       <tr>  
        <td class="LC_description">$lt{'func'}:</td>  
 END  
     my $numitems = keys(%{$functions});      my $numitems = keys(%{$functions});
     my $halfnum = int($numitems/2);      my $halfnum = int($numitems/2);
     my $remnum = $numitems%2;      my $remnum = $numitems%2;
Line 1640  END Line 1673  END
         $halfnum ++;          $halfnum ++;
     }      }
     my @allfunctions = sort(keys (%{$functions}));      my @allfunctions = sort(keys (%{$functions}));
     for (my $i=0; $i<$halfnum; $i++) {  
         $r->print('<td><label><input type="checkbox" name="tool" value="'.      $r->print(&Apache::lonhtmlcommon::row_title($lt{'func'})
                   $allfunctions[$i].'" />&nbsp;'.               .'<div>'
                    $$functions{$allfunctions[$i]}.'</label></td>               .'<input type="button" value="'.&mt('check all').'"'
                    <td>&nbsp;</td><td>&nbsp;</td>');               .' onclick="javascript:checkAll(document.'.$formname.'.tool)" />'
     }               .'&nbsp;<input type="button" value="'.&mt('uncheck all').'"'
     $r->print('<td><input type="button" value="'.&mt('check all').'" '.               .' onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />'
               'onclick="javascript:checkAll(document.'.$formname.'.tool)" />'.               .'</div>'
               '</td></tr><tr><td>&nbsp;</td>');               .'<table cellpadding="5px"><tr>' # FIXME Get rid of inflexible table (-> float)
     for (my $j=$halfnum; $j<@allfunctions; $j++) {      );
         $r->print('<td><label><input type="checkbox" name="tool" value="'.      for (my $i=0; $i<@allfunctions; $i++) {
                   $allfunctions[$j].'" />&nbsp;'.          $r->print('<td><label><span class="LC_nobreak">'
                   $$functions{$allfunctions[$j]}.'</label></td>                   .'<input type="checkbox" name="tool" value="'
                   <td>&nbsp;</td><td>&nbsp;</td>');                   .$allfunctions[$i].'" /> '
     }                   .&mt($$functions{$allfunctions[$i]})
     if ($remnum) {                   .'</span></label></td>'
         $r->print('<td>&nbsp;</td>');          );
           if ($i == $halfnum - 1) {
               $r->print('</tr><tr>');
           }
     }      }
     $r->print('      $r->print('</tr></table>'
        <td>               .&Apache::lonhtmlcommon::row_closure()
         <input type="button" value="'.&mt('uncheck all').'"      );
           onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />  
        </td>      # Granularity
       </tr>      $r->print(&Apache::lonhtmlcommon::row_title($lt{'gran'})
       <tr>               .$lt{'doyo'}.'<br />'
        <td class="LC_description">'.&mt('Granularity:').'</td>               .'<label>'
        <td colspan="10">'.$lt{'doyo'}.'&nbsp;<label><input type="radio" name="granularity" value="Yes" />'.&mt('Yes').'</label>&nbsp;<label><input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No').'</label>');               .'<input type="radio" name="granularity" value="Yes" />'.&mt('Yes')
                .'</label>&nbsp;<label>'
                .'<input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No')
                .'</label>'
       );
     if ($action eq 'modify') {      if ($action eq 'modify') {
         $r->print('&nbsp;&nbsp;('.&mt('Currently set to [_1].'          $r->print(' <span class="LC_nobreak">('
                                       ,'"'.&mt($$stored{'granularity'}).'"').')');                   .&mt('Currently set to [_1].'
                        ,'"'.&mt($$stored{'granularity'}).'"')
                    .')</span>'
           );
     }      }
     $r->print('      $r->print(&Apache::lonhtmlcommon::row_closure());
        </td>  
       </tr>      # Disk Quota
       <tr>      $r->print(&Apache::lonhtmlcommon::row_title($lt{'dquo'}));
        <td class="LC_description">'.&mt('Disk quota: ').'</td><td colspan="10">');  
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print(&mt('If you enable the file repository for the '.$gpterm.', allocate a disk quota.'));          $r->print('<span class="LC_info">'
                    .&mt('If you enable the group portfolio for the '.$gpterm
                        .', allocate a disk quota.')
                    .'</span>'
           );
     } else {      } else {
         $r->print(&mt('Quota allocated to file repository:'));          $r->print(&mt('Quota allocated to group portfolio:'));
     }       } 
     $r->print('&nbsp;'.&mt('[_1] Mb','<input type="text" name="quota" size="4" />'));      $r->print(' '.&mt('[_1] Mb','<input type="text" name="quota" size="4" />'));
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print('<br />'          $r->print('<br />'
                  .&mt('A total of [_1] Mb can be divided amongst all '.$gpterm.'s in the '                   .&mt('A total of [_1] Mb can be divided amongst all '.$gpterm.'s in the '
Line 1697  END Line 1743  END
                  .'by adding all unallocated space for '.$gpterm.'s in the '.lc($crstype).'.'                   .'by adding all unallocated space for '.$gpterm.'s in the '.lc($crstype).'.'
                   ,sprintf("%.2f",$maxposs)));                    ,sprintf("%.2f",$maxposs)));
     }      }
     $r->print('      $r->print(&Apache::lonhtmlcommon::row_closure(1));
        </td>  
       </tr>      $r->print(&Apache::lonhtmlcommon::end_pick_box());
      </table>  
 ');  
     return;      return;
 }  }
   
Line 1722  sub get_quota_constraints { Line 1767  sub get_quota_constraints {
 }  }
   
 sub membership_options {  sub membership_options {
     my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm)=@_;      my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm,$crstype)=@_;
     my $crstype = &Apache::loncommon::course_type();  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 'pipa' => 'Build a list of users for selection of group members',                  'pipa' => 'Build a list of users for selection of group members',
                 'gmem' => "Group membership selection list criteria:",                  'gmem' => 'Group membership selection list criteria:',
                 'picr' => 'Pick the criteria to use to build a list of '.                  'picr' => 'Pick the criteria to use to build a list of course users from which you will select members of the new group.',
                           lc($crstype).' users from which you will select ',                  'pica' => 'Pick the criteria to use to build a list of course users from which you will select additional members of the group.',
                 'meof' => "members of the new group.",                  'ifno' => 'If you do not wish to add members when you first create the group, there is no need to pick any criteria.', 
                 'admg' => "additional members of the group.",  
                 'ifno' => "If you do not wish to add members when you first ".  
                           "create the group, there is no need to pick any criteria.",  
                 'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section <i>changes</i> in the course.",  
                 'acty' => 'Access types',                  'acty' => 'Access types',
                 'coro' => $crstype.' roles',                  'coro' => 'Course roles',
                 'cose' => $crstype.' sections',                  'cose' => 'Course sections',
              );               );
       if ($crstype eq 'Community') {
           $lt{'picr'} = &mt('Pick the criteria to use to build a list of community participants from which you will select ');
           $lt{'asub'} = &mt('A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section [_1]changes[_2] in the course.','<i>','</i>');
           $lt{'coro'} = &mt('Community roles');
           $lt{'cose'} = &mt('Community sections');
       } else {
           $lt{'asub'} = &mt('A subsequent step will also allow you to specify automatic adding/dropping of group members triggered by specified user role and section [_1]changes[_2] in the course.','<i>','</i>');
       }
     my %status_types = (      my %status_types = (
                    active => &mt('Currently has access'),                     active => &mt('Currently has access'),
                    previous => &mt('Previously had access'),                     previous => &mt('Previously had access'),
                    future => &mt('Will have future access'),                     future => &mt('Will have future access'),
                    );                     );
   
     my @roles = ('st','cc','in','ta','ep','cr');      my @roles = ('st');
       if ($crstype eq 'Community') {
           push(@roles,'co');
       } else {
           push(@roles,'cc');
       }
       push (@roles,('in','ta','ep','ad','cr'));
   
     my @sections = keys(%{$sectioncount});      my @sections = keys(%{$sectioncount});
   
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'
      <b>'.$lt{'gmem'}.'</b><br />'.$lt{'picr'});       <b>'.$lt{'gmem'}.'</b><br />');
     if ($action eq 'create') {      if ($action eq 'create') {
         $r->print($lt{'meof'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});          $r->print($lt{'picr'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'});
     } else {      } else {
         $r->print($lt{'admg'});          $r->print($lt{'pica'});
     }      }
     $r->print('      $r->print('
      <br />       <br />
Line 1798  sub sections_selection { Line 1852  sub sections_selection {
         }          }
     }      }
     my $output = '      my $output = '
         <select name="'.$elementname.'" multiple="true" size="'.$numvisible.'">          <select name="'.$elementname.'" multiple="multiple" size="'.$numvisible.'">
           '.$section_sel.'            '.$section_sel.'
         </select>';          </select>';
     return $output;      return $output;
Line 1869  sub choose_members_form { Line 1923  sub choose_members_form {
         }          }
     }      }
     &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs,      &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs,
                           $fixedprivs,\@available,$formname,$gpterm,$ucgpterm);                            $fixedprivs,\@available,$formname,$gpterm,$ucgpterm,
                             $functions,$crstype);
     my $newusers = &pick_new_members($r,$action,$formname,\@available,$idx,      my $newusers = &pick_new_members($r,$action,$formname,\@available,$idx,
      $stored,$memimg,$users,$userdata,       $stored,$memimg,$users,$userdata,
      $granularity,\%origmembers,$gpterm,       $granularity,\%origmembers,$gpterm,
Line 1966  sub print_current_settings { Line 2021  sub print_current_settings {
   <td valign="top">'.$description.'</td>    <td valign="top">'.$description.'</td>
   <td>    <td>
 ');  ');
   
     if (@{$available} > 0) {      if (@{$available} > 0) {
         $r->print('<b>'.&mt('Available for assignment to members:').'</b>'.          $r->print('<b>'.&mt('Available for assignment to members:').'</b>');
                     '<table class="LC_group_priv"><tr>');          $r->print('<ul>');
         my $rowcell = int(@{$available}/2) + @{$available}%2;  
         for (my $i=0; $i<@{$available}; $i++) {          for (my $i=0; $i<@{$available}; $i++) {
             if (@{$available} > 3) {              $r->print('<li>'.&mt($$functions{$$available[$i]}).'</li>');
                 if ($i==$rowcell) {  
                     $r->print('</tr><tr>');  
                 }  
             }  
             $r->print('<td>'.$$functions{$$available[$i]}.  
       '</td><td>&nbsp;</td>');  
         }  
         if ((@{$available} > 3) && (@{$available}%2)) {  
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');  
         }          }
         $r->print('</tr></table><br />');          $r->print('</ul>');
     }      }
   
     if (@{$unavailable} > 0) {      if (@{$unavailable} > 0) {
         $r->print('<b>'.&mt('Unavailable for assignment:').'</b>'.          $r->print('<b>'.&mt('Unavailable for assignment:').'</b>');
                     '<table class="LC_group_priv"><tr>');          $r->print('<ul>');
         my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;          for (my $i=0; $i<@{$unavailable}; $i++) {
         for (my $j=0; $j<@{$unavailable}; $j++) {              $r->print('<li>'.&mt($$functions{$$unavailable[$i]}).'</li>');
             if (@{$unavailable} > 3) {  
                 if ($j==$rowcell) {  
                     $r->print('</tr><tr>');  
                 }  
             }  
             $r->print('<td>'.$$functions{$$unavailable[$j]}.  
       '</td><td>&nbsp;</td>');  
         }  
         if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {  
             $r->print('<td>&nbsp;</td><td>&nbsp;</td>');  
         }          }
         $r->print('</tr></table>');          $r->print('</ul>');
     }      }
   
     my $quota_text=&mt('[_1] Mb',$quota);      my $quota_text=&mt('[_1] Mb',$quota);
     my $granu_text=&mt($granularity);      my $granu_text=&mt($granularity);
     $r->print(<<"END");      $r->print(<<"END");
Line 2064  sub pick_new_members { Line 2102  sub pick_new_members {
         &check_uncheck_buttons($r,$formname,'member',$lt{'addm'});          &check_uncheck_buttons($r,$formname,'member',$lt{'addm'});
         if (@{$available} > 0 && $granularity eq 'Yes') {          if (@{$available} > 0 && $granularity eq 'Yes') {
             $r->print('<td>              $r->print('<td>
      <fieldset><legend><b>'.$lt{'setf'}.'</b></legend>       <fieldset><legend>'.$lt{'setf'}.'</legend>
       <span class="LC_nobreak">        <span class="LC_nobreak">
       <input type="button" value="'.&mt('check all').'"        <input type="button" value="'.&mt('check all').'"
         onclick="javascript:checkAllTools(document.'.$formname.')" />          onclick="javascript:checkAllTools(document.'.$formname.')" />
Line 2163  sub pick_new_members { Line 2201  sub pick_new_members {
   
 sub privilege_specificity {  sub privilege_specificity {
     my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available,      my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available,
  $formname,$gpterm,$ucgpterm) = @_;   $formname,$gpterm,$ucgpterm,$functions,$crstype) = @_;
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
       'uprv' => 'User privileges for collaborative tools',        'uprv' => 'User privileges for collaborative tools',
       'frty' => 'For each collaborative tool you have chosen to include, '.        'frty' => 'For each collaborative tool you have chosen to include, '.
Line 2197  sub privilege_specificity { Line 2235  sub privilege_specificity {
       'oppr' => 'Optional privileges',        'oppr' => 'Optional privileges',
       'defp' => 'The default privileges new members will receive are:',         'defp' => 'The default privileges new members will receive are:', 
     );      );
       if ($crstype eq 'Community') {
           $lt{'thes'} = &mt('These will be the privileges given to members assigned in the future via automatic group assignment for users who receive specific sections/roles in the community '); 
       }
     my $totaloptionalprivs = 0;      my $totaloptionalprivs = 0;
     foreach my $tool (@{$tools}) {      foreach my $tool (@{$tools}) {
         foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {          foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
Line 2260  sub privilege_specificity { Line 2301  sub privilege_specificity {
             $r->print($lt{'algm'}.'<br /><br />');              $r->print($lt{'algm'}.'<br /><br />');
         }          }
         &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs,          &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs,
     $available);      $available,$functions);
     } else {      } else {
         if ($action eq 'create') {          if ($action eq 'create') {
             $r->print($lt{'asyo'});              $r->print($lt{'asyo'});
Line 2284  sub privilege_specificity { Line 2325  sub privilege_specificity {
 }  }
   
 sub default_privileges {  sub default_privileges {
     my ($r,$action,$tools,$toolprivs,$fixedprivs,$available) = @_;      my ($r,$action,$tools,$toolprivs,$fixedprivs,$available,$functions) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                 'addp' => 'Additional privileges',                                  'addp' => 'Additional privileges',
                                 'fixp' => 'Fixed privileges',                                  'fixp' => 'Fixed privileges',
Line 2293  sub default_privileges { Line 2334  sub default_privileges {
     );      );
     $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box').      $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box').
       &Apache::lonhtmlcommon::row_title($lt{'func'},undef,        &Apache::lonhtmlcommon::row_title($lt{'func'},undef,
  'LC_groups_functionality'));        'LC_groups_functionality'));
     $r->print(join('</td><td class="LC_groups_functionality">',@{$tools}));      my @tableHeader;
       if ((ref($functions) eq 'HASH') && (ref($tools) eq 'ARRAY')) {
           @tableHeader = map { $functions->{$_}; } @{$tools};
       }
    $r->print(join('</td><td class="LC_groups_functionality">', @tableHeader));
     $r->print(&Apache::lonhtmlcommon::row_closure(1));      $r->print(&Apache::lonhtmlcommon::row_closure(1));
     my $fixed = '';      my $fixed = '';
     my $dynamic = '';      my $dynamic = '';
Line 2310  sub default_privileges { Line 2355  sub default_privileges {
     $fixed .= '</td><td class="LC_groups_fixed">';      $fixed .= '</td><td class="LC_groups_fixed">';
  }   }
                 $fixed .= '<input type="hidden" name="defpriv" value="'.$priv.'" />'                  $fixed .= '<input type="hidden" name="defpriv" value="'.$priv.'" />'
                          .'<span class="LC_nobreak">'.$$toolprivs{$tool}{$priv}.'&nbsp;';                           .'<span class="LC_nobreak">'.&mt($$toolprivs{$tool}{$priv}).'&nbsp;';
                 if ($action eq 'modify') {                  if ($action eq 'modify') {
                     if (grep(/^$tool$/,@{$available})) {                      if (grep(/^$tool$/,@{$available})) {
                         $fixed .= '<small>'.&mt('(on)').'<small>&nbsp;';                          $fixed .= '<small>'.&mt('(on)').'<small>&nbsp;';
Line 2325  sub default_privileges { Line 2370  sub default_privileges {
                     $dynamic .= '</tr>                      $dynamic .= '</tr>
                                  <tr>'."\n";                                   <tr>'."\n";
                 }                  }
                 $dynamic .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="defpriv" value="'.$priv.'" />'.$$toolprivs{$tool}{$priv}.'</label></span></td>'."\n";                  $dynamic .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="defpriv" value="'.$priv.'" />'.&mt($$toolprivs{$tool}{$priv}).'</label></span></td>'."\n";
             }              }
         }          }
         if ($privcount == 0) {          if ($privcount == 0) {
Line 2510  sub current_membership { Line 2555  sub current_membership {
                 $r->print('                  $r->print('
      <td>       <td>
       <span class="LC_nobreak">        <span class="LC_nobreak">
        <fieldset><legend><b>'.$lt{'curf'}.'</b></legend>         <fieldset><legend>'.$lt{'curf'}.'</legend>
        <input type="button" value="'.&mt('check all').'"         <input type="button" value="'.&mt('check all').'"
        onclick="javascript:checkAllTools(document.'.$formname.')" />         onclick="javascript:checkAllTools(document.'.$formname.')" />
        &nbsp;&nbsp;         &nbsp;&nbsp;
Line 2668  sub check_uncheck_buttons { Line 2713  sub check_uncheck_buttons {
     $r->print('      $r->print('
      <td '.$colspan.'>       <td '.$colspan.'>
        <fieldset>         <fieldset>
        <legend><b>'.$title.'</b></legend>         <legend>'.$title.'</legend>
       <span class="LC_nobreak">        <span class="LC_nobreak">
        <input type="button" value="'.&mt('check all').'"         <input type="button" value="'.&mt('check all').'"
        onclick="javascript:checkAll(document.'.$formname.'.'.$field.')" />         onclick="javascript:checkAll(document.'.$formname.'.'.$field.')" />
Line 2748  sub change_privs_form { Line 2793  sub change_privs_form {
 sub add_members_form {  sub add_members_form {
     my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname,      my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname,
         $description,$granularity,$quota,$sectioncount,$tools,$functions,          $description,$granularity,$quota,$sectioncount,$tools,$functions,
         $stored,$states,$navbuttons,$gpterm,$ucgpterm)=@_;           $stored,$states,$navbuttons,$gpterm,$ucgpterm,$crstype)=@_;
     $r->print(' <br />');      $r->print(' <br />');
     my @available = ();      my @available = ();
     my @unavailable = ();      my @unavailable = ();
Line 2757  sub add_members_form { Line 2802  sub add_members_form {
     $groupname,$description,$granularity,$quota,      $groupname,$description,$granularity,$quota,
     \@available,\@unavailable,$gpterm,$ucgpterm);      \@available,\@unavailable,$gpterm,$ucgpterm);
     &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm,      &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm,
                         $ucgpterm);                          $ucgpterm,$crstype);
     my $nexttext = $$navbuttons{'gtns'};      my $nexttext = $$navbuttons{'gtns'};
     my $prevtext = $$navbuttons{'gtpp'};      my $prevtext = $$navbuttons{'gtpp'};
     &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,      &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
Line 2952  sub member_privileges_form { Line 2997  sub member_privileges_form {
                     foreach my $tool (@{$tools}) {                      foreach my $tool (@{$tools}) {
                         if (@{$showboxes{$tool}} > 0) {                          if (@{$showboxes{$tool}} > 0) {
                             $r->print('<td valign="top">');                              $r->print('<td valign="top">');
                             $r->print('<table class="thinborder"><tr>'.                              $r->print('<fieldset><legend>'.&mt($tool).'</legend>');
       '<th colspan="'.$colspan.'">'.                              $r->print('<table><tr>');
                                       &mt($tool).'</th></tr><tr>');  
                             my $privcount = 0;                              my $privcount = 0;
                             foreach my $priv (@{$showboxes{$tool}}) {                              foreach my $priv (@{$showboxes{$tool}}) {
                                 $privcount ++;                                  $privcount ++;
Line 2969  sub member_privileges_form { Line 3013  sub member_privileges_form {
                                     $r->print('<td>');                                      $r->print('<td>');
                                 }                                  }
                                 $r->print(                                  $r->print(
  '<fieldset><legend><b>'.&mt($$toolprivs{$tool}{$priv}).'</b></legend>'   '<fieldset><legend>'.&mt($$toolprivs{$tool}{$priv}).'</legend>'
 .'<span class="LC_nobreak">'  .'<span class="LC_nobreak">'
 .' <input type="button" value="'.&mt('check all').'"'  .' <input type="button" value="'.&mt('check all').'"'
 .' onclick="javascript:checkAll(document.'.$formname.'.userpriv_'.$priv.')" />'  .' onclick="javascript:checkAll(document.'.$formname.'.userpriv_'.$priv.')" />'
Line 2989  sub member_privileges_form { Line 3033  sub member_privileges_form {
                                     }                                      }
                                 }                                  }
                             }                              }
                             $r->print('</tr></table></td><td>&nbsp;</td>');                              $r->print('</tr></table></fieldset></td><td>&nbsp;</td>');
                         }                          }
                     }                      }
                     $r->print('</tr></table>');                      $r->print('</tr></table>');
Line 3089  sub process_request { Line 3133  sub process_request {
         &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,          &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,
                             $enddate,$startdate,$userdata,$idx,$toolprivs,                              $enddate,$startdate,$userdata,$idx,$toolprivs,
                             $usertools,$specificity,\@defprivs,$memchg,$gpterm,                              $usertools,$specificity,\@defprivs,$memchg,$gpterm,
                             $ucgpterm);                              $ucgpterm,$crstype);
     }      }
     return;      return;
 }  }
Line 3122  sub write_group_data { Line 3166  sub write_group_data {
     if ($quota !~ /^\d*\.?\d*$/) {      if ($quota !~ /^\d*\.?\d*$/) {
         $quota = 0;          $quota = 0;
         $r->print('<div class="LC_warning">'          $r->print('<div class="LC_warning">'
                  .&mt('The value you entered for the quota for the file repository in this '.$gpterm                   .&mt('The value you entered for the quota for the group portfolio in this '.$gpterm
                  .' contained invalid characters, so it has been set to 0 Mb. You can change this by'                   .' contained invalid characters, so it has been set to 0 Mb. You can change this by'
                  .' modifying the '.$gpterm.' settings.')                   .' modifying the '.$gpterm.' settings.')
                  .'</div>');                   .'</div>');
Line 3130  sub write_group_data { Line 3174  sub write_group_data {
     if ($quota > $maxposs) {      if ($quota > $maxposs) {
         $quota = $maxposs;          $quota = $maxposs;
         $r->print('<div class="LC_warning">'          $r->print('<div class="LC_warning">'
                  .&mt('The value you entered for the quota for the file repository in this '.$gpterm                   .&mt('The value you entered for the quota for the group portfolio in this '.$gpterm
                  .' exceeded the maximum possible value, so it has been set to [_1] Mb '                   .' exceeded the maximum possible value, so it has been set to [_1] Mb '
                  .'(the maximum possible value).',sprintf("%.2f",$maxposs))                   .'(the maximum possible value).',sprintf("%.2f",$maxposs))
                  .'</div>');                   .'</div>');
Line 3199  sub write_group_data { Line 3243  sub write_group_data {
                                            $description,$tools,\%groupinfo,                                             $description,$tools,\%groupinfo,
                                            $gpterm,$ucgpterm,$crstype);                                             $gpterm,$ucgpterm,$crstype);
             if ($result eq 'ok') {              if ($result eq 'ok') {
                 $r->print('<div class="LC_success">'                  my $msg = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was created.','<i>'.$groupname.'</i>'));
                          .&mt($ucgpterm.' [_1] was created.','<i>'.$groupname.'</i>')                  $msg = &Apache::loncommon::confirmwrapper($msg);
                          .'</div>');                  $r->print($msg);
             } else {              } else {
                 $r->print('<div class="LC_error">'                  my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'
                          .&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'                                                                       ,'<i>'.$groupname.'</i>')
                              ,'<i>'.$groupname.'</i>')                                                                       .'<br />'.$result,1);
                          .'<br />'.$result                  $msg = &Apache::loncommon::confirmwrapper($msg);
                          .'</div>');                  $r->print($msg);
             }              }
         } elsif ($action eq 'modify') {          } elsif ($action eq 'modify') {
             my (@oldtools,@newtools);               my (@oldtools,@newtools); 
Line 3222  sub write_group_data { Line 3266  sub write_group_data {
                 my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';                  my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
                 my $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';                  my $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';
                 my $navmap = Apache::lonnavmaps::navmap->new();                  my $navmap = Apache::lonnavmaps::navmap->new();
                 my $bbmapres = $navmap->getResourceByUrl($boardsmap);                  my ($bbmapres,$error);
                 undef($navmap);                  if (defined($navmap)) {
                 if (!$bbmapres) {                      $bbmapres = $navmap->getResourceByUrl($boardsmap);
                     my $grpmap = $crspath.'group_folder_'.$groupname.'.sequence';                      undef($navmap);
                     my $disctitle = &mt('Discussion Boards');                      if (!$bbmapres) {
                     my $outcome = &map_updater($cdom,$cnum,'group_boards_'.                          my $grpmap = $crspath.'group_folder_'.$groupname.'.sequence';
                                                $groupname.'.sequence','bbseq',                          my $disctitle = &mt('Discussion Boards');
                                                $disctitle,$grpmap);                          my $outcome = &map_updater($cdom,$cnum,'group_boards_'.
                     my ($furl,$ferr) =                                                      $groupname.'.sequence','bbseq',
                         &Apache::lonuserstate::readmap($cdom.'/'.$cnum);                                                     $disctitle,$grpmap);
                     $navmap = Apache::lonnavmaps::navmap->new();                          my ($furl,$ferr) = 
                     # modify parameter                              &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
                     if ($outcome eq 'ok') {                          # modify parameter
                         my $parm_result = &parm_setter($navmap,$cdom,$boardsmap,                          if ($outcome eq 'ok') {
                                                        $groupname);                              $navmap = Apache::lonnavmaps::navmap->new();
                         if ($parm_result) {                              if (defined($navmap)) {
                             $r->print('<div class="LC_error">'                                  my $parm_result = &parm_setter($navmap,$cdom,$boardsmap,
                                      .&mt('An error occurred while setting parameters '                                                                 $groupname);
                                          .'for Discussion Boards folder: '                                  if ($parm_result) {
                                          .'[_1]',$parm_result)                                      $error = &mt('An error occurred while setting parameters '
                                      .'</div>');                                               .'for Discussion Boards folder: '
                                                .'[_1]',$parm_result);
                                   } else {
                                       $r->print('<div class="LC_success">'.
                                                 &mt('Discussion Boards Folder created.')
                                                 .'</div>');
                                   }
                                   undef($navmap);
                               } else {
                                   if ($crstype eq 'Community') {
                                       $error = &mt("An error occurred while setting parameters '.
                                                'for Discussion Boards folder: '.
                                                'Could not retrieve community information");
                                   } else {
                                       $error = &mt("An error occurred while setting parameters '.
                                                'for Discussion Boards folder: '.
                                                'Could not retrieve course information");
                                   }
                               }
                         } else {                          } else {
                             $r->print('<div class="LC_success">'                              $r->print($outcome);
                                      .&mt('Discussion Boards Folder created.')  
                                      .'</div>');  
                         }                          }
                       }
                   } else {
                       $error = &mt("An error occurred while retrieving the contents of the group's folder.").'<br />';
                       if ($crstype eq 'Community') {
                           $error .= &mt("You need to re-initialize the community.");
   
                     } else {                      } else {
                         $r->print($outcome);                          $error .= &mt("You need to re-initialize the course.");
                     }                      }
                     undef($navmap);                  }
                   if ($error ne '') {
                       $r->print('<div class="LC_error">'.$error.'</div>');
                 }                  }
             }              }
             $r->print('<div class="LC_success">'              my $message = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was updated.','<i>'.$groupname.'</i>'));
                      .&mt($ucgpterm.' [_1] was updated.','<i>'.$groupname.'</i>')              $message = &Apache::loncommon::confirmwrapper($message);
                      .'</div>');              $r->print($message);
         }          }
     } else {      } else {
         my %actiontype = (          my %actiontype = (
Line 3277  sub write_group_data { Line 3345  sub write_group_data {
 sub process_membership {  sub process_membership {
     my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,      my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
         $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,          $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,
         $gpterm,$ucgpterm)=@_;          $gpterm,$ucgpterm,$crstype)=@_;
     my %usersettings = ();      my %usersettings = ();
     my %added= ();      my %added= ();
     my %failed = ();      my %failed = ();
Line 3434  sub process_membership { Line 3502  sub process_membership {
     my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,      my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,
                                                        $cnum,\%usersettings);                                                         $cnum,\%usersettings);
     if ($num_ok) {      if ($num_ok) {
         foreach my $type (sort(keys(%added))) {           my $msgall ='';
             $r->print(&mt('The following users were successfully [_1]',$type));          foreach my $type (sort(keys(%added))) {
               my $message = &mt('The following users were successfully [_1]',$type); 
             if (!($type eq 'deleted' || $type eq 'expired')) {                 if (!($type eq 'deleted' || $type eq 'expired')) {   
                 $r->print(&mt(' with the following privileges'));                  $message .= &mt(' with the following privileges');
             }              }
             $r->print(':<br />');              $message .= ':<br/>';
             foreach my $user (@{$added{$type}}) {              foreach my $user (@{$added{$type}}) {
                 my $privlist = '';                  my $privlist = '';
                 if (!($type eq 'deleted' ||  $type eq 'expired')) {                  if (!($type eq 'deleted' ||  $type eq 'expired')) {
Line 3455  sub process_membership { Line 3524  sub process_membership {
                     }                      }
                     $privlist =~ s/, $//;                      $privlist =~ s/, $//;
                 }                  }
                 $r->print($$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.$privlist.'<br />');                  $message .= $$userdata{$user}[$$idx{fullname}].'&nbsp;-&nbsp;'.$user.$privlist.'<br />';
             }              }
             $r->print('<br />');              $message .= '<br/>';
               $message = &Apache::lonhtmlcommon::confirm_success($message);
               $msgall .= $message;
         }          }
           $msgall = &Apache::loncommon::confirmwrapper($msgall);
           $r->print($msgall);
     }      }
     if ($num_fail) {      if ($num_fail) {
         foreach my $type (sort(keys(%failed))) {          foreach my $type (sort(keys(%failed))) {
Line 3471  sub process_membership { Line 3544  sub process_membership {
         }          }
         $r->print('<br />');          $r->print('<br />');
     }      }
     if (@unchanged > 0) {  # Is that really needed?
         $r->print(&mt('No change occurred for the following users:').'<br />');  #
         foreach my $user (sort(@unchanged)) {  #    if (@unchanged > 0) {
             $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');  #        $r->print(&mt('No change occurred for the following users:').'<br />');
         }  #        foreach my $user (sort(@unchanged)) {
         $r->print('<br />');  #            $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />');
     }  #        }
   #        $r->print('<br />');
   #    }
     if ($roster_result eq 'ok') {      if ($roster_result eq 'ok') {
         $r->print('<div class="LC_success">'          $r->print('<div class="LC_success">'
                  .&mt($ucgpterm.' membership list updated.')                   .&mt($ucgpterm.' membership list updated.')
                  .'</div>');                   .'</div>');
  $r->print('<p class="LC_info">'   $r->print('<p class="LC_info">');
                  .&mt('Any currently logged in course users affected by the changes you made'          if ($crstype eq 'Community') {
               $r->print(&mt("Any currently logged in community users affected by the changes you made"
                      .' to group membership or privileges for the [_1] group will need to log out'                       .' to group membership or privileges for the [_1] group will need to log out'
                      .' and log back in for their LON-CAPA sessions to reflect these changes.'                       .' and log back in for their LON-CAPA sessions to reflect these changes.'
                      ,'<i>'.$groupname.'</i>')                       ,'<i>'.$groupname.'</i>'));
                  .'</p>'  
         );          } else {  
               $r->print(&mt("Any currently logged in course users affected by the changes you made"
                        .' to group membership or privileges for the [_1] group will need to log out'
                        .' and log back in for their LON-CAPA sessions to reflect these changes.'
                        ,'<i>'.$groupname.'</i>'));
           } 
           $r->print('</p>');
     } else {      } else {
         $r->print('<div class="LC_error">'          $r->print('<div class="LC_error">'
                  .&mt("An error occurred while updating the $gpterm membership list:")                   .&mt("An error occurred while updating the $gpterm membership list:")
Line 3559  sub mapping_settings { Line 3641  sub mapping_settings {
         @sections = ('all','none');          @sections = ('all','none');
     }      }
     $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));      $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));
     my @roles = &standard_roles();      my @roles = &standard_roles($crstype);
     my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);      my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);
     $r->print(&Apache::loncommon::start_data_table().      $r->print(&Apache::loncommon::start_data_table().
       &Apache::loncommon::start_data_table_header_row());        &Apache::loncommon::start_data_table_header_row());
Line 3602  sub print_autorole_item { Line 3684  sub print_autorole_item {
     my ($role,$roletitle,$sections) = @_;      my ($role,$roletitle,$sections) = @_;
     my $sections_sel;      my $sections_sel;
     if (@{$sections} > 0) {      if (@{$sections} > 0) {
         if ($role eq 'cc') {          if (($role eq 'cc') || ($role eq 'co')) {
             $sections_sel = '<td align="right">'.              $sections_sel = '<td align="right">'.
                             &mt('all sections').'<input type="hidden" '.                              &mt('all sections').'<input type="hidden" '.
                             'name="sec_cc" value="all" /></td>';                              'name="sec_'.$role.'" value="all" /></td>';
         } else {          } else {
             $sections_sel='<td align="right">'.              $sections_sel='<td align="right">'.
                           &sections_selection($sections,'sec_'.$role).                            &sections_selection($sections,'sec_'.$role).
Line 3621  sub print_autorole_item { Line 3703  sub print_autorole_item {
 }   } 
   
 sub standard_roles {  sub standard_roles {
     my @roles = ('cc','in','ta','ep','st');      my ($crstype) = @_;
       my @roles = qw(in ta ep ad st);
       if ($crstype eq 'Community') {
           unshift(@roles,'co');
       } else {
           unshift(@roles,'cc');
       }
     return @roles;      return @roles;
 }  }
   
 sub modify_menu {  sub modify_menu {
     my ($r,$groupname,$page,$gpterm) = @_;      my ($r,$groupname,$page,$gpterm) = @_;
     my @menu =      my @menu =
         (          ( { categorytitle =>'Group Actions',
           { text => "Modify default $gpterm settings",   items => [
             help => 'Course_Modify_Group',  
             state => 'change_settings',            { linktext => "Modify default $gpterm settings",
             branch => 'settings',              url => '/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state=change_settings&branch=settings',
               icon => 'grp_settings.png',
               alttext => "Modify default $gpterm settings",
               permission => '1',
               help => 'Course_Modify_Group',            
             },              },
           { text => 'Modify access, tools and/or privileges for previous, '.            { linktext => 'Modify access, tools and privileges for members',
                     'future, or current members',              url => '/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state=change_members&branch=members',
               icon => 'grp_tools.png',
               alttext => 'Modify access, tools and privileges for members',
               permission => '1',
             help => 'Course_Modify_Group_Membership',              help => 'Course_Modify_Group_Membership',
             state => 'change_members',  
             branch => 'members',  
             },              },
           { text => "Add member(s) to the $gpterm",            { linktext => "Add member(s) to the $gpterm",
               url => '/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state=add_members&branch=adds',
               icon => 'grp_add.png',
               alttext =>  "Add member(s) to the $gpterm",
               permission => '1',
             help => 'Course_Group_Add_Members',              help => 'Course_Group_Add_Members',
             state => 'add_members',              }]}
             branch => 'adds',            );   
             },      $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
           );  
     my $menu_html = '';  
     foreach my $menu_item (@menu) {  
         $menu_html .=  
         '<p><font size="+1"><a href="/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state='.$menu_item->{'state'}.'&branch='.$menu_item->{'branch'}.'">';  
         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';  
         if (exists($menu_item->{'help'})) {  
             $menu_html.=  
                 &Apache::loncommon::help_open_topic($menu_item->{'help'});  
         }  
         $menu_html.='</p>'.$/;  
     }  
     $r->print($menu_html);  
     return;      return;
 }  }
   
Line 3740  sub date_setting_table { Line 3824  sub date_setting_table {
                                                       'startdate',$starttime);                                                        'startdate',$starttime);
     my $endform = &Apache::lonhtmlcommon::date_setter($formname,      my $endform = &Apache::lonhtmlcommon::date_setter($formname,
                                                       'enddate',$endtime);                                                        'enddate',$endtime);
     my $perpetual =       my $perpetual = ' <span class="LC_nobreak"><label>'
  '<span class="LC_nobreak"><label><input type="checkbox" name="no_end_date" />'.                     .'<input type="checkbox" name="no_end_date" />'
  &mt('None').'</label></span>';                     .&mt('No end date')
     my $table = "<table class=\"LC_descriptive_input\">\n".                     .'</label></span>';
  '<tr><td class="LC_description">'.&mt('Start:').'</td>'.      my $table = &Apache::lonhtmlcommon::start_pick_box()
         '<td>'.$startform.'</td>'.                 .&Apache::lonhtmlcommon::row_title(&mt('Start Date'))
         '<td>&nbsp;</td>'."</tr>\n".                 .$startform
  '<tr><td class="LC_description">'.&mt('End:').'</td>'.                 .&Apache::lonhtmlcommon::row_closure()
         '<td>'.$endform.'</td>'.                 .&Apache::lonhtmlcommon::row_title(&mt('End Date'))
         '<td>'.$perpetual.'</td>'."</tr>\n".                 .$endform
  "</table>\n";                 .$perpetual
                  .&Apache::lonhtmlcommon::row_closure(1)
                  .&Apache::lonhtmlcommon::end_pick_box();
     return $table;      return $table;
 }  }
   
Line 3758  sub add_group_folder { Line 3844  sub add_group_folder {
     my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,      my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,
         $gpterm,$ucgpterm,$crstype) = @_;          $gpterm,$ucgpterm,$crstype) = @_;
     if ($cdom eq '' || $cnum eq '') {      if ($cdom eq '' || $cnum eq '') {
         return '<span class="LC_error">'          my $error = '<span class="LC_error">';
               .&mt('Error: invalid course domain or number - group folder creation failed.')          if ($crstype eq 'Community') { 
               .'</span>';              $error .= &mt("Error: invalid community domain or number - group folder creation failed.");
           } else {
               $error .= &mt("Error: invalid course domain or number - group folder creation failed.");
           }
           $error .= '</span>';
           return $error;
     }      }
     my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage,$warning);      my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage,$warning);
     my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';      my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
Line 3827  sub add_group_folder { Line 3918  sub add_group_folder {
     }      }
     my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);      my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
       if (!defined($navmap)) {
           $warning .= '<span class="LC_error">';
           if ($crstype eq 'Community') {
               $warning .= &mt("Error retrieving community contents").
                           ' '.&mt("You need to re-initialize the community.");
           } else {
               $warning  .= &mt("Error retrieving course contents").
                            ' '.&mt("You need to re-initialize the course.");
           }
           $warning .= '</span>';
           return $warning;
       }
     # modify parameters      # modify parameters
     my $parm_result;      my $parm_result;
     if ($action eq 'create') {      if ($action eq 'create') {
Line 3930  sub new_map { Line 4033  sub new_map {
 }  }
   
 sub parm_setter {  sub parm_setter {
     my ($navmap,$cdom,$url,$groupname) = @_;      my ($navmap,$cdom,$url,$groupname,$crstype) = @_;
     my $allresults;      if (!defined($navmap)) {
           my $allresults;
           if ($crstype eq 'Community') { 
               $allresults = &mt("Parameters not set for [_1] because the contents of the community could not be retrieved.",$url).' '.
                             &mt("You need to reinitialize the community.");
           } else {
               $allresults = &mt("Parameters not set for [_1] because the contents of the course could not be retrieved.",$url).' '.
                             &mt("You need to reinitialize the course.");
   
           }
           return '<div class="LC_warning">'.$allresults.'</div>';
       }
     my %hide_settings = (      my %hide_settings = (
                            'course' =>  {                             'course' =>  {
                                           'num' => 13,                                            'num' => 13,
Line 3944  sub parm_setter { Line 4058  sub parm_setter {
                                         },                                          },
                         );                          );
     my $res = $navmap->getResourceByUrl($url);      my $res = $navmap->getResourceByUrl($url);
       my $allresults;
     if ($res) {      if ($res) {
         my $symb = $res->symb();          my $symb = $res->symb();
         foreach my $level (keys(%hide_settings)) {          foreach my $level (keys(%hide_settings)) {
Line 3960  sub parm_setter { Line 4075  sub parm_setter {
             }              }
         }          }
     } else {      } else {
         $allresults = '<div class="LC_warning">'           $allresults = '<div class="LC_warning">';
                      .&mt('Parameters not set for [_1] because the resource was not recognized'          if ($crstype eq 'Community') {
                          .' as part of the course.','<tt>'.$url.'</tt>')              $allresults .= &mt("Parameters not set for [_1] because the resource was not recognized as part of the community.",'<tt>'.$url.'</tt>');
                      .'</div>';          } else {
               $allresults .= &mt('Parameters not set for [_1] because the resource was not recognized as part of the course.','<tt>'.$url.'</tt>');
           }
           $allresults .= '</div>';
     }      }
     return $allresults;      return $allresults;
 }  }
Line 4116  sub check_changes { Line 4234  sub check_changes {
 }  }
   
 1;  1;
   

Removed from v.1.84  
changed lines
  Added in v.1.109


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