--- loncom/interface/loncoursegroups.pm 2006/07/04 20:50:52 1.37 +++ loncom/interface/loncoursegroups.pm 2006/11/28 21:38:04 1.66 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.37 2006/07/04 20:50:52 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.66 2006/11/28 21:38:04 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,13 +29,14 @@ package Apache::loncoursegroups; use strict; use Apache::lonnet; -use Apache::loncommon; -use Apache::lonhtmlcommon; +use Apache::loncommon(); +use Apache::lonhtmlcommon(); use Apache::lonlocal; -use Apache::lonnavmaps; -use Apache::longroup; -use Apache::portfolio; +use Apache::lonnavmaps(); +use Apache::longroup(); +use Apache::portfolio(); use Apache::Constants qw(:common :http); +use LONCAPA::map(); use lib '/home/httpd/lib/perl/'; use LONCAPA; @@ -59,15 +60,13 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['action','refpage','state','groupname','branch']); - my $function = &Apache::loncommon::get_users_function(); - my $tabcol = &Apache::loncommon::designparm($function.'.tabbg'); my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $view_permission = - &Apache::lonnet::allowed('vcg',$env{'request.course.id'}); + &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); my $manage_permission = - &Apache::lonnet::allowed('mdg',$env{'request.course.id'}); + &Apache::lonnet::allowed('mdg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); &Apache::lonhtmlcommon::clear_breadcrumbs(); my $gpterm = &Apache::loncommon::group_term(); @@ -91,125 +90,145 @@ sub handler { $idx{uname} = &Apache::loncoursedata::CL_SNAME(); $idx{section} = &Apache::loncoursedata::CL_SECTION(); - my $rowColor1 = "#dddddd"; - my $rowColor2 = "#eeeeee"; - my $action = $env{'form.action'}; my $state = $env{'form.state'}; - if ((!defined($action)) || ($action eq 'view')) { + if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) { if (!defined($state)) { $state = 'view'; } } - if ($action eq 'create' || $action eq 'modify' || $action eq 'view') { + if ($action eq 'create' || $action eq 'modify' || $action eq 'view' || + $action eq 'delete' || $action eq 'reenable') { if ($view_permission || $manage_permission) { - &group_administration($r,$action,$state,$cdom,$cnum,$function, - $tabcol,\%functions,\%idx,$view_permission, - $manage_permission,$rowColor1,$rowColor2, - $gpterm,$ucgpterm,$crstype); + if ($state eq 'view') { + &print_main_menu($r,$cdom,$cnum,\%functions,\%idx, + $view_permission,$manage_permission, + $action,$state,$gpterm,$ucgpterm,$crstype); + } else { + &group_administration($r,$action,$state,$cdom,$cnum, + \%functions,\%idx,$view_permission, + $manage_permission,$gpterm,$ucgpterm, + $crstype); + } } else { $r->print(&mt('You do not have [_1] administration '. 'privileges in this [_2]',$gpterm,lc($crstype))); } } else { - &print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx, - $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); + &print_main_menu($r,$cdom,$cnum,\%functions,\%idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm, + $crstype); } return OK; } sub print_main_menu { - my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm, - $ucgpterm,$crstype) = @_; - my $pagename = "$crstype $ucgpterm".'s'; + my ($r,$cdom,$cnum,$functions,$idx,$view_permission,$manage_permission, + $action,$state,$gpterm,$ucgpterm,$crstype) = @_; my $jscript = qq| function changeSort(caller) { document.$state.sortby.value = caller; document.$state.submit(); +} +function openGroupRoster(group,status) { + var url = '/adm/grouproster?'; + url += 'group='+group+'&status='+status+'&ref=popup'; + var title = 'Group Membership'; + var options = 'scrollbars=1,resizable=1,menubar=0'; + options += ',width=700,height=600'; + rosterbrowser = open(url,title,options,'1'); + rosterbrowser.focus(); }\n|; - $r->print(&header($pagename,$jscript,$action,$state, - undef,$function)); + $r->print(&header('Groups',$jscript,$action,$state)); + if ($env{'form.refpage'} eq 'enrl') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/dropadd", + text=>"Enrollment Manager"}); + } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursegroups", - text=>"$pagename"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename)); - &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); + text=>"Groups"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Groups')); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm, + $crstype); $r->print(&footer()); return; } sub display_groups { - my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, - $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm, - $ucgpterm,$crstype) = @_; + my ($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm,$crstype) = @_; my %curr_groups = (); my %grp_info = (); my %actionlinks = ( modify => ' ' 'Modify', view => 'View', delete => 'Delete', + reenable => 'Re-enable', act => 'Action', - gname => "$ucgpterm Name", - desc => 'Description', + gname => 'Group Name', + desc => 'Group Title', crea => 'Creator', crtd => 'Created', last => 'Last Modified', - func => 'Functionality', + func => 'Collaborative Tools', quot => 'Quota (Mb)', memb => 'Members', file => 'Files', dibd => 'Discussion Boards', dius => 'Disk Use (%)', - nogr => 'No '.$gpterm.'s exist.', - crng => 'Create a new '.$gpterm, + nogr => 'No groups exist.', + crng => 'Create a new group', alth => 'Although your current role has privileges'. - ' to view any existing '.$gpterm.'s in this'. - lc($crstype).', you do not have privileges'. - 'to create new '.$gpterm.'s.', + ' to view any existing groups in this '. + lc($crstype).', you do not have privileges '. + 'to create new groups.', ); if ($view_permission) { if (!defined($action)) { $action = 'view'; } - my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); + my $status; + if ($action eq 'reenable') { + $status = 'deleted_groups'; + } + my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef, + $status); if (%curr_groups) { if ($manage_permission) { - $r->print('
'.$lt{'crng'}.''); + if (!exists($env{'form.refpage'})) { + $r->print('
'.$lt{'crng'}.''); + } } $r->print('

'); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); + $r->print(<<"END"); - - - - - - - - - - - - - - - + + + + + + + + + + + END + $r->print(&Apache::loncommon::end_data_table_header_row()); my %Sortby = (); foreach my $group (sort(keys(%curr_groups))) { %{$grp_info{$group}} = @@ -259,17 +278,10 @@ END push(@{$Sortby{$group}},$group); } } - my $rowNum = 0; - my $rowColor; foreach my $key (sort(keys(%Sortby))) { foreach my $group (@{$Sortby{$key}}) { - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } my $description = - &unescape($grp_info{$group}{'description'}); + &unescape($grp_info{$group}{'description'}); my $creator = $grp_info{$group}{'creator'}; my $creation = $grp_info{$group}{'creation'}; my $modified = $grp_info{$group}{'modified'}; @@ -289,25 +301,42 @@ END $functionality = &mt('None available'); } my $link = $actionlinks{$action}; - if ($action eq 'modify' || $action eq 'delete') { + if ($action eq 'modify' || $action eq 'delete' || + $action eq 'reenable') { $link .= $group; } else { - $link .= $group.'/grppg'; + $link .= $group.'/smppg?ref=grouplist'; + if (exists($env{'form.refpage'})) { + $link .= '&refpage='.$env{'form.refpage'}; + } } $link .= '">'.$lt{$action}.''; if ($action eq 'view') { if (($manage_permission) && ($env{'form.refpage'} ne 'enrl')) { $link .= '  '.$actionlinks{'modify'}. - $group.'">'.$lt{'modify'}.''; + $group.'">'.$lt{'modify'}.''. + '  '.$actionlinks{'delete'}. + $group.'">'.$lt{'delete'}.''; } } - $r->print(''); - $rowNum ++; + $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense'). + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + ''. + &Apache::loncommon::end_data_table_row()); } } - $r->print('
$lt{'act'}$lt{'gname'}$lt{'desc'}$lt{'crea'} - $lt{'crtd'} - $lt{'last'} - $lt{'func'} - $lt{'quot'}$lt{'memb'}$lt{'file'}$lt{'dibd'}$lt{'dius'}
$lt{'act'}$lt{'gname'}$lt{'desc'}$lt{'crea'}$lt{'crtd'}$lt{'last'}$lt{'func'} + $lt{'quot'}$lt{'memb'}$lt{'file'}$lt{'dibd'}$lt{'dius'}
'.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.&mt('Files: ').$totalfiles.'
'.&mt('Folders: ').$totaldirs.'
'.$boards.''.$diskuse.'
'.$link.''.$group.''.$description.''.$creator.''. &Apache::lonnavmaps::timeToHumanString($creation).''. &Apache::lonnavmaps::timeToHumanString($modified).''.$functionality.''.$quota.''.$totalmembers.''.&mt('Files: ').$totalfiles.'
'.&mt('Folders: ').$totaldirs.'
'.$boards.''.$diskuse.'
'); - $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(&Apache::loncommon::end_data_table()); $r->print(''); if ($action eq 'view') { @@ -320,7 +349,9 @@ END } else { $r->print($lt{'nogr'}); if ($manage_permission) { - $r->print('

'.$lt{'crng'}.''); + if (!exists($env{'form.refpage'})) { + $r->print('

'.$lt{'crng'}.''); + } } else { $r->print('

'.$lt{'alth'}); @@ -337,8 +368,7 @@ END $curr_groups{$group}); my $description = &unescape( $group_info{description}); - my ($uname,$udom) = split(/:/,$group_info{creator}); - $r->print(''.$group,'
'.$description.'

'); + $r->print(''.$group,'
'.$description.'

'); } } } else { @@ -351,14 +381,14 @@ END } sub group_administration { - my ($r,$action,$state,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$rowColor1,$rowColor2,$gpterm, - $ucgpterm,$crstype) = @_; + my ($r,$action,$state,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$gpterm,$ucgpterm,$crstype) = @_; my %sectioncount = (); my @tools = (); my @types = (); my @roles = (); my @sections = (); + my @buildsections = (); my %users = (); my %userdata = (); my @members = (); @@ -410,11 +440,9 @@ sub group_administration { if ($state eq '') { if (defined($env{'form.groupname'})) { $state = 'pick_task'; - } else { - $state = 'pick_group'; } } else { - %stored = &retrieve_settings($cdom,$cnum,$groupname); + %stored = &retrieve_settings($cdom,$cnum,$groupname,$action); if (ref($stored{'types'}) eq 'ARRAY') { @types = @{$stored{'types'}}; } @@ -505,11 +533,9 @@ sub group_administration { (($action eq 'modify') && (($state eq 'change_settings') || ($state eq 'add_members')))) { %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum); - if (%sectioncount) { - $elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox'; - $elements{'modify'}{'change_mapping'}{'sectionpick'} = 'selectbox'; - $elements{'modify'}{'add_members'}{'sectionpick'} = 'selectbox'; - } + $elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox'; + $elements{'modify'}{'change_mapping'}{'sectionpick'} = 'selectbox'; + $elements{'modify'}{'add_members'}{'sectionpick'} = 'selectbox'; } if (($action eq 'create') || @@ -523,13 +549,15 @@ sub group_administration { if (defined($env{'form.sectionpick'})) { @sections=&Apache::loncommon::get_env_multiple('form.sectionpick'); if (grep/^all$/,@sections) { - @sections = sort {$a cmp $b} keys(%sectioncount); + @buildsections = sort {$a cmp $b} keys(%sectioncount); + } else { + @buildsections = @sections; } } } if (($state eq 'pick_members') || ($state eq 'pick_privs') || ($state eq 'change_privs')) { - &build_members_list($cdom,$cnum,\@types,\@roles,\@sections,\%users, + &build_members_list($cdom,$cnum,\@types,\@roles,\@buildsections,\%users, \%userdata); } if ($state eq 'pick_members') { @@ -565,7 +593,7 @@ sub group_administration { $num_reenable ++; next; } elsif (($start > $now)) { - $num_activate = 1; + $num_activate ++; next; } else { $num_expire ++; @@ -734,13 +762,13 @@ sub group_administration { my $space_trim = '/^\s*|\s*\$/g,""'; my $float_check = '/^([0-9]*\.?[0-9]*)$/'; $validate_script = ' - var newquota = document.'.$state.'.quota.value; + var newquota = new String(document.'.$state.'.quota.value); newquota.replace('.$space_trim.'); if (newquota == "" ) { document.'.$state.'.quota.value = 0; - newquota = 0; + newquota = "0"; } - var maxposs = '.$maxposs.'; + 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."); return; @@ -791,7 +819,9 @@ function changeSort(caller) { my %states = (); my %branchstates = (); @{$states{'create'}} = ('pick_name','pick_members','pick_privs','result'); - @{$states{'modify'}} = ('pick_group','pick_task'); + @{$states{'modify'}} = ('pick_task'); + @{$states{'delete'}} = ('verify','result'); + @{$states{'reenable'}} = ('verify','result'); @{$branchstates{'noprivs'}} = ('result'); @{$branchstates{'settings'}} = ('change_settings','chgresult'); @{$branchstates{'members'}} = ('change_members','change_privs','memresult'); @@ -802,7 +832,7 @@ function changeSort(caller) { push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}}); } - if (($action eq 'create') || ($action eq 'modify')) { + if (($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) { my $done = 0; my $i=0; while ($i<@{$states{$action}} && !$done) { @@ -815,20 +845,30 @@ function changeSort(caller) { } my $loaditems = &onload_action($action,$state); - my $crumbtitle = "$crstype $ucgpterm".'s'; - $r->print(&header("$crumbtitle Manager", - $jscript,$action,$state,$page,$function,$loaditems)); + $r->print(&header("Groups Manager", + $jscript,$action,$state,$page,$loaditems)); if ($env{'form.refpage'} eq 'enrl') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/dropadd", text=>"Enrollment Manager", faq=>9,bug=>'Instructor Interface',}); - } else { + if ($action eq 'modify' || $action eq 'delete') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/coursegroups?refpage=enrl&action=$action", + text=>"Groups", + faq=>9,bug=>'Instructor Interface',}); + } + } else { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/coursegroups", - text=>"$crumbtitle", - faq=>9,bug=>'Instructor Interface',}); + ({href=>"/adm/coursegroups", + text=>"Groups", + faq=>9,bug=>'Instructor Interface',}); + if ($env{'form.refpage'} eq 'grouplist') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/$cdom/$cnum/$env{'form.groupname'}/smppg?ref=grouplist", + text=>"Group: $description",}); + } } my %trail = (); @@ -839,7 +879,6 @@ function changeSort(caller) { result => 'Creation Complete', ); %{$trail{'modify'}} = &Apache::lonlocal::texthash( - pick_group => $ucgpterm.'s', pick_task => 'Choose Task', change_settings => "$ucgpterm Settings", change_members => 'Modify/Delete Members', @@ -852,6 +891,14 @@ function changeSort(caller) { memresult => 'Modifications Complete', addresult => 'Additions Complete', ); + %{$trail{'delete'}} = &Apache::lonlocal::texthash( + verify => 'Verify deletion', + result => 'Deletion Complete' + ); + %{$trail{'reenable'}} = &Apache::lonlocal::texthash( + verify => 'Verify Re-enable', + result => 'Re-enabled' + ); my %navbuttons = &Apache::lonlocal::texthash( gtns => 'Go to next step', gtps => 'Go to previous step', @@ -860,53 +907,61 @@ function changeSort(caller) { gtpp => 'Go to previous page', adme => 'Add members', ); - if ((($action eq 'create') || ($action eq 'modify')) && + if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete') || ($action eq 'reenable')) && ($manage_permission)) { for (my $i=0; $i<@{$states{$action}}; $i++) { if ($state eq $states{$action}[$i]) { &Apache::lonhtmlcommon::add_breadcrumb( {text=>"$trail{$action}{$state}"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs - ("$crumbtitle Manager")); - &display_control($r,$cdom,$cnum,$tabcol,$action,$state,$page, + ("Groups Manager","Creating_Groups")); + &display_control($r,$cdom,$cnum,$action,$state,$page, \%sectioncount,$groupname,$description,$functions, \@tools,$toolprivs,$fixedprivs,$startdate,$enddate, \%users,\%userdata,$idx,\%memchg,\%usertools, - $function,$view_permission,$manage_permission, + $view_permission,$manage_permission, \%stored,$granularity,$quota,$specificity,\@types,\@roles, - \@sections,\%states,\%navbuttons,$rowColor1,$rowColor2, - $gpterm,$ucgpterm,$crstype); + \@sections,\%states,\%navbuttons,$gpterm,$ucgpterm, + $crstype); last; } else { - if (($state eq 'result') && ($i > 0)) { - &Apache::lonhtmlcommon::add_breadcrumb( + if (($action eq 'create') || ($action eq 'modify')) { + if (($state eq 'result') && ($i > 0)) { + &Apache::lonhtmlcommon::add_breadcrumb( {href=>"javascript:backPage(document.$state,'$states{$action}[0]')", text=>"$trail{$action}{$states{$action}[$i]}"}); - } else { - &Apache::lonhtmlcommon::add_breadcrumb( + } else { + &Apache::lonhtmlcommon::add_breadcrumb( {href=>"javascript:backPage(document.$state,'$states{$action}[$i]')", text=>"$trail{$action}{$states{$action}[$i]}"}); + } } - } + } } } elsif (($action eq 'view') && ($view_permission)) { &Apache::lonhtmlcommon::add_breadcrumb( {text=>"View $gpterm".'s'}); - my $crumbtitle = "$crstype $ucgpterm".'s Manager'; $r->print(&Apache::lonhtmlcommon::breadcrumbs - (&mt($crumbtitle))); - &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); - + ('Groups Manager')); + &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, + $manage_permission,$action,$state,$gpterm,$ucgpterm, + $crstype); } $r->print(&footer()); return; } sub retrieve_settings { - my ($cdom,$cnum,$groupname) = @_; - my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname); + my ($cdom,$cnum,$groupname,$action) = @_; + my %curr_groups; + my $namespace; + if ($action eq 'reenable') { + $namespace = 'deleted_groups'; + } else { + $namespace = 'coursegroups'; + } + %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$groupname, + $namespace); return if (!%curr_groups); @@ -951,6 +1006,7 @@ sub retrieve_settings { foreach my $role (sort(keys(%{$groupinfo{'autosec'}}))) { if (ref($groupinfo{'autosec'}{$role}) eq 'ARRAY') { foreach my $section (@{$groupinfo{'autosec'}{$role}}) { + push (@{$stored{'sec_'.$role}},$section); } if (@{$groupinfo{'autosec'}{$role}} > 0) { @@ -963,110 +1019,369 @@ sub retrieve_settings { } sub display_control { - my ($r,$cdom,$cnum,$tabcol,$action,$state,$page,$sectioncount,$groupname, + my ($r,$cdom,$cnum,$action,$state,$page,$sectioncount,$groupname, $description,$functions,$tools,$toolprivs,$fixedprivs,$startdate, - $enddate,$users,$userdata,$idx,$memchg,$usertools,$function, + $enddate,$users,$userdata,$idx,$memchg,$usertools, $view_permission,$manage_permission,$stored,$granularity,$quota, - $specificity,$types,$roles,$sections,$states,$navbuttons,$rowColor1, - $rowColor2,$gpterm,$ucgpterm,$crstype) = @_; + $specificity,$types,$roles,$sections,$states,$navbuttons, + $gpterm,$ucgpterm,$crstype) = @_; if ($action eq 'create') { if ($state eq 'pick_name') { - &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page, + &general_settings_form($r,$cdom,$cnum,$action,$state,$page, $functions,$tools,$toolprivs,$fixedprivs, $sectioncount,$stored,$states,$navbuttons, - $rowColor1,$rowColor2,$gpterm,$ucgpterm, - $crstype); + $gpterm,$ucgpterm,$crstype); } elsif ($state eq 'pick_members') { - &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &choose_members_form($r,$cdom,$cnum,$action,$state,$page, $groupname,$description,$granularity,$quota, $startdate,$enddate,$tools,$fixedprivs, $toolprivs,$functions,$users,$userdata,$idx, - $stored,$states,$navbuttons,$rowColor1, - $rowColor2,$gpterm,$ucgpterm,$crstype); + $stored,$states,$navbuttons,$gpterm,$ucgpterm, + $crstype); } elsif ($state eq 'pick_privs') { - &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &choose_privs_form($r,$cdom,$cnum,$action,$state,$page, $startdate,$enddate,$tools,$functions, $toolprivs,$fixedprivs,$userdata,$usertools, $idx,$states,$stored,$sectioncount,$navbuttons, - $rowColor1,$rowColor2,$gpterm,$ucgpterm, - $crstype); + $gpterm,$ucgpterm,$crstype); } elsif ($state eq 'result') { - &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &process_request($r,$cdom,$cnum,$action,$state,$page, $groupname,$description,$specificity,$userdata, $startdate,$enddate,$tools,$functions, $toolprivs,$usertools,$idx,$types,$roles, $sections,$states,$navbuttons,$memchg, - $sectioncount,$stored,$rowColor1,$rowColor2, - $gpterm,$ucgpterm,$crstype); + $sectioncount,$stored,$gpterm,$ucgpterm,$crstype); } } elsif ($action eq 'modify') { my $groupname = $env{'form.groupname'}; - if ($state eq 'pick_group') { - &display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, - $view_permission,$manage_permission,$action,$state, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); - } elsif ($state eq 'pick_task') { + if ($state eq 'pick_task') { &modify_menu($r,$groupname,$page,$gpterm); } elsif ($state eq 'change_settings') { - &general_settings_form($r,$cdom,$cnum,$action,$tabcol,$state,$page, + &general_settings_form($r,$cdom,$cnum,$action,$state,$page, $functions,$tools,$toolprivs,$fixedprivs, $sectioncount,$stored,$states,$navbuttons, - $rowColor1,$rowColor2,$gpterm,$ucgpterm, - $crstype); + $gpterm,$ucgpterm,$crstype); } elsif ($state eq 'change_members') { - &change_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &change_members_form($r,$cdom,$cnum,$action,$state,$page, $groupname,$description,$startdate,$enddate, $tools,$fixedprivs,$functions,$users, $userdata,$granularity,$quota,$specificity, - $idx,$states,$navbuttons,$rowColor1,$rowColor2, - $gpterm,$ucgpterm); + $idx,$states,$navbuttons,$gpterm,$ucgpterm); } elsif ($state eq 'add_members') { - &add_members_form($r,$tabcol,$action,$state,$page,$startdate, + &add_members_form($r,$cdom,$cnum,$action,$state,$page,$startdate, $enddate,$groupname,$description,$granularity, $quota,$sectioncount,$tools,$functions,$stored, - $states,$navbuttons,$rowColor1,$rowColor2,$gpterm, - $ucgpterm); + $states,$navbuttons,$gpterm,$ucgpterm); } elsif ($state eq 'pick_members') { - &choose_members_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &choose_members_form($r,$cdom,$cnum,$action,$state,$page, $groupname,$description,$granularity,$quota, $startdate,$enddate,$tools,$fixedprivs, $toolprivs,$functions,$users,$userdata,$idx, - $stored,$states,$navbuttons,$rowColor1, - $rowColor2,$gpterm,$ucgpterm,$crstype); + $stored,$states,$navbuttons,$gpterm,$ucgpterm, + $crstype); } elsif ($state eq 'pick_privs') { - &choose_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &choose_privs_form($r,$cdom,$cnum,$action,$state,$page, $startdate,$enddate,$tools,$functions, $toolprivs,$fixedprivs,$userdata,$usertools, $idx,$states,$stored,$sectioncount,$navbuttons, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); + $gpterm,$ucgpterm,$crstype); } elsif ($state eq 'change_privs') { - &change_privs_form($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &change_privs_form($r,$cdom,$cnum,$action,$state,$page, $startdate,$enddate,$tools,$functions, $toolprivs,$fixedprivs,$userdata,$usertools, $memchg,$idx,$states,$stored,$sectioncount, - $navbuttons,$rowColor1,$rowColor2,$gpterm, - $ucgpterm); + $navbuttons,$gpterm,$ucgpterm); } elsif ($state eq 'chgresult' || $state eq 'memresult' || $state eq 'addresult') { - &process_request($r,$cdom,$cnum,$tabcol,$action,$state,$page, + &process_request($r,$cdom,$cnum,$action,$state,$page, $groupname,$description,$specificity,$userdata, $startdate,$enddate,$tools,$functions, $toolprivs,$usertools,$idx,$types,$roles, $sections,$states,$navbuttons,$memchg, - $sectioncount,$stored,$rowColor1,$rowColor2, - $gpterm,$ucgpterm,$crstype); + $sectioncount,$stored,$gpterm,$ucgpterm,$crstype); + } + } elsif ($action eq 'delete') { + my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action); + if ($state eq 'verify') { + &verify_delete($r,$groupname,$state,$action,$page,$states, + \%stored); + } elsif ($state eq 'result') { + &delete_group($r,$cdom,$cnum,$groupname); + } + } 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); + } elsif ($state eq 'result') { + &reenable_group($r,$cdom,$cnum,$groupname); } } } +sub verify_delete { + my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_; + $r->print(&Apache::lonhtmlcommon::echo_form_input([])); + $r->print(&mt("You have requested deletion of the following group: ").''. + $stored->{'description'}.''. + '

'.&mt('When a group is deleted the following occurs:').'
    '. + '
  • '.&mt('All group membership is terminated.').'
  • '. + '
  • '.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'
  • '. + '
  • '.&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.').'
  • '. + '
'.&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; + if ($env{'form.refpage'} eq 'enrl') { + $prev = 'view'; + } + &display_navbuttons($r,$formname,$prev,$prevtext, + $$states{$action}[$page+1],$nexttext); + return; +} + +sub delete_group { + my ($r,$cdom,$cnum,$groupname) = @_; + my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, + $groupname); + my $now = time; + my $num_users = 0; + my $num_fail = 0; + my $num_ok = 0; + my @deleted; + my @undeleted; + my %usersettings; + foreach my $key (sort(keys(%membership))) { + if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) { + my $user = $1; + my($end,$start,$userprivs) = split(/:/,$membership{$key},3); + if ($start != -1) { + $num_users ++; + $usersettings{$groupname.':'.$user} = $now.':-1:'.$userprivs; + if (&Apache::lonnet::modify_group_roles($cdom,$cnum, + $groupname,$user, + $now,'-1',$userprivs) + eq 'ok') { + $num_ok ++; + push(@deleted,$user); + } else { + push(@undeleted,$user); + $num_fail ++; + } + } + } + } + if ($num_ok > 0) { + my $roster_result = + &Apache::lonnet::modify_coursegroup_membership($cdom,$cnum, + \%usersettings); + } + if ($num_fail > 0) { + $r->print(&mt('Group deletion failed because deletion of [_1] out of [_2] members failed.',$num_fail,$num_users)); + + } else { + my ($result,$message) = + &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum, + $groupname,'delete'); + if ($result eq 'ok') { + my $outcome = &modify_folders($cdom,$cnum,$groupname); + if ($outcome eq '') { + $r->print(&mt('Group successfully deleted.')); + } else { + $r->print(&mt("Although the group was deleted, an error ([_1]) occurred when removing the group's folder from the 'Course Groups' folder.",$outcome)); + } + } else { + $r->print(&mt('Group deletion failed.')); + } + } + return; +} + +sub reenable_folder { + my ($cdom,$cnum,$groupname,$description) = @_; + my $outcome; + my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/'; + my $allgrpsmap = $crspath.'group_allfolders.sequence'; + my $foldertitle = &mt('Course Folder -').$description; + my $mapurl = $crspath.'group_folder_'. + $groupname.'.sequence'; + my ($errtext,$fatal)=&LONCAPA::map::mapread($allgrpsmap); + if ($fatal) { + $outcome=&mt('Error reading contents of parent folder to group'). + " ($allgrpsmap): $errtext".'
'; + } else { + my $idx=&LONCAPA::map::getresidx($mapurl); + $LONCAPA::map::resources[$idx] = $foldertitle.':'.$mapurl. + ':false:normal:res'; + $LONCAPA::map::order[1+$#LONCAPA::map::order]=$idx; + my ($outtext,$errtext) = &LONCAPA::map::storemap($allgrpsmap,1); + if ($errtext) { + $outcome = &mt('Error storing updated parent folder to group'). + "- $allgrpsmap - $errtext".'
'; + } else { + my ($furl,$ferr) = + &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + } + } + return $outcome; +} + +sub modify_folders { + my ($cdom,$cnum,$groupname) = @_; + my $outcome; + my $navmap = Apache::lonnavmaps::navmap->new(); + my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'. + $groupname.'.sequence'; + my $groupmapres = $navmap->getResourceByUrl($groupmap); + my ($map,$id,$src); + if ($groupmapres) { + ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb()); + } + undef($navmap); + if ($map) { + $map = '/'.$map; + my ($errtext,$fatal) = &LONCAPA::map::mapread($map); + if ($fatal) { + $outcome=&mt('Error reading contents of parent folder to group'). + " ($map): $errtext".'
'; + } else { + my $idx = 0; + my $grpidx; + foreach my $item (@LONCAPA::map::order) { + my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$item]); + $url=&LONCAPA::map::qtescape($url); + if ($url eq $groupmap) { + $grpidx = $idx; + last; + } else { + $idx++; + } + } + + if ($grpidx ne '') { + &LONCAPA::map::makezombie($LONCAPA::map::order[$grpidx]); + for (my $i=$grpidx;$i<$#LONCAPA::map::order;$i++) { + $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1]; + } + $#LONCAPA::map::order--; + my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1); + if ($errtext) { + $outcome = &mt('Error storing updated parent folder to group'). "- $map - $errtext".'
'; + } else { + my ($furl,$ferr) = + &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + } + } + } + } + return $outcome; +} + +sub verify_reenable { + my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_; + $r->print(&Apache::lonhtmlcommon::echo_form_input([])); + $r->print(&mt("You have requested enabling the following previously deleted group: ").''. + $stored->{'description'}.''. + '

'.&mt('When a deleted group is re-enabled the following occurs:').'
    '. + '
  • '.&mt('Group settings and membership at the time the group was deleted are reinstated.').'
  • '. + '
  • '.&mt('A group folder is added to the "Course Groups" folder which contains folders for all groups in the course.').'
'); + my $prevtext = &mt('Go back'); + my $nexttext = &mt('Reenable group'); + my $prev; + if ($env{'form.refpage'} eq 'enrl') { + $prev = 'view'; + } + &display_navbuttons($r,$formname,$prev,$prevtext, + $$states{$action}[$page+1],$nexttext); + return; +} + +sub reenable_group { + my ($r,$cdom,$cnum,$groupname) = @_; + my %groups = + &Apache::longroup::coursegroups($cdom,$cnum,$groupname, + 'deleted_groups'); + if (keys(%groups) == 0) { + $r->print(&mt('The group ([_1]) was not re-enabled, because it is not a deleted group.
Perhaps it has already been re-enabled?',$groupname)); + return; + } + my %groupinfo = + &Apache::longroup::get_group_settings($groups{$groupname}); + my $defstart = $groupinfo{'startdate'}; + my $defend = $groupinfo{'enddate'}; + my $showstart = &Apache::lonlocal::locallocaltime($defstart); + my $showend; + if ($defend == 0) { + $showend = &mt('No end date set'); + } else { + $showend = &Apache::lonlocal::locallocaltime($defend); + } + my $description = &unescape($groupinfo{'description'}); + my $num_users = 0; + my $num_ok = 0; + my $num_fail = 0; + my (%usersettings,@enabled,@unenabled); + my ($result,$message) = + &Apache::lonnet::toggle_coursegroup_status($cdom,$cnum,$groupname, + 'reenable'); + if ($result eq 'ok') { + my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, + $groupname); + foreach my $key (sort(keys(%membership))) { + if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) { + my $user = $1; + my($end,$start,$userprivs) = split(/:/,$membership{$key},3); + if (($start == -1) && ($end == $groupinfo{'modified'})) { + $num_users ++; + $usersettings{$groupname.':'.$user} = $defend.':'. + $defstart.':'. + $userprivs; + if (&Apache::lonnet::modify_group_roles($cdom,$cnum, + $groupname,$user, + $defend,$defstart, + $userprivs) eq 'ok') { + $num_ok ++; + push(@enabled,$user); + } else { + push(@unenabled,$user); + $num_fail ++; + } + } + } + } + if ($num_users > 0) { + if ($num_ok > 0) { + my $roster_result = + &Apache::lonnet::modify_coursegroup_membership($cdom,$cnum, + \%usersettings); + if ($roster_result eq 'ok') { + $r->print(&mt('Membership reinstated for [_1] users, each with start and end dates for group access set to defaults: [_2] and [_3]',$num_ok,$showstart,$showend).'
'); + } + } else { + $r->print(&mt('A problem occurred when trying to reinstate [_1] of the [_2] members of the pre-existing group.',$num_fail,$num_users).'
'); + } + } else { + $r->print(&mt('There were no group members to reinstate, as none were removed when the group was deleted.').'
'); + } + my $outcome = &reenable_folder($cdom,$cnum,$groupname,$description); + if ($outcome eq '') { + $r->print(&mt('Group successfully re-enabled.')); + } else { + $r->print(&mt("Although the group was re-enabled, an error ([_1]) occurred when adding the group's folder to the 'Course Groups' folder.",$outcome)); + } + } else { + $r->print(&mt('Re-enabling group failed')); + } + return; +} + sub header { - my ($bodytitle,$jscript,$action,$state,$page,$function,$loaditems) = @_; + my ($bodytitle,$jscript,$action,$state,$page,$loaditems) = @_; my $start_page= &Apache::loncommon::start_page($bodytitle, '', - {'function' => $function, - 'add_entries' => $loaditems,}); + {'add_entries' => $loaditems,}); my $output = <<"END"; $start_page
@@ -1096,8 +1411,7 @@ sub onload_action { } if (($action eq 'modify') && ($state eq 'change_settings' || $state eq 'change_members' || - $state eq 'change_privs' || $state eq 'add_members' || - $state eq 'pick_members')) { + $state eq 'change_privs' || $state eq 'add_members')) { $loaditems{'onload'} = 'javascript:setFormElements(document.'.$state.')'; } @@ -1150,59 +1464,65 @@ sub group_members { my ($cdom,$cnum,$group,$group_info) = @_; my %memberhash = &Apache::lonnet::get_group_membership($cdom,$cnum,$group); my $now = time; - my ($tmp)=keys(%memberhash); - if ($tmp=~/^error:/) { - $$group_info{'totalmembers'} = 'Unknown - an error occurred'; - return $tmp; - } + my %lt = &Apache::lonlocal::texthash ( + active => 'active', + previous => 'previous', + future => 'future', + ); + my %membercounts = ( + active => 0, + previous => 0, + future => 0, + ); my $totalmembers = 0; - my $active = 0; - my $previous = 0; - my $future = 0; foreach my $member (keys %memberhash) { $totalmembers ++; my ($end,$start) = split(/:/,$memberhash{$member}); unless ($start == -1) { if (($end!=0) && ($end<$now)) { - $previous ++; + $membercounts{previous} ++; } elsif (($start!=0) && ($start>$now)) { - $future ++; + $membercounts{future} ++; } else { - $active ++; + $membercounts{active} ++; } } } if ($totalmembers == 0) { $$group_info{$group}{'totalmembers'} = 'None'; } else { - $$group_info{$group}{'totalmembers'} = $active.' - active
'.$previous.' -previous
'.$future.' -future'; + foreach my $type ('active','previous','future') { + $$group_info{$group}{'totalmembers'} .= + &open_list_window($group,$type,$membercounts{$type},$lt{$type}); + } } return 'ok'; } +sub open_list_window { + my ($group,$status,$count,$text) = @_; + my $entry; + if ($count > 0) { + $entry = ''.$text.' - '.$count. + '
'; + } else { + $entry = ''.$text.' - '.$count.'
'; + } + return $entry; +} + sub general_settings_form { - my ($r,$cdom,$cnum,$action,$tabcol,$formname,$page,$functions,$tools, + my ($r,$cdom,$cnum,$action,$formname,$page,$functions,$tools, $toolprivs,$fixedprivs,$sectioncount,$stored,$states,$navbuttons, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_; + $gpterm,$ucgpterm,$crstype) = @_; my ($nexttext,$prevtext); - $r->print('
- -'); - &groupsettings_options($r,$tabcol,$functions,$action,$formname,$stored,1, + &groupsettings_options($r,$functions,$action,$formname,$stored,1, $gpterm,$ucgpterm,$crstype); - $r->print(' - - - '); - &access_date_settings($r,$tabcol,$action,$formname,$stored,2,$gpterm, - $ucgpterm); - $r->print(' - - - '); + &access_date_settings($r,$action,$formname,$stored,2,$gpterm,$ucgpterm); if ($action eq 'create') { - &membership_options($r,$action,$formname,$tabcol,$sectioncount,3, + &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,3, $gpterm,$ucgpterm); $nexttext = $$navbuttons{'gtns'}; } else { @@ -1210,53 +1530,44 @@ sub general_settings_form { my @unavailable = (); &check_tools($functions,$tools,\@available,\@unavailable); @{$tools} = sort(keys(%{$functions})); - &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action, - 3,$tools,$stored,$toolprivs,$fixedprivs, - \@available,$formname,$gpterm,$ucgpterm); - $r->print(' - - - '); - &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount, - $states,$stored,$navbuttons,4,5,$rowColor1, - $rowColor2,$gpterm,$ucgpterm,$crstype); + &privilege_specificity($r,$action,3,$tools,$stored,$toolprivs, + $fixedprivs,\@available,$formname, + $gpterm,$ucgpterm); + &mapping_options($r,$action,$formname,$page,$sectioncount, + $states,$stored,$navbuttons,4,5, + $gpterm,$ucgpterm,$crstype,$cdom,$cnum); $nexttext = $$navbuttons{'mose'}; } $prevtext = $$navbuttons{'gtpp'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, $$states{$action}[$page+1],$nexttext); - $r->print(' -
 
 
 
'); return; } sub groupsettings_options { - my ($r,$tabcol,$functions,$action,$formname,$stored,$image,$gpterm, + my ($r,$functions,$action,$formname,$stored,$image,$gpterm, $ucgpterm,$crstype) = @_; my %lt = &Apache::lonlocal::texthash( - 'gdat' => "$ucgpterm open and close dates", - 'sten' => "Set a start date/time and end date/time for the $gpterm", - 'gfun' => "$ucgpterm functionality", - 'gnde' => "$ucgpterm name, description and available functionality", - 'desc' => 'Description', - 'func' => 'Functionality', - 'gnam' => "$ucgpterm Name", - 'doyo' => "Do you want to assign different functionality ". - "to different $gpterm members?", + 'gdat' => "Group access start and end dates", + 'gnde' => "Group name, title and available collaborative tools", + 'desc' => 'Group Title', + 'func' => 'Collaborative Tools', + 'gnam' => 'Group Name', + 'lett' => 'Letters, numbers and underscore only', + 'doyo' => 'Different subsets of the chosen collaborative tools '. + 'for different group members?', ); my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,$stored); - &topic_bar($r,$tabcol,$image,$lt{'gnde'}); + &topic_bar($r,$image,$lt{'gnde'}); $r->print(' - -   - - +
- + - + - + END my $numitems = keys(%{$functions}); my $halfnum = int($numitems/2); @@ -1305,7 +1616,7 @@ END - + -
'.$lt{'gnam'}.':'.$lt{'gnam'}.': '); if ($action eq 'create') { - $r->print(''); + $r->print(' ('. + $lt{'lett'}.')'); } else { $r->print(''.$env{'form.groupname'}); @@ -1265,13 +1576,13 @@ sub groupsettings_options {
$lt{'desc'}:$lt{'desc'}:
$lt{'func'}:$lt{'func'}:
'.&mt('Granularity:').''.&mt('Granularity:').' '.$lt{'doyo'}.'  '); if ($action eq 'modify') { $r->print('  ('.&mt('Currently set to "[_1]"', @@ -1315,7 +1626,7 @@ END
'.&mt('Disk quota: ').''); + '.&mt('Disk quota: ').''); if ($action eq 'create') { $r->print(&mt('If you enable the file repository for the [_1], allocate a disk quota.',$gpterm)); } else { @@ -1324,23 +1635,21 @@ END $r->print(' Mb'); if ($action eq 'create') { $r->print('
'. - &mt('A total of [_1] Mb is shared between all [_2]s in the '. + &mt('A total of [_1] Mb can be divided amongst all [_2]s in the '. '[_3], and [_4] Mb are currently unallocated.',$crsquota, - $gpterm,lc($crstype),$freespace)); + $gpterm,lc($crstype),sprintf("%.2f",$freespace))); } else { $r->print('  ('.&mt('The quota is currently [_1] Mb', $$stored{'quota'}).').'); $r->print('
'.&mt('The quota can be increased to [_1] Mb, '. 'by adding all unallocated space for [_2]s in the [_3].', - $maxposs,$gpterm,lc($crstype))); + sprintf("%.2f",$maxposs),$gpterm,lc($crstype))); } $r->print('
- - '); return; } @@ -1362,18 +1671,18 @@ sub get_quota_constraints { } sub membership_options { - my ($r,$action,$state,$tabcol,$sectioncount,$image,$gpterm,$ucgpterm) = @_; + my ($r,$cdom,$cnum,$action,$state,$sectioncount,$image,$gpterm,$ucgpterm)=@_; my $crstype = &Apache::loncommon::course_type(); my %lt = &Apache::lonlocal::texthash( - 'pipa' => 'Pick parameters to generate membership list', - 'gmem' => "$ucgpterm membership options", + '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 $gpterm.", - 'admg' => "additional members of the $gpterm.", + '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 $gpterm, do not make any selections.", - 'asub' => "A subsequent step will also allow you to specify automatic adding/dropping of $gpterm members triggered by specified role and section changes.", + "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 changes in the course.", 'acty' => 'Access types', 'coro' => $crstype.' roles', 'cose' => $crstype.' sections', @@ -1384,17 +1693,13 @@ sub membership_options { future => &mt('Will have future access'), ); - #FIXME need to plumb around for the various cr roles defined by the user - my @roles = ('st','cc','in','ta','ep'); + my @roles = ('st','cc','in','ta','ep','cr'); my @sections = keys(%{$sectioncount}); - &topic_bar($r,$tabcol,$image,$lt{'pipa'}); + &topic_bar($r,$image,$lt{'pipa'}); $r->print(' - -   - - '.$lt{'gmem'}.'
'.$lt{'picr'}); + '.$lt{'gmem'}.'
'.$lt{'picr'}); if ($action eq 'create') { $r->print($lt{'meof'}.'
'.$lt{'ifno'}.'
'.$lt{'asub'}); } else { @@ -1403,34 +1708,26 @@ sub membership_options { $r->print('

- +
- - - '); - if (@sections >0) { - $r->print(' - - - '); - } - $r->print(''); + + + + '); - $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles)); + $r->print(' - '); + } else { + @sections = ('all','none'); } - $r->print(' + $r->print(' -
'.$lt{'acty'}.' '.$lt{'coro'}.' '.$lt{'cose'}.' 
'.$lt{'acty'}.''.$lt{'coro'}.''.$lt{'cose'}.'
'); $r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types)); - $r->print(' '); + $r->print(&Apache::lonhtmlcommon::role_select_row(\@roles,undef,undef,1,$cdom,$cnum)); if (@sections > 0) { @sections = sort {$a cmp $b} @sections; unshift(@sections,'none'); # Put 'no sections' next unshift(@sections,'all'); # Put 'all' at the front of the list - $r->print(' '. - §ions_selection(\@sections,'sectionpick').''. + §ions_selection(\@sections,'sectionpick').'
- - '); + '); return; } @@ -1443,7 +1740,7 @@ sub sections_selection { } foreach my $sec (@{$sections}) { if ($sec eq 'all') { - $section_sel .= ' '."\n"; + $section_sel .= ' '."\n"; } elsif ($sec eq 'none') { $section_sel .= ' '."\n"; } else { @@ -1458,7 +1755,7 @@ sub sections_selection { } sub access_date_settings { - my ($r,$tabcol,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_; + my ($r,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash( 'sten' => "Default start and end dates for $gpterm access", ); @@ -1470,29 +1767,19 @@ sub access_date_settings { $endtime = $$stored{'enddate'}; } } - my ($start_table,$end_table) = &date_setting_table - ($starttime,$endtime,$formname); - &topic_bar($r,$tabcol,$image,$lt{'sten'}); + my ($table) = &date_setting_table($starttime,$endtime,$formname); + &topic_bar($r,$image,$lt{'sten'}); $r->print(' - -   - '.$start_table.' - - -   - - -   - '.$end_table.' - '); + '.$table.' + '); return; } sub choose_members_form { - my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$groupname,$description, + my ($r,$cdom,$cnum,$action,$formname,$page,$groupname,$description, $granularity,$quota,$startdate,$enddate,$tools,$fixedprivs,$toolprivs, $functions,$users,$userdata,$idx,$stored,$states,$navbuttons, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype) = @_; + $gpterm,$ucgpterm,$crstype) = @_; my @regexps = ('user_','userpriv_','sec_'); my %origmembers; $r->print(&Apache::lonhtmlcommon::echo_form_input( @@ -1501,17 +1788,10 @@ sub choose_members_form { \@regexps)); my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm, $ucgpterm,$crstype); - $r->print(' - - - - '); + $r->print($earlyout); &display_navbuttons($r,$formname,$$states{$action}[$page-1], $$navbuttons{'gtps'}); - $r->print('
  -'); if ($earlyout) { - $r->print($earlyout.'
'); return; } my ($specimg,$memimg); @@ -1519,10 +1799,9 @@ sub choose_members_form { my @unavailable = (); &check_tools($functions,$tools,\@available,\@unavailable); if ($action eq 'create') { - &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, - $functions,$startdate,$enddate,$groupname, - $description,$granularity,$quota,\@available, - \@unavailable,$gpterm,$ucgpterm); + &print_current_settings($r,$action,$functions,$startdate,$enddate, + $groupname,$description,$granularity,$quota, + \@available,\@unavailable,$gpterm,$ucgpterm); $specimg = 4; $memimg = 5; } else { @@ -1542,13 +1821,12 @@ sub choose_members_form { } } } - &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$action, - $specimg,$tools,$stored,$toolprivs, + &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs, $fixedprivs,\@available,$formname,$gpterm,$ucgpterm); - my $newusers = &pick_new_members($r,$action,$formname,$tabcol,$rowColor1, - $rowColor2,\@available,$idx,$stored, - $memimg,$users,$userdata,$granularity, - \%origmembers,$gpterm,$ucgpterm); + my $newusers = &pick_new_members($r,$action,$formname,\@available,$idx, + $stored,$memimg,$users,$userdata, + $granularity,\%origmembers,$gpterm, + $ucgpterm); if ($newusers || $action eq 'create') { &display_navbuttons($r,$formname,$$states{$action}[$page-1], $$navbuttons{'gtps'},$$states{$action}[$page+1], @@ -1557,34 +1835,29 @@ sub choose_members_form { &display_navbuttons($r,$formname,$$states{$action}[$page-1], $$navbuttons{'gtps'}); } - $r->print(''); return; } sub display_navbuttons { my ($r,$formname,$prev,$prevtext,$next,$nexttext) = @_; - $r->print(' - -   - - -   - '); + $r->print('
'); if ($prev) { $r->print('    '); + } elsif ($prevtext) { + $r->print(' + +    '); } if ($next) { $r->print(' '); } - $r->print(' - - -'); + $r->print('
'); } sub check_tools { @@ -1600,20 +1873,19 @@ sub check_tools { } sub print_current_settings { - my ($r,$action,$tabcol,$rowColor1,$rowColor2,$functions,$startdate,$enddate, - $groupname,$description,$granularity,$quota,$available,$unavailable, - $gpterm,$ucgpterm) = @_; + my ($r,$action,$functions,$startdate,$enddate,$groupname,$description, + $granularity,$quota,$available,$unavailable,$gpterm,$ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash( - grna => "$ucgpterm Name", - desc => 'Description', - grfn => "$ucgpterm Functions", + grna => 'Group Name', + desc => 'Group Title', + grfn => "Collaborative Tools", gran => 'Granularity', quot => 'File quota', dfac => 'Default access dates', - ygrs => "Your $gpterm selections", - tfwa => "The following settings will apply to the $gpterm:", - difn => 'Different functionality
for different members:', + ygrs => "Your group selections - ", + tfwa => "The following settings will apply to the group:", + difn => 'Different collaborative tools
for different members:', stda => 'Start date', enda => 'End date:', ); @@ -1624,37 +1896,32 @@ sub print_current_settings { } else { $showend = &Apache::lonlocal::locallocaltime($enddate); } - $r->print(''); if ($action eq 'create') { $r->print(' - - -'); +'); } - $r->print(' - - - - - - - - - - - - - - - - - - - - - - - - + + - END - &member_privs_entries($r,$tabcol,$rowColor1,$rowColor2, - $usertools,$toolprivs,$fixedprivs, + $r->print(&Apache::loncommon::end_data_table_header_row()); + &member_privs_entries($r,$usertools,$toolprivs,$fixedprivs, $userdata,$idx,\@showtools,\@defprivs, \@excluded); - $r->print(''); - $r->print(&Apache::lonhtmlcommon::end_pick_box()); - $r->print(' - - - -'); + $r->print(&Apache::loncommon::end_data_table()); } else { - $r->print(' - - '); - &mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt, - $stored,$img2,$crstype); + &automapping($r,$action,$stored,\%lt,$img1); + &mapping_settings($r,$sectioncount,\%lt,$stored,$img2,$crstype,$cdom,$cnum, + $action); return; } sub automapping { - my ($r,$action,$tabcol,$stored,$lt,$image) = @_; + my ($r,$action,$stored,$lt,$image) = @_; my $add = 'off'; my $drop = 'off'; if (exists($$stored{'autoadd'})) { @@ -3273,138 +3443,101 @@ sub automapping { if (exists($$stored{'autodrop'})) { $drop = $$stored{'autodrop'}; } - &topic_bar($r,$tabcol,$image,$$lt{'endi'}); + &topic_bar($r,$image,$$lt{'endi'}); $r->print(' - - - - - - - - - - - - - - - - - - - - - - -'); + $r->print('

'.$$lt{'mapr'}); } sub mapping_settings { - my ($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,$lt,$stored,$image, - $crstype) = @_; + my ($r,$sectioncount,$lt,$stored,$image,$crstype,$cdom,$cnum,$action) = @_; my @sections = keys(%{$sectioncount}); if (@sections > 0) { @sections = sort {$a cmp $b} @sections; unshift(@sections,'none'); # Put 'no sections' next unshift(@sections,'all'); # Put 'all' at the front of the list + } else { + @sections = ('all','none'); } - &topic_bar($r,$tabcol,$image,$$lt{'pirs'}); - $r->print(' - - - '); if (@sections > 0) { - $r->print(''."\n"); + $r->print(''); } - my $rowNum = 0; - my $rowColor; + $r->print(&Apache::loncommon::end_data_table_header_row()."\n"); foreach my $role (@roles) { - my $plrole=&Apache::lonnet::plaintext($role,$crstype); - my $sections_sel; - if (@sections > 0) { - if ($role eq 'cc') { - $sections_sel = ''; - } else { - $sections_sel=''; - } - } - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } - $r->print(''.$sections_sel.''); - $rowNum ++; + my $roletitle=&Apache::lonnet::plaintext($role,$crstype); + $r->print(&print_autorole_item($role,$roletitle,\@sections)); } + my @customs; foreach my $role (sort(keys(%customroles))) { - my $sections_sel; - if (@sections > 0) { - $sections_sel = ''; - } - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; + my ($roletitle) = ($role =~ m|^cr/[^/]+/[^/]+/(.+)$|); + push (@customs,$role); + $r->print(&print_autorole_item($role,$roletitle,\@sections)); + } + if ($action eq 'modify') { + foreach my $role (@{$$stored{'autorole'}}) { + if ((!grep(/^\Q$role\E$/,@customs)) && + (!grep(/^\Q$role\E$/,@roles))) { + my $roletitle; + if ($role =~ /^cr/) { + ($roletitle) = ($role =~ m|_([^_]+)$|); + } else { + $roletitle = &Apache::lonnet::plaintext($role,$crstype); + } + $r->print(&print_autorole_item($role,$roletitle,\@sections)); + } } - $r->print(''. - $sections_sel.''); - $rowNum ++; } - $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(&Apache::loncommon::end_data_table()); return; } +sub print_autorole_item { + my ($role,$roletitle,$sections) = @_; + my $sections_sel; + if (@{$sections} > 0) { + if ($role eq 'cc') { + $sections_sel = ''; + } else { + $sections_sel=''; + } + } + my $output = &Apache::loncommon::start_data_table_row(). + ''.$sections_sel. + &Apache::loncommon::end_data_table_row(); + return $output; +} + sub standard_roles { my @roles = ('cc','in','ta','ep','st'); return @roles; } -sub my_custom_roles { - my %returnhash=(); - my %rolehash=&Apache::lonnet::dump('roles'); - foreach (keys %rolehash) { - if ($_=~/^rolesdef\_(\w+)$/) { - $returnhash{$1}=$1; - } - } - return %returnhash; -} - sub modify_menu { my ($r,$groupname,$page,$gpterm) = @_; my @menu = @@ -3442,10 +3575,8 @@ sub modify_menu { } sub member_privs_entries { - my ($r,$tabcol,$rowColor1,$rowColor2,$usertools,$toolprivs, - $fixedprivs,$userdata,$idx,$showtools,$defprivs,$excluded) = @_; - my $rowColor; - my $rowNum = 0; + my ($r,$usertools,$toolprivs,$fixedprivs,$userdata,$idx,$showtools, + $defprivs,$excluded) = @_; foreach my $user (sort(keys(%{$usertools}))) { if (defined($excluded)) { if (ref($excluded) eq 'ARRAY') { @@ -3455,19 +3586,27 @@ sub member_privs_entries { } } my ($uname,$udom) = split(/:/,$user); - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } - $r->print(' + $r->print(&Apache::loncommon::start_data_table_row().' - '); + '); foreach my $tool (@{$showtools}) { if (exists($$usertools{$user}{$tool})) { - $r->print(''."\n". + "
'.$lt{'ygrs'}.' +
'.$lt{'ygrs'}.'
'.$lt{'tfwa'}.' -
'); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::loncommon::start_data_table('LC_course_group_status'). + &Apache::loncommon::start_data_table_header_row()); $r->print(' -
- - - - - - - - - - - - + + + + + + +'); + $r->print(&Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row('LC_data_table_dense')); + $r->print(' + + - END - $r->print(&Apache::lonhtmlcommon::end_pick_box()); - $r->print('
'.$lt{'grna'}.''.$lt{'desc'}.''.$lt{'grfn'}.''.$lt{'gran'}.''.$lt{'quot'}.''.$lt{'dfac'}.'
'.$groupname.''.$description.''.$lt{'grna'}.''.$lt{'desc'}.''.$lt{'grfn'}.''.$lt{'gran'}.''.$lt{'quot'}.''.$lt{'dfac'}.''.$groupname.''.$description.' '); if (@{$available} > 0) { - $r->print('Available: - '); + $r->print(&mt('Available for assignment to members:'). + '
'); my $rowcell = int(@{$available}/2) + @{$available}%2; for (my $i=0; $i<@{$available}; $i++) { if (@{$available} > 3) { @@ -1662,8 +1929,8 @@ sub print_current_settings { $r->print(''); } } - $r->print(''); + $r->print(''); } if ((@{$available} > 3) && (@{$available}%2)) { $r->print(''); @@ -1671,8 +1938,8 @@ sub print_current_settings { $r->print('
'.$$functions{$$available[$i]}. - ' '.$$functions{$$available[$i]}. + '   

'); } if (@{$unavailable} > 0) { - $r->print('Unavailable: - '); + $r->print(&mt('Unavailable for assignment:'). + '
'); my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2; for (my $j=0; $j<@{$unavailable}; $j++) { if (@{$unavailable} > 3) { @@ -1680,8 +1947,8 @@ sub print_current_settings { $r->print(''); } } - $r->print(''); + $r->print(''); } if ((@{$unavailable} > 3) && (@{$unavailable}%2)) { $r->print(''); @@ -1690,35 +1957,30 @@ sub print_current_settings { } $r->print(<<"END"); - - - + + - -
'.$$functions{$$unavailable[$j]}. - ' '.$$functions{$$unavailable[$j]}. + '   $lt{'difn'} - $granularity$quota Mb$lt{'stda'} $showstart
- $lt{'enda'} $showend
+
$lt{'difn'} $granularity$quota Mb$lt{'stda'} $showstart
+ $lt{'enda'} $showend
-

'); + $r->print(&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table()); return; } sub pick_new_members { - my ($r,$action,$formname,$tabcol,$rowColor1,$rowColor2,$available,$idx, - $stored,$img,$users,$userdata,$granularity,$origmembers,$gpterm, - $ucgpterm) = @_; + my ($r,$action,$formname,$available,$idx,$stored,$img,$users,$userdata, + $granularity,$origmembers,$gpterm,$ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash( - 'gpme' => "$ucgpterm membership", + 'gpme' => "Group membership", 'addm' => 'Add members', - 'setf' => 'Set functionality', - 'func' => 'Functionality', - 'nome' => 'No members to add at this time.', + 'setf' => 'Assign collaborative tools', + 'func' => 'Tools', + 'nome' => 'No members to add at this time, as there are no users '. + 'matching the specified type(s), role(s) and section(s).', 'nnew' => "There are no users to add as new members, as all users". - " matching the specified type(s), role(s), and/or ". - "section(s) are already affiliated with this $gpterm.", + " matching the specified type(s), role(s), and ". + "section(s) are already affiliated with this group.", 'yoma' => 'You may need to use the '."'".'modify existing, past or '. 'future members'."'".' page if you need to re-enable '. 'or activate access for previous or future members.', @@ -1745,62 +2007,51 @@ sub pick_new_members { $r->print(&check_uncheck_tools($r,$available)); } } - &topic_bar($r,$tabcol,$img,$lt{'gpme'}); + &topic_bar($r,$img,$lt{'gpme'}); if (keys(%members) > 0) { $r->print(' -
  '); &check_uncheck_buttons($r,$formname,'member',$lt{'addm'}); if (@{$available} > 0 && $granularity eq 'Yes') { - $r->print(''); + + '); } $r->print('
+ $r->print('
'.$lt{'setf'}.' +    -
-
 
  '); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); $r->print(' - - - - - - - - + '); + $r->print(''); } - $r->print(''); + $r->print(&Apache::loncommon::end_data_table_header_row()); if (@{$available} > 0) { if ($granularity eq 'Yes') { - $r->print(' + $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').' - '); + $r->print(''); } } my %Sortby = (); @@ -1819,27 +2070,22 @@ sub pick_new_members { push(@{$Sortby{$members{$user}[$$idx{fullname}]}},$user); } } - my $rowNum = 0; - my $rowColor; foreach my $key (sort(keys(%Sortby))) { foreach my $user (@{$Sortby{$key}}) { - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } my $id = $members{$user}[$$idx{id}]; my $fullname = $members{$user}[$$idx{fullname}]; my $udom = $members{$user}[$$idx{udom}]; my $uname = $members{$user}[$$idx{uname}]; my $section = $members{$user}[$$idx{section}]; - $r->print(''. - ''); + $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense'). + ''. + ''. + ''. + ''. + ''. + ''); if (@{$available} > 0) { - $r->print(''); + $r->print(''); } - $r->print(''."\n"); - $rowNum ++; + $r->print(&Apache::loncommon::end_data_table_row()."\n"); } } - $r->print(&Apache::lonhtmlcommon::end_pick_box()); - $r->print(' - - '); + $r->print(&Apache::loncommon::end_data_table()); } else { - $r->print(' - - - - '); } return $newusers; } sub privilege_specificity { - my ($r,$tabcol,$rowColor1,$rowColor2,$action,$img,$tools,$stored, - $toolprivs,$fixedprivs,$available,$formname,$gpterm,$ucgpterm) = @_; + my ($r,$action,$img,$tools,$stored,$toolprivs,$fixedprivs,$available, + $formname,$gpterm,$ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash ( - 'uprv' => 'User privileges', - 'frty' => 'For each type of functionality you have chosen to include, '. - 'there is a set of standard privileges which apply to all '. - 'of those for whom the functionality is enabled.', - 'thar' => 'There are also additional privileges which can be set for '. - 'some, or all, members. Please choose one of the following:', - 'fort' => 'For the types of functionality you have chosen to include '. - 'there are no additional privileges which can be set for some '. - 'or all members.', - 'eaty' => 'Each of the types of functionality includes standard '. - 'privileges which apply to members with access to that '. - 'functionality, and may also include additional privileges '. + 'uprv' => 'User privileges for collaborative tools', + 'frty' => 'For each collaborative tool you have chosen to include, '. + 'there is a set of core privileges which all group members '. + 'assigned use of the tool will receive.', + 'thar' => 'For some tools there are also additional optional '. + 'privileges which can be set.', + 'plch' => 'Choose one of the following:', + 'fort' => 'For the collaborative tools you have chosen to include '. + 'only core privileges are available, '. + 'so there are no optional privileges to assign.', + 'eaty' => 'Each collaborative tool includes core '. + 'privileges assigned to all members with access to the '. + 'tool. Some tools may also feature additional privileges '. 'which can be set for specific members.', - 'cutg' => "Currently the $gpterm is configured ", - 'sdif' => "so different $gpterm members can receive different privileges.", - 'sall' => "so all $gpterm members will receive the same privileges.", - 'algm' => "All $gpterm members will receive the same privileges.", - 'smgp' => "Some $gpterm members will receive different privileges from ". - "others.", - 'thwi' => "These will be the privileges all $gpterm members receive, ". - "if you selected the first option above.", + 'cutg' => 'Currently the group is configured ', + 'sdif' => 'so different members can receive different optional privileges for a particular tool.', + 'sall' => 'so all members will receive the same optional privileges for a particular tool.', + 'algm' => 'All group members will receive the same privileges for any tool assigned to them, including the default set of optional privileges.', + 'smgp' => 'Different group members may receive different privileges from '. + 'others for the tools they have been assigned.', + 'thwi' => 'These will be the privileges all group members receive for a particular assigned tool, '. + 'if you selected the first option above.', 'thes' => "These will be the privileges given to members assigned ". - "in the future, including via automatic $gpterm assignment ". - "for specific sections/roles ", - 'asyo' => "As you have chosen not to include any functionality in the ". - "$gpterm, no default user privileges settings need to be set.", - 'plin' => 'Please indicate which optional privileges members '. - 'will receive by default.', + "in the future via automatic group assignment ". + "for users who receive specific sections/roles in the course ", + 'asyo' => "As you have chosen not to include any collaborative tools ". + "in the group, no default optional privileges need to be set.", + 'plin' => 'Indicate which optional privileges members '. + 'will receive by default for a specific tool.', 'oppr' => 'Optional privileges', 'defp' => 'The default privileges new members will receive are:', ); @@ -1921,14 +2156,9 @@ sub privilege_specificity { } } } - &topic_bar($r,$tabcol,$img,$lt{'uprv'}); - $r->print(' - - - - - - - '); +
+
+

'); } else { $r->print(''); } if ($totaloptionalprivs) { - $r->print(' - - - - - - - - - - - - -'); return; } sub default_privileges { - my ($r,$action,$tabcol,$rowColor1,$rowColor2,$tools,$toolprivs, - $fixedprivs,$available) = @_; + my ($r,$action,$tools,$toolprivs,$fixedprivs,$available) = @_; my %lt = &Apache::lonlocal::texthash( 'addp' => 'Additional privileges', 'fixp' => 'Fixed privileges', 'oppr' => 'Optional privileges', - 'func' => 'Function', + 'func' => 'Collaborative Tool', ); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); - $r->print(' - - '); + $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box'). + &Apache::lonhtmlcommon::row_title($lt{'func'},undef, + 'LC_groups_functionality')); + $r->print(join(''."\n"); - $r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(&Apache::lonhtmlcommon::row_title($lt{'fixp'},undef, + 'LC_groups_fixed'). + $fixed. + &Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::row_title($lt{'oppr'},undef, + 'LC_groups_optional'). + $dynamic. + &Apache::lonhtmlcommon::end_pick_box()); $r->print('
'); return; + } sub display_defprivs { - my ($r,$tabcol,$rowColor1,$rowColor2,$tools,$toolprivs,$defprivs) = @_; + my ($r,$tools,$toolprivs,$defprivs) = @_; + my $function = &Apache::loncommon::get_users_function(); + my $tabcol = &Apache::loncommon::designparm($function.'.tabbg'); + my $rowColor1 = "#dddddd"; + my $rowColor2 = "#eeeeee"; my %lt = &Apache::lonlocal::texthash( 'priv' => 'Privileges', - 'func' => 'Function', + 'func' => 'Collaborative Tool', ); $r->print(&Apache::lonhtmlcommon::start_pick_box()); $r->print(''); @@ -2114,7 +2319,7 @@ sub display_defprivs { @{$currprivs{$tool}} = (); foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { if (ref($defprivs) eq 'ARRAY') { - if (grep/^\Q$priv\E$/,@{$defprivs}) { + if (grep(/^\Q$priv\E$/,@{$defprivs})) { push(@{$currprivs{$tool}},$priv); } } @@ -2170,10 +2375,10 @@ sub display_defprivs { sub change_members_form { - my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$groupname,$description, + my ($r,$cdom,$cnum,$action,$formname,$page,$groupname,$description, $startdate,$enddate,$tools,$fixedprivs,$functions,$users,$userdata, - $granularity,$quota,$specificity,$idx,$states,$navbuttons,$rowColor1, - $rowColor2,$gpterm,$ucgpterm) = @_; + $granularity,$quota,$specificity,$idx,$states,$navbuttons,$gpterm, + $ucgpterm) = @_; my %lt = &Apache::lonlocal::texthash( grse => "$ucgpterm settings", mogm => "Modify $gpterm membership", @@ -2191,39 +2396,27 @@ sub change_members_form { my $prevtext = $$navbuttons{'gtpp'}; $r->print('
-
'.&mt('Add?').''.&mt('Name').''.&mt('Username').' - '.&mt('Domain').'IDSection'.&mt('Add?').' + '.&mt('Name').' + '.&mt('Username').' + '.&mt('Domain').' + '.&mt('ID').' + '.&mt('Section').' '); if (@{$available} > 0) { - $r->print(''.$lt{'func'}.''.$lt{'func'}.'
 '.&mt('All:').' '); + '.&mt('All:').' '); foreach my $tool (@{$available}) { $r->print('   '); } - $r->print('
- '. - $fullname.''.$uname.''. - $udom.''.$id.''.$section.''.$fullname.''.$uname.''.$udom.''.$id.''.$section.''. + $r->print(''. '       '); foreach my $tool (@{$available}) { if ($granularity eq 'Yes') { @@ -1850,66 +2096,55 @@ sub pick_new_members { $tool.'" value="'.$user.'" />'.$tool.'   '); } } - $r->print('
  -'); if ($totalusers > 0) { $r->print($lt{'nnew'}.'

'.$lt{'yoma'}); } else { $r->print($lt{'nome'}); } - $r->print(' -
  - '); + &topic_bar($r,$img,$lt{'uprv'}); if ((($action eq 'create') && (@{$available} > 0)) || - (($action eq 'modify') && ($formname eq 'change_settings'))) { + (($action eq 'modify') && ($formname eq 'change_settings'))) { my %specific = ( 'No' => 'checked="checked"', 'Yes' => '', @@ -1936,7 +2166,7 @@ sub privilege_specificity { if ($action eq 'create') { $r->print($lt{'frty'}.'
'); if ($totaloptionalprivs) { - $r->print($lt{'thar'}); + $r->print($lt{'thar'}.'

'.$lt{'plch'}); } else { $r->print($lt{'fort'}); } @@ -1952,23 +2182,16 @@ sub privilege_specificity { } if ($totaloptionalprivs) { $r->print(' -


- -
 
 '.$lt{'plin'}); + $r->print($lt{'plin'}); if ($action eq 'create') { - $r->print(' '.$lt{'thwi'}); + $r->print('
'.$lt{'thwi'}); } $r->print('
'.$lt{'thes'}); if ($action eq 'create') { @@ -1977,30 +2200,22 @@ sub privilege_specificity { $r->print('('.&mt('if enabled below').').'); } $r->print('

-
 '); +
'); &check_uncheck_buttons($r,$formname,'defpriv',$lt{'oppr'}); $r->print('
-
 
 
'); } else { - $r->print('
 '.$lt{'algm'}.'

'); + $r->print($lt{'algm'}.'

'); } - &default_privileges($r,$action,$tabcol,$rowColor1,$rowColor2, - $tools,$toolprivs,$fixedprivs,$available); + &default_privileges($r,$action,$tools,$toolprivs,$fixedprivs, + $available); } else { if ($action eq 'create') { $r->print($lt{'asyo'}); + $r->print(''); } elsif ($action eq 'modify' && $formname eq 'pick_members') { my @defprivs; if (ref($$stored{'defpriv'}) eq 'ARRAY') { @@ -2013,98 +2228,88 @@ sub privilege_specificity { $r->print($lt{'sall'}); } $r->print(' '.$lt{'defp'}.'

'); - &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools, - $toolprivs,\@defprivs); + &display_defprivs($r,$tools,$toolprivs,\@defprivs); } } - $r->print(' -
- - - - - - - - - - -
'.$lt{'func'}.'
'.$lt{'fixp'}.'
'.$lt{'oppr'}.'
-
',@{$tools})); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + my $fixed = ''; + my $dynamic = ''; foreach my $tool (@{$tools}) { - $r->print(' - - - - - '); my $privcount = 0; - my $fixed = ''; - my $dynamic = ''; + if ($dynamic ne '') { + $dynamic .= ' - '); + $dynamic .= '
'.$tool.'
'; + } + $dynamic .= ''; foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { if (exists($$fixedprivs{$tool}{$priv})) { - $fixed .= ''.$$toolprivs{$tool}{$priv}.' '; + if ($fixed ne '') { + $fixed .= ' - '."\n"; + '."\n"; } - $dynamic .= ''."\n"; + $dynamic .= ''."\n"; } } - if ($dynamic eq '') { - $dynamic = ''."\n"; + if ($privcount == 0) { + $dynamic .= ''."\n"; } if ($privcount < 3) { - $dynamic .= ' - - '."\n"; + $dynamic .= ''."\n"; } elsif ($privcount%2) { $dynamic = ''."\n"; } - $r->print(' - - - '."\n".$dynamic.''."\n".'
'; + } + $fixed .= ''.$$toolprivs{$tool}{$priv}.' '; if ($action eq 'modify') { - if (grep/^$tool$/,@{$available}) { + if (grep(/^$tool$/,@{$available})) { $fixed .= ''.&mt('(on)').' '; } else { $fixed .= ''.&mt('(off)').' '; } } + $fixed .= ''; } else { - $privcount ++; + $privcount++; if ($privcount == 3) { $dynamic .= '
NoneNone
   
'.$fixed.'
'."\n".'
'; } - $r->print('
-'); - &topic_bar($r,$tabcol,1,$lt{'grse'}); - $r->print(' - - - '); - &topic_bar($r,$tabcol,2,$lt{'mogm'}); - $r->print(' - - - '); - &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, - $$states{$action}[$page+1],$nexttext); - $r->print('
  '); - &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, - $functions,$startdate,$enddate,$groupname, - $description,$granularity,$quota,\@available, - \@unavailable,$gpterm,$ucgpterm); -$r->print(' -
 
  -'); - ¤t_membership($r,$cdom,$cnum,$formname,$tabcol,$rowColor1, - $rowColor2,$groupname,\@available,\@unavailable, - $fixedprivs,$granularity,$specificity); - $r->print('
'); + &topic_bar($r,1,$lt{'grse'}); + &print_current_settings($r,$action,$functions,$startdate,$enddate, + $groupname,$description,$granularity,$quota, + \@available,\@unavailable,$gpterm,$ucgpterm); + &topic_bar($r,2,$lt{'mogm'}); + my $numcurrent = ¤t_membership($r,$cdom,$cnum,$formname,$groupname, + \@available,\@unavailable,$fixedprivs, + $granularity,$specificity); + if ($numcurrent > 0) { + &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, + $$states{$action}[$page+1],$nexttext); + } else { + &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext); + } return; } sub current_membership { - my ($r,$cdom,$cnum,$formname,$tabcol,$rowColor1,$rowColor2,$groupname, - $available,$unavailable,$fixedprivs,$granularity,$specificity) = @_; + my ($r,$cdom,$cnum,$formname,$groupname,$available,$unavailable, + $fixedprivs,$granularity,$specificity) = @_; my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, $groupname); my %lt = &Apache::lonlocal::texthash( @@ -2237,26 +2430,24 @@ sub current_membership { 'reen' => 'Re-enable', 'acti' => 'Activate', 'dele' => 'Delete', - 'curf' => 'Current Functionality', + 'curf' => 'Current Tool Set', 'chpr' => 'Change Privileges' ); - my ($current,$hastools,$addtools,$num_reenable,$num_activate,$num_expire) = + my ($current,$num_items,$hastools,$addtools) = &Apache::longroup::group_memberlist($cdom,$cnum,$groupname,$fixedprivs, $available); - if (keys(%{$current}) > 0) { + my $numcurrent = scalar(keys(%{$current})); + if ($numcurrent > 0) { $r->print(' -
  '); - if ($num_expire) { + if ($num_items->{'active'}) { &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'}); } - if ($num_reenable) { + if ($num_items->{'previous'}) { &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'}); } - if ($num_activate) { + if ($num_items->{'future'}) { &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'}); } &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'}); @@ -2284,51 +2475,41 @@ sub current_membership { $r->print(<<"END");
-
 
 
  +
END - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); $r->print(<<"END"); - - - - - - - - - + + + + + + + END my $colspan = 0; if ($hastools) { - $r->print(''); - $colspan ++; + $r->print(''); + $colspan++; } if ($addtools) { - $r->print(''); - $colspan ++; + $r->print(''); + $colspan++; } - $r->print(''); + $r->print(&Apache::loncommon::end_data_table_header_row()); if ($colspan) { if ($granularity eq 'Yes') { - $r->print(' + $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').' - '); + $r->print(''); } } my %Sortby = (); @@ -2345,23 +2526,16 @@ END push(@{$Sortby{$$current{$user}{fullname}}},$user); } } - my $rowNum = 0; - my $rowColor; foreach my $key (sort(keys(%Sortby))) { foreach my $user (@{$Sortby{$key}}) { - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } my $id = $$current{$user}{id}; my $fullname = $$current{$user}{fullname}; my $udom = $$current{$user}{udom}; my $uname = $$current{$user}{uname}; my $start = $$current{$user}{start}; my $end = $$current{$user}{end}; - $r->print(' - - '); + '. + ''. + ''. + ''. + ''. + ''. + ''); if ($hastools) { - $r->print(''); + $r->print(''); } if ($addtools) { - $r->print(''); + $r->print(''); } - $r->print(''."\n"); - $rowNum ++; + $r->print(&Apache::loncommon::end_data_table_row()."\n"); } } - $r->print(&Apache::lonhtmlcommon::end_pick_box()); - $r->print(' - - '); + $r->print(&Apache::loncommon::end_data_table()); + } else { + $r->print(&mt('There are no active, future or previous group members to modify.')); } - return; + return $numcurrent; } sub check_uncheck_buttons { my ($r,$formname,$field,$title,$colspan) = @_; $r->print(' '); } sub change_privs_form { - my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$startdate,$enddate, - $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools, - $memchg,$idx,$states,$stored,$sectioncount,$navbuttons,$rowColor1, - $rowColor2,$gpterm,$ucgpterm) = @_; + my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate, + $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools, + $memchg,$idx,$states,$stored,$sectioncount,$navbuttons,$gpterm, + $ucgpterm) = @_; my @regexps = ('userpriv_'); my $nexttext; my %lt = &Apache::lonlocal::texthash( @@ -2477,44 +2651,40 @@ sub change_privs_form { } else { $nexttext = $$navbuttons{'mose'}; } - $r->print('
$lt{'actn'}$lt{'name'}$lt{'usnm'} - $lt{'doma'}ID$lt{'stda'}$lt{'enda'}$lt{'actn'}$lt{'name'}$lt{'usnm'}$lt{'doma'}ID$lt{'stda'}$lt{'enda'}'.$lt{'curf'}.''.$lt{'curf'}.'Additional Functionality'.&mt('Additional Tools').'
 '.&mt('All:'). + '.&mt('All:'). ' '); foreach my $tool (@{$available}) { $r->print('   '); + ' value="'.$tool.'" />'.''.$tool.'   '); } - $r->print('
'); + $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').' + '); if ($$current{$user}{changestate} eq 'reenable') { $r->print(''); } $r->print(' - '. - $fullname.''.$uname.''. - $udom.''.$id.''.$start. - ''.$end.''.$fullname.''.$uname.''. $udom.''.$id.''.$start.''.$end.''. + $r->print(''. '      '); foreach my $tool (@{$$current{$user}{currtools}}) { if ($granularity eq 'Yes') { @@ -2406,10 +2582,10 @@ END } $r->print('   '); } - $r->print(''); + $r->print(''); if ($granularity eq 'Yes') { foreach my $tool (@{$$current{$user}{newtools}}) { $r->print('
-
'.$title.' +    -
+
'); - &topic_bar($r,$tabcol,3,&mt('Members to delete or expire')); + &topic_bar($r,3,&mt('Members to delete or expire')); my $exp_or_del = 0; if (ref($$memchg{'deletion'}) eq 'ARRAY') { if (@{$$memchg{'deletion'}} > 0) { - $r->print(''); + $r->print(''); $exp_or_del += @{$$memchg{'deletion'}}; } } if (ref($$memchg{'expire'}) eq 'ARRAY') { if (@{$$memchg{'expire'}} > 0) { - $r->print(''); + $r->print(''); $exp_or_del += @{$$memchg{'expire'}}; } } if (!$exp_or_del) { - $r->print(''); + $r->print($lt{'nome'}.'
'); } - &topic_bar($r,$tabcol,4,&mt('[_1] member privileges',$ucgpterm)); + &topic_bar($r,4,&mt('Setting optional privileges for specific group members')); - my $numchgs = &member_privileges_form($r,$tabcol,$action,$formname,$tools, + my $numchgs = &member_privileges_form($r,$action,$formname,$tools, $toolprivs,$fixedprivs,$userdata, $usertools,$idx,$memchg,$states, - $stored,$rowColor1,$rowColor2, - $gpterm); - $r->print(''); + $stored,$gpterm); my $prevtext = $$navbuttons{'gtps'}; if ($numchgs || $exp_or_del) { &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, @@ -2522,50 +2692,34 @@ sub change_privs_form { } else { &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext); } - $r->print('
 '.$lt{'tode'}.':
    '); + $r->print(''.$lt{'tode'}.':
      '); foreach my $user (@{$$memchg{'deletion'}}) { $r->print('
    • '.$$userdata{$user}[$$idx{fullname}]. ' ('.$user.')
    • '); } - $r->print('
 
 '.$lt{'toex'}.':
    '); + $r->print(''.$lt{'toex'}.':
      '); foreach my $user (@{$$memchg{'expire'}}) { $r->print('
    • '.$$userdata{$user}[$$idx{fullname}]. ' ('.$user.')
    • '); } - $r->print('
 
 '.$lt{'nome'}. - '
 
 
'); return; } sub add_members_form { - my ($r,$tabcol,$action,$formname,$page,$startdate,$enddate,$groupname, + my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate,$groupname, $description,$granularity,$quota,$sectioncount,$tools,$functions, - $stored,$states,$navbuttons,$rowColor1,$rowColor2,$gpterm,$ucgpterm)=@_; - $r->print('
- - - - - - - - '); - - &membership_options($r,$action,$formname,$tabcol,$sectioncount,1,$gpterm, + &print_current_settings($r,$action,$functions,$startdate,$enddate, + $groupname,$description,$granularity,$quota, + \@available,\@unavailable,$gpterm,$ucgpterm); + &membership_options($r,$cdom,$cnum,$action,$formname,$sectioncount,1,$gpterm, $ucgpterm); my $nexttext = $$navbuttons{'gtns'}; my $prevtext = $$navbuttons{'gtpp'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, $$states{$action}[$page+1],$nexttext); - $r->print(' -
  -'); + $stored,$states,$navbuttons,$gpterm,$ucgpterm)=@_; + $r->print('
'); my @available = (); my @unavailable = (); &check_tools($functions,$tools,\@available,\@unavailable); - &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2, - $functions,$startdate,$enddate,$groupname, - $description,$granularity,$quota,\@available, - \@unavailable,$gpterm,$ucgpterm); - $r->print(' -
 
'); return; } sub choose_privs_form { - my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$startdate,$enddate, - $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,$idx, - $states,$stored,$sectioncount,$navbuttons,$rowColor1,$rowColor2, - $gpterm,$ucgpterm,$crstype) = @_; + my ($r,$cdom,$cnum,$action,$formname,$page,$startdate,$enddate, + $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,$idx, + $states,$stored,$sectioncount,$navbuttons,$gpterm,$ucgpterm, + $crstype) = @_; my @regexps = ('userpriv_'); my $nexttext; @@ -2582,27 +2736,22 @@ sub choose_privs_form { $nexttext = $$navbuttons{'adme'}; } - $r->print('
'); - &topic_bar($r,$tabcol,6,&mt('[_1] member privileges',$ucgpterm)); + &topic_bar($r,6,&mt('Setting optional privileges for specific group members')); - &member_privileges_form($r,$tabcol,$action,$formname,$tools,$toolprivs, + &member_privileges_form($r,$action,$formname,$tools,$toolprivs, $fixedprivs,$userdata,$usertools,$idx,undef, - $states,$stored,$rowColor1,$rowColor2,$gpterm); + $states,$stored,$gpterm); - $r->print(''); if ($action eq 'create') { - if (keys(%{$sectioncount}) > 0) { - my $img1 = 7; - my $img2 = 8; - &mapping_options($r,$action,$formname,$page,$tabcol,$sectioncount, - $states,$stored,$navbuttons,$img1,$img2, - $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype); - } + my $img1 = 7; + my $img2 = 8; + &mapping_options($r,$action,$formname,$page,$sectioncount, + $states,$stored,$navbuttons,$img1,$img2, + $gpterm,$ucgpterm,$crstype,$cdom,$cnum); } my $prevtext = $$navbuttons{'gtps'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, $$states{$action}[$page+1],$nexttext); - $r->print('
 
'); return; } @@ -2665,26 +2814,28 @@ function uncheckAllTools(formname) { } sub member_privileges_form { - my ($r,$tabcol,$action,$formname,$tools,$toolprivs,$fixedprivs,$userdata, - $usertools,$idx,$memchg,$states,$stored,$rowColor1,$rowColor2, - $gpterm) = @_; + my ($r,$action,$formname,$tools,$toolprivs,$fixedprivs,$userdata, + $usertools,$idx,$memchg,$states,$stored,$gpterm) = @_; my %lt = &Apache::lonlocal::texthash( 'addp' => 'Additional privileges', - 'fixp' => 'Fixed privileges', + 'fixp' => 'Core privileges', 'oppr' => 'Optional privileges', - 'func' => 'Function', - 'forf' => 'For the functionality you have chosen to include '. - 'there are no optional privileges to set besides '. - 'the standard privileges.', - 'algr' => "All $gpterm members will receive the same privileges.", - 'asno' => "As no $gpterm members are being added, ". - "there are no specific user privileges to set.", - 'asng' => "As no $gpterm tools will be made available to users, ". - "there are no specific user privileges to set.", - 'nogm' => "No $gpterm member privileges to display or set, ". - "as you have not indicated that you will be activating,". - " re-enabling, changing privileges, or adding/removing ". - "functionality for any current members ", + 'func' => 'Tool', + 'forf' => 'For the collaborative tools included for group '. + 'members being added or modified, '. + 'there are no optional privileges to set '. + 'for specific members.', + 'algr' => 'All new group members will receive the same privileges.', 'ifex' => 'If previously expired members are being re-enabled, or '. + 'if access for future members is being activated now, '. + 'previously set privileges will be preserved.', + 'asno' => 'As no group members are being added, '. + 'there are no specific user privileges to set.', + 'asng' => 'As no group tools will be made available to users, '. + 'there are no specific user privileges to set.', + 'nogm' => 'No group member privileges to display or set, '. + 'as you have not indicated that you will be activating,'. + ' re-enabling, changing privileges, or adding/removing '. + 'tools for any current members.', 'full' => 'Fullname', 'user' => 'Username', 'doma' => 'Domain', @@ -2728,7 +2879,7 @@ sub member_privileges_form { } $numchgs = @currmembers; if (!$numchgs) { - $r->print('
 '.$lt{'nogm'}); + $r->print($lt{'nogm'}); return $numchgs; } } @@ -2744,17 +2895,14 @@ sub member_privileges_form { my %total; if (keys(%{$usertools}) > 1) { $r->print(' -
  - +
'); foreach my $tool (@{$tools}) { if (@{$showboxes{$tool}} > 0) { $r->print(''); - $r->print(''); + $r->print('
'); - $r->print(''); } } - $r->print('
'. + $r->print(''. + ''); my $privcount = 0; foreach my $priv (@{$showboxes{$tool}}) { @@ -2792,59 +2940,44 @@ sub member_privileges_form { $r->print('
'. $tool.'
 
 
'); } - $r->print('
 '); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); $r->print(<<"END"); -
$lt{'full'}$lt{'user'}$lt{'full'}$lt{'user'} $lt{'doma'} $lt{'addp'}
 
 '.$lt{'forf'}. - '
'); - &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools, - $toolprivs,\@defprivs); + $r->print($lt{'forf'}.'
'); + &display_defprivs($r,$tools,$toolprivs,\@defprivs); } } else { if (keys(%{$usertools}) > 0) { - $r->print('
 '.$lt{'algr'}. - '

'); - &display_defprivs($r,$tabcol,$rowColor1,$rowColor2,$tools, - $toolprivs,\@defprivs); + $r->print($lt{'algr'}.'
'.$lt{'ifex'}.'

'); + &display_defprivs($r,$tools,$toolprivs,\@defprivs); } else { - $r->print('
 '.$lt{'asno'}. - '
'); + $r->print($lt{'asno'}.'
'); } } } else { - $r->print('
 '.$lt{'asng'}); + $r->print($lt{'asng'}); } return $numchgs; } sub process_request { - my ($r,$cdom,$cnum,$tabcol,$action,$state,$page,$groupname,$description, + my ($r,$cdom,$cnum,$action,$state,$page,$groupname,$description, $specificity,$userdata,$startdate,$enddate,$tools,$functions,$toolprivs, $usertools,$idx,$types,$roles,$sections,$states,$navbuttons,$memchg, - $sectioncount,$stored,$rowColor1,$rowColor2,$gpterm,$ucgpterm, - $crstype) = @_; + $sectioncount,$stored,$gpterm,$ucgpterm,$crstype) = @_; $r->print(&Apache::lonhtmlcommon::echo_form_input( ['origin','action','state','page','sortby'])); @@ -2940,7 +3073,7 @@ sub write_group_data { } if ($quota > $maxposs) { $quota = $maxposs; - $r->print(&mt('The value you entered for the quota for the file repository in this [_1] exceeded the maximum possible value, so it has been set to [_2] Mb (the maximum possible value).
',$gpterm,$maxposs)); + $r->print(&mt('The value you entered for the quota for the file repository in this [_1] exceeded the maximum possible value, so it has been set to [_2] Mb (the maximum possible value).
',$gpterm,sprintf("%.2f",$maxposs))); } my %groupinfo = ( description => $esc_description, @@ -3009,7 +3142,47 @@ sub write_group_data { $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2].
',$gpterm,$result)); } $r->print(&mt('[_1] [_2] was created.
',$ucgpterm,$groupname)); - } else { + } elsif ($action eq 'modify') { + my (@oldtools,@newtools); + if (ref($$stored{'tool'}) eq 'ARRAY') { + @oldtools = @{$$stored{'tool'}}; + } + if (ref($tools) eq 'ARRAY') { + @newtools = @{$tools}; + } + if (!grep(/^discussion$/,@oldtools) && + grep(/^discussion$/,@newtools)) { + my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/'; + my $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence'; + my $navmap = Apache::lonnavmaps::navmap->new(); + my $bbmapres = $navmap->getResourceByUrl($boardsmap); + undef($navmap); + if (!$bbmapres) { + my $grpmap = $crspath.'group_folder_'.$groupname.'.sequence'; + my $disctitle = &mt('Discussion Boards'); + my $outcome = &map_updater($cdom,$cnum,'group_boards_'. + $groupname.'.sequence','bbseq', + $disctitle,$grpmap); + my ($furl,$ferr) = + &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + $navmap = Apache::lonnavmaps::navmap->new(); + # modify parameter + if ($outcome eq 'ok') { + my $parm_result = &parm_setter($navmap,$cdom,$boardsmap, + $groupname); + if ($parm_result) { + $r->print(&mt('Error while setting parameters '. + 'for Discussion Boards folder: '. + '[_1]
.',$parm_result)); + } else { + $r->print(&mt('Discussion Boards Folder created.
')); + } + } else { + $r->print($outcome); + } + undef($navmap); + } + } $r->print(&mt('[_1] [_2] was updated.
',$ucgpterm,$groupname)); } } else { @@ -3140,17 +3313,6 @@ sub process_membership { my $start = $startdate; my $end = $enddate; if ($state eq 'memresult') { - if ($curr_privs{$user} eq $group_privs{$user}) { - push(@unchanged,$user); - next; - } - if (exists($curr_start{$user})) { - $start = $curr_start{$user}; - } - if (exists($curr_end{$user})) { - $end = $curr_end{$user}; - } - $type = 'modified'; if (@activate > 0) { if (grep/^$user$/,@activate) { $start = $now; @@ -3165,6 +3327,19 @@ sub process_membership { $type = 'reenabled'; } } + if ($type eq '') { + if ($curr_privs{$user} eq $group_privs{$user}) { + push(@unchanged,$user); + next; + } + if (exists($curr_start{$user})) { + $start = $curr_start{$user}; + } + if (exists($curr_end{$user})) { + $end = $curr_end{$user}; + } + $type = 'modified'; + } } else { $type = 'added'; } @@ -3227,7 +3402,7 @@ sub process_membership { } if ($roster_result eq 'ok') { $r->print('
'.&mt('[_1] membership list updated.',$ucgpterm)); - $r->print('

'.&mt("For full access to all of [_1]'s privileges, users will need to log out and log back in.",$groupname).'

'); + $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.",$groupname).'

'); } else { $r->print('
'.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.'
'); } @@ -3235,15 +3410,14 @@ sub process_membership { } sub mapping_options { - my ($r,$action,$formname,$page,$tabcol,$sectioncount,$states,$stored, - $navbuttons,$img1,$img2,$rowColor1,$rowColor2,$gpterm,$ucgpterm, - $crstype) = @_; + my ($r,$action,$formname,$page,$sectioncount,$states,$stored, + $navbuttons,$img1,$img2,$gpterm,$ucgpterm,$crstype,$cdom,$cnum) = @_; my %lt = &Apache::lonlocal::texthash( 'auto' => "Settings for automatic $gpterm enrollment", 'gmma' => "$ucgpterm membership mapping to specific sections/roles", 'endi' => "Enable/disable automatic $gpterm enrollment for ". "users in specified roles and sections", - 'adds' => "If automatic $gpterm enrollment is enabled, when a user is 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.", + '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', @@ -3253,18 +3427,14 @@ sub mapping_options { 'auex' => "Automatically expire $gpterm membership when roles are removed?", 'mapr' => "Mapping of roles and sections affected by automatic $gpterm enrollment/disenrollment follows scheme chosen below.", ); - &automapping($r,$action,$tabcol,$stored,\%lt,$img1); - $r->print(' -
 
  - '.$$lt{'gmma'}.':
'.$$lt{'adds'}.'
'.$$lt{'drops'}.'
-
 
  + '.$$lt{'gmma'}.':
'.$$lt{'adds'}.'
'.$$lt{'drops'}.'

'.$$lt{'auad'}.':  '); if ($action eq 'modify') { $r->print('    ('.$$lt{'curr'}.' '.$$lt{$add}.')'); } $r->print(' - -
  +
'.$$lt{'auex'}.':  '); if ($action eq 'modify') { $r->print('    ('.$$lt{'curr'}.' '.$$lt{$drop}.')'); } - $r->print(' -
 
 '.$$lt{'mapr'}.' -
  -'); + &topic_bar($r,$image,$$lt{'pirs'}); my @roles = &standard_roles(); - my %customroles = &my_custom_roles(); - $r->print(&Apache::lonhtmlcommon::start_pick_box()); + my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum); + $r->print(&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); $r->print(' -
'.&mt('Active?').' '.&mt('Role').''.&mt('Sections').'
'.&mt('Sections').''. - &mt('all sections').''. - §ions_selection(\@sections,'sec_'.$role). - '
'.$plrole. - '
'.§ions_selection(\@sections,'sec_'.$role). - '
'.$role.'
'. + &mt('all sections').''. + §ions_selection($sections,'sec_'.$role). + ''. + ''.$roletitle.'
'.$$userdata{$user}[$$idx{fullname}].' '.$uname.' '.$udom.'
Function
Fixed
Optional
+ + + + + + + + + + +
'. + &mt('Collaborative Tool').'
'.&mt('Fixed').'
'.&mt('Optional').'
+
'); + $r->print(''); } else { - $r->print(''); + $r->print(''); } } - $rowNum ++; + $r->print(&Apache::loncommon::end_data_table_row()); } } @@ -3514,23 +3653,18 @@ sub date_setting_table { 'startdate',$starttime); my $endform = &Apache::lonhtmlcommon::date_setter($formname, 'enddate',$endtime); - my $perpetual = ''; - my $start_table = ''; - $start_table .= "
'.$tool.'
'); my $privcount = 0; my $fixed = ''; my $dynamic = ''; @@ -3490,10 +3629,10 @@ sub member_privs_entries { } $r->print(''.$dynamic.'
'.$tool.'
'.$fixed.'
'.$tool.'
 
 
'.$tool.'
 
 
\n"; - $start_table .= ''. + my $perpetual = + ''; + my $table = "
Default starting date for - member access
\n". + ''. ''. - ''."\n"; - $start_table .= "
'.&mt('Start:').''.$startform.' 
"; - my $end_table = ''; - $end_table .= "\n"; - $end_table .= ''. + ''."\n". + ''. ''. - ''."\n"; - $end_table .= "
Default ending date for - member access 
'.&mt('End:').''.$endform.''.$perpetual.'
\n"; - return ($start_table, $end_table); + '
'.$perpetual.'
\n"; + return $table; } sub add_group_folder { @@ -3542,31 +3676,31 @@ sub add_group_folder { my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage); my $navmap = Apache::lonnavmaps::navmap->new(); my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/'; - $allgrpsmap = $crspath.'default_0.sequence'; + $allgrpsmap = $crspath.'group_allfolders.sequence'; my $topmap = $navmap->getResourceByUrl($allgrpsmap); undef($navmap); if ($action eq 'create') { - # check if default_0.sequence exists. + # check if group_allfolders.sequence exists. if (!$topmap) { - my $grpstitle = &mt('[_1] [_2]',$crstype,$ucgpterm); + my $grpstitle = &mt('[_1] [_2]s',$crstype,$ucgpterm); my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'}; $topmap_url =~ s|/+|/|g; if ($topmap_url =~ m|^/uploaded|) { - $outcome = &map_updater($cdom,$cnum,'default_0.sequence', + $outcome = &map_updater($cdom,$cnum,'group_allfolders.sequence', 'toplevelgroup',$grpstitle,$topmap_url); if ($outcome ne 'ok') { return $outcome; } } else { - $outcome = &mt('Non-standard course - group folder not added.'); + $outcome = &mt('Non-standard course - folder for all groups not added.'); return $outcome; } } my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description; - $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/grppg'; + $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg'; my $grptitle = &mt('Group homepage').' - '.$description; - my ($seqid,$discussions,$disctitle); - my $outcome = &map_updater($cdom,$cnum,'default_'.$now.'.sequence', + my ($discussions,$disctitle); + my $outcome = &map_updater($cdom,$cnum,'group_folder_'.$groupname.'.sequence', 'grpseq',$grpfolder,$allgrpsmap,$grppage, $grptitle); if ($outcome ne 'ok') { @@ -3575,16 +3709,15 @@ sub add_group_folder { my $pageout = &create_homepage($cdom,$cnum,$groupname,$groupinfo, $tools,$gpterm,$ucgpterm,$now); # Link to folder for bulletin boards - $grpmap = $crspath.'default_'.$now.'.sequence'; + $grpmap = $crspath.'group_folder_'.$groupname.'.sequence'; if (grep/^discussion$/,@{$tools}) { - $seqid = $now + 1; $disctitle = &mt('Discussion Boards'); - my $outcome = &map_updater($cdom,$cnum,'default_'.$seqid. + my $outcome = &map_updater($cdom,$cnum,'group_boards_'.$groupname. '.sequence','bbseq',$disctitle,$grpmap); if ($outcome ne 'ok') { return $outcome; } - $boardsmap = $crspath.'default_'.$seqid.'.sequence'; + $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence'; } } else { #modify group folder if status of discussions tools is changed @@ -3594,9 +3727,6 @@ sub add_group_folder { # modify parameters my $parm_result; if ($action eq 'create') { - if ($allgrpsmap) { - $parm_result .= &parm_setter($navmap,$cdom,$allgrpsmap,$groupname); - } if ($grpmap) { $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname); } @@ -3626,17 +3756,17 @@ sub map_updater { $outcome = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'
'; return $outcome; } - my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap); + my ($errtext,$fatal)=&LONCAPA::map::mapread($parentmap); if ($fatal) { $outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'
'; return $outcome; } else { - my $newidx=&Apache::lonratedt::getresidx($newmapurl); - $Apache::lonratedt::resources[$newidx] = $itemtitle.':'.$newmapurl. + my $newidx=&LONCAPA::map::getresidx($newmapurl); + $LONCAPA::map::resources[$newidx] = $itemtitle.':'.$newmapurl. ':false:normal:res'; - $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx; - my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1); - if ($errtext) { + $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx; + my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1); + if ($outtext) { $outcome = &mt('Error storing updated parent folder')." ($parentmap): $errtext".'
'; return $outcome; } @@ -3746,7 +3876,12 @@ sub validate_groupname { my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_; my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum); my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); - + my %deleted_groups = &Apache::longroup::coursegroups($cdom,$cnum,undef, + 'deleted_groups'); + if (my $tmp = &Apache::lonnet::error(%deleted_groups)) { + undef(%deleted_groups); + &Apache::lonnet::logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom); + } my %lt = &Apache::lonlocal::texthash ( igna => "Invalid $gpterm name", tgne => "The $gpterm name entered ", @@ -3761,8 +3896,8 @@ sub validate_groupname { "existing $gpterm", ); - my $exitmsg = ''.$lt{'igna'}.'

'.$lt{'tgne'}.' "'. - $groupname.'" '; + my $exitmsg = ''.$lt{'igna'}.'

'. + $lt{'tgne'}.' "'.$groupname.'" '; my $dupmsg = $lt{'grna'}; my $earlyout; if (($groupname eq '') || ($groupname =~ /\W/)) { @@ -3773,12 +3908,14 @@ sub validate_groupname { return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}. '
'.$lt{'grna'}; } - if ($action eq 'create' - && exists($curr_groups{$groupname})) { - - return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm). - $lt{'inth'}.'
'.$lt{'grna'}; - + if ($action eq 'create') { + if (exists($curr_groups{$groupname})) { + return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm). + $lt{'inth'}.'.
'.$lt{'grna'}; + } elsif (exists($deleted_groups{$groupname})) { + return $exitmsg.$lt{'cnnb'}.&mt('a [_1] which previously existed',$gpterm). + $lt{'inth'}.'.
'.$lt{'grna'}; + } } elsif ($action eq 'modify') { unless(exists($curr_groups{$groupname})) { $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}. @@ -3790,22 +3927,13 @@ sub validate_groupname { } sub topic_bar { - my ($r,$tabcol,$imgnum,$title) = @_; + my ($r,$imgnum,$title) = @_; $r->print(' - -   - - -   - - - '.$title.' - -   - - -   - +
+ '.&mt('Step [_1]',$imgnum).
+	      '  + '.$title.' +
'); return; }