--- loncom/interface/loncoursegroups.pm 2008/12/24 07:36:39 1.80.2.4 +++ loncom/interface/loncoursegroups.pm 2009/11/06 19:49:26 1.104 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.80.2.4 2008/12/24 07:36:39 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.104 2009/11/06 19:49:26 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -54,7 +54,7 @@ sub handler { if (! ($env{'request.course.fn'})) { # Not in a course $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; } @@ -75,11 +75,11 @@ sub handler { my $crstype = &Apache::loncommon::course_type(); my %functions = ( - email => 'E-mail', - discussion => 'Discussion boards', - chat => 'Chat', - files => 'File repository', - roster => 'Membership roster', + email => 'Send Messages', + discussion => 'Discussion Boards', + chat => 'Chat Room', + files => 'Group Portfolio', + roster => 'Membership Roster', homepage => $ucgpterm.' home page', ); @@ -141,7 +141,7 @@ function openGroupRoster(group,status) { rosterbrowser = open(url,title,options,'1'); rosterbrowser.focus(); }\n|; - $r->print(&header('Groups',$jscript,$action,$state)); + $r->print(&header('My Space',$jscript,$action,$state)); if ($env{'form.refpage'} eq 'cusr') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createuser", @@ -537,7 +537,7 @@ sub group_administration { if (ref($stored{'autorole'}) eq 'ARRAY') { foreach my $role (@{$stored{'autorole'}}) { - unless ($role eq 'cc') { + unless (($role eq 'cc') || ($role eq 'co')) { $elements{'modify'}{'change_settings'}{'sec_'.$role} = 'selectbox'; } @@ -785,7 +785,7 @@ sub group_administration { } var maxposs = '.sprintf("%.2f",$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; } var re_quota = '.$float_check.'; @@ -804,7 +804,7 @@ sub group_administration { } } 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; } } @@ -915,11 +915,11 @@ function changeSort(caller) { result => 'Re-enabled' ); my %navbuttons = &Apache::lonlocal::texthash( - gtns => 'Go to next step', - gtps => 'Go to previous step', + gtns => 'Next',#'Go to next step', + gtps => 'Back',#'Go to previous step', crgr => 'Create '.$gpterm, - mose => 'Modify settings', - gtpp => 'Go to previous page', + mose => 'Save',#'Modify settings', + gtpp => 'Back',#'Go to previous page', adme => 'Add members', ); if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) && @@ -1086,7 +1086,7 @@ sub display_control { &add_members_form($r,$cdom,$cnum,$action,$state,$page,$startdate, $enddate,$groupname,$description,$granularity, $quota,$sectioncount,$tools,$functions,$stored, - $states,$navbuttons,$gpterm,$ucgpterm); + $states,$navbuttons,$gpterm,$ucgpterm,$crstype); } elsif ($state eq 'pick_members') { &choose_members_form($r,$cdom,$cnum,$action,$state,$page, $groupname,$description,$granularity,$quota, @@ -1119,31 +1119,36 @@ sub display_control { my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action); if ($state eq 'verify') { &verify_delete($r,$groupname,$state,$action,$page,$states, - \%stored); + \%stored,$crstype); } elsif ($state eq 'result') { - &delete_group($r,$cdom,$cnum,$groupname); + &delete_group($r,$cdom,$cnum,$groupname,$crstype); } } elsif ($action eq 'reenable') { my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action); if ($state eq 'verify') { &verify_reenable($r,$groupname,$state,$action,$page,$states, - \%stored); + \%stored,$crstype); } elsif ($state eq 'result') { - &reenable_group($r,$cdom,$cnum,$groupname); + &reenable_group($r,$cdom,$cnum,$groupname,$crstype); } } } 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(&mt('You have requested deletion of the group [_1].' ,'<i>'.$stored->{'description'}.'</i>'). '<br /><br />'.&mt('When a group is deleted the following occurs:').'<ul>'. '<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 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.')); + '<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>'); + if ($crstype eq 'Community') { + $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 $nexttext = &mt('Delete group'); my $prev; @@ -1156,7 +1161,7 @@ sub verify_delete { } sub delete_group { - my ($r,$cdom,$cnum,$groupname) = @_; + my ($r,$cdom,$cnum,$groupname,$crstype) = @_; my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, $groupname); my $now = time; @@ -1198,22 +1203,24 @@ sub delete_group { .&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.' ,$num_fail,$num_users) .'</div>'); - } else { my ($result,$message) = &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum, $groupname,'delete'); if ($result eq 'ok') { - my $outcome = &modify_folders($cdom,$cnum,$groupname); + my $outcome = &modify_folders($cdom,$cnum,$groupname,$crstype); if ($outcome eq '') { $r->print('<div class="LC_success">' .&mt('Group successfully deleted.') .'</div>'); } else { - $r->print('<div class="LC_error">' - .&mt("Although the group was deleted, an error occurred when removing" - ." the group's folder from the 'Course Groups' folder: [_1]",$outcome) - .'</div>'); + $r->print('<div class="LC_error">'); + if ($crstype eq 'Comunity') { + $r->print(&mt("Although the group was deleted, an error occurred when removing the group's folder from the 'Community Groups' folder: [_1]",$outcome)); + } 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 { $r->print('<div class="LC_error">' @@ -1225,11 +1232,16 @@ sub delete_group { } sub reenable_folder { - my ($cdom,$cnum,$groupname,$description) = @_; + my ($cdom,$cnum,$groupname,$description,$crstype) = @_; my $outcome; my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/'; 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_'. $groupname.'.sequence'; my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap); @@ -1258,14 +1270,19 @@ sub reenable_folder { } sub modify_folders { - my ($cdom,$cnum,$groupname) = @_; + my ($cdom,$cnum,$groupname,$crstype) = @_; my ($outcome,$groupmap,$groupmapres,$map,$id,$src); my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { - $outcome = '<div class="LC_error">'. - &mt('Error reading course contents.').' '. - &mt('You need to re-initialize the course.'). - '</div>'; + $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_'. @@ -1320,13 +1337,18 @@ sub modify_folders { } 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(&mt('You have requested enabling the previously deleted group [_1].' ,'<i>'.$stored->{'description'}.'</i>'). '<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('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'</li></ul>'); + '<li>'.&mt('Group settings and membership at the time the group was deleted are reinstated.').'</li><li>'); + 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 $nexttext = &mt('Reenable group'); my $prev; @@ -1339,7 +1361,7 @@ sub verify_reenable { } sub reenable_group { - my ($r,$cdom,$cnum,$groupname) = @_; + my ($r,$cdom,$cnum,$groupname,$crstype) = @_; my %groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname, 'deleted_groups'); @@ -1413,15 +1435,19 @@ $context) eq 'ok') { .&mt('There were no group members to reinstate, as none were removed when the group was deleted.') .'</div>'); } - my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description); + my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description,$crstype); if ($outcome eq '') { $r->print('<div class="LC_success">' .&mt('Group successfully re-enabled.') .'</div>'); } else { - $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) - .'</div>'); + $r->print('<div class="LC_error">'); + if ($crstype eq 'Comunity') { + $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 { $r->print('<div class="LC_error">' @@ -1440,7 +1466,7 @@ sub header { {'add_entries' => $loaditems,}); my $output = <<"END"; $start_page -<form method="POST" name="$state"> +<form method="post" name="$state"> END if ($action eq 'create' || $action eq 'modify') { @@ -1579,7 +1605,7 @@ sub general_settings_form { &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm); if ($action eq 'create') { &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3, - $gpterm,$ucgpterm); + $gpterm,$ucgpterm,$crstype); $nexttext = $$navbuttons{'gtns'}; } else { my @available = (); @@ -1588,7 +1614,7 @@ sub general_settings_form { @{$tools} = sort(keys(%{$functions})); &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs, $fixedprivs,\@available,$formname, - $gpterm,$ucgpterm); + $gpterm,$ucgpterm,$functions,$crstype); &mapping_options($r,$action,$formname,$page,$sectioncount, $states,$stored,$navbuttons,4,5, $gpterm,$ucgpterm,$crstype,$cdom,$cnum); @@ -1612,33 +1638,34 @@ sub groupsettings_options { 'lett' => 'Letters, numbers and underscore only', 'doyo' => 'Different subsets of the chosen collaborative tools '. 'for different group members?', + 'gran' => 'Granularity', + 'dquo' => 'Disk quota', ); my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored); - $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'}).' - <table class="LC_descriptive_input"> - <tr> - <td class="LC_description">'.$lt{'gnam'}.':</td> - <td colspan="5"> -'); + $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'gnde'})); + + # Group Name + $r->print(&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'gnam'}) + ); if ($action eq 'create') { - $r->print('<input type="text" name="groupname" size="25" /> ('. - $lt{'lett'}.')'); + $r->print('<input type="text" name="groupname" size="25" />' + .' <span class="LC_nobreak">(' + .$lt{'lett'}.')</span>' + ); } else { $r->print('<input type="hidden" name="groupname" value="'. $env{'form.groupname'}.'" />'.$env{'form.groupname'}); } - $r->print(<<"END"); - </td> - <tr> - <tr> - <td class="LC_description">$lt{'desc'}:</td> - <td colspan="5"><input type="text" name="description" size="40" - value="" /> - </td> - <tr> - <tr> - <td class="LC_description">$lt{'func'}:</td> -END + $r->print(&Apache::lonhtmlcommon::row_closure()); + + # Group Title + $r->print(&Apache::lonhtmlcommon::row_title($lt{'desc'}) + .'<input type="text" name="description" size="40" value="" />' + .&Apache::lonhtmlcommon::row_closure() + ); + + # Collaborative Tools my $numitems = keys(%{$functions}); my $halfnum = int($numitems/2); my $remnum = $numitems%2; @@ -1646,48 +1673,61 @@ END $halfnum ++; } my @allfunctions = sort(keys (%{$functions})); - for (my $i=0; $i<$halfnum; $i++) { - $r->print('<td><label><input type="checkbox" name="tool" value="'. - $allfunctions[$i].'" /> '. - $$functions{$allfunctions[$i]}.'</label></td> - <td> </td><td> </td>'); - } - $r->print('<td><input type="button" value="'.&mt('check all').'" '. - 'onclick="javascript:checkAll(document.'.$formname.'.tool)" />'. - '</td></tr><tr><td> </td>'); - for (my $j=$halfnum; $j<@allfunctions; $j++) { - $r->print('<td><label><input type="checkbox" name="tool" value="'. - $allfunctions[$j].'" /> '. - $$functions{$allfunctions[$j]}.'</label></td> - <td> </td><td> </td>'); - } - if ($remnum) { - $r->print('<td> </td>'); + + $r->print(&Apache::lonhtmlcommon::row_title($lt{'func'}) + .'<div>' + .'<input type="button" value="'.&mt('check all').'"' + .' onclick="javascript:checkAll(document.'.$formname.'.tool)" />' + .' <input type="button" value="'.&mt('uncheck all').'"' + .' onclick="javascript:uncheckAll(document.'.$formname.'.tool)" />' + .'</div>' + .'<table cellpadding="5px"><tr>' # FIXME Get rid of inflexible table (-> float) + ); + for (my $i=0; $i<@allfunctions; $i++) { + $r->print('<td><label><span class="LC_nobreak">' + .'<input type="checkbox" name="tool" value="' + .$allfunctions[$i].'" /> ' + .&mt($$functions{$allfunctions[$i]}) + .'</span></label></td>' + ); + if ($i == $halfnum - 1) { + $r->print('</tr><tr>'); + } } - $r->print(' - <td> - <input type="button" value="'.&mt('uncheck all').'" - onclick="javascript:uncheckAll(document.'.$formname.'.tool)" /> - </td> - </tr> - <tr> - <td class="LC_description">'.&mt('Granularity:').'</td> - <td colspan="10">'.$lt{'doyo'}.' <label><input type="radio" name="granularity" value="Yes" />'.&mt('Yes').'</label> <label><input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No').'</label>'); + $r->print('</tr></table>' + .&Apache::lonhtmlcommon::row_closure() + ); + + # Granularity + $r->print(&Apache::lonhtmlcommon::row_title($lt{'gran'}) + .$lt{'doyo'}.'<br />' + .'<label>' + .'<input type="radio" name="granularity" value="Yes" />'.&mt('Yes') + .'</label> <label>' + .'<input type="radio" name="granularity" value="No" checked="checked" />'.&mt('No') + .'</label>' + ); if ($action eq 'modify') { - $r->print(' ('.&mt('Currently set to "[_1]"', - &mt($$stored{'granularity'})).')'); + $r->print(' <span class="LC_nobreak">(' + .&mt('Currently set to [_1].' + ,'"'.&mt($$stored{'granularity'}).'"') + .')</span>' + ); } - $r->print(' - </td> - </tr> - <tr> - <td class="LC_description">'.&mt('Disk quota: ').'</td><td colspan="10">'); + $r->print(&Apache::lonhtmlcommon::row_closure()); + + # Disk Quota + $r->print(&Apache::lonhtmlcommon::row_title($lt{'dquo'})); 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 { - $r->print(&mt('Quota allocated to file repository:')); + $r->print(&mt('Quota allocated to group portfolio:')); } - $r->print(' '.&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') { $r->print('<br />' .&mt('A total of [_1] Mb can be divided amongst all '.$gpterm.'s in the ' @@ -1703,11 +1743,10 @@ END .'by adding all unallocated space for '.$gpterm.'s in the '.lc($crstype).'.' ,sprintf("%.2f",$maxposs))); } - $r->print(' - </td> - </tr> - </table> -'); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + + $r->print(&Apache::lonhtmlcommon::end_pick_box()); + return; } @@ -1728,38 +1767,48 @@ sub get_quota_constraints { } sub membership_options { - my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm)=@_; - my $crstype = &Apache::loncommon::course_type(); + my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm,$crstype)=@_; my %lt = &Apache::lonlocal::texthash( 'pipa' => 'Build a list of users for selection of group members', - 'gmem' => "Group membership selection list criteria:", - 'picr' => 'Pick the criteria to use to build a list of '. - lc($crstype).' users from which you will select ', - 'meof' => "members of the new group.", - '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.", + 'gmem' => 'Group membership selection list criteria:', + 'picr' => 'Pick the criteria to use to build a list of course users from which you will select members of the new group.', + 'pica' => 'Pick the criteria to use to build a list of course users from which you will select 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', - 'coro' => $crstype.' roles', - 'cose' => $crstype.' sections', + 'coro' => 'Course roles', + '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 = ( active => &mt('Currently has access'), previous => &mt('Previously had 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}); $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') { - $r->print($lt{'meof'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'}); + $r->print($lt{'picr'}.'<br />'.$lt{'ifno'}.'<br />'.$lt{'asub'}); } else { - $r->print($lt{'admg'}); + $r->print($lt{'pica'}); } $r->print(' <br /> @@ -1804,7 +1853,7 @@ sub sections_selection { } } my $output = ' - <select name="'.$elementname.'" multiple="true" size="'.$numvisible.'"> + <select name="'.$elementname.'" multiple="multiple" size="'.$numvisible.'"> '.$section_sel.' </select>'; return $output; @@ -1875,7 +1924,8 @@ sub choose_members_form { } } &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, $stored,$memimg,$users,$userdata, $granularity,\%origmembers,$gpterm, @@ -1972,42 +2022,25 @@ sub print_current_settings { <td valign="top">'.$description.'</td> <td> '); + if (@{$available} > 0) { - $r->print('<b>'.&mt('Available for assignment to members:').'</b>'. - '<table class="LC_group_priv"><tr>'); - my $rowcell = int(@{$available}/2) + @{$available}%2; + $r->print('<b>'.&mt('Available for assignment to members:').'</b>'); + $r->print('<ul>'); for (my $i=0; $i<@{$available}; $i++) { - if (@{$available} > 3) { - if ($i==$rowcell) { - $r->print('</tr><tr>'); - } - } - $r->print('<td>'.$$functions{$$available[$i]}. - '</td><td> </td>'); - } - if ((@{$available} > 3) && (@{$available}%2)) { - $r->print('<td> </td><td> </td>'); + $r->print('<li>'.&mt($$functions{$$available[$i]}).'</li>'); } - $r->print('</tr></table><br />'); + $r->print('</ul>'); } + if (@{$unavailable} > 0) { - $r->print('<b>'.&mt('Unavailable for assignment:').'</b>'. - '<table class="LC_group_priv"><tr>'); - my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2; - for (my $j=0; $j<@{$unavailable}; $j++) { - if (@{$unavailable} > 3) { - if ($j==$rowcell) { - $r->print('</tr><tr>'); - } - } - $r->print('<td>'.$$functions{$$unavailable[$j]}. - '</td><td> </td>'); - } - if ((@{$unavailable} > 3) && (@{$unavailable}%2)) { - $r->print('<td> </td><td> </td>'); + $r->print('<b>'.&mt('Unavailable for assignment:').'</b>'); + $r->print('<ul>'); + for (my $i=0; $i<@{$unavailable}; $i++) { + $r->print('<li>'.&mt($$functions{$$unavailable[$i]}).'</li>'); } - $r->print('</tr></table>'); + $r->print('</ul>'); } + my $quota_text=&mt('[_1] Mb',$quota); my $granu_text=&mt($granularity); $r->print(<<"END"); @@ -2070,7 +2103,7 @@ sub pick_new_members { &check_uncheck_buttons($r,$formname,'member',$lt{'addm'}); if (@{$available} > 0 && $granularity eq 'Yes') { $r->print('<td> - <fieldset><legend><b>'.$lt{'setf'}.'</b></legend> + <fieldset><legend>'.$lt{'setf'}.'</legend> <span class="LC_nobreak"> <input type="button" value="'.&mt('check all').'" onclick="javascript:checkAllTools(document.'.$formname.')" /> @@ -2169,7 +2202,7 @@ sub pick_new_members { sub privilege_specificity { my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available, - $formname,$gpterm,$ucgpterm) = @_; + $formname,$gpterm,$ucgpterm,$functions,$crstype) = @_; my %lt = &Apache::lonlocal::texthash ( 'uprv' => 'User privileges for collaborative tools', 'frty' => 'For each collaborative tool you have chosen to include, '. @@ -2203,6 +2236,9 @@ sub privilege_specificity { 'oppr' => 'Optional privileges', '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; foreach my $tool (@{$tools}) { foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { @@ -2266,7 +2302,7 @@ sub privilege_specificity { $r->print($lt{'algm'}.'<br /><br />'); } &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs, - $available); + $available,$functions); } else { if ($action eq 'create') { $r->print($lt{'asyo'}); @@ -2290,7 +2326,7 @@ sub privilege_specificity { } sub default_privileges { - my ($r,$action,$tools,$toolprivs,$fixedprivs,$available) = @_; + my ($r,$action,$tools,$toolprivs,$fixedprivs,$available,$functions) = @_; my %lt = &Apache::lonlocal::texthash( 'addp' => 'Additional privileges', 'fixp' => 'Fixed privileges', @@ -2299,8 +2335,12 @@ sub default_privileges { ); $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box'). &Apache::lonhtmlcommon::row_title($lt{'func'},undef, - 'LC_groups_functionality')); - $r->print(join('</td><td class="LC_groups_functionality">',@{$tools})); + 'LC_groups_functionality')); + my @tableHeader; + foreach my $key (sort(keys(%{$functions}))){ + push (@tableHeader,&mt($functions->{$key})); + } + $r->print(join('</td><td class="LC_groups_functionality">', @tableHeader)); $r->print(&Apache::lonhtmlcommon::row_closure(1)); my $fixed = ''; my $dynamic = ''; @@ -2316,7 +2356,7 @@ sub default_privileges { $fixed .= '</td><td class="LC_groups_fixed">'; } $fixed .= '<input type="hidden" name="defpriv" value="'.$priv.'" />' - .'<span class="LC_nobreak">'.$$toolprivs{$tool}{$priv}.' '; + .'<span class="LC_nobreak">'.&mt($$toolprivs{$tool}{$priv}).' '; if ($action eq 'modify') { if (grep(/^$tool$/,@{$available})) { $fixed .= '<small>'.&mt('(on)').'<small> '; @@ -2331,7 +2371,7 @@ sub default_privileges { $dynamic .= '</tr> <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) { @@ -2516,7 +2556,7 @@ sub current_membership { $r->print(' <td> <span class="LC_nobreak"> - <fieldset><legend><b>'.$lt{'curf'}.'</b></legend> + <fieldset><legend>'.$lt{'curf'}.'</legend> <input type="button" value="'.&mt('check all').'" onclick="javascript:checkAllTools(document.'.$formname.')" /> @@ -2674,7 +2714,7 @@ sub check_uncheck_buttons { $r->print(' <td '.$colspan.'> <fieldset> - <legend><b>'.$title.'</b></legend> + <legend>'.$title.'</legend> <span class="LC_nobreak"> <input type="button" value="'.&mt('check all').'" onclick="javascript:checkAll(document.'.$formname.'.'.$field.')" /> @@ -2754,7 +2794,7 @@ sub change_privs_form { sub add_members_form { my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname, $description,$granularity,$quota,$sectioncount,$tools,$functions, - $stored,$states,$navbuttons,$gpterm,$ucgpterm)=@_; + $stored,$states,$navbuttons,$gpterm,$ucgpterm,$crstype)=@_; $r->print(' <br />'); my @available = (); my @unavailable = (); @@ -2763,7 +2803,7 @@ sub add_members_form { $groupname,$description,$granularity,$quota, \@available,\@unavailable,$gpterm,$ucgpterm); &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm, - $ucgpterm); + $ucgpterm,$crstype); my $nexttext = $$navbuttons{'gtns'}; my $prevtext = $$navbuttons{'gtpp'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, @@ -2958,9 +2998,8 @@ sub member_privileges_form { foreach my $tool (@{$tools}) { if (@{$showboxes{$tool}} > 0) { $r->print('<td valign="top">'); - $r->print('<table class="thinborder"><tr>'. - '<th colspan="'.$colspan.'">'. - &mt($tool).'</th></tr><tr>'); + $r->print('<fieldset><legend>'.&mt($tool).'</legend>'); + $r->print('<table><tr>'); my $privcount = 0; foreach my $priv (@{$showboxes{$tool}}) { $privcount ++; @@ -2975,7 +3014,7 @@ sub member_privileges_form { $r->print('<td>'); } $r->print( - '<fieldset><legend><b>'.&mt($$toolprivs{$tool}{$priv}).'</b></legend>' + '<fieldset><legend>'.&mt($$toolprivs{$tool}{$priv}).'</legend>' .'<span class="LC_nobreak">' .' <input type="button" value="'.&mt('check all').'"' .' onclick="javascript:checkAll(document.'.$formname.'.userpriv_'.$priv.')" />' @@ -2995,7 +3034,7 @@ sub member_privileges_form { } } } - $r->print('</tr></table></td><td> </td>'); + $r->print('</tr></table></fieldset></td><td> </td>'); } } $r->print('</tr></table>'); @@ -3095,7 +3134,7 @@ sub process_request { &process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools, $enddate,$startdate,$userdata,$idx,$toolprivs, $usertools,$specificity,\@defprivs,$memchg,$gpterm, - $ucgpterm); + $ucgpterm,$crstype); } return; } @@ -3128,7 +3167,7 @@ sub write_group_data { if ($quota !~ /^\d*\.?\d*$/) { $quota = 0; $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' .' modifying the '.$gpterm.' settings.') .'</div>'); @@ -3136,7 +3175,7 @@ sub write_group_data { if ($quota > $maxposs) { $quota = $maxposs; $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 ' .'(the maximum possible value).',sprintf("%.2f",$maxposs)) .'</div>'); @@ -3238,7 +3277,7 @@ sub write_group_data { my $outcome = &map_updater($cdom,$cnum,'group_boards_'. $groupname.'.sequence','bbseq', $disctitle,$grpmap); - my ($furl,$ferr) = + my ($furl,$ferr) = &Apache::lonuserstate::readmap($cdom.'/'.$cnum); # modify parameter if ($outcome eq 'ok') { @@ -3257,17 +3296,28 @@ sub write_group_data { } undef($navmap); } else { - $error = &mt('An error occurred while setting parameters '. + if ($crstype eq 'Community') { + $error = &mt("An error occurred while setting parameters '. 'for Discussion Boards folder: '. - 'Could not retrieve course information' ); + 'Could not retrieve community information"); + } else { + $error = &mt("An error occurred while setting parameters '. + 'for Discussion Boards folder: '. + 'Could not retrieve course information"); + } } } else { $r->print($outcome); } } } else { - $error = &mt("An error occurred while retrieving the contents of the group's folder.").'<br />'. - &mt('You need to re-initialize the course.'); + $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 { + $error .= &mt("You need to re-initialize the course."); + } } if ($error ne '') { $r->print('<div class="LC_error">'.$error.'</div>'); @@ -3296,7 +3346,7 @@ sub write_group_data { sub process_membership { my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate, $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg, - $gpterm,$ucgpterm)=@_; + $gpterm,$ucgpterm,$crstype)=@_; my %usersettings = (); my %added= (); my %failed = (); @@ -3501,13 +3551,20 @@ sub process_membership { $r->print('<div class="LC_success">' .&mt($ucgpterm.' membership list updated.') .'</div>'); - $r->print('<p class="LC_info">' - .&mt('Any currently logged in course users affected by the changes you made' + $r->print('<p class="LC_info">'); + 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' .' and log back in for their LON-CAPA sessions to reflect these changes.' - ,'<i>'.$groupname.'</i>') - .'</p>' - ); + ,'<i>'.$groupname.'</i>')); + + } 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 { $r->print('<div class="LC_error">' .&mt("An error occurred while updating the $gpterm membership list:") @@ -3528,7 +3585,6 @@ sub mapping_options { 'adds' => "If automatic $gpterm enrollment is enabled, when a user is newly assigned a ".lc($crstype)."-wide or section-specific role, he/she will automatically be added as a member of the $gpterm, with start and end access dates defined by the default dates set for the $gpterm, unless he/she is already a $gpterm member, with access dates that permit either current or future $gpterm access.", 'drops' => "If automatic $gpterm disenrollment is enabled, when a user's role is expired, access to the $gpterm will be terminated unless the user continues to have other ".lc($crstype)."-wide or section-specific active or future roles which receive automatic membership in the $gpterm.", 'pirs' => "Pick roles and sections for automatic $gpterm enrollment", - 'curr' => 'Currently set to', 'on' => 'on', 'off' => 'off', 'auad' => "Automatically enable $gpterm membership when roles are added?", @@ -3556,14 +3612,14 @@ sub automapping { <span class="LC_nobreak">'.$$lt{'auad'}.': <label><input type="radio" name="autoadd" value="on" />'.&mt('on').' </label><label><input type="radio" name="autoadd" value="off" checked="checked" />'.&mt('off').'</label>'); if ($action eq 'modify') { - $r->print(' ('.$$lt{'curr'}.' <b>'.$$lt{$add}.'</b>)'); + $r->print(' ('.&mt('Currently set to [_1].','<b>'.$$lt{$add}.'</b>').')'); } $r->print(' </span><br /> <span class="LC_nobreak">'.$$lt{'auex'}.': <label><input type="radio" name="autodrop" value="on" />'.&mt('on').' </label><label><input type="radio" name="autodrop" value="off" checked="checked" />'.&mt('off').'</label>'); if ($action eq 'modify') { - $r->print(' ('.$$lt{'curr'}.' <b>'.$$lt{$drop}.'</b>)'); + $r->print(' ('.&mt('Currently set to [_1].','<b>'.$$lt{$drop}.'</b>').')'); } $r->print('</span><br /><br />'.$$lt{'mapr'}); } @@ -3579,7 +3635,7 @@ sub mapping_settings { @sections = ('all','none'); } $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); $r->print(&Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row()); @@ -3622,10 +3678,10 @@ sub print_autorole_item { my ($role,$roletitle,$sections) = @_; my $sections_sel; if (@{$sections} > 0) { - if ($role eq 'cc') { + if (($role eq 'cc') || ($role eq 'co')) { $sections_sel = '<td align="right">'. &mt('all sections').'<input type="hidden" '. - 'name="sec_cc" value="all" /></td>'; + 'name="sec_'.$role.'" value="all" /></td>'; } else { $sections_sel='<td align="right">'. §ions_selection($sections,'sec_'.$role). @@ -3641,7 +3697,13 @@ sub print_autorole_item { } 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; } @@ -3760,17 +3822,19 @@ sub date_setting_table { 'startdate',$starttime); my $endform = &Apache::lonhtmlcommon::date_setter($formname, 'enddate',$endtime); - my $perpetual = - '<span class="LC_nobreak"><label><input type="checkbox" name="no_end_date" />'. - &mt('None').'</label></span>'; - my $table = "<table class=\"LC_descriptive_input\">\n". - '<tr><td class="LC_description">'.&mt('Start:').'</td>'. - '<td>'.$startform.'</td>'. - '<td> </td>'."</tr>\n". - '<tr><td class="LC_description">'.&mt('End:').'</td>'. - '<td>'.$endform.'</td>'. - '<td>'.$perpetual.'</td>'."</tr>\n". - "</table>\n"; + my $perpetual = ' <span class="LC_nobreak"><label>' + .'<input type="checkbox" name="no_end_date" />' + .&mt('No end date') + .'</label></span>'; + my $table = &Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title(&mt('Start Date')) + .$startform + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('End Date')) + .$endform + .$perpetual + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box(); return $table; } @@ -3778,9 +3842,14 @@ sub add_group_folder { my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo, $gpterm,$ucgpterm,$crstype) = @_; if ($cdom eq '' || $cnum eq '') { - return '<span class="LC_error">' - .&mt('Error: invalid course domain or number - group folder creation failed.') - .'</span>'; + my $error = '<span class="LC_error">'; + if ($crstype eq 'Community') { + $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 $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/'; @@ -3848,8 +3917,16 @@ sub add_group_folder { my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum); my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { - return $warning.'<span class="LC_error">'.&mt('Error retrieving course contents'). - ' '.&mt('You need to re-initialize the course.').'</span>'; + $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 my $parm_result; @@ -3954,14 +4031,18 @@ sub new_map { } sub parm_setter { - my ($navmap,$cdom,$url,$groupname) = @_; - my $allresults; + my ($navmap,$cdom,$url,$groupname,$crstype) = @_; if (!defined($navmap)) { - $allresults = '<div class="LC_warning">'. - &mt('Parameters not set for [_1] because the contents of the course could not be retrieved.',$url).' '. - &mt('You need to reinitialize the course.'). - '</div>'; - return $allresults; + 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 = ( 'course' => { @@ -3975,6 +4056,7 @@ sub parm_setter { }, ); my $res = $navmap->getResourceByUrl($url); + my $allresults; if ($res) { my $symb = $res->symb(); foreach my $level (keys(%hide_settings)) { @@ -3991,10 +4073,13 @@ sub parm_setter { } } } else { - $allresults = '<div class="LC_warning">' - .&mt('Parameters not set for [_1] because the resource was not recognized' - .' as part of the course.','<tt>'.$url.'</tt>') - .'</div>'; + $allresults = '<div class="LC_warning">'; + if ($crstype eq 'Community') { + $allresults .= &mt("Parameters not set for [_1] because the resource was not recognized as part of the community.",'<tt>'.$url.'</tt>'); + } 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; }