@@ -628,58 +2638,809 @@ ENDSCRIPT
} else {
my $onload;
}
+ my ($crscat,$catcrs,$assign);
+ if ($crstype eq 'Community') {
+ $crscat = 'Community Categories';
+ $catcrs = &mt('Categorize Community');
+ $assign = &mt('Assign one or more categories to this community.')
+ } else {
+ $crscat = 'Course Categories';
+ $catcrs = &mt('Categorize Course');
+ $assign = &mt('Assign one or more categories to this course.')
+ }
my $start_page =
- &Apache::loncommon::start_page('Course Categories',$catwin_js,
+ &Apache::loncommon::start_page($crscat,$catwin_js,
{'only_body' => 1,});
my $end_page = &Apache::loncommon::end_page();
- my $categoriesform = ''.&mt('Categorize Course').' ';
+ my $categoriesform = ''.$catcrs.' ';
if ($hascats) {
my %currsettings =
&Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);
- $categoriesform .= &mt('Assign one or more categories to this course.').' '.
+ my $cattable = &Apache::loncommon::assign_categories_table($cathash,
+ $currsettings{'categories'},$crstype);
+ if ($cattable eq '') {
+ $categoriesform .= &mt('No suitable categories defined for this course type in this domain.');
+ } else {
+ $categoriesform .= $assign.' '.
' ';
+ }
} else {
- $categoriesform .= &mt('No categories defined for this domain');
+ $categoriesform .= &mt('No categories defined in this domain.');
}
$r->print($start_page.$categoriesform.$end_page);
return;
}
+sub display_loncaparev_constraints {
+ my ($r,$navmap,$loncaparev,$crstype) = @_;
+ my ($reqdmajor,$reqdminor);
+ my $cid = $env{'request.course.id'};
+ my $cdom = $env{'course.'.$cid.'.domain'};
+ my $cnum = $env{'course.'.$cid.'.num'};
+ my $output;
+ my %lt = &Apache::lonlocal::texthash (
+ 'all' => 'all',
+ 'section/group' => 'section/group',
+ 'user' => 'user',
+ );
+ &Apache::lonrelrequtils::init_global_hashes();
+ if (defined($Apache::lonrelrequtils::checkcrstypes{$crstype})) {
+ ($reqdmajor,$reqdminor) = split(/\./,$Apache::lonrelrequtils::checkcrstypes{$crstype});
+ $output .= ''.&mt('Course type: [_1] requires [_2] or newer',$crstype,
+ $Apache::lonrelrequtils::checkcrstypes{$crstype}).' ';
+ }
+ my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps,
+ %byresponsetype,%bysubmission,%fromblocks);
+ @scopeorder = ('all','section/group','user');
+ my $now = time;
+ my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom);
+ if (ref($resourcedata) eq 'HASH') {
+ foreach my $key (keys(%{$resourcedata})) {
+ foreach my $item (keys(%Apache::lonrelrequtils::checkparms)) {
+ if ($key =~ /(\Q$item\E)$/) {
+ if (ref($Apache::lonrelrequtils::checkparms{$item}) eq 'ARRAY') {
+ my $value = $resourcedata->{$key};
+ if ($item eq 'examcode') {
+ if (&Apache::lonnet::validCODE($value)) {
+ $value = 'valid';
+ } else {
+ $value = '';
+ }
+ } elsif ($item eq 'printstartdate') {
+ if ($value =~ /^\d+$/) {
+ if ($value > $now) {
+ $value = 'future';
+ }
+ }
+ } elsif ($item eq 'printenddate') {
+ if ($value =~ /^\d+$/) {
+ if ($value < $now) {
+ $value = 'past';
+ }
+ }
+
+ }
+ my ($middle,$scope,$which,$level,$map,$resource);
+ if (grep(/^\Q$value\E$/,@{$Apache::lonrelrequtils::checkparms{$item}})) {
+ my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
+ my $stdname = &Apache::lonparmset::standard_parameter_names($item);
+ my $valname = &get_param_description($stdtype,$value);
+ my $rev = $Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value};
+ my $start = $cid.'.';
+ if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {
+ $middle = $1;
+ $which = $2;
+ $scope = 'user';
+ } elsif ($key =~ /^\Q$start\E(\[(\w+)\]\.)/) {
+ $middle = $1;
+ $which = $2;
+ $scope = 'section/group';
+ } else {
+ $scope = 'all';
+ }
+ my $what="$stdname=$valname";
+ if ($key =~ /^\Q$start$middle\E\w+\.\Q$item\E$/) {
+ $level = 'general';
+ if ($scope eq 'all') {
+ if (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}})) {
+ push(@{$fromparam{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$fromparam{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($fromparam{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}{$which}})) {
+ push(@{$fromparam{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$fromparam{$rev}{$scope}{$which}},$what);
+ }
+ }
+ $rowspan{$rev} ++;
+ } elsif ($key =~ /^\Q$start$middle\E(.+)___\(all\).\w+\.\Q$item\E$/) {
+ $level = 'folder';
+ $map = $1;
+ if ($scope eq 'all') {
+ if (ref($bymap{$map}{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}})) {
+ push(@{$bymap{$map}{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$bymap{$map}{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($bymap{$map}{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}{$which}})) {
+ push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
+ }
+ }
+ } elsif ($key =~ /^\Q$start$middle\E(.+)\.\w+\.\Q$item\E$/) {
+ $level = 'resource';
+ $resource = $1;
+ if ($scope eq 'all') {
+ if (ref($byresource{$resource}{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}})) {
+ push(@{$byresource{$resource}{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$byresource{$resource}{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($byresource{$resource}{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}{$which}})) {
+ push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (keys(%fromparam)) {
+ $output .= ''.&mt('Requirements from general settings').' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Release').' '.&mt('Scope').' '.
+ ''.&mt('Extent').' '.&mt('Setting').' '.
+ &Apache::loncommon::end_data_table_header_row();
+ foreach my $rev (keys(%fromparam)) {
+ my ($major,$minor) = split(/\./,$rev);
+ ($reqdmajor,$reqdminor) =
+ &Apache::lonrelrequtils::update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$rev.' ';
+ my $newrow;
+ foreach my $scope (@scopeorder) {
+ if (ref($fromparam{$rev}{$scope}) eq 'HASH') {
+ if ($newrow) {
+ $output .= &Apache::loncommon::continue_data_table_row();
+ }
+ $output .= ''.$lt{$scope}.' ';
+ foreach my $which (sort(keys(%{$fromparam{$rev}{$scope}}))) {
+ $output .= ''.$which.' '.
+ join(' ',@{$fromparam{$rev}{$scope}{$which}}).' ';
+ }
+ $output .= &Apache::loncommon::end_data_table_row();
+ $newrow = 1;
+ } elsif (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
+ if ($newrow) {
+ $output .= &Apache::loncommon::continue_data_table_row();
+ }
+ $output .= ''.$lt{$scope}.' '.
+ join(' ',@{$fromparam{$rev}{$scope}}).' '.
+ &Apache::loncommon::end_data_table_row();
+ $newrow = 1;
+ }
+ }
+ }
+ $output .= &Apache::loncommon::end_data_table().' ';
+ }
+ }
+
+ my %comm_blocks = &Apache::lonnet::dump('comm_block',$cdom,$cnum);
+ my $now = time;
+ if (keys(%comm_blocks) > 0) {
+ foreach my $block (keys(%comm_blocks)) {
+ if ($block =~ /^firstaccess____(.+)$/) {
+ my $rev = $Apache::lonnet::needsrelease{'course:commblock:timer'};
+ if (ref($comm_blocks{$block}) eq 'HASH') {
+ push(@{$fromblocks{'timer'}{$rev}},&unescape($comm_blocks{$block}{'event'}).
+ ' '.&mt('set by [_1]',
+ &Apache::loncommon::plainname(split(/:/,$comm_blocks{$block}{'setter'}))));
+ }
+ next;
+ } elsif ($block =~ /^(\d+)____(\d+)$/) {
+ my ($start,$end) = ($1,$2);
+ next if ($end < $now);
+ }
+ if (ref($comm_blocks{$block}) eq 'HASH') {
+ if (ref($comm_blocks{$block}{'blocks'}) eq 'HASH') {
+ if (ref($comm_blocks{$block}{'blocks'}{'docs'}) eq 'HASH') {
+ if (keys(%{$comm_blocks{$block}{'blocks'}{'docs'}}) > 0) {
+ my $rev = $Apache::lonnet::needsrelease{'course:commblock:docs'};
+ push(@{$fromblocks{'docs'}{$rev}},&unescape($comm_blocks{$block}{'event'}).
+ ' '.
+ &mt('set by [_1]',
+ &Apache::loncommon::plainname(split(/:/,$comm_blocks{$block}{'setter'}))));
+ }
+ } elsif ($comm_blocks{$block}{'blocks'}{'printout'} eq 'on') {
+ my $rev = $Apache::lonnet::needsrelease{'course:commblock:printout'};
+ push(@{$fromblocks{'printout'}{$rev}},&unescape($comm_blocks{$block}{'event'}).
+ ' '.
+ &mt('set by [_1]',
+ &Apache::loncommon::plainname(split(/:/,$comm_blocks{$block}{'setter'}))));
+
+ }
+ }
+ }
+ }
+ if (keys(%fromblocks)) {
+ my %lt = (
+ docs => 'Content blocking',
+ printout => 'Printout generation',
+ timer => 'Timed quiz trigger',
+ );
+ $output .= ''.&mt('Requirements from exam blocking').' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Release').' '.&mt('Setting').' '.
+ ''.&mt('Event(s)').' '.
+ &Apache::loncommon::end_data_table_header_row();
+ foreach my $type ('docs','printout','timer') {
+ if (ref($fromblocks{$type}) eq 'HASH') {
+ foreach my $rev (keys(%{$fromblocks{$type}})) {
+ my ($major,$minor) = split(/\./,$rev);
+ ($reqdmajor,$reqdminor) =
+ &Apache::lonrelrequtils::update_reqd_loncaparev($major,$minor,$reqdmajor,$reqdminor);
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$rev.' '.$lt{$type}.' ';
+ foreach my $event (sort(@{$fromblocks{$type}{$rev}})) {
+ $output .= $event.' ';
+ }
+ $output =~ s{\Q \E$}{};
+ $output .= ' '.&Apache::loncommon::end_data_table_row();
+ }
+ }
+ }
+ $output .= &Apache::loncommon::end_data_table().' ';
+ }
+ }
+
+ if (defined($navmap)) {
+ my %anonsubms=&Apache::lonnet::dump('nohist_anonsurveys',$cdom,$cnum);
+ my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'};
+ my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum);
+ my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry'};
+ my $stdtype=&Apache::lonparmset::standard_parameter_types('type');
+ my $stdname=&Apache::lonparmset::standard_parameter_names('type');
+ my $valanon=&get_param_description($stdtype,'anonsurvey');
+ my $valrandtry=&get_param_description($stdtype,'randomizetry');
+ my %checkedrev;
+ foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) {
+ my @parts = @{$res->parts()};
+ my $symb = $res->symb();
+ my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src());
+ foreach my $part (@parts) {
+ if (exists($anonsubms{$symb."\0".$part})) {
+ my $rev = $rev_anonsurv;
+ my $what="$stdname=$valanon";
+ if (ref($bysubmission{$symb}{$rev}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E/,@{$bysubmission{$symb}{$rev}})) {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ } else {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ $allmaps{$enclosing_map} = 1;
+ unless ($checkedrev{'anonsurvey'}) {
+ my ($major,$minor) = split(/\./,$rev);
+ ($reqdmajor,$reqdminor) =
+ &Apache::lonrelrequtils::update_reqd_loncaparev($major,$minor,
+ $reqdmajor,$reqdminor);
+ $checkedrev{'anonsurvey'} = 1;
+ }
+ }
+ if (exists($randtrysubms{$symb."\0".$part})) {
+ my $rev = $rev_randtry;
+ my $what="$stdname=$valrandtry";
+ if (ref($bysubmission{$symb}{$rev}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E/,@{$bysubmission{$symb}{$rev}})) {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ } else {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ $allmaps{$enclosing_map} = 1;
+ unless ($checkedrev{'randomizetry'}) {
+ my ($major,$minor) = split(/\./,$rev);
+ ($reqdmajor,$reqdminor) =
+ &Apache::lonrelrequtils::update_reqd_loncaparev($major,$minor,
+ $reqdmajor,$reqdminor);
+ $checkedrev{'randomizetry'} = 1;
+ }
+ }
+ }
+ my %responses = $res->responseTypes();
+ foreach my $key (keys(%responses)) {
+ if (exists($Apache::lonrelrequtils::checkresponsetypes{$key})) {
+ my $rev = $Apache::lonrelrequtils::checkresponsetypes{$key};
+ unless ($checkedrev{$key}) {
+ my ($major,$minor) = split(/\./,$rev);
+ ($reqdmajor,$reqdminor) =
+ &Apache::lonrelrequtils::update_reqd_loncaparev($major,$minor,
+ $reqdmajor,$reqdminor);
+ $checkedrev{$key} = 1;
+ }
+ push(@{$byresponsetype{$symb}{$rev}},$key);
+ $allmaps{$enclosing_map} = 1;
+ }
+ }
+ }
+ if (keys(%byresource) > 0) {
+ foreach my $symb (keys(%byresource)) {
+ my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);
+ $allmaps{$map} = 1;
+ }
+ }
+ if (keys(%bymap) > 0) {
+ foreach my $map (keys(%bymap)) {
+ $allmaps{$map} = 1;
+ }
+ }
+ foreach my $map (keys(%allmaps)) {
+ my $mapres = $navmap->getResourceByUrl($map);
+ if (ref($mapres)) {
+ my $mapsymb = $mapres->symb();
+ $toshow{$mapsymb} = 1;
+ my $pcslist = $mapres->map_hierarchy();
+ if ($pcslist ne '') {
+ foreach my $pc (split(/,/,$pcslist)) {
+ my $res = $navmap->getByMapPc($pc);
+ if (ref($res)) {
+ my $symb = $res->symb();
+ unless ($symb eq '______') {
+ $toshow{$symb} = 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ my $mapres_header = ''.
+ &mt('Requirements for specific folders or resources').
+ ' ';
+ if ((keys(%toshow) > 0) || (keys(%byresource) > 0) ||
+ (keys(%bysubmission) > 0) || (keys(%byresponsetype))) {
+ $output .= $mapres_header;
+ }
+ my $top_header = ''.&mt('LON-CAPA version dependencies').' ';
+ my $title = 'Version Constraints';
+ my $start_page =
+ &Apache::loncommon::start_page($title,undef,{'only_body' => 1,});
+ $r->print($start_page.$top_header);
+ if ($output) {
+ $r->print($output);
+ if (defined($navmap)) {
+ &show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission,
+ \%byresponsetype,\@scopeorder,\%lt);
+ }
+ $r->print(' ');
+ } else {
+ $r->print(''.
+ &mt('No version requirements from resource content or settings.').
+ '
');
+ }
+ $r->print(&Apache::loncommon::end_page());
+ my ($currmajor,$currminor) = split(/\./,$loncaparev);
+ if (($currmajor != $reqdmajor) || ($currminor != $reqdminor)) {
+ return 1;
+ }
+ return;
+}
+
+sub show_contents_view {
+ my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype,
+ $scopeorder,$lt) = @_;
+ if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||
+ (keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0)) {
+ my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
+ my $whitespace = ' ';
+ my $icon = ' ';
+ my $topmap = $env{'course.'.$cid.'.url'};
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Location').' '.&mt('Release').' '.
+ ''.&mt('Attribute/Setting').' '.
+ &Apache::loncommon::end_data_table_header_row().
+ &Apache::loncommon::start_data_table_row().
+ ' '.$icon.' '.&mt('Main Content').' ');
+ &releases_by_map($r,$bymap,$topmap,$scopeorder,$lt);
+ $r->print(&Apache::loncommon::end_data_table_row());
+ my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);
+ my $curRes;
+ my $depth = 0;
+ my %parent = ();
+ my $startcount = 5;
+ my $lastcontainer = $startcount;
+ while ($curRes = $it->next()) {
+ if ($curRes == $it->BEGIN_MAP()) {
+ $depth++;
+ $parent{$depth}= $lastcontainer;
+ }
+ if ($curRes == $it->END_MAP()) {
+ $depth--;
+ $lastcontainer = $parent{$depth};
+ }
+ my $indent;
+ for (my $i=0; $i<$depth; $i++) {
+ $indent.= $whitespace;
+ }
+ if (ref($curRes)) {
+ my $symb = $curRes->symb();
+ my $ressymb = $symb;
+ my $srcf = $curRes->src();
+ my $title = &Apache::lonnet::gettitle($srcf);
+ if (($curRes->is_sequence()) || ($curRes->is_page())) {
+ next unless($toshow->{$symb});
+ my ($parent,$ind,$url) = &Apache::lonnet::decode_symb($symb);
+ $icon = ' ';
+ if ($curRes->is_page()) {
+ $icon = ' ';
+ }
+ my $rowspan = 1;
+ if (ref($bymap->{$url}) eq 'HASH') {
+ $rowspan = scalar(keys(%{$bymap->{$url}}));
+ }
+ $r->print(&Apache::loncommon::start_data_table_row().
+ ''.$indent.$icon.' '.$title.' ');
+ &releases_by_map($r,$bymap,$url,$scopeorder,$lt);
+ $r->print(&Apache::loncommon::end_data_table_row());
+ } else {
+ my $rowspan;
+ if (ref($byresource->{$symb}) eq 'HASH') {
+ $rowspan += scalar(keys(%{$byresource->{$symb}}));
+ }
+ if (ref($bysubmission->{$symb}) eq 'HASH') {
+ $rowspan += scalar(keys(%{$bysubmission->{$symb}}));
+ }
+ if (ref($byresponsetype->{$symb}) eq 'HASH') {
+ $rowspan += scalar(keys(%{$byresponsetype->{$symb}}));
+ }
+ next if (!$rowspan);
+ $icon = ' ';
+ $r->print(&Apache::loncommon::start_data_table_row().
+ ''.$indent.$icon.' '.$title.' ');
+ my $newrow;
+ if (ref($byresource->{$symb}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$byresource->{$symb}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' ');
+ if (ref($byresource->{$symb}{$rev}) eq 'HASH') {
+ $r->print('');
+ foreach my $scope (@{$scopeorder}) {
+ if (ref($byresource->{$symb}{$rev}{$scope}) eq 'HASH') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).' ');
+ foreach my $which (sort(keys(%{$byresource->{$symb}{$rev}{$scope}}))) {
+ $r->print(''.$which.' '.
+ join(' ',@{$byresource->{$symb}{$rev}{$scope}{$which}}).
+ ' ');
+ }
+ $r->print(' ');
+ } elsif (ref($byresource->{$symb}{$rev}{$scope}) eq 'ARRAY') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).' '.
+ ' '.
+ join(' ',@{$byresource->{$symb}{$rev}{$scope}}).' ');
+ }
+ }
+ $r->print('
');
+ }
+ $r->print(' ');
+ $r->print(&Apache::loncommon::end_data_table_row());
+ $newrow = 1;
+ }
+ }
+ if (ref($bysubmission->{$symb}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$bysubmission->{$symb}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' ');
+ if (ref($bysubmission->{$symb}{$rev}) eq 'ARRAY') {
+ $r->print(&mt('Submissions to: ').' '.
+ join(', ',@{$bysubmission->{$symb}{$rev}}));
+ }
+ $r->print(' ');
+ $r->print(&Apache::loncommon::end_data_table_row());
+ $newrow = 1;
+ }
+ }
+ if (ref($byresponsetype->{$symb}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$byresponsetype->{$symb}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' ');
+ if (ref($byresponsetype->{$symb}{$rev}) eq 'ARRAY') {
+ $r->print(&mt('Response Type(s): ').' '.
+ join(' ',@{$byresponsetype->{$symb}{$rev}}));
+ }
+ $r->print(' ');
+ }
+ $r->print(&Apache::loncommon::end_data_table_row());
+ }
+ }
+ }
+ }
+ $r->print(&Apache::loncommon::end_data_table());
+ }
+ return;
+}
+
+sub releases_by_map {
+ my ($r,$bymap,$url,$scopeorder,$lt) = @_;
+ return unless ((ref($bymap) eq 'HASH') && (ref($scopeorder) eq 'ARRAY'));
+ my $newrow = 0;
+ if (ref($bymap->{$url}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$bymap->{$url}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' ');
+ if (ref($bymap->{$url}{$rev}) eq 'HASH') {
+ $r->print('');
+ foreach my $scope (@{$scopeorder}) {
+ if (ref($bymap->{$url}{$rev}{$scope}) eq 'HASH') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).' ');
+ foreach my $which (sort(keys(%{$bymap->{$url}{$rev}{$scope}}))) {
+ $r->print(''.$which.' '.
+ join(' ',@{$bymap->{$url}{$rev}{$scope}{$which}}).
+ ' ');
+ }
+ $r->print(' ');
+ } elsif (ref($bymap->{$url}{$rev}{$scope}) eq 'ARRAY') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).
+ ' '.
+ join(' ',@{$bymap->{$url}{$rev}{$scope}}).' ');
+ }
+ }
+ $r->print('
');
+ }
+ $r->print(' ');
+ $newrow = 1;
+ }
+ } else {
+ $r->print(' ');
+ }
+ return;
+}
+
+sub get_param_description {
+ my ($stdtype,$value) = @_;
+ my $name = $value;
+ my $paramstrings = &Apache::lonparmset::standard_string_options($stdtype);
+ unless (ref($paramstrings) eq 'ARRAY') {
+ return $name;
+ }
+ foreach my $possibilities (@{$paramstrings}) {
+ next unless (ref($possibilities) eq 'ARRAY');
+ my ($thing, $description) = @{ $possibilities };
+ if ($thing eq $value) {
+ $name = $description;
+ last;
+ }
+ }
+ return $name;
+}
+
+sub update_releasereq {
+ my $readmap = 1;
+ my $getrelreq = 1;
+ if (ref($modified_courses) eq 'ARRAY') {
+ foreach my $item (@{$modified_courses}) {
+ if (ref($item) eq 'ARRAY') {
+ my ($cdom,$cnum,$chome,$crstype) = @{$item};
+ &Apache::lonrelrequtils::modify_course_relreq(undef,undef,$cnum,$cdom,
+ $chome,$crstype,$cdom.'_'.$cnum,
+ $readmap,$getrelreq);
+ }
+ }
+ $modified_courses = [];
+ }
+ return OK;
+}
+
+sub show_autocoowners {
+ my (@currcoown) = @_;
+ my $output = ''.&mt('Co-ownership is set automatically when a Course Coordinator role[_1] is assigned to official course personnel (from institutional data).',' ').' ';
+ if (@currcoown > 0) {
+ $output .= ' '.&mt('Current co-owners are:').' '.
+ join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));
+ } else {
+ $output .= ' '.&mt('Currently no co-owners.');
+ }
+ return $output;
+}
+
+sub coowner_invitations {
+ my ($cnum,$cdom,$currcoownref,$noedit) = @_;
+ my ($output,@pendingcoown,@othercoords,@currcoown);
+ my $pendingcoowners =
+ $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
+ if ($pendingcoowners) {
+ @pendingcoown = split(',',$pendingcoowners);
+ }
+ if (ref($currcoownref) eq 'ARRAY') {
+ @currcoown = @{$currcoownref};
+ }
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
+ my $ccrole = 'cc';
+ my %ccroles = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,[$ccrole]);
+ foreach my $key (sort(keys(%ccroles))) {
+ my ($ccname,$ccdom,$role) = split(':',$key);
+ next if ($key eq $env{'user.name'}.':'.$env{'user.domain'}.':'.$ccrole);
+ unless (grep(/^\Q$ccname\E:\Q$ccdom\E$/,@currcoown,@pendingcoown)) {
+ push(@othercoords,$ccname.':'.$ccdom);
+ }
+ }
+ my $coowner_rows = @currcoown + @pendingcoown + @othercoords;
+ if ($coowner_rows) {
+ $output .= &Apache::loncommon::start_data_table();
+ if (@currcoown) {
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.&mt('Current co-owners').' ';
+ foreach my $person (@currcoown) {
+ my ($co_uname,$co_dom) = split(':',$person);
+ $output .= ' '.&Apache::loncommon::plainname($co_uname,$co_dom).' '.(' 'x2).' ';
+ }
+ $output .= ' '.
+ &Apache::loncommon::end_data_table_row();
+ }
+ if ($pendingcoowners) {
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.&mt('Invited as co-owners [_1](agreement pending)',' ').' ';
+ foreach my $person (@pendingcoown) {
+ my ($co_uname,$co_dom) = split(':',$person);
+ $output .= ' '.&Apache::loncommon::plainname($co_uname,$co_dom).' '.(' 'x2).' ';
+ }
+ $output .= ' '.
+ &Apache::loncommon::end_data_table_row();
+ }
+ if (@othercoords) {
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.&mt('Invite other Coordinators [_1]to become co-owners',' ').' ';
+ foreach my $person (@othercoords) {
+ my ($co_uname,$co_dom) = split(':',$person);
+ $output .= ' '.&Apache::loncommon::plainname($co_uname,$co_dom).' '.(' 'x2).' ';
+ }
+ $output .= ' '.
+ &Apache::loncommon::end_data_table_row();
+ }
+ $output .= &Apache::loncommon::end_data_table();
+ } else {
+ $output = &mt('There are no coordinators to select as co-owners');
+ }
+ return $output;
+}
+
+sub manage_coownership {
+ my ($cnum,$cdom,$currcoownref,$noedit) = @_;
+ my (@pendingcoown,@currcoown);
+ my $pendingcoowners =
+ $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
+ if ($pendingcoowners) {
+ @pendingcoown = split(',',$pendingcoowners);
+ }
+ if (ref($currcoownref) eq 'ARRAY') {
+ @currcoown = @{$currcoownref};
+ }
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
+ my ($is_coowner,$is_pending,$output);
+ my $uname = $env{'user.name'};
+ my $udom = $env{'user.domain'};
+ if (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) {
+ $is_coowner = 1;
+ }
+ if (grep(/^\Q$uname\E:\Q$udom\E$/,@pendingcoown)) {
+ $is_pending = 1;
+ }
+ if (@currcoown && ($is_coowner || $is_pending)) {
+ $output = &Apache::loncommon::start_data_table();
+ }
+ if (@currcoown) {
+ if ($is_coowner || $is_pending) {
+ $output .= &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().'';
+ }
+ $output .= &mt('Current co-owners are:').' '.
+ join(', ', map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));
+ if ($is_coowner || $is_pending) {
+ $output .= ' '.&Apache::loncommon::end_data_table_row();
+ }
+ }
+ if ($is_coowner || $is_pending) {
+ if (@currcoown) {
+ $output .= &Apache::loncommon::start_data_table_row().'';
+ }
+ $output .= '';
+ if ($is_coowner) {
+ $output .= &mt('You are currently a co-owner:').' '.&mt('Discontinue?').' ';
+ } else {
+ $output .= &mt('The course owner has invited you to become a co-owner:').' '.&mt('Accept?').' '.(' 'x2).
+ ' '.&mt('Decline?').' ';
+ }
+ $output .= ' ';
+ if (@currcoown) {
+ $output .= ' '.&Apache::loncommon::end_data_table_row();
+ }
+ }
+ if (@currcoown && ($is_coowner || $is_pending)) {
+ $output .= &Apache::loncommon::end_data_table();
+ }
+ return $output;
+}
+
sub print_localization {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
languages => {
- text => &mt('Languages used').' '.&mt("(will override user's preference)"),
+ text => ''.&mt($itemtext->{'languages'}).' '.
+ &mt("(overrides individual user preference)"),
input => 'selectbox',
},
timezone => {
- text => &mt('Timezone in which the course takes place'),
+ text => ''.&mt($itemtext->{'timezone'}).' ',
input => 'selectbox',
},
datelocale => {
- text => &mt('Locale used for course calendar'),
+ text => ''.&mt($itemtext->{'datelocale'}).' ',
input => 'selectbox',
},
);
- my $datatable;
+ my ($datatable,$disabled);
my $count = 0;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
foreach my $item (@{$ordered}) {
$count ++;
- $datatable .= &item_table_row_start($items{$item}{text},$count);
+ my $colspan;
+ unless ($item eq 'languages') {
+ $colspan = 2;
+ }
+ $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);
if ($item eq 'timezone') {
my $includeempty = 1;
my $timezone = &Apache::lonlocal::gettimezone();
$datatable .=
&Apache::loncommon::select_timezone($item,$timezone,undef,
- $includeempty);
+ $includeempty,$disabled);
} elsif ($item eq 'datelocale') {
my $includeempty = 1;
my $locale_obj = &Apache::lonlocal::getdatelocale();
@@ -689,42 +3450,48 @@ sub print_localization {
}
$datatable .=
&Apache::loncommon::select_datelocale($item,$currdatelocale,
- undef,$includeempty);
+ undef,$includeempty,$disabled);
} else {
if ($settings->{$item} eq '') {
- $datatable .=
- &Apache::loncommon::select_language('language_0','',1);
+ unless ($noedit) {
+ $datatable .= ''.
+ &Apache::loncommon::select_language('languages_0','',1);
+ }
} else {
my $num = 0;
- my @languages = split(/\s*(\,|\;|\:)\s*/,$settings->{$item});
- $datatable .= &Apache::loncommon::start_data_table();
+ my @languages = split(/\s*[,;:]\s*/,$settings->{$item});
+ $datatable .= ' '.
+ &Apache::loncommon::start_data_table();
if (@languages > 0) {
+ my %langchoices = &get_lang_choices();
foreach my $lang (@languages) {
my $showlang = $lang;
- my $code = &Apache::loncommon::supportedlanguagecode($lang);
- if ($code) {
- $showlang = &plainlanguagedescription($lang);
+ if (exists($langchoices{$lang})) {
+ $showlang = $langchoices{$lang};
}
$datatable .=
&Apache::loncommon::start_data_table_row().
- ''.
+ ' '.
&mt('Language:').' '.$showlang.
' '.
' '.
+ 'name="languages_delete" value="'.$num.'"'.$disabled.' />'.
&mt('Delete').' '.
- &Apache::loncommon::end_data_table_row().'';
+ &Apache::loncommon::end_data_table_row();
$num ++;
}
}
- $datatable .= &Apache::loncommon::start_data_table_row().
- ''.
- &mt('Additional language:').' '.
- &Apache::loncommon::select_language($item);
+ unless ($noedit) {
+ $datatable .=
+ &Apache::loncommon::start_data_table_row().
+ ''.
+ &mt('Additional language:'). ' '.
+ &Apache::loncommon::select_language('languages_'.$num,'',1).
' '.
- ' '.&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
+ ''.&Apache::loncommon::end_data_table_row();
+ }
+ $datatable .= &Apache::loncommon::end_data_table().' ';
}
}
$datatable .= &item_table_row_end();
@@ -733,26 +3500,37 @@ sub print_localization {
return $datatable;
}
+sub get_lang_choices {
+ my %langchoices;
+ foreach my $id (&Apache::loncommon::languageids()) {
+ my $code = &Apache::loncommon::supportedlanguagecode($id);
+ if ($code) {
+ $langchoices{$code} = &Apache::loncommon::plainlanguagedescription($id);
+ }
+ }
+ return %langchoices;
+}
+
sub print_feedback {
- my ($position,$cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($position,$cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
- 'question' => {
- text => ''.&mt('Resource Content').' ',
+ 'question.email' => {
+ text => ''.&mt($itemtext->{'question.email'}).' ',
input => 'textbox',
size => '50',
},
- 'comment' => {
- text => ''.&mt('Course Content').' ',
+ 'comment.email' => {
+ text => ''.&mt($itemtext->{'comment.email'}).' ',
input => 'textbox',
size => '50',
},
- 'policy' => {
- text => ''.&mt('Course Policy').' ',
+ 'policy.email' => {
+ text => ''.&mt($itemtext->{'policy.email'}).' ',
input => 'textbox',
size => '50',
},
@@ -763,23 +3541,31 @@ sub print_feedback {
my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
my @sections = sort( { $a <=> $b } keys(%sections));
my %lt = &Apache::lonlocal::texthash (
- currone => 'Current recipient:',
- curmult => 'Current recipients:',
- add => 'Additional recipient:',
- del => 'Delete?',
- sec => 'Sections:',
+ currone => 'Current recipient:',
+ currmult => 'Current recipients:',
+ add => 'Additional recipient:',
+ del => 'Delete?',
+ sec => 'Sections:',
);
-
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
foreach my $item (@{$ordered}) {
$count ++;
- $datatable .= &item_table_row_start($items{$item}{text},$count);
+ if ($position eq 'top') {
+ $datatable .= &item_table_row_start($items{$item}{text},$count);
+ } else {
+ $datatable .= &item_table_row_start($items{$item}{text}." (Custom text)",$count, "advanced",2);
+ }
if ($position eq 'top') {
my $includeempty = 0;
- $datatable .= &user_table($cdom,$item,\@sections,
- $settings->{$item.'.email'},\%lt);
+ $datatable .= ''.
+ &user_table($cdom,$item,\@sections,
+ $settings->{$item},\%lt,$noedit);
} else {
- $datatable .= &Apache::lonhtmlcommon::textbox($item.'_text',
- $settings->{$item},$items{$item}{size});
+ $datatable .= &Apache::lonhtmlcommon::textbox($item.'.text',
+ $settings->{$item.'.text'},$items{$item}{size},$disabled);
}
$datatable .= &item_table_row_end();
}
@@ -788,15 +3574,21 @@ sub print_feedback {
}
sub user_table {
- my ($cdom,$item,$sections,$currvalue,$lt) = @_;
+ my ($cdom,$item,$sections,$currvalue,$lt,$noedit) = @_;
my $output;
if ($currvalue eq '') {
- $output .= &select_recipient($item,'0',$cdom,$sections);
+ unless ($noedit) {
+ $output .= &select_recipient($item,'0',$cdom,$sections);
+ }
} else {
my $num = 0;
my @curr = split(/,/,$currvalue);
- $output .= &Apache::loncommon::start_data_table();
+ $output .= '';
my ($currusers);
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
foreach my $val (@curr) {
next if ($val eq '');
my ($uname,$udom,$seclist) = ($val =~ /^($match_username):($match_domain)(\(?[^\)]*\)?)$/);
@@ -808,10 +3600,10 @@ sub user_table {
$currusers .= ''.
''.
' '.
+ 'name="'.$item.'_delete" value="'.$num.'"'.$disabled.' />'.
$lt->{'del'}.' '.
' '.(' 'x2).
+ $num.'" value="'.$uname.':'.$udom.'" />'.(' 'x2).
&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($uname,$udom,'firstname'),
$uname,$udom,'aboutuser');
@@ -819,31 +3611,34 @@ sub user_table {
if (@{$sections}) {
$currusers.= (' 'x3).$lt->{'sec'}.' '.
&select_sections($item,$num,$sections,
- \@selsec);
+ \@selsec,$noedit);
}
}
$currusers .= ' ';
$num ++;
}
if ($num) {
- $output .= &Apache::loncommon::start_data_table_row().
+ $output .= ''.
'';
- if ($num > 1) {
+ if ($num == 1) {
$output .= $lt->{'currone'};
} else {
$output .= $lt->{'currmult'};
}
$output .= ' '.
' '.
- &Apache::loncommon::end_data_table_row();
+ ' ';
}
- $output .= &Apache::loncommon::start_data_table_row().
+ unless ($noedit) {
+ $output .=
+ ''.
''.
$lt->{'add'}.' '.
&select_recipient($item,$num,$cdom,$sections).
' '.
- ' '.&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
+ ' ';
+ }
+ $output .= '
';
}
return $output;
}
@@ -853,7 +3648,7 @@ sub select_recipient {
my $domform = &Apache::loncommon::select_dom_form($cdom,$item.'_udom_'.$num,$includeempty);
my $selectlink =
&Apache::loncommon::selectstudent_link('display',$item.'_uname_'.$num,
- $item.'_udom_'.$num,1);
+ $item.'_udom_'.$num,'only');
my $output =
''.&mt('Username').' '.
' '.
@@ -870,29 +3665,40 @@ sub select_recipient {
}
sub select_sections {
- my ($item,$num,$sections,$selected) = @_;
- my ($output,@currsecs,$allsec);
+ my ($item,$num,$sections,$selected,$noedit,$allval) = @_;
+ my ($output,@currsecs,$allsec,$disabled);
if (ref($selected) eq 'ARRAY') {
@currsecs = @{$selected};
}
if (!@currsecs) {
$allsec = ' selected="selected"';
}
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
if (ref($sections) eq 'ARRAY') {
if (@{$sections}) {
my $mult;
if (@{$sections} > 1) {
$mult = ' multiple="multiple"';
+ my $size;
if (@{$sections} > 3) {
- $mult .= ' size="4"';
+ $size = 4;
+ } else {
+ $size = 1 + scalar(@{$sections});
}
+ $mult .= ' size="'.$size.'"';
}
- $output = ''.
- ' '.&mt('All').' ';
+ my $name = $item.'_sections';
+ unless ($item eq 'hidetotals') {
+ $name .= '_'.$num;
+ }
+ $output = ''.
+ ' '.&mt('All').' ';
foreach my $sec (@{$sections}) {
my $is_sel;
if ((@currsecs) && (grep(/^\Q$sec\E$/,@currsecs))) {
- $is_sel = 'selected="selected"';
+ $is_sel = ' selected="selected"';
}
$output .= ''.$sec.' ';
}
@@ -903,41 +3709,50 @@ sub select_sections {
}
sub print_discussion {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
'plc.roles.denied' => {
- text => ''.&mt('No Chat room use').' '.
- &Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
+ text => ''.&mt($itemtext->{'plc.roles.denied'}).' '.
+ &Apache::loncommon::help_open_topic("Course_Disable_Discussion").' '.
+ &mt('(role-based)'),
input => 'checkbox',
},
'plc.users.denied' => {
- text => ''.&mt('No Chat room use').' ',
+ text => ''.&mt($itemtext->{'plc.users.denied'}).' '.
+ &mt('(specific user(s))'),
input => 'checkbox',
},
'pch.roles.denied' => {
- text => ''.&mt('No Resource Discussion').' '.
- &Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
+ text => ''.&mt($itemtext->{'pch.roles.denied'}).' '.
+ &Apache::loncommon::help_open_topic("Course_Disable_Discussion").' '.
+ &mt('(role-based)'),
input => 'checkbox',
},
'pch.users.denied' => {
- text => ''.&mt('No Resource Discussion').' ',
+ text => ''.&mt($itemtext->{'pch.users.denied'}).' '.
+ &mt('(specific user(s))'),
input => 'checkbox',
},
'allow_limited_html_in_feedback' => {
- text => ''.&mt('Allow limited HTML in discussion posts').' ',
+ text => ''.&mt($itemtext->{'allow_limited_html_in_feedback'}).' ',
input => 'radio',
},
'allow_discussion_post_editing' => {
- text => ''.&mt('Users can edit/delete own discussion posts').' ',
+ text => ''.&mt($itemtext->{'allow_discussion_post_editing'}).' ',
input => 'checkbox',
},
+ 'discussion_post_fonts' => {
+ text => ''.&mt($itemtext->{'discussion_post_fonts'}).' ',
+ input => 'textbox',
+ size => '20',
+ },
);
my $datatable;
my $count;
@@ -945,38 +3760,58 @@ sub print_discussion {
my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
my @sections = sort( { $a <=> $b } keys(%sections));
my %lt = &Apache::lonlocal::texthash (
- currone => 'Disallowed:',
- curmult => 'Disallowed:',
- add => 'Disallow more:',
- del => 'Delete?',
- sec => 'Sections:',
+ currone => 'Disallowed:',
+ currmult => 'Disallowed:',
+ add => 'Disallow more:',
+ del => 'Delete?',
+ sec => 'Sections:',
);
-
foreach my $item (@{$ordered}) {
$count ++;
- $datatable .= &item_table_row_start($items{$item}{text},$count);
+ my $colspan;
+ if ($item eq 'allow_limited_html_in_feedback') {
+ $colspan = 2;
+ }
+ $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);
if ($item eq 'plc.roles.denied') {
- $datatable .= ''.&role_checkboxes($cdom,$cnum,$item,$settings).
+ $datatable .= ''.
+ ''.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit).
'
';
} elsif ($item eq 'plc.users.denied') {
- $datatable .= &user_table($cdom,$item,undef,
- $settings->{$item},\%lt);
+ $datatable .= ' '.
+ &user_table($cdom,$item,undef,
+ $settings->{$item},\%lt,$noedit);
} elsif ($item eq 'pch.roles.denied') {
- $datatable .= ''.&role_checkboxes($cdom,$cnum,$item,$settings).
+ $datatable .= ''.
+ ''.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit).
'
';
} elsif ($item eq 'pch.users.denied') {
- $datatable .= &user_table($cdom,$item,undef,
- $settings->{$item},\%lt);
+ $datatable .= ' '.
+ &user_table($cdom,$item,undef,
+ $settings->{$item},\%lt,$noedit);
} elsif ($item eq 'allow_limited_html_in_feedback') {
- $datatable .= &yesno_radio($item,$settings);
+ $datatable .= &yesno_radio($item,$settings,undef,undef,undef,$noedit);
} elsif ($item eq 'allow_discussion_post_editing') {
- $datatable .= &Apache::loncommon::start_data_table().
+ $datatable .= ' '.
+ &Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_row().
''.&mt('Role').' '.
&mt('Sections').' '.
&Apache::loncommon::end_data_table_row().
- &role_checkboxes($cdom,$cnum,$item,$settings,1).
- &Apache::loncommon::end_data_table();
+ &role_checkboxes($cdom,$cnum,$item,$settings,1,undef,$noedit).
+ &Apache::loncommon::end_data_table().' ';
+ } elsif ($item eq 'discussion_post_fonts') {
+ $datatable .= ' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().
+ ''.&mt('Sum of likes/dislikes').' '.
+ ''.&mt('font-size').' '.
+ ''.&mt('font-weight').' '.
+ ''.&mt('font-style').' '.
+ ''.&mt('Other css').' '.
+ &Apache::loncommon::end_data_table_row().
+ &set_discussion_fonts($cdom,$cnum,$item,$settings,$noedit).
+ &Apache::loncommon::end_data_table().' ';
}
$datatable .= &item_table_row_end();
}
@@ -985,8 +3820,13 @@ sub print_discussion {
}
sub role_checkboxes {
- my ($cdom,$cnum,$item,$settings,$showsections) = @_;
- my @roles = ('st','ad','ta','ep','in','cc');
+ my ($cdom,$cnum,$item,$settings,$showsections,$crstype,$noedit) = @_;
+ my @roles = ('st','ad','ta','ep','in');
+ if ($crstype eq 'Community') {
+ push(@roles,'co');
+ } else {
+ push(@roles,'cc');
+ }
my $output;
my (@current,@curr_roles,%currsec,@sections);
if ($showsections) {
@@ -1005,6 +3845,8 @@ sub role_checkboxes {
if (!grep(/^\Q$sec\E/,@{$currsec{$trole}})) {
push(@{$currsec{$trole}},$sec);
}
+ } else {
+ $currsec{$trole} = [$sec];
}
} else {
push(@curr_roles,$role);
@@ -1016,12 +3858,16 @@ sub role_checkboxes {
}
my $numinrow = 3;
my $count = 0;
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
foreach my $role (@roles) {
my $checked = '';
if (grep(/^\Q$role\E$/,@current)) {
$checked = ' checked="checked" ';
}
- my $plrole=&Apache::lonnet::plaintext($role);
+ my $plrole=&Apache::lonnet::plaintext($role,$crstype);
if ($showsections) {
$output .= &Apache::loncommon::start_data_table_row();
} else {
@@ -1033,12 +3879,12 @@ sub role_checkboxes {
$output .= '';
}
}
- $output .= ' '.
+ $output .= ' '.
$plrole.' ';
if ($showsections) {
$output .= ''.
- &select_sections($item,$role,\@sections,$currsec{$role}).
+ &select_sections($item,$role,\@sections,$currsec{$role},$noedit).
' ';
}
$count ++;
@@ -1065,12 +3911,12 @@ sub role_checkboxes {
$output .= '';
}
}
- $output .= ' '.$rolename.
+ $output .= ' '.$rolename.
' ';
if ($showsections) {
$output .= ''.
- &select_sections($item,$role,\@sections,$currsec{$role}).
+ &select_sections($item,$role,\@sections,$currsec{$role},$noedit).
' '.&Apache::loncommon::end_data_table_row();
}
$total ++;
@@ -1091,50 +3937,147 @@ sub role_checkboxes {
return $output;
}
+sub set_discussion_fonts {
+ my ($cdom,$cnum,$item,$settings,$noedit) = @_;
+ my ($classorder,$classtitles) = &discussion_vote_classes();
+ my ($styleorder,$styleitems) = &discussion_vote_styles();
+ my $output;
+ if (ref($classorder) eq 'ARRAY') {
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
+ foreach my $cat (@{$classorder}) {
+ my %curr = ();
+ ($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) =
+ split(/,/,$settings->{'discussion_post_fonts_'.$cat});
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$classtitles->{$cat}.' ';
+ if (ref($styleorder) eq 'ARRAY') {
+ foreach my $item (@{$styleorder}) {
+ $output .= '';
+ my $selitem = $item;
+ if ($item eq 'size') {
+ my ($currsize,$currunit);
+ if ($curr{'size'} =~ /^(\d+)(px|%)$/) {
+ ($currsize,$currunit) = ($1,$2);
+ $curr{'size'} = $currunit;
+ }
+ $output .= ' '.
+ ' ';
+ $selitem = 'unit';
+ }
+ if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) {
+ $output .= '';
+ foreach my $val (@{$styleitems->{$item}}) {
+ my $sel;
+ if ($val eq $curr{$item}) {
+ $sel = ' selected="selected"';
+ }
+ $output .= ''.$val.' ';
+ }
+ }
+ }
+ }
+ $output .= ' ';
+ }
+ $output .= &Apache::loncommon::end_data_table_row();
+ }
+ return $output;
+}
+
+sub discussion_vote_classes {
+ my $classorder = ['twoplus','oneplus','zero','oneminus','twominus'];
+ my %classtitles = &Apache::lonlocal::texthash(
+ 'twoplus' => 'Two sigma above mean',
+ 'oneplus' => 'One sigma above mean',
+ 'zero' => 'Within one sigma of mean',
+ 'oneminus' => 'One sigma below mean',
+ 'twominus' => 'Two sigma below mean',
+ );
+ return ($classorder,\%classtitles);
+}
+
+sub discussion_vote_styles {
+ my $styleorder = ['size','weight','style'];
+ my $styleitems = {
+ size => ['','px','%','xx-small','x-small','small','medium','large',
+ 'x-large','xx-large','smaller','larger'],
+ weight => ['','normal','bold','bolder','lighter','100','200','300','400',
+ '500','600','700','800','900'],
+ style => ['','normal','italic','oblique'],
+ };
+ return ($styleorder,$styleitems);
+}
+
sub print_classlists {
- my ($position,$cdom,$settings,$rowtotal) = @_;
+ my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype,$noedit) = @_;
my @ordered;
if ($position eq 'top') {
@ordered = ('default_enrollment_start_date',
'default_enrollment_end_date');
+ if ($crstype eq 'Course') {
+ push(@ordered,'defaultcredits');
+ }
} elsif ($position eq 'middle') {
- @ordered = ('nothideprivileged');
+ @ordered = ('nothideprivileged','checkforpriv');
} else {
@ordered = ('student_classlist_view',
- 'student_opt_in','student_classlist_portfiles');
+ 'student_classlist_opt_in',
+ 'student_classlist_portfiles');
+ }
+ my %lt;
+
+ if ($crstype eq 'Community') {
+ %lt = &Apache::lonlocal::texthash (
+ disabled => 'No viewable membership list',
+ section => "Membership of viewer's section",
+ all => 'List of all members',
+ );
+ } else {
+ %lt = &Apache::lonlocal::texthash (
+ disabled => 'No viewable classlist',
+ section => "Classlist of viewer's section",
+ all => 'Classlist of all students',
+ );
}
+
my %items = (
'default_enrollment_start_date' => {
- text => ''.&mt('Start date').' ',
+ text => ''.&mt($itemtext->{'default_enrollment_start_date'}).' ',
input => 'dates',
},
'default_enrollment_end_date' => {
- text => ''.&mt('End date').' ',
+ text => ''.&mt($itemtext->{'default_enrollment_end_date'}).' ',
input => 'dates',
},
+ 'defaultcredits' => {
+ text => ''.&mt($itemtext->{'defaultcredits'}).' ',
+ },
'nothideprivileged' => {
- text => ''.&mt('Domain Coodinators in course').' ',
+ text => ''.&mt($itemtext->{'nothideprivileged'}).' ',
input => 'checkbox',
},
+ 'checkforpriv' => {
+ text => ''.&mt($itemtext->{'checkforpriv'}).' ',
+ input => 'selectbox',
+ },
+
'student_classlist_view' => {
- text => ''.&mt('Student-viewable classlist').' ',
+ text => ''.&mt($itemtext->{'student_classlist_view'}).' ',
input => 'selectbox',
- options => {
- disabled => &mt('No viewable classlist'),
- section => &mt("Classlist of viewer's section"),
- all => &mt('Classlist of all students'),
- },
+ options => \%lt,
order => ['disabled','all','section'],
},
- 'student_opt_in' => {
- text => ''.&mt('Student agreement needed to be listed').' ',
+ 'student_classlist_opt_in' => {
+ text => ''.&mt($itemtext->{'student_classlist_opt_in'}).' ',
input => 'radio',
},
'student_classlist_portfiles' => {
- text => ''.&mt('Include link to accessible portfolio files').' ',
+ text => ''.&mt($itemtext->{'student_classlist_portfiles'}).' ',
input => 'radio',
},
);
@@ -1142,17 +4085,23 @@ sub print_classlists {
($settings->{'student_classlist_view'} eq 'section')) {
$settings->{'student_classlist_view'} = 'disabled';
}
- return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'classlists',$noedit);
}
sub print_appearance {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
+ my $mathdef;
+ if ($crstype eq 'Community') {
+ $mathdef = &mt("None specified - use member's choice");
+ } else {
+ $mathdef = &mt("None specified - use student's choice");
+ }
my %items = (
'default_xml_style' => {
- text => ''.&mt('Default XML Style File').' '.
+ text => ''.&mt($itemtext->{'default_xml_style'}).' '.
''.&mt('Select Style File').' ',
@@ -1161,53 +4110,66 @@ sub print_appearance {
},
'pageseparators' => {
- text => ''.&mt('Visibly Separate Items on Pages').' ',
+ text => ''.&mt($itemtext->{'pageseparators'}).' ',
input => 'radio',
},
'disable_receipt_display' => {
- text => ''.&mt('Disable display of problem receipts').' ',
+ text => ''.&mt($itemtext->{'disable_receipt_display'}).' ',
input => 'radio',
},
'texengine' => {
- text => ''.&mt('Force use of a specific math rendering engine.').' ',
+ text => ''.&mt($itemtext->{'texengine'}).' ',
input => 'selectbox',
options => {
- jsMath => 'jsMath',
+ MathJax => 'MathJax',
mimetex => &mt('Convert to Images'),
tth => &mt('TeX to HTML'),
},
- order => ['jsMath','mimetex','tth'],
- nullval => &mt("None specified - use student's choice"),
+ order => ['MathJax','mimetex','tth'],
+ nullval => $mathdef,
},
'tthoptions' => {
- text => ''.&mt('Default set of options to pass to tth/m when converting TeX').' ',
+ text => ''.&mt($itemtext->{'tthoptions'}).' ',
input => 'textbox',
size => 40,
},
+ 'uselcmath' => {
+ text => ''.&mt($itemtext->{'uselcmath'}).' ',
+ input => 'radio',
+ },
+ 'usejsme' => {
+ text => ''.&mt($itemtext->{'usejsme'}).' ',
+ input => 'radio',
+ },
+ 'inline_chem' => {
+ text => ''.&mt($itemtext->{'inline_chem'}).' ',
+ input => 'radio',
+ },
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'appearance',$noedit);
}
sub print_grading {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$cnum,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
'grading' => {
- text => ''.&mt('Grading').' '.
+ text => ''.&mt($itemtext->{'grading'}).' '.
&Apache::loncommon::help_open_topic('GradingOptions'),
input => 'selectbox',
options => {
standard => &mt('Standard: shows points'),
- external => &mt('External: shows number of completed parts'),
+ external => &mt('External: shows number of completed parts and totals'),
+ externalnototals => &mt('External: shows only number of completed parts'),
spreadsheet => &mt('Spreadsheet: (with link to detailed scores)'),
},
- order => ['standard','external','spreadsheet'],
+ order => ['standard','external','externalnototals','spreadsheet'],
},
'rndseed' => {
- text => ''.&mt('Randomization algorithm used').' '.
- ''.' '.
+ text => ''.&mt($itemtext->{'rndseed'}).' '.
+ ''.
&mt('Modifying this will make problems have different numbers and answers!').
' ',
input => 'selectbox',
@@ -1220,10 +4182,11 @@ sub print_grading {
'64bit5' => '64bit5',
},
order => ['32bit','64bit','64bit2','64bit3','64bit4','64bit5'],
+ advanced => 1
},
'receiptalg' => {
- text => ''.&mt('Receipt algorithm used').' '.
- &mt('This controls how receipt numbers are generated.'),
+ text => ''.&mt($itemtext->{'receiptalg'}).' '.
+ &mt('This controls how receipt numbers are generated'),
input => 'selectbox',
options => {
receipt => 'receipt',
@@ -1231,31 +4194,32 @@ sub print_grading {
receipt3 => 'receipt3',
},
order => ['receipt','receipt2','receipt3'],
+ advanced => 1
},
'disablesigfigs' => {
- text => ''.&mt('Disable checking of Significant Figures').' ',
+ text => ''.&mt($itemtext->{'disablesigfigs'}).' ',
input => 'radio',
},
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading',$noedit,$cnum);
}
sub print_printouts {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
problem_stream_switch => {
- text => ''.&mt('Allow problems to be split over pages').' ',
+ text => ''.&mt($itemtext->{'problem_stream_switch'}).' ',
input => 'radio',
},
suppress_tries => {
- text => ''.&mt('Suppress number of tries in printing').' ',
+ text => ''.&mt($itemtext->{'suppress_tries'}).' ',
input => 'radio',
},
default_paper_size => {
- text => ''.&mt('Default paper type').' ',
+ text => ''.&mt($itemtext->{'default_paper_size'}).' ',
input => 'selectbox',
options => {
Letter => &mt('Letter').' [8 1/2x11 in]',
@@ -1269,74 +4233,92 @@ sub print_printouts {
A6 => &mt('A6').' [105x148 mm]',
},
order => ['Letter','Legal','Tabloid','Executive','A2','A3','A4','A5','A6'],
- nullval => 'None specified',
+ nullval => &mt('None specified'),
},
print_header_format => {
- text => ''.&mt('Print header format').' ',
+ text => ''.&mt($itemtext->{'print_header_format'}).' ',
input => 'checkbox',
},
disableexampointprint => {
- text => ''.&mt('Disable automatically printing point values on exams').' ',
+ text => ''.&mt($itemtext->{'disableexampointprint'}).' ',
input => 'radio',
},
+ canuse_pdfforms => {
+ text => ''.&mt($itemtext->{'canuse_pdfforms'}).' ',
+ input => 'selectbox',
+ options => {
+ 1 => &mt('Yes'),
+ 0 => &mt('No'),
+ },
+ order => ['1','0'],
+ nullval => &mt('None specified - use domain default'),
+ }
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'printouts',$noedit);
}
sub print_spreadsheet {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
my %items = (
spreadsheet_default_classcalc => {
- text => ''.&mt('Default Course Spreadsheet').' '.
+ text => ''.&mt($itemtext->{'spreadsheet_default_classcalc'}).' '.
''.$SelectSpreadsheetFile.' ',
input => 'textbox',
},
spreadsheet_default_studentcalc => {
- text => ''.&mt('Default Student Spreadsheet').' '.
+ text => ''.&mt($itemtext->{'spreadsheet_default_studentcalc'}).' '.
''.$SelectSpreadsheetFile.' ',
input => 'textbox',
},
spreadsheet_default_assesscalc => {
- text => ''.&mt('Default Assessment Spreadsheet').' '.
+ text => ''.&mt($itemtext->{'spreadsheet_default_assesscalc'}).' '.
''.$SelectSpreadsheetFile.' ',
input => 'textbox',
},
hideemptyrows => {
- text => ''.&mt('Hide Empty Rows in Spreadsheets').' ',
+ text => ''.&mt($itemtext->{'hideemptyrows'}).' ',
input => 'radio',
},
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
-}
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'spreadsheet',$noedit);
+}
sub print_bridgetasks {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
+ my ($stumsg,$msgnote);
+ if ($crstype eq 'Community') {
+ $stumsg = &mt('Send message to member');
+ $msgnote = &mt('Message to member and add to user notes');
+ } else {
+ $stumsg = &mt('Send message to student');
+ $msgnote = &mt('Message to student and add to user notes');
+ }
my %items = (
task_messages => {
- text => ''.&mt('Send message to student when clicking Done on Tasks').' ',
+ text => ''.&mt($itemtext->{'task_messages'}).' ',
input => 'selectbox',
options => {
- only_student => &mt('Send message to student'),
- student_and_user_notes_screen => &mt('Message to student and add to user notes'),
+ only_student => $stumsg,
+ student_and_user_notes_screen => $msgnote,
},
order => ['only_student','student_and_user_notes_screen'],
nullval => &mt('No message or record in user notes'),
},
task_grading => {
- text => ''.&mt('Bridge Task grading by instructors and TAs in sections').' ',
+ text => ''.&mt($itemtext->{'task_grading'}).' ',
input => 'selectbox',
options => {
any => &mt('Grade BTs in any section'),
@@ -1345,52 +4327,77 @@ sub print_bridgetasks {
order => ['any','section'],
},
suppress_embed_prompt => {
- text => ''.&mt('Hi$de upload references prompt if uploading file to portfolio').' '.
- &mt('(applies when current role is student)').' ',
+ text => ''.&mt($itemtext->{'suppress_embed_prompt'}).' '.
+ ' '.&mt('(applies when current role is student)').' ',
input => 'radio',
},
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'bridgetasks',$noedit);
}
sub print_other {
- my ($cdom,$settings,$allitems,$rowtotal) = @_;
+ my ($cdom,$settings,$allitems,$rowtotal,$crstype,$noedit) = @_;
unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {
return;
}
- my @ordered;
+ my @ordered = &get_other_items($cdom,$settings,$allitems);
my %items;
+ foreach my $parameter (@ordered) {
+ $items{$parameter} = {
+ text => ''.$parameter.' ',
+ input => 'textbox',
+ size => '15',
+ },
+ }
+ push (@ordered,'newp_value');
+ $items{'newp_value'} = {
+ text => ''.&mt('Create New Environment Variable').' '.
+ ' ',
+ input => 'textbox',
+ size => '30',
+ };
+ return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'other',$noedit);
+}
+
+sub get_other_items {
+ my ($cdom,$settings,$allitems) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {
+ return;
+ }
+ my @ordered;
if (ref($settings) eq 'HASH') {
foreach my $parameter (sort(keys(%{$settings}))) {
next if (grep/^\Q$parameter\E$/,@{$allitems});
- next if (($parameter eq 'course.helper.not.run') &&
- (!exists($env{'user.role.dc./'.$env{'request.role.domain'}.'/'})));
+ next if (($parameter eq 'course.helper.not.run') &&
+ (!exists($env{'user.role.dc./'.$env{'request.role.domain'}.'/'})));
unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
|| ($parameter eq 'type') ||
- ($parameter =~ m/^(cc|in|ta|ep|ad|st)\.plaintext$/)) {
+ ($parameter =~ m/^(cc|co|in|ta|ep|ad|st)\.plaintext$/)
+ || ($parameter =~ m/^discussion_post_fonts/) ||
+ ($parameter =~ m{^(minimal|updated|uploaded|external)syllabus$}) ||
+ ($parameter eq 'clonedfrom')) {
push(@ordered,$parameter);
- $items{$parameter} = {
- text => $parameter,
- input => 'textbox',
- size => '15',
- },
}
}
}
- return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal);
+ return @ordered;
}
sub item_table_row_start {
- my ($text,$count) = @_;
+ my ($text,$count,$add_class,$colspan) = @_;
my $output;
- if ($count%2) {
- $output .= '';
+ my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row';
+ $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
+ $output .= ' '."\n".
+ ''.$text.
+ ' ';
+ if ($colspan) {
+ $output .= '';
} else {
- $output .= ' ';
+ $output .= '';
}
- $output .= ' '.$text.
- ' ';
return $output;
}
@@ -1399,25 +4406,53 @@ sub item_table_row_end {
}
sub yesno_radio {
- my ($item,$settings) = @_;
+ my ($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit,$onclick,$reverse) = @_;
my $itemon = ' ';
my $itemoff = ' checked="checked" ';
+ if (($valueyes eq '') && ($valueno eq '')) {
+ $valueyes = 'yes';
+ $valueno = '';
+ }
if (ref($settings) eq 'HASH') {
- if ($settings->{$item} eq 'yes') {
+ if ($settings->{$item} eq $valueyes) {
$itemon = $itemoff;
$itemoff = ' ';
}
+ unless (exists($settings->{$item})) {
+ if ($unsetdefault eq $valueyes) {
+ $itemon = $itemoff;
+ $itemoff = ' ';
+ }
+ }
+ }
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ } elsif ($onclick) {
+ $onclick = ' onclick="'.$onclick.'"';
+ }
+ if ($reverse) {
+ return ''.
+ ' '.&mt('No').' '.
+ ' '.&mt('Yes').' ';
+ } else {
+ return ''.
+ ' '.&mt('Yes').' '.
+ ' '.&mt('No').' ';
}
- return ''.
- ' '.&mt('Yes').' '.
- ' '.&mt('No').' ';
}
sub select_from_options {
- my ($item,$order,$options,$curr,$nullval,$multiple,$maxsize,$onchange) = @_;
+ my ($item,$order,$options,$curr,$nullval,$multiple,$maxsize,$onchange,$noedit,$id) = @_;
my $output;
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled=disabled"';
+ }
if ((ref($order) eq 'ARRAY') && (ref($options) eq 'HASH')) {
$output=''."\n";
if ($nullval ne '') {
$output .= '{$item}{text},$count);
- if ($item eq 'nothideprivileged') {
- $datatable .= ¬hidepriv_row($cdom,$item,$settings);
+ my $colspan;
+ if ((($caller eq 'classlists') && ($item eq 'nothideprivileged')) ||
+ (($caller eq 'printouts') && ($item ne 'print_header_format'))) {
+ $colspan = 2;
+ }
+ if (exists $items->{$item}{advanced} && $items->{$item}{advanced} == 1) {
+ $datatable .= &item_table_row_start($items->{$item}{text},$count,"advanced",$colspan);
+ } else {
+ $datatable .= &item_table_row_start($items->{$item}{text},$count,undef,$colspan);
+ }
+ if ($item eq 'defaultcredits') {
+ my $defaultcredits = $env{'course.'.$env{'request.course.id'}.'.internal.defaultcredits'};
+ my $showcredits;
+ if ($defaultcredits ne '') {
+ $showcredits = &mt('Default is [quant,_1,credit]',$defaultcredits);
+ } else {
+ $showcredits = &mt('No default set');
+ }
+ $datatable .= $showcredits;
+ } elsif ($item eq 'nothideprivileged') {
+ $datatable .= ¬hidepriv_row($cdom,$item,$settings,$crstype,$noedit);
+ } elsif ($item eq 'checkforpriv') {
+ $datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype,$noedit);
} elsif ($item eq 'print_header_format') {
- $datatable .= &print_hdrfmt_row($item,$settings);
+ $datatable .= &print_hdrfmt_row($item,$settings,$noedit);
} elsif ($items->{$item}{input} eq 'dates') {
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
$datatable .=
&Apache::lonhtmlcommon::date_setter('display',$item,
- $settings->{$item});
+ $settings->{$item},$disabled);
} elsif ($items->{$item}{input} eq 'radio') {
- $datatable .= &yesno_radio($item,$settings);
+ my ($unsetdefault,$valueyes,$valueno);
+ if (($item eq 'usejsme') || ($item eq 'uselcmath') || ($item eq 'inline_chem')) {
+ my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
+ unless ($domdefs{$item} eq '0') {
+ $unsetdefault = 1;
+ }
+ $valueyes = "1";
+ $valueno = "0";
+ }
+ $datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit);
} elsif ($items->{$item}{input} eq 'selectbox') {
+ my ($id,$onchange);
+ if ($caller eq 'grading') {
+ if ($item eq 'grading') {
+ $onchange = ' onchange="javascript:toggleGrading(this.form);"';
+ $id = $item;
+ }
+ }
my $curr = $settings->{$item};
$datatable .=
&select_from_options($item,$items->{$item}{'order'},
$items->{$item}{'options'},$curr,
- $items->{$item}{'nullval'});
+ $items->{$item}{'nullval'},
+ undef,undef,$onchange,$noedit,$id);
+ if ($item eq 'grading') {
+ my ($unsetdefault,$valueyes,$valueno,$sectionbox);
+ my $gradingsty = 'none';
+ my $gradingsecsty = 'none';
+ $unsetdefault = 0;
+ my (@selsec,@sections,%current);
+ if ($curr eq 'standard') {
+ $gradingsty = 'inline-block';
+ if (ref($settings) eq 'HASH') {
+ $current{'hidetotals'} = $settings->{'hidetotals'};
+ if ($settings->{'hidetotals'} =~ /^([\w,]+)$/) {
+ my $secstr = $1;
+ unless ($secstr eq 'all') {
+ @selsec = split(/,/,$secstr);
+ }
+ $current{'hidetotals'} = 1;
+ }
+ }
+ }
+ $valueyes = "1";
+ $valueno = "0";
+ my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
+ if (keys(%sections)) {
+ @sections = sort( { $a <=> $b } keys(%sections));
+ }
+ my $onclick = 'javascript:toggleHiddenTotalsSec(this.form);';
+ my $sectionbox = '';
+ my $reverse = 1;
+ if (@sections) {
+ $sectionbox .= ' ... '.&mt('hidden in sections').': '.
+ '
'.
+ &select_sections('hidetotals','',\@sections,\@selsec,$noedit,'all').
+ '
';
+ }
+ $sectionbox .= '
';
+ $datatable .= ''.
+ ''.
+ &mt('Hide Course Points Totals').' '.
+ ''.
+ &yesno_radio('hidetotals',\%current,$unsetdefault,$valueyes,$valueno,$noedit,
+ $onclick,$reverse).'
'.
+ $sectionbox.
+ '
';
+ }
} elsif ($items->{$item}{input} eq 'textbox') {
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled=disabled"';
+ }
$datatable .=
&Apache::lonhtmlcommon::textbox($item,$settings->{$item},
- $items->{$item}{size});
+ $items->{$item}{size},
+ $disabled);
}
$datatable .= &item_table_row_end();
}
@@ -1499,10 +4627,9 @@ sub make_item_rows {
}
sub nothidepriv_row {
- my ($cdom,$item,$settings) = @_;
+ my ($cdom,$item,$settings,$crstype,$noedit) = @_;
my ($cnum) = &get_course();
- my %nothide;
- my $datatable;
+ my ($datatable,%nothide,@checkdoms);
if (ref($settings) eq 'HASH') {
if ($settings->{$item} ne '') {
foreach my $user (split(/\s*\,\s*/,$settings->{$item})) {
@@ -1513,23 +4640,34 @@ sub nothidepriv_row {
}
}
}
+ if ($settings->{'checkforpriv'}) {
+ @checkdoms = split(/,/,$settings->{'checkforpriv'});
+ }
}
- my %coursepersonnel = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
- my $now = time;
+ push(@checkdoms,$cdom);
+ my %coursepersonnel =
+ &Apache::lonnet::get_my_roles($cnum,$cdom,'',['previous','future','active']);
my @privusers;
foreach my $person (keys(%coursepersonnel)) {
- my ($role,$user,$usec) = ($person =~ /^([^:]*):([^:]+:[^:]+):([^:]*)/);
- $user =~ s/:$//;
- my ($end,$start) = split(/:/,$coursepersonnel{$person});
+ my ($uname,$udom,$role) = split(/:/,$person);
+ my $user = $uname.':'.$udom;
+ my ($start,$end) = split(/:/,$coursepersonnel{$person});
if ($end == -1 || $start == -1) {
next;
}
- my ($uname,$udom) = split(':',$user);
- if (&Apache::lonnet::privileged($uname,$udom)) {
- push(@privusers,$user);
+ foreach my $dom (@checkdoms) {
+ if (&Apache::lonnet::privileged($uname,$udom,\@checkdoms,['dc','su'])) {
+ unless (grep(/^\Q$user\E$/,@privusers)) {
+ push(@privusers,$user);
+ }
+ }
}
}
- if (@privusers) {
+ if (@privusers > 0) {
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
$datatable .= '';
} else {
- $datatable .= &mt('No Domain Coordinators have course roles');
+ if ($crstype eq 'Community') {
+ $datatable .= &mt('No Domain Coordinators have community roles');
+ } else {
+ $datatable .= &mt('No Domain Coordinators have course roles');
+ }
+ }
+ return $datatable;
+}
+
+sub checkforpriv_row {
+ my ($cdom,$item,$settings,$crstype,$noedit) = @_;
+ my $datatable;
+ my %domains=map { $_ => 1; } &Apache::lonnet::all_domains();
+ if (keys(%domains) == 1) {
+ $datatable = ' '.
+ &mt("Course's domain is only domain");
+ return $datatable;
+ }
+ my @excdoms = ($cdom);
+ my $num = 0;
+ if ($settings->{$item} eq '') {
+ $datatable = ' '.
+ &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,
+ 1,1,undef,undef,\@excdoms,
+ $noedit);
+ } else {
+ my @privdoms = split(/,/,$settings->{$item});
+ my %domains=map { $_ => 1; } &Apache::lonnet::all_domains();
+ $datatable = ' '.
+ &Apache::loncommon::start_data_table();
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
+ if (@privdoms > 0) {
+ foreach my $currdom (@privdoms) {
+ next unless ($domains{$currdom});
+ my $domdesc = &Apache::lonnet::domain($currdom,'description');
+ if ($domdesc eq '') {
+ $domdesc = $currdom;
+ }
+ $datatable .=
+ &Apache::loncommon::start_data_table_row().
+ ''.
+ &mt('Domain:').' '.$domdesc.
+ ' '.
+ ' '.
+ &mt('Delete').' '.
+ &Apache::loncommon::end_data_table_row();
+ $num ++;
+ unless (grep(/^\Q$currdom\E$/,@excdoms)) {
+ push(@excdoms,$currdom);
+ }
+ }
+ }
+ if ((scalar(keys(%domains)) - scalar(@excdoms)) > 0) {
+ $datatable .=
+ &Apache::loncommon::start_data_table_row().
+ ''.
+ &mt('Additional domain:'). ' '.
+ &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,1,
+ 1,undef,undef,\@excdoms,$noedit).
+ ' '.&Apache::loncommon::end_data_table_row();
+ }
+ $datatable .= &Apache::loncommon::end_data_table().
+ ' '.
+ ' ';
}
return $datatable;
}
sub print_hdrfmt_row {
- my ($item,$settings) = @_;
+ my ($item,$settings,$noedit) = @_;
my @curr;
my $currnum = 0;
my $maxnum = 2;
@@ -1567,9 +4774,9 @@ sub print_hdrfmt_row {
$currstr .= ''.&mt('Current print header:').' '.
$settings->{$item}.' ';
my @current = split(/(%\d*[nca])/,$settings->{$item});
- foreach my $item (@current) {
- unless ($item eq '') {
- push(@curr,$item);
+ foreach my $val (@current) {
+ unless ($val eq '') {
+ push(@curr,$val);
}
}
$currnum = @curr;
@@ -1629,51 +4836,62 @@ function getIndexByName(item) {
ENDJS
- $output .= $currstr.&Apache::loncommon::start_data_table();
+ $output .= ' '.
+ $currstr.'';
+ my $disabled;
+ if ($noedit) {
+ $disabled = ' disabled="disabled"';
+ }
if (@curr > 0) {
for (my $i=0; $i<@curr; $i++) {
my $pos = $i+1;
- $output .= &Apache::loncommon::start_data_table_row().
+ $output .= ''.
''.
- &position_selector($pos,$i,$maxnum).&mt('Delete:').
+ &position_selector($pos,$i,$maxnum,$disabled).&mt('Delete:').
' ';
+ '"'.$disabled.' />';
if ($curr[$i] =~ /^%\d*[nca]$/) {
my ($limit,$subst) = ($curr[$i] =~ /^%(\d*)([nca])$/);
$output .= ''.
- &substitution_selector($i,$subst,$limit).' ';
+ &substitution_selector($i,$subst,$limit,$disabled).'';
} else {
$output .= ''.&mt('Text').' '.
' ';
+ ' value="'.$curr[$i].'" size="25"'.$disabled.' />';
}
- $output .= &Apache::loncommon::end_data_table_row();
+ $output .= ' ';
}
}
my $pos = $currnum+1;
- $output .= &Apache::loncommon::start_data_table_row().
+ unless ($noedit) {
+ $output .=
+ ''.
''.
&position_selector($pos,$currnum,$maxnum).
''.&mt('New').' '.
&substitution_selector($currnum).' '.
- &Apache::loncommon::end_data_table_row();
- $pos ++;
- $currnum ++;
- $output .= &Apache::loncommon::start_data_table_row().
+ ' ';
+ $pos ++;
+ $currnum ++;
+ $output .=
+ ''.
''.
&position_selector($pos,$currnum,$maxnum).
''.&mt('New').' '.
''.&mt('Text').' '.
' '.
- &Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
+ '" value="" size ="25" />'.
+ ' '.
+ ' ';
+ }
+ $output .= '
';
return $output;
}
sub position_selector {
- my ($pos,$num,$maxnum) = @_;
- my $output = '';
+ my ($pos,$num,$maxnum,$disabled) = @_;
+ my $output = '';
for (my $j=1; $j<=$maxnum; $j++) {
my $sel = '';
if ($pos == $j) {
@@ -1687,14 +4905,22 @@ sub position_selector {
}
sub substitution_selector {
- my ($num,$subst,$limit) = @_;
+ my ($num,$subst,$limit,$crstype,$disabled) = @_;
+ my ($stunametxt,$crsidtxt);
+ if ($crstype eq 'Community') {
+ $stunametxt = 'member name';
+ $crsidtxt = 'community ID',
+ } else {
+ $stunametxt = 'student name';
+ $crsidtxt = 'course ID',
+ }
my %lt = &Apache::lonlocal::texthash(
- n => 'student name',
- c => 'course ID',
+ n => $stunametxt,
+ c => $crsidtxt,
a => 'assignment note',
);
my $output .= &mt('Substitution').' '.
- '';
+ '';
if ($subst eq '') {
$output .= ' ';
}
@@ -1708,14 +4934,74 @@ sub substitution_selector {
}
$output .= ' '.&mt('Size limit').' '.
' ';
+ '" value="'.$limit.'" size="5"'.$disabled.' />';
return $output;
}
-sub modify_crsenv {
- my ($action,$cdom,%domconfig) = @_;
+sub change_clone {
+ my ($cdom,$cnum,$clonelist,$oldcloner) = @_;
+ my $clone_crs = $cnum.':'.$cdom;
+ if ($cnum && $cdom) {
+ my $clone_crs = $cnum.':'.$cdom;
+ my @allowclone;
+ if ($clonelist =~ /,/) {
+ @allowclone = split(',',$clonelist);
+ } else {
+ $allowclone[0] = $clonelist;
+ }
+ foreach my $currclone (@allowclone) {
+ if (!grep(/^$currclone$/,@$oldcloner)) {
+ if ($currclone ne '*') {
+ if ($currclone =~ /:/) {
+ my ($uname,$udom) = split(/:/,$currclone);
+ if ($uname && $udom && $uname ne '*') {
+ if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
+ my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
+ if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
+ if ($currclonecrs{'cloneable'} eq '') {
+ $currclonecrs{'cloneable'} = $clone_crs;
+ } else {
+ $currclonecrs{'cloneable'} .= ','.$clone_crs;
+ }
+ &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ foreach my $oldclone (@$oldcloner) {
+ if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
+ if ($oldclone ne '*') {
+ if ($oldclone =~ /:/) {
+ my ($uname,$udom) = split(/:/,$oldclone);
+ if ($uname && $udom && $uname ne '*' ) {
+ if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
+ my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
+ my %newclonecrs = ();
+ if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
+ if ($currclonecrs{'cloneable'} =~ /,/) {
+ my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
+ foreach my $crs (@currclonecrs) {
+ if ($crs ne $clone_crs) {
+ $newclonecrs{'cloneable'} .= $crs.',';
+ }
+ }
+ $newclonecrs{'cloneable'} =~ s/,$//;
+ } else {
+ $newclonecrs{'cloneable'} = '';
+ }
+ &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
return;
}
1;
-