--- loncom/interface/loncoursegroups.pm 2006/07/07 21:04:57 1.47 +++ loncom/interface/loncoursegroups.pm 2019/08/05 19:16:50 1.127.2.2 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: loncoursegroups.pm,v 1.47 2006/07/07 21:04:57 raeburn Exp $ +# $Id: loncoursegroups.pm,v 1.127.2.2 2019/08/05 19:16:50 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,13 +29,16 @@ package Apache::loncoursegroups; use strict; use Apache::lonnet; -use Apache::loncommon; -use Apache::lonhtmlcommon; +use Apache::loncommon(); +use Apache::lonhtmlcommon(); +use Apache::lonhtmlgateway; 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 HTML::Entities; +use LONCAPA::map(); use lib '/home/httpd/lib/perl/'; use LONCAPA; @@ -53,21 +56,19 @@ sub handler { if (! ($env{'request.course.fn'})) { # Not in a course $env{'user.error.msg'}= - "/adm/coursegroups:mdg:0:0:Cannot edit or view course groups"; + "/adm/coursegroups:mdg:0:0:Cannot edit or view course/community groups"; return HTTP_NOT_ACCEPTABLE; } &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(); @@ -76,11 +77,11 @@ sub handler { my $crstype = &Apache::loncommon::course_type(); my %functions = ( - email => 'E-mail', - discussion => 'Discussion boards', - chat => 'Chat', - files => 'File repository', - roster => 'Membership roster', + email => 'Send Messages', + discussion => 'Discussion Boards', + chat => 'Chat Room', + files => 'Group Portfolio', + roster => 'Membership Roster', homepage => $ucgpterm.' home page', ); @@ -91,25 +92,31 @@ 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, - $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))); + $r->print('
' + .&mt('You do not currently have access to any '.$gpterm.'s' + .' in this '.lc($crstype).'.') + .'
' + ); + } } else { - $r->print(&mt('You are not currently a member of any '. - 'active [_1]s in this [_2]',$gpterm, - lc($crstype))); + $r->print( + '' + .&mt('You are not currently a member of any active '.$gpterm.'s' + .' in this '.lc($crstype).'.') + .'
' + ); } } return; } sub group_administration { - my ($r,$action,$state,$cdom,$cnum,$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 = (); @@ -407,11 +519,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'}}; } @@ -486,7 +596,7 @@ sub group_administration { if (ref($stored{'autorole'}) eq 'ARRAY') { foreach my $role (@{$stored{'autorole'}}) { - unless ($role eq 'cc') { + unless (($role eq 'cc') || ($role eq 'co')) { $elements{'modify'}{'change_settings'}{'sec_'.$role} = 'selectbox'; } @@ -502,11 +612,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') || @@ -519,9 +627,6 @@ 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); - } } } @@ -562,7 +667,7 @@ sub group_administration { $num_reenable ++; next; } elsif (($start > $now)) { - $num_activate = 1; + $num_activate ++; next; } else { $num_expire ++; @@ -731,15 +836,15 @@ 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."); + alert("The group portfolio quota you entered for this group ("+newquota+" MB) exceeds the maximum possible ("+maxposs+" MB). Please enter a smaller number."); return; } var re_quota = '.$float_check.'; @@ -758,7 +863,7 @@ sub group_administration { } } if (warn_zero == 1) { - alert("You have indicated that the file repository should be enabled, but you have set the respository quota to 0 Mb.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature."); + alert("You have indicated that the group portfolio should be enabled, but you have set the repository quota to 0 MB.\nThis will prevent any upload of files.\nPlease set a value or disable the repository feature."); return; } } @@ -788,7 +893,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'); @@ -799,7 +906,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) { @@ -812,20 +919,30 @@ function changeSort(caller) { } my $loaditems = &onload_action($action,$state); - my $crumbtitle = "$crstype $ucgpterm".'s'; - $r->print(&header("$crumbtitle Manager", + $r->print(&header("Groups Manager", $jscript,$action,$state,$page,$loaditems)); - if ($env{'form.refpage'} eq 'enrl') { + if ($env{'form.refpage'} eq 'cusr') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/dropadd", - text=>"Enrollment Manager", + ({href=>"/adm/createuser", + text=>"User Management", faq=>9,bug=>'Instructor Interface',}); - } else { + if ($action eq 'modify' || $action eq 'delete') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/coursegroups?refpage=cusr&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 = (); @@ -836,7 +953,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', @@ -849,61 +965,77 @@ 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', + gtns => 'Next',#'Go to next step', + gtps => 'Back',#'Go to previous step', crgr => 'Create '.$gpterm, - mose => 'Modify settings', - gtpp => 'Go to previous page', + mose => 'Save',#'Modify settings', + gtpp => 'Back',#'Go to previous page', adme => 'Add members', ); - if ((($action eq 'create') || ($action eq 'modify')) && + 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, $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))); + ('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); @@ -948,6 +1080,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) { @@ -960,12 +1093,12 @@ 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, $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,$state,$page, @@ -995,11 +1128,7 @@ sub display_control { } } elsif ($action eq 'modify') { my $groupname = $env{'form.groupname'}; - if ($state eq 'pick_group') { - &display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, - $manage_permission,$action,$state,$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,$state,$page, @@ -1007,17 +1136,16 @@ sub display_control { $sectioncount,$stored,$states,$navbuttons, $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,$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,$gpterm,$ucgpterm); + $states,$navbuttons,$gpterm,$ucgpterm,$crstype); } elsif ($state eq 'pick_members') { &choose_members_form($r,$cdom,$cnum,$action,$state,$page, $groupname,$description,$granularity,$quota, @@ -1046,7 +1174,346 @@ sub display_control { $sections,$states,$navbuttons,$memchg, $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,$crstype); + } elsif ($state eq 'result') { + &delete_group($r,$cdom,$cnum,$groupname,$crstype); + } + } elsif ($action eq 'reenable') { + my %stored = &retrieve_settings($cdom,$cnum,$groupname,$action); + if ($state eq 'verify') { + &verify_reenable($r,$groupname,$state,$action,$page,$states, + \%stored,$crstype); + } elsif ($state eq 'result') { + &reenable_group($r,$cdom,$cnum,$groupname,$crstype); + } + } +} + +sub verify_delete { + my ($r,$groupname,$formname,$action,$page,$states,$stored,$crstype) = @_; + $r->print(&Apache::lonhtmlcommon::echo_form_input([])); + $r->print(&mt('You have requested deletion of the group [_1].' + ,''.$stored->{'description'}.''). + '