-
-
- '.$lt{'gmem'}.' '.$lt{'picr'});
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$lt{'pipa'}).'
+ '.$lt{'gmem'}.' ');
if ($action eq 'create') {
- $r->print($lt{'meof'}.' '.$lt{'ifno'}.' '.$lt{'asub'});
+ $r->print($lt{'picr'}.' '.$lt{'ifno'}.' '.$lt{'asub'});
} else {
- $r->print($lt{'admg'});
+ $r->print($lt{'pica'});
}
$r->print('
-
+
- '.$lt{'acty'}.'
-
- '.$lt{'coro'}.' ');
- if (@sections >0) {
- $r->print('
-
- '.$lt{'cose'}.'
- ');
- }
- $r->print(' ');
+ '.$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));
+ $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,'all'); # Put 'all' at the front of the list
unshift(@sections,'none'); # Put 'no sections' next
- $r->print('
- '.
- §ions_selection(\@sections,'sectionpick').' ');
+ unshift(@sections,'all'); # Put 'all' at the front of the list
+ } else {
+ @sections = ('all','none');
}
- $r->print('
+ $r->print(''.
+ §ions_selection(\@sections,'sectionpick').'
-
-
- ');
+
');
return;
}
@@ -1425,25 +1865,23 @@ sub sections_selection {
}
foreach my $sec (@{$sections}) {
if ($sec eq 'all') {
- $section_sel .= ' all sections'."\n";
+ $section_sel .= ' '.&mt('all sections').' '."\n";
} elsif ($sec eq 'none') {
- $section_sel .= ' no section'."\n";
+ $section_sel .= ' '.&mt('no section').' '."\n";
} else {
- $section_sel .= ' '.$sec."\n";
+ $section_sel .= ' '.$sec." \n";
}
}
my $output = '
-
+
'.$section_sel.'
';
return $output;
}
sub access_date_settings {
- my ($r,$tabcol,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_;
- my %lt = &Apache::lonlocal::texthash(
- 'sten' => "Default start and end dates for $gpterm access",
- );
+ my ($r,$action,$formname,$stored,$image,$gpterm,$ucgpterm) = @_;
+ my $sten = &mt("Default start and end dates for $gpterm access");
my $starttime = time;
my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
if ($action eq 'modify') {
@@ -1452,29 +1890,18 @@ 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'});
- $r->print('
-
-
- '.$start_table.'
-
-
-
-
-
-
- '.$end_table.'
- ');
+ my ($table) = &date_setting_table($starttime,$endtime,$formname);
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$sten).'
+ '.$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(
@@ -1483,17 +1910,10 @@ sub choose_members_form {
\@regexps));
my $earlyout = &validate_groupname($groupname,$action,$cdom,$cnum,$gpterm,
$ucgpterm,$crstype);
- $r->print('
-
-
-
-
-');
if ($earlyout) {
- $r->print($earlyout.' ');
+ $r->print($earlyout);
&display_navbuttons($r,$formname,$$states{$action}[$page-1],
$$navbuttons{'gtps'});
- $r->print('
');
return;
}
my ($specimg,$memimg);
@@ -1501,10 +1921,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 {
@@ -1524,13 +1943,13 @@ sub choose_members_form {
}
}
}
- &privilege_specificity($r,$tabcol,$rowColor1,$rowColor2,$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);
+ &privilege_specificity($r,$action,$specimg,$tools,$stored,$toolprivs,
+ $fixedprivs,\@available,$formname,$gpterm,$ucgpterm,
+ $functions,$crstype);
+ 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],
@@ -1539,34 +1958,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 {
@@ -1582,21 +1996,20 @@ 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:',
- stda => 'Start date',
+ 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:',
);
my $showstart = &Apache::lonlocal::locallocaltime($startdate);
@@ -1606,104 +2019,79 @@ sub print_current_settings {
} else {
$showend = &Apache::lonlocal::locallocaltime($enddate);
}
- $r->print('');
if ($action eq 'create') {
$r->print('
-
- '.$lt{'ygrs'}.'
+'.$lt{'ygrs'}.'
'.$lt{'tfwa'}.'
-
- ');
+');
}
- $r->print('');
- $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('
-
-
-
-
- '.$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'}.'
+');
+ $r->print(&Apache::loncommon::end_data_table_header_row().
+ &Apache::loncommon::start_data_table_row('LC_data_table_dense'));
+ $r->print('
+ '.$groupname.'
+ '.$description.'
');
+
if (@{$available} > 0) {
- $r->print('Available:
- ');
- my $rowcell = int(@{$available}/2) + @{$available}%2;
+ $r->print(''.&mt('Available for assignment to members:').' ');
+ $r->print('');
for (my $i=0; $i<@{$available}; $i++) {
- if (@{$available} > 3) {
- if ($i==$rowcell) {
- $r->print(' ');
- }
- }
- $r->print(''.$$functions{$$available[$i]}.
- ' ');
+ $r->print(''.&mt($$functions{$$available[$i]}).' ');
}
- if ((@{$available} > 3) && (@{$available}%2)) {
- $r->print(' ');
- }
- $r->print('
');
+ $r->print('');
}
+
if (@{$unavailable} > 0) {
- $r->print('Unavailable:
- ');
- my $rowcell = int(@{$unavailable}/2) + @{$unavailable}%2;
- for (my $j=0; $j<@{$unavailable}; $j++) {
- if (@{$unavailable} > 3) {
- if ($j==$rowcell) {
- $r->print(' ');
- }
- }
- $r->print(''.$$functions{$$unavailable[$j]}.
- ' ');
- }
- if ((@{$unavailable} > 3) && (@{$unavailable}%2)) {
- $r->print(' ');
+ $r->print(''.&mt('Unavailable for assignment:').' ');
+ $r->print('');
+ for (my $i=0; $i<@{$unavailable}; $i++) {
+ $r->print(''.&mt($$functions{$$unavailable[$i]}).' ');
}
- $r->print('
');
+ $r->print('');
}
+
+ my $quota_text=&mt('[_1] Mb',$quota);
+ my $granu_text=&mt($granularity);
$r->print(<<"END");
- $lt{'difn'}
- $granularity
- $quota Mb
- $lt{'stda'} $showstart
- $lt{'enda'} $showend
+ $lt{'difn'} $granu_text
+ $quota_text
+ $lt{'stda'} $showstart
+ $lt{'enda'} $showend
-
-
-
-
END
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
- $r->print('
');
+ $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.",
- '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.',
+ " 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.",
);
my %members;
my $totalusers = 0;
@@ -1727,61 +2115,51 @@ sub pick_new_members {
$r->print(&check_uncheck_tools($r,$available));
}
}
- &topic_bar($r,$tabcol,$img,$lt{'gpme'});
+ $r->print(&Apache::lonhtmlcommon::topic_bar($img,$lt{'gpme'}));
if (keys(%members) > 0) {
$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('
-
-
- '.&mt('Add?').'
- '.&mt('Name').'
- '.&mt('Username').'
-
- '.&mt('Domain').'
- ID
+ '.&mt('Add?').'
+ '.&mt('Name').'
+ '.&mt('Username').'
+ '.&mt('Domain').'
+ '.&mt('ID').'
+ '.&mt('Section').'
');
if (@{$available} > 0) {
- $r->print(''.$lt{'func'}.' ');
+ $r->print(''.$lt{'func'}.' ');
}
- $r->print(' ');
+ $r->print(&Apache::loncommon::end_data_table_header_row());
if (@{$available} > 0) {
if ($granularity eq 'Yes') {
- $r->print('
-
- '.&mt('All:').' ');
+ $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'
+
+ '.&mt('All:').' ');
foreach my $tool (@{$available}) {
$r->print(' '.''.$tool.' ');
}
- $r->print(' ');
+ $r->print('');
}
}
my %Sortby = ();
@@ -1794,29 +2172,28 @@ sub pick_new_members {
push(@{$Sortby{$members{$user}[$$idx{udom}]}},$user);
} elsif ($env{'form.sortby'} eq 'id') {
push(@{$Sortby{$members{$user}[$$idx{id}]}},$user);
+ } elsif ($env{'form.sortby'} eq 'section') {
+ push(@{$Sortby{$members{$user}[$$idx{section}]}},$user);
} else {
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}];
- $r->print('
- '.
- $fullname.' '.$uname.' '.
- $udom.' '.$id.' ');
+ my $section = $members{$user}[$$idx{section}];
+ $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense').
+ ' '.
+ ''.$fullname.' '.
+ ''.$uname.' '.
+ ''.$udom.' '.
+ ''.$id.' '.
+ ''.$section.' ');
if (@{$available} > 0) {
- $r->print(''.
+ $r->print(''.
' ');
foreach my $tool (@{$available}) {
if ($granularity eq 'Yes') {
@@ -1827,69 +2204,61 @@ sub pick_new_members {
$tool.'" value="'.$user.'" />'.$tool.' ');
}
}
- $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('
-
-
-
-');
if ($totalusers > 0) {
$r->print($lt{'nnew'}.' '.$lt{'yoma'});
} else {
$r->print($lt{'nome'});
}
- $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,$functions,$crstype) = @_;
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:',
);
+ if ($crstype eq 'Community') {
+ $lt{'thes'} = &mt('These will be the privileges given to members assigned in the future via automatic group assignment for users who receive specific sections/roles in the community ');
+ }
my $totaloptionalprivs = 0;
foreach my $tool (@{$tools}) {
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
@@ -1898,14 +2267,9 @@ sub privilege_specificity {
}
}
}
- &topic_bar($r,$tabcol,$img,$lt{'uprv'});
- $r->print('
-
-
-
- ');
+ $r->print(&Apache::lonhtmlcommon::topic_bar($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' => '',
@@ -1913,7 +2277,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'});
}
@@ -1929,23 +2293,16 @@ sub privilege_specificity {
}
if ($totaloptionalprivs) {
$r->print('
- '.$lt{'algm'}.'
- '.$lt{'smgp'}.'
-
-
-
-
- ');
+
+ '.$lt{'algm'}.'
+ '.$lt{'smgp'}.' ');
} else {
$r->print(' ');
}
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') {
@@ -1954,30 +2311,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,$functions);
} 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') {
@@ -1990,98 +2339,93 @@ 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('
-
-
-');
return;
}
sub default_privileges {
- my ($r,$action,$tabcol,$rowColor1,$rowColor2,$tools,$toolprivs,
- $fixedprivs,$available) = @_;
+ my ($r,$action,$tools,$toolprivs,$fixedprivs,$available,$functions) = @_;
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('
-
-
-
- '.$lt{'func'}.'
-
-
- '.$lt{'fixp'}.'
-
-
- '.$lt{'oppr'}.'
-
-
-
- ');
+ $r->print(&Apache::lonhtmlcommon::start_pick_box('LC_group_priv_box').
+ &Apache::lonhtmlcommon::row_title($lt{'func'},undef,
+ 'LC_groups_functionality'));
+ my @tableHeader;
+ if ((ref($functions) eq 'HASH') && (ref($tools) eq 'ARRAY')) {
+ @tableHeader = map { $functions->{$_}; } @{$tools};
+ }
+ $r->print(join('', @tableHeader));
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ my $fixed = '';
+ my $dynamic = '';
foreach my $tool (@{$tools}) {
- $r->print('
-
-
- '.$tool.'
-
- ');
my $privcount = 0;
- my $fixed = '';
- my $dynamic = '';
+ if ($dynamic ne '') {
+ $dynamic .= '';
+ }
+ $dynamic .= ''."\n".'
- ');
+ $dynamic .= '
';
}
- $r->print(' '."\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('');
@@ -2091,7 +2435,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);
}
}
@@ -2147,10 +2491,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",
@@ -2168,39 +2512,27 @@ sub change_members_form {
my $prevtext = $$navbuttons{'gtpp'};
$r->print('
-
');
- &topic_bar($r,$tabcol,1,$lt{'grse'});
- $r->print('
-
-
-
-');
- &print_current_settings($r,$action,$tabcol,$rowColor1,$rowColor2,
- $functions,$startdate,$enddate,$groupname,
- $description,$granularity,$quota,\@available,
- \@unavailable,$gpterm,$ucgpterm);
-$r->print('
- ');
- &topic_bar($r,$tabcol,2,$lt{'mogm'});
- $r->print('
-
-
-
-');
- ¤t_membership($r,$cdom,$cnum,$formname,$tabcol,$rowColor1,
- $rowColor2,$groupname,\@available,\@unavailable,
- $fixedprivs,$granularity,$specificity);
- $r->print(' ');
- &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
- $$states{$action}[$page+1],$nexttext);
- $r->print('
');
+ $r->print(&Apache::lonhtmlcommon::topic_bar(1,$lt{'grse'}));
+ &print_current_settings($r,$action,$functions,$startdate,$enddate,
+ $groupname,$description,$granularity,$quota,
+ \@available,\@unavailable,$gpterm,$ucgpterm);
+ $r->print(&Apache::lonhtmlcommon::topic_bar(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(
@@ -2214,314 +2546,213 @@ sub current_membership {
'reen' => 'Re-enable',
'acti' => 'Activate',
'dele' => 'Delete',
- 'curf' => 'Current Functionality',
+ 'curf' => 'Current Tool Set',
'chpr' => 'Change Privileges'
);
- if (keys(%membership) > 0) {
- my %current = ();
- my %allnames = ();
- my $hastools = 0;
- my $addtools = 0;
- my $num_reenable = 0;
- my $num_activate = 0;
- my $num_expire = 0;
- foreach my $key (sort(keys(%membership))) {
- if ($key =~ /^\Q$groupname\E:([^:]+):([^:]+)$/) {
- my $uname = $1;
- my $udom = $2;
- my $user = $uname.':'.$udom;
- my($end,$start,@userprivs) = split(/:/,$membership{$key});
- unless ($start == -1) {
- $allnames{$udom}{$uname} = 1;
- $current{$user} = {
- uname => $uname,
- udom => $udom,
- start => &Apache::lonlocal::locallocaltime($start),
- currtools => [],
- newtools => [],
- };
-
- if ($end == 0) {
- $current{$user}{end} = 'No end date';
- } else {
- $current{$user}{end} =
- &Apache::lonlocal::locallocaltime($end);
- }
- my $now = time;
- if (($end > 0) && ($end < $now)) {
- $current{$user}{changestate} = 'reenable';
- $num_reenable++;
- } elsif (($start > $now)) {
- $current{$user}{changestate} = 'activate';
- $num_activate ++;
- } else {
- $current{$user}{changestate} = 'expire';
- $num_expire ++;
- }
- if (@userprivs > 0) {
- foreach my $tool (sort(keys(%{$fixedprivs}))) {
- foreach my $priv (keys(%{$$fixedprivs{$tool}})) {
- if (grep/^$priv$/,@userprivs) {
- push(@{$current{$user}{currtools}},$tool);
- last;
- }
- }
- }
- $hastools = 1;
- }
- if (@{$available} > 0) {
- if (@{$current{$user}{currtools}} > 0) {
- if ("@{$available}" ne "@{$current{$user}{currtools}}") {
- foreach my $tool (@{$available}) {
- unless (grep/^$tool$/,@{$current{$user}{currtools}}) {
- push(@{$current{$user}{newtools}},$tool);
- }
- }
- }
- } else {
- @{$current{$user}{newtools}} = @{$available};
- }
- if (@{$current{$user}{newtools}} > 0) {
- $addtools = 1;
- }
- }
- }
- }
- }
- if (keys(%current) > 0) {
- my %idhash;
- foreach my $udom (keys(%allnames)) {
- %{$idhash{$udom}} = &Apache::lonnet::idrget($udom,
- keys(%{$allnames{$udom}}));
- foreach my $uname (keys(%{$idhash{$udom}})) {
- $current{$uname.':'.$udom}{'id'} = $idhash{$udom}{$uname};
- }
- foreach my $uname (keys(%{$allnames{$udom}})) {
- $current{$uname.':'.$udom}{'fullname'} =
- &Apache::loncommon::plainname($uname,$udom,
- 'lastname');
- }
- }
- $r->print('
-
-
-
+ my ($current,$num_items,$hastools,$addtools) =
+ &Apache::longroup::group_memberlist($cdom,$cnum,$groupname,$fixedprivs,
+ $available);
+ my $numcurrent = scalar(keys(%{$current}));
+ if ($numcurrent > 0) {
+ $r->print('
');
- if ($num_expire) {
- &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
- }
- if ($num_reenable) {
- &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
- }
- if ($num_activate) {
- &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
+ if ($num_items->{'active'}) {
+ &check_uncheck_buttons($r,$formname,'expire',$lt{'expi'});
+ }
+ if ($num_items->{'previous'}) {
+ &check_uncheck_buttons($r,$formname,'reenable',$lt{'reen'});
+ }
+ if ($num_items->{'future'}) {
+ &check_uncheck_buttons($r,$formname,'activate',$lt{'acti'});
+ }
+ &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
+ if (@{$available} > 0) {
+ if ($specificity eq 'Yes') {
+ &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
}
- &check_uncheck_buttons($r,$formname,'deletion',$lt{'dele'});
- if (@{$available} > 0) {
- if ($specificity eq 'Yes') {
- &check_uncheck_buttons($r,$formname,'changepriv',$lt{'chpr'});
- }
- if ($granularity eq 'Yes') {
- $r->print(&check_uncheck_tools($r,$available));
- $r->print('
+ if ($granularity eq 'Yes') {
+ $r->print(&check_uncheck_tools($r,$available));
+ $r->print('
-
- '.$lt{'curf'}.'
-
+ '.$lt{'curf'}.'
+
-
-
+
');
- }
}
- $r->print(<<"END");
+ }
+ $r->print(<<"END");
-
-
-
-
-
-
-
-
-
+
END
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
- $r->print(<<"END");
-
-
- $lt{'actn'}
- $lt{'name'}
- $lt{'usnm'}
-
- $lt{'doma'}
- ID
- $lt{'stda'}
- $lt{'enda'}
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
+ $r->print(<<"END");
+ $lt{'actn'}
+ $lt{'name'}
+ $lt{'usnm'}
+ $lt{'doma'}
+ ID
+ $lt{'stda'}
+ $lt{'enda'}
END
- my $colspan = 0;
- if ($hastools) {
- $r->print(''.$lt{'curf'}.' ');
- $colspan ++;
- }
- if ($addtools) {
- $r->print('Additional Functionality ');
- $colspan ++;
- }
- $r->print(' ');
- if ($colspan) {
- if ($granularity eq 'Yes') {
- $r->print('
+ my $colspan = 0;
+ if ($hastools) {
+ $r->print(''.$lt{'curf'}.' ');
+ $colspan++;
+ }
+ if ($addtools) {
+ $r->print(''.&mt('Additional Tools').' ');
+ $colspan++;
+ }
+ $r->print(&Apache::loncommon::end_data_table_header_row());
+ if ($colspan) {
+ if ($granularity eq 'Yes') {
+ $r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense LC_data_table_highlight').'
- '.&mt('All:').
+ '.&mt('All:').
' ');
- foreach my $tool (@{$available}) {
- $r->print(' print(' '.''.$tool.' ');
- }
- $r->print(' ');
+ ' value="'.$tool.'" />'.''.$tool.' ');
}
+ $r->print('');
}
- my %Sortby = ();
- foreach my $user (sort(keys(%current))) {
- if ($env{'form.sortby'} eq 'fullname') {
- push(@{$Sortby{$current{$user}{fullname}}},$user);
- } elsif ($env{'form.sortby'} eq 'username') {
- push(@{$Sortby{$current{$user}{uname}}},$user);
- } elsif ($env{'form.sortby'} eq 'domain') {
- push(@{$Sortby{$current{$user}{udom}}},$user);
- } elsif ($env{'form.sortby'} eq 'id') {
- push(@{$Sortby{$current{$user}{id}}},$user);
- } else {
- push(@{$Sortby{$current{$user}{fullname}}},$user);
- }
+ }
+ my %Sortby = ();
+ foreach my $user (sort(keys(%{$current}))) {
+ if ($env{'form.sortby'} eq 'fullname') {
+ push(@{$Sortby{$$current{$user}{fullname}}},$user);
+ } elsif ($env{'form.sortby'} eq 'username') {
+ push(@{$Sortby{$$current{$user}{uname}}},$user);
+ } elsif ($env{'form.sortby'} eq 'domain') {
+ push(@{$Sortby{$$current{$user}{udom}}},$user);
+ } elsif ($env{'form.sortby'} eq 'id') {
+ push(@{$Sortby{$$current{$user}{id}}},$user);
+ } else {
+ 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 ($current{$user}{changestate} eq 'reenable') {
- $r->print(''.
+ }
+ foreach my $key (sort(keys(%Sortby))) {
+ foreach my $user (@{$Sortby{$key}}) {
+ 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(&Apache::loncommon::start_data_table_row('LC_data_table_dense').'
+ ');
+ if ($$current{$user}{changestate} eq 'reenable') {
+ $r->print(''.
' '.
- $lt{'reen'}.' ');
- } elsif ($current{$user}{changestate} eq 'expire') {
- $r->print(''.
+ $lt{'reen'}.' ');
+ } elsif ($$current{$user}{changestate} eq 'expire') {
+ $r->print(''.
' '.
- $lt{'expi'}.' ');
- } elsif ($current{$user}{changestate} eq 'activate') {
- $r->print(''.
+ $lt{'expi'}.' ');
+ } elsif ($$current{$user}{changestate} eq 'activate') {
+ $r->print(''.
' '.
- $lt{'acti'}.' ');
- }
- $r->print(''.
+ $lt{'acti'}.' ');
+ }
+ $r->print(''.
' '.
- $lt{'dele'}.' ');
- if ($specificity eq 'Yes') {
- $r->print(''.
+ $lt{'dele'}.' ');
+ if ($specificity eq 'Yes') {
+ $r->print(''.
' '.$lt{'chpr'}.
- ' ');
- }
- $r->print('
-
- '.
- $fullname.' '.$uname.' '.
- $udom.' '.$id.' '.$start.
- ' '.$end.' ');
- if ($hastools) {
- $r->print(''.
+ '');
+ }
+ $r->print('
+ '.
+ ''.$fullname.' '.
+ ''.$uname.' '.
+ ''. $udom.' '.
+ ''.$id.' '.
+ ''.$start.' '.
+ ''.$end.' ');
+ if ($hastools) {
+ $r->print(''.
' ');
- foreach my $tool (@{$current{$user}{currtools}}) {
- if ($granularity eq 'Yes') {
- $r->print(' print(' '.$tool.' ');
- } else {
- $r->print(' print(' '.$tool);
- }
- $r->print(' ');
- }
- $r->print(' ');
+ }
+ $r->print(' ');
}
- if ($addtools) {
- $r->print('');
- if ($granularity eq 'Yes') {
- foreach my $tool (@{$current{$user}{newtools}}) {
- $r->print(' print(' ');
+ }
+ if ($addtools) {
+ $r->print('');
+ if ($granularity eq 'Yes') {
+ foreach my $tool (@{$$current{$user}{newtools}}) {
+ $r->print(' '.$tool.
- ' ');
- }
- } else {
- foreach my $tool (@{$current{$user}{newtools}}) {
- $r->print(' ');
+ }
+ } else {
+ foreach my $tool (@{$$current{$user}{newtools}}) {
+ $r->print(' '.$tool.
- ' ');
- }
+ ' ');
}
- $r->print(' ');
}
- $r->print(' '."\n");
- $rowNum ++;
+ $r->print('');
}
+ $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('
-
- '.$title.'
- '.$title.'
+
+
-
+
-
');
}
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(
@@ -2536,44 +2767,40 @@ sub change_privs_form {
} else {
$nexttext = $$navbuttons{'mose'};
}
- $r->print('');
- &topic_bar($r,$tabcol,3,&mt('Members to delete or expire'));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('Members to delete or expire')));
my $exp_or_del = 0;
if (ref($$memchg{'deletion'}) eq 'ARRAY') {
if (@{$$memchg{'deletion'}} > 0) {
- $r->print(' '.$lt{'tode'}.': ');
+ $r->print(''.$lt{'tode'}.': ');
foreach my $user (@{$$memchg{'deletion'}}) {
$r->print(''.$$userdata{$user}[$$idx{fullname}].
' ('.$user.') ');
}
- $r->print(' ');
+ $r->print('');
$exp_or_del += @{$$memchg{'deletion'}};
}
}
if (ref($$memchg{'expire'}) eq 'ARRAY') {
if (@{$$memchg{'expire'}} > 0) {
- $r->print(' '.$lt{'toex'}.': ');
+ $r->print(''.$lt{'toex'}.': ');
foreach my $user (@{$$memchg{'expire'}}) {
$r->print(''.$$userdata{$user}[$$idx{fullname}].
' ('.$user.') ');
}
- $r->print(' ');
+ $r->print('');
$exp_or_del += @{$$memchg{'expire'}};
}
}
if (!$exp_or_del) {
- $r->print(' '.$lt{'nome'}.
- ' ');
+ $r->print($lt{'nome'}.' ');
}
- &topic_bar($r,$tabcol,4,&mt('[_1] member privileges',$ucgpterm));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(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,
@@ -2581,50 +2808,34 @@ sub change_privs_form {
} else {
&display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext);
}
- $r->print('
');
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('
-
-
-
-
-');
+ $stored,$states,$navbuttons,$gpterm,$ucgpterm,$crstype)=@_;
+ $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('
-
-
-
-
- ');
-
- &membership_options($r,$action,$formname,$tabcol,$sectioncount,1,$gpterm,
- $ucgpterm);
+ &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,$crstype);
my $nexttext = $$navbuttons{'gtns'};
my $prevtext = $$navbuttons{'gtpp'};
&display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext,
$$states{$action}[$page+1],$nexttext);
- $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;
@@ -2641,27 +2852,22 @@ sub choose_privs_form {
$nexttext = $$navbuttons{'adme'};
}
- $r->print('');
- &topic_bar($r,$tabcol,6,&mt('[_1] member privileges',$ucgpterm));
+ $r->print(&Apache::lonhtmlcommon::topic_bar(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;
}
@@ -2724,26 +2930,29 @@ 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',
@@ -2787,7 +2996,7 @@ sub member_privileges_form {
}
$numchgs = @currmembers;
if (!$numchgs) {
- $r->print(' '.$lt{'nogm'});
+ $r->print($lt{'nogm'});
return $numchgs;
}
}
@@ -2803,18 +3012,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(''.
- $tool.' ');
+ $r->print(''.&mt($tool).' ');
+ $r->print(' ');
+ $r->print('
');
}
}
- $r->print('
');
- $r->print(' ');
+ $r->print('
');
}
- $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'}
-
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(' '.$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']));
@@ -2963,7 +3154,7 @@ sub process_request {
&process_membership($r,$cdom,$cnum,$action,$state,$groupname,$tools,
$enddate,$startdate,$userdata,$idx,$toolprivs,
$usertools,$specificity,\@defprivs,$memchg,$gpterm,
- $ucgpterm);
+ $ucgpterm,$crstype);
}
return;
}
@@ -2985,6 +3176,30 @@ sub write_group_data {
'specificity','autoadd','autodrop','quota');
my @mult_attributes = ('roles','types','sectionpick','defpriv');
+ my ($crsquota,$freespace,$maxposs) = &get_quota_constraints($action,
+ $stored);
+ my $quota = $env{'form.quota'};
+
+ $quota =~ s/^\s*([^\s]*)\s*$/$1/;
+ if ($quota eq '') {
+ $quota = 0;
+ }
+ if ($quota !~ /^\d*\.?\d*$/) {
+ $quota = 0;
+ $r->print(''
+ .&mt('The value you entered for the quota for the group portfolio in this '.$gpterm
+ .' contained invalid characters, so it has been set to 0 Mb. You can change this by'
+ .' modifying the '.$gpterm.' settings.')
+ .'
');
+ }
+ if ($quota > $maxposs) {
+ $quota = $maxposs;
+ $r->print(''
+ .&mt('The value you entered for the quota for the group portfolio in this '.$gpterm
+ .' exceeded the maximum possible value, so it has been set to [_1] Mb '
+ .'(the maximum possible value).',sprintf("%.2f",$maxposs))
+ .'
');
+ }
my %groupinfo = (
description => $esc_description,
startdate => $startdate,
@@ -2996,8 +3211,9 @@ sub write_group_data {
specificity => $specificity,
autoadd => $env{'form.autoadd'},
autodrop => $env{'form.autodrop'},
- quota => $env{'form.quota'},
+ quota => $quota,
);
+
foreach my $func (keys(%{$functions})) {
my $status;
if (grep(/^$func$/,@{$tools})) {
@@ -3044,12 +3260,92 @@ sub write_group_data {
if ($result eq 'ok') {
if ($action eq 'create') {
- my $put_result = &create_homepage($cdom,$cnum,$groupname,
- \%groupinfo,$tools,$gpterm,
- $ucgpterm);
- $r->print(&mt('[_1] [_2] was created. ',$ucgpterm,$groupname));
- } else {
- $r->print(&mt('[_1] [_2] was updated. ',$ucgpterm,$groupname));
+ my $result = &add_group_folder($cdom,$cnum,$now,$groupname,$action,
+ $description,$tools,\%groupinfo,
+ $gpterm,$ucgpterm,$crstype);
+ if ($result eq 'ok') {
+ my $msg = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was created.',''.$groupname.' '));
+ $msg = &Apache::loncommon::confirmwrapper($msg);
+ $r->print($msg);
+ } else {
+ my $msg = &Apache::lonhtmlcommon::confirm_success(&mt('A problem occurred when creating folders for the new '.$gpterm.' [_1]:'
+ ,''.$groupname.' ')
+ .' '.$result,1);
+ $msg = &Apache::loncommon::confirmwrapper($msg);
+ $r->print($msg);
+ }
+ } 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,$error);
+ if (defined($navmap)) {
+ $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);
+ # modify parameter
+ if ($outcome eq 'ok') {
+ $navmap = Apache::lonnavmaps::navmap->new();
+ if (defined($navmap)) {
+ my $parm_result = &parm_setter($navmap,$cdom,$boardsmap,
+ $groupname);
+ if ($parm_result) {
+ $error = &mt('An error occurred while setting parameters '
+ .'for Discussion Boards folder: '
+ .'[_1]',$parm_result);
+ } else {
+ $r->print(''.
+ &mt('Discussion Boards Folder created.')
+ .'
');
+ }
+ undef($navmap);
+ } else {
+ if ($crstype eq 'Community') {
+ $error = &mt("An error occurred while setting parameters '.
+ 'for Discussion Boards folder: '.
+ 'Could not retrieve community information");
+ } else {
+ $error = &mt("An error occurred while setting parameters '.
+ 'for Discussion Boards folder: '.
+ 'Could not retrieve course information");
+ }
+ }
+ } else {
+ $r->print($outcome);
+ }
+ }
+ } else {
+ $error = &mt("An error occurred while retrieving the contents of the group's folder.").' ';
+ if ($crstype eq 'Community') {
+ $error .= &mt("You need to re-initialize the community.");
+
+ } else {
+ $error .= &mt("You need to re-initialize the course.");
+ }
+ }
+ if ($error ne '') {
+ $r->print(''.$error.'
');
+ }
+ }
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt($ucgpterm.' [_1] was updated.',''.$groupname.' '));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
}
} else {
my %actiontype = (
@@ -3059,8 +3355,10 @@ sub write_group_data {
&Apache::lonnet::logthis("Failed to store $gpterm $groupname ".
'in '.lc($crstype).': '.$cnum.
' in domain: '.$cdom);
- $r->print(&mt('An error occurred when [_1] the new [_2]. '.
- 'Please try again.',$actiontype{$action},$gpterm));
+ $r->print(''
+ .&mt('An error occurred when [_1] the '.$gpterm.'. '
+ .'Please try again.',$actiontype{$action})
+ .'
');
}
return $result;
}
@@ -3068,7 +3366,7 @@ sub write_group_data {
sub process_membership {
my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
$userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,
- $gpterm,$ucgpterm)=@_;
+ $gpterm,$ucgpterm,$crstype)=@_;
my %usersettings = ();
my %added= ();
my %failed = ();
@@ -3079,6 +3377,7 @@ sub process_membership {
my %curr_start = ();
my %curr_end = ();
my %tooltype = ();
+ my $context = 'processgroupmembership';
foreach my $tool (@{$tools}) {
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
@@ -3148,7 +3447,7 @@ sub process_membership {
$curr_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
$user,$now,$savestart,
- $curr_privs{$user}) eq 'ok') {
+ $curr_privs{$user},'',$context) eq 'ok') {
push(@{$added{'expired'}},$user);
$num_ok ++;
} else {
@@ -3159,7 +3458,7 @@ sub process_membership {
foreach my $user (@deletion) {
$usersettings{$groupname.':'.$user} = $now.':-1:';
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
- $user,$now,'-1','')
+ $user,$now,'-1','','',$context)
eq 'ok') {
push(@{$added{'deleted'}},$user);
$num_ok ++;
@@ -3179,17 +3478,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;
@@ -3204,6 +3492,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';
}
@@ -3211,7 +3512,7 @@ sub process_membership {
$group_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
$user,$end,$start,
- $group_privs{$user}) eq 'ok') {
+ $group_privs{$user},'',$context) eq 'ok') {
push(@{$added{$type}},$user);
$num_ok ++;
} else {
@@ -3222,12 +3523,13 @@ sub process_membership {
my $roster_result = &Apache::lonnet::modify_coursegroup_membership($cdom,
$cnum,\%usersettings);
if ($num_ok) {
- foreach my $type (sort(keys(%added))) {
- $r->print(&mt('The following users were successfully [_1]',$type));
+ my $msgall ='';
+ foreach my $type (sort(keys(%added))) {
+ my $message = &mt('The following users were successfully [_1]',$type);
if (!($type eq 'deleted' || $type eq 'expired')) {
- $r->print(&mt(' with the following privileges'));
+ $message .= &mt(' with the following privileges');
}
- $r->print(': ');
+ $message .= ': ';
foreach my $user (@{$added{$type}}) {
my $privlist = '';
if (!($type eq 'deleted' || $type eq 'expired')) {
@@ -3243,67 +3545,87 @@ sub process_membership {
}
$privlist =~ s/, $//;
}
- $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.$privlist.' ');
+ $message .= $$userdata{$user}[$$idx{fullname}].' - '.$user.$privlist.' ';
}
- $r->print(' ');
+ $message .= ' ';
+ $message = &Apache::lonhtmlcommon::confirm_success($message);
+ $msgall .= $message;
}
+ $msgall = &Apache::loncommon::confirmwrapper($msgall);
+ $r->print($msgall);
}
if ($num_fail) {
foreach my $type (sort(keys(%failed))) {
- $r->print(&mt('The following users could not be [_1], because an error occurred: ',$type));
+ $r->print(''
+ .&mt("The following users could not be $type, because an error occurred:")
+ .'
');
foreach my $user (@{$failed{$type}}) {
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
}
}
$r->print(' ');
}
- if (@unchanged > 0) {
- $r->print(&mt('No change occurred for the following users: '));
- foreach my $user (sort(@unchanged)) {
- $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
- }
- $r->print(' ');
- }
+# Is that really needed?
+#
+# if (@unchanged > 0) {
+# $r->print(&mt('No change occurred for the following users:').' ');
+# foreach my $user (sort(@unchanged)) {
+# $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.' ');
+# }
+# $r->print(' ');
+# }
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($ucgpterm.' membership list updated.')
+ .'
');
+ $r->print('');
+ if ($crstype eq 'Community') {
+ $r->print(&mt("Any currently logged in community users affected by the changes you made"
+ .' to group membership or privileges for the [_1] group will need to log out'
+ .' and log back in for their LON-CAPA sessions to reflect these changes.'
+ ,''.$groupname.' '));
+
+ } else {
+ $r->print(&mt("Any currently logged in course users affected by the changes you made"
+ .' to group membership or privileges for the [_1] group will need to log out'
+ .' and log back in for their LON-CAPA sessions to reflect these changes.'
+ ,''.$groupname.' '));
+ }
+ $r->print('
');
} else {
- $r->print(' '.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.' ');
+ $r->print(''
+ .&mt("An error occurred while updating the $gpterm membership list:")
+ .' '.$roster_result
+ .'
');
}
return;
}
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',
'on' => 'on',
'off' => 'off',
'auad' => "Automatically enable $gpterm membership when roles are added?",
'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('
-
-
- ');
- &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'})) {
@@ -3312,179 +3634,141 @@ sub automapping {
if (exists($$stored{'autodrop'})) {
$drop = $$stored{'autodrop'};
}
- &topic_bar($r,$tabcol,$image,$$lt{'endi'});
- $r->print('
-
-
-
- '.$$lt{'gmma'}.': '.$$lt{'adds'}.' '.$$lt{'drops'}.'
-
-
-
-
-
-
-
-
- '.$$lt{'auad'}.':
- on off ');
+ $r->print(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'endi'}).'
+ '.$$lt{'gmma'}.': '.$$lt{'adds'}.' '.$$lt{'drops'}.'
+ '.$$lt{'auad'}.':
+ '.&mt('on').' '.&mt('off').' ');
if ($action eq 'modify') {
- $r->print(' ('.$$lt{'curr'}.' '.$$lt{$add}.' )');
+ $r->print(' ('.&mt('Currently set to [_1].',''.$$lt{$add}.' ').')');
}
$r->print('
-
-
-
-
-
-
- '.$$lt{'auex'}.':
- on off ');
+
+ '.$$lt{'auex'}.':
+ '.&mt('on').' '.&mt('off').' ');
if ($action eq 'modify') {
- $r->print(' ('.$$lt{'curr'}.' '.$$lt{$drop}.' )');
+ $r->print(' ('.&mt('Currently set to [_1].',''.$$lt{$drop}.' ').')');
}
- $r->print('
-
-
-
-
-
-
-
- '.$$lt{'mapr'}.'
-
-
-');
+ $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(&Apache::lonhtmlcommon::topic_bar($image,$$lt{'pirs'}));
+ my @roles = &standard_roles($crstype);
+ my %customroles = &Apache::lonhtmlcommon::course_custom_roles($cdom,$cnum);
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
$r->print('
-
-
-
-');
- my @roles = &standard_roles();
- my %customroles = &my_custom_roles();
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
- $r->print('
-
'.&mt('Active?').'
'.&mt('Role').' ');
if (@sections > 0) {
- $r->print(''.&mt('Sections').' '."\n");
+ $r->print(''.&mt('Sections').' ');
}
- 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 = ''.
- &mt('all sections').' ';
- } else {
- $sections_sel=''.
- §ions_selection(\@sections,'sec_'.$role).
- ' ';
- }
- }
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
- }
- $r->print(''.$plrole.
- ' '.$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 = ''.§ions_selection(\@sections,'sec_'.$role).
- ' ';
- }
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
- }
- $r->print(''.$role.' '.
- $sections_sel.' ');
- $rowNum ++;
+ my ($roletitle) = ($role =~ m|^cr/[^/]+/[^/]+/(.+)$|);
+ push (@customs,$role);
+ $r->print(&print_autorole_item($role,$roletitle,\@sections));
}
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ 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(&Apache::loncommon::end_data_table());
return;
}
-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;
+sub print_autorole_item {
+ my ($role,$roletitle,$sections) = @_;
+ my $sections_sel;
+ if (@{$sections} > 0) {
+ if (($role eq 'cc') || ($role eq 'co')) {
+ $sections_sel = ''.
+ &mt('all sections').' ';
+ } else {
+ $sections_sel=''.
+ §ions_selection($sections,'sec_'.$role).
+ ' ';
}
}
- return %returnhash;
+ my $output = &Apache::loncommon::start_data_table_row().
+ ' '.
+ ''.$roletitle.' '.$sections_sel.
+ &Apache::loncommon::end_data_table_row();
+ return $output;
+}
+
+sub standard_roles {
+ my ($crstype) = @_;
+ my @roles = qw(in ta ep ad st);
+ if ($crstype eq 'Community') {
+ unshift(@roles,'co');
+ } else {
+ unshift(@roles,'cc');
+ }
+ return @roles;
}
sub modify_menu {
my ($r,$groupname,$page,$gpterm) = @_;
my @menu =
- (
- { text => "Modify default $gpterm settings",
- help => 'Course_Modify_Group',
- state => 'change_settings',
- branch => 'settings',
+ ( { categorytitle =>'Group Actions',
+ items => [
+
+ { linktext => "Modify default $gpterm settings",
+ url => '/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state=change_settings&branch=settings',
+ icon => 'grp_settings.png',
+ alttext => "Modify default $gpterm settings",
+ permission => '1',
+ help => 'Course_Modify_Group',
},
- { text => 'Modify access, tools and/or privileges for previous, '.
- 'future, or current members',
+ { linktext => 'Modify access, tools and privileges for members',
+ url => '/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state=change_members&branch=members',
+ icon => 'grp_tools.png',
+ alttext => 'Modify access, tools and privileges for members',
+ permission => '1',
help => 'Course_Modify_Group_Membership',
- state => 'change_members',
- branch => 'members',
},
- { text => "Add member(s) to the $gpterm",
+ { linktext => "Add member(s) to the $gpterm",
+ url => '/adm/coursegroups?action=modify&refpage='.$env{'form.refpage'}.'&groupname='.$groupname.'&state=add_members&branch=adds',
+ icon => 'grp_add.png',
+ alttext => "Add member(s) to the $gpterm",
+ permission => '1',
help => 'Course_Group_Add_Members',
- state => 'add_members',
- branch => 'adds',
- },
- );
- my $menu_html = '';
- foreach my $menu_item (@menu) {
- $menu_html .=
- '';
- $menu_html.= &mt($menu_item->{'text'}).' ';
- if (exists($menu_item->{'help'})) {
- $menu_html.=
- &Apache::loncommon::help_open_topic($menu_item->{'help'});
- }
- $menu_html.='
'.$/;
- }
- $r->print($menu_html);
+ }]}
+ );
+ $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
return;
}
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') {
@@ -3494,19 +3778,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().'
'.$$userdata{$user}[$$idx{fullname}].'
'.$uname.'
'.$udom.'
- ');
+
+
+
+ '.
+ &mt('Collaborative Tool').'
+
+
+ '.&mt('Fixed').'
+
+
+ '.&mt('Optional').'
+
+
+ ');
foreach my $tool (@{$showtools}) {
if (exists($$usertools{$user}{$tool})) {
- $r->print(''.$tool.' ');
+ $r->print(' ');
+ $r->print(''.$fixed.' '.$dynamic.'
');
} else {
- $r->print(' ');
+ $r->print(' ');
}
}
- $rowNum ++;
+ $r->print(&Apache::loncommon::end_data_table_row());
}
}
@@ -3553,27 +3845,270 @@ sub date_setting_table {
'startdate',$starttime);
my $endform = &Apache::lonhtmlcommon::date_setter($formname,
'enddate',$endtime);
- my $perpetual = '
- no ending date ';
- my $start_table = '';
- $start_table .= "\n";
- $start_table .= 'Default starting date for
- member access '.
- ''.$startform.' '.
- ' '." \n";
- $start_table .= "
";
- my $end_table = '';
- $end_table .= "\n";
- $end_table .= 'Default ending date for
- member access '.
- ''.$endform.' '.
- ''.$perpetual.' '." \n";
- $end_table .= "
\n";
- return ($start_table, $end_table);
+ my $perpetual = ' '
+ .' '
+ .&mt('No end date')
+ .' ';
+ my $table = &Apache::lonhtmlcommon::start_pick_box()
+ .&Apache::lonhtmlcommon::row_title(&mt('Start Date'))
+ .$startform
+ .&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title(&mt('End Date'))
+ .$endform
+ .$perpetual
+ .&Apache::lonhtmlcommon::row_closure(1)
+ .&Apache::lonhtmlcommon::end_pick_box();
+ return $table;
+}
+
+sub add_group_folder {
+ my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,
+ $gpterm,$ucgpterm,$crstype) = @_;
+ if ($cdom eq '' || $cnum eq '') {
+ my $error = '';
+ if ($crstype eq 'Community') {
+ $error .= &mt("Error: invalid community domain or number - group folder creation failed.");
+ } else {
+ $error .= &mt("Error: invalid course domain or number - group folder creation failed.");
+ }
+ $error .= ' ';
+ return $error;
+ }
+ my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage,$warning);
+ my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
+ $allgrpsmap = $crspath.'group_allfolders.sequence';
+ if ($action eq 'create') {
+ if (&get_folder_lock($cdom,$cnum,'group_allfolders',$now) eq 'ok') {
+ # check if group_allfolders.sequence exists.
+ my $mapcontents = &Apache::lonnet::getfile($allgrpsmap);
+ if ($mapcontents eq '-1') { #file does not exist;
+ my $grpstitle = &mt("$crstype $ucgpterm".'s');
+ my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'};
+ $topmap_url =~ s|/+|/|g;
+ if ($topmap_url =~ m|^/uploaded|) {
+ $outcome = &map_updater($cdom,$cnum,'group_allfolders.sequence',
+ 'toplevelgroup',$grpstitle,$topmap_url);
+ } else {
+ $outcome = ''
+ .&mt('Non-standard course - folder for all groups not added.')
+ .' ';
+ }
+ if ($outcome ne 'ok') {
+ my $delresult = &release_folder_lock($cdom,$cnum,'group_allfolders');
+ if ($delresult ne 'ok') {
+ $warning = $delresult;
+ }
+ return $outcome.$warning;
+ }
+ }
+ my $delresult = &release_folder_lock($cdom,$cnum,'group_allfolders');
+ if ($delresult ne 'ok') {
+ $warning = $delresult ;
+ }
+ } else {
+ $outcome = ''
+ .&mt('Could not obtain exclusive lock to check status of the folder for all groups. No group folder added.')
+ .' ';
+ return $outcome;
+ }
+ my $grpfolder = &mt($ucgpterm.' Folder - [_1]',$description);
+ $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/smppg';
+ my $grptitle = &mt('Group homepage - [_1]',$description);
+ my ($discussions,$disctitle);
+ my $outcome = &map_updater($cdom,$cnum,'group_folder_'.$groupname.'.sequence',
+ 'grpseq',$grpfolder,$allgrpsmap,$grppage,
+ $grptitle);
+ if ($outcome ne 'ok') {
+ return $outcome.$warning;
+ }
+ my $pageout = &create_homepage($cdom,$cnum,$groupname,$groupinfo,
+ $tools,$gpterm,$ucgpterm,$now);
+ # Link to folder for bulletin boards
+ $grpmap = $crspath.'group_folder_'.$groupname.'.sequence';
+ if (grep/^discussion$/,@{$tools}) {
+ $disctitle = &mt('Discussion Boards');
+ my $outcome = &map_updater($cdom,$cnum,'group_boards_'.$groupname.
+ '.sequence','bbseq',$disctitle,$grpmap);
+ if ($outcome ne 'ok') {
+ return $outcome.$warning;
+ }
+ $boardsmap = $crspath.'group_boards_'.$groupname.'.sequence';
+ }
+ } else {
+ #modify group folder if status of discussions tools is changed
+ }
+ my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (!defined($navmap)) {
+ $warning .= '';
+ if ($crstype eq 'Community') {
+ $warning .= &mt("Error retrieving community contents").
+ ' '.&mt("You need to re-initialize the community.");
+ } else {
+ $warning .= &mt("Error retrieving course contents").
+ ' '.&mt("You need to re-initialize the course.");
+ }
+ $warning .= ' ';
+ return $warning;
+ }
+ # modify parameters
+ my $parm_result;
+ if ($action eq 'create') {
+ if ($grpmap) {
+ $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname);
+ }
+ if ($grppage) {
+ $parm_result .= &parm_setter($navmap,$cdom,$grppage,$groupname);
+ }
+ if ($boardsmap) {
+ $parm_result .= &parm_setter($navmap,$cdom,$boardsmap,$groupname);
+ }
+ }
+ undef($navmap);
+ if ($parm_result) {
+ return $warning.$parm_result;
+ } else {
+ return 'ok';
+ }
+}
+
+sub get_folder_lock {
+ my ($cdom,$cnum,$folder_name,$now) = @_;
+ # get lock for folder being edited.
+ my $lockhash = {
+ $folder_name."\0".'locked_folder' => $now.':'.$env{'user.name'}.
+ ':'.$env{'user.domain'},
+ };
+ my $tries = 0;
+ my $gotlock = &Apache::lonnet::newput('coursegroups',$lockhash,$cdom,$cnum);
+
+ while (($gotlock ne 'ok') && $tries <3) {
+ $tries ++;
+ sleep(1);
+ $gotlock = &Apache::lonnet::newput('coursegroups',$lockhash,$cdom,$cnum);
+ }
+ return $gotlock;
+}
+
+sub release_folder_lock {
+ my ($cdom,$cnum,$folder_name) = @_;
+ # remove lock
+ my @del_lock = ($folder_name."\0".'locked_folder');
+ my $dellockoutcome=&Apache::lonnet::del('coursegroups',\@del_lock,$cdom,$cnum);
+ if ($dellockoutcome ne 'ok') {
+ return (''
+ .&mt('Warning: failed to release lock for folder: [_1].',''.$folder_name.' ')
+ .'
'
+ );
+ } else {
+ return 'ok';
+ }
+}
+
+sub map_updater {
+ my ($cdom,$cnum,$newfile,$itemname,$itemtitle,$parentmap,$startsrc,
+ $starttitle,$endsrc,$endtitle) = @_;
+ my $outcome;
+ $env{'form.'.$itemname} = &new_map($startsrc,$starttitle,$endsrc,
+ $endtitle);
+ my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname,
+ $newfile);
+ if ($newmapurl !~ m|^/uploaded|) {
+ $outcome = ''
+ .&mt('Error uploading new folder.')." ($newfile): $newmapurl"
+ .'
';
+ return $outcome;
+ }
+ my ($errtext,$fatal)=&LONCAPA::map::mapread($parentmap);
+ if ($fatal) {
+ $outcome = ''
+ .&mt('Error reading contents of parent folder.')." ($parentmap): $errtext"
+ .'
';
+ return $outcome;
+ } else {
+ my $newidx=&LONCAPA::map::getresidx($newmapurl);
+ $LONCAPA::map::resources[$newidx] = $itemtitle.':'.$newmapurl.
+ ':false:normal:res';
+ $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
+ my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1);
+ if ($errtext) {
+ $outcome = ''
+ .&mt('Error saving updated parent folder.')." ($parentmap): $errtext"
+ .'
';
+ return $outcome;
+ }
+ }
+ return 'ok';
+}
+
+sub new_map {
+ my ($startsrc,$starttitle,$endsrc,$endtitle) = @_;
+ my $newmapstr = '
+
+
+
+
+
+';
+ return $newmapstr;
+}
+
+sub parm_setter {
+ my ($navmap,$cdom,$url,$groupname,$crstype) = @_;
+ if (!defined($navmap)) {
+ my $allresults;
+ if ($crstype eq 'Community') {
+ $allresults = &mt("Parameters not set for [_1] because the contents of the community could not be retrieved.",$url).' '.
+ &mt("You need to reinitialize the community.");
+ } else {
+ $allresults = &mt("Parameters not set for [_1] because the contents of the course could not be retrieved.",$url).' '.
+ &mt("You need to reinitialize the course.");
+
+ }
+ return ''.$allresults.'
';
+ }
+ my %hide_settings = (
+ 'course' => {
+ 'num' => 13,
+ 'set' => 'yes',
+ },
+ 'group' => {
+ 'num' => 5,
+ 'set' => 'no',
+ 'extra' => $groupname,
+ },
+ );
+ my $res = $navmap->getResourceByUrl($url);
+ my $allresults;
+ if ($res) {
+ my $symb = $res->symb();
+ foreach my $level (keys(%hide_settings)) {
+ my $parmresult =
+ &Apache::lonparmset::storeparm_by_symb($symb,
+ '0_hiddenresource',
+ $hide_settings{$level}{'num'},
+ $hide_settings{$level}{'set'},
+ 'string_yesno',undef,$cdom,
+ undef,undef,
+ $hide_settings{$level}{'extra'});
+ if ($parmresult) {
+ $allresults .= $level.': '.$parmresult;
+ }
+ }
+ } else {
+ $allresults = '';
+ if ($crstype eq 'Community') {
+ $allresults .= &mt("Parameters not set for [_1] because the resource was not recognized as part of the community.",''.$url.' ');
+ } else {
+ $allresults .= &mt('Parameters not set for [_1] because the resource was not recognized as part of the course.',''.$url.' ');
+ }
+ $allresults .= '
';
+ }
+ return $allresults;
}
sub create_homepage {
- my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm) = @_;
+ my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm,$now) = @_;
my $functionality = join(',',@{$tools});
my $content = &unescape($$groupinfo{description});
$content=~s/\s+$//s;
@@ -3586,7 +4121,7 @@ sub create_homepage {
'abb_links' => $functionality,
'bbb_content' => $content,
'ccc_webreferences' => '',
- 'uploaded.lastmodified' => time,
+ 'uploaded.lastmodified' => $now,
);
my $putresult = &Apache::lonnet::put('grppage_'.$name,\%pageinfo,$cdom,$cnum);
return $putresult;
@@ -3631,7 +4166,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 ",
@@ -3646,8 +4186,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/)) {
@@ -3658,12 +4198,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'}.
@@ -3674,27 +4216,6 @@ sub validate_groupname {
return;
}
-sub topic_bar {
- my ($r,$tabcol,$imgnum,$title) = @_;
- $r->print('
-
-
-
-
-
-
-
- '.$title.'
-
-
-
-
-
-
-');
- return;
-}
-
sub check_changes {
my ($member_changes,$memchg) = @_;
my %exclusions;
@@ -3734,3 +4255,4 @@ sub check_changes {
}
1;
+