--- loncom/interface/lonpickcourse.pm 2009/05/08 17:22:17 1.81 +++ loncom/interface/lonpickcourse.pm 2009/07/31 03:01:31 1.85 @@ -1,7 +1,7 @@ # The LearningOnline Network # Pick a course # -# $Id: lonpickcourse.pm,v 1.81 2009/05/08 17:22:17 raeburn Exp $ +# $Id: lonpickcourse.pm,v 1.85 2009/07/31 03:01:31 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,7 +36,7 @@ use Apache::lonnet; use Apache::lonlocal; use Apache::longroup; use Apache::courseclassifier; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); sub handler { my $r = shift; @@ -50,22 +50,22 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi ($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement', 'cdomelement','cnameelement','roleelement', - 'multiple','type','setroles','fixeddom']); + 'multiple','type','setroles','fixeddom','cloner']); my ($type,$title,$jscript,$multelement,$multiple,$roleelement, - $lastaction,$autosubmit,$submitopener); + $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom); - # Get course type - Course or Non-standard Course. + # Get course type - Course or Community. $type = $env{'form.type'}; if (!defined($env{'form.type'})) { $type = 'Course'; } - $title = &mt('Selecting a [_1]',$type); + $title = 'Selecting a '.$type; # Setup for multiple course selections, if flag for multiples set. $multiple = $env{'form.multiple'}; if ($multiple) { ($jscript,$multelement) = &multiples_tag(); - $title = &mt('Selecting [_1](s)',lc($type)); + $title = 'Selecting '.$type.'(s)'; } # if called when a DC is selecting a course @@ -76,6 +76,17 @@ sub handler { $autosubmit = 'process_pick("'.$roledom.'")'; } + # if called when a DC is creating a course + if ($env{'form.form'} eq 'ccrs') { + ($cloneruname,$clonerudom) = ($env{'form.cloner'} =~ /^($match_username):($match_domain)$/); + } + + # if called when requesting a course + if ($env{'form.form'} eq 'requestcrs') { + $cloneruname = $env{'user.name'}; + $clonerudom = $env{'user.domain'}; + } + my $onlyown = 0; # if called to assign course-based portfolio access control if ((($env{'form.form'} eq 'portform') && (!$env{'user.adv'}))) { @@ -83,15 +94,18 @@ sub handler { } my %loaditem; - if ($env{'form.numtitles'}) { - $loaditem{'onload'} = 'setElements(); '; + if (($env{'form.type'} eq 'Course') && ($env{'form.numtitles'})) { + if (($env{'form.official'} eq 'on') && ($env{'form.state'} eq 'listing')) { + $loaditem{'onload'} = 'setElements(document.filterpicker); '; + } } if ((($env{'form.form'} eq 'cu') || ($env{'form.form'} eq 'studentform')) && ($env{'form.pickedcourse'})) { $loaditem{'onload'} .= 'setSections()'; } - $r->print(&Apache::loncommon::start_page($title,undef, + my $js = &js_changer(); + $r->print(&Apache::loncommon::start_page($title,$js, {'add_entries' => \%loaditem, 'no_nav_bar' => 1, })); @@ -112,7 +126,8 @@ sub handler { } # print javascript functions for choosing a course - if ($env{'form.gosearch'} || $onlyown) { + if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) || + $onlyown) { $r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction)); } $r->print(' + +ENDJS + +} + sub processpick { my $openerform = 'rolechoice'; if ($env{'form.form'} eq 'studentform') { @@ -236,7 +276,7 @@ function setSections() { } sub display_matched_courses { - my ($r,$type,$multiple,$action,$showroles,%courses) = @_; + my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,%courses) = @_; if ($env{'form.form'} eq 'portform') { $action = '/adm/portfolio'; } @@ -313,11 +353,26 @@ sub display_matched_courses { my $cleandesc=&HTML::Entities::encode($description,'<>&"'); $cleandesc=~s/'/\\'/g; my ($cdom,$cnum)=split(/\_/,$course); - my ($descr,$instcode,$ttype,@owners); + my ($descr,$instcode,$ttype,$canclone,@owners); if (ref($courses{$course}) eq 'HASH') { $descr = $courses{$course}{'description'}; - $instcode = $courses{$course}{'inst_code'}; - $ttype = $courses{$course}{'type'}; + $instcode = $courses{$course}{'inst_code'}; + $ttype = $courses{$course}{'type'}; + if (($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) { + my $cloners = $courses{$course}{'cloners'}; + if ($cloners ne '') { + my @cloneable = split(',',$cloners); + if (grep(/^\*$/,@cloneable)) { + $canclone = 1; + } + if (grep(/^\*:\Q$env{'form.clonerudom'}\E$/,@cloneable)) { + $canclone = 1; + } + if (grep(/^\Q$cloneruname\E:\Q$clonerudom\E$/,@cloneable)) { + $canclone = 1; + } + } + } push(@owners,&unescape($courses{$course}{'owner'})); if (ref($courses{$course}{'co-owners'}) eq 'ARRAY') { foreach my $item (@{$courses{$course}{'co-owners'}}) { @@ -330,7 +385,7 @@ sub display_matched_courses { push(@owners,&unescape($singleowner)); } my $ownerstr = join(', ',@owners); - $r->print(''.&course_chooser($multiple,$cdom,$cnum,$cleandesc).''); + $r->print(''.&course_chooser($multiple,$cdom,$cnum,$cleandesc,$canclone).''); $r->print(''.$description.''); $r->print(''); $r->print(&Apache::lonnet::domain($cdom,'description')? @@ -422,15 +477,18 @@ sub multiples_tag { sub build_filters { my ($filterlist,$type,$roleelement,$multelement,$filter,$action, - $numtitlesref,$caller) = @_; - my $list; - my $formname; - my ($fixeddom,$codedom,$jscript); + $numtitlesref,$caller,$cloneruname,$clonerudom) = @_; + my ($list,$formname,$fixeddom,$codedom,$jscript); + $codedom = $env{'request.role.domain'}; if (defined($env{'form.form'})) { $formname = $env{'form.form'}; } else { $formname = $caller; } + my $onchange; + unless ($env{'form.interface'} eq 'textual') { + $onchange = 'javascript:updateFilters(this)'; + } my ($domainselectform,$sincefilterform,$ownerdomselectform,$persondomselectform, $instcodeform,$typeselectform,$instcodetitle); foreach my $item (@{$filterlist}) { @@ -486,7 +544,7 @@ sub build_filters { $domainselectform = &Apache::loncommon::select_dom_form($filter->{$item}, 'domainfilter', - $allow_blank); + $allow_blank,'',$onchange); $codedom = $filter->{'domainfilter'}; } } else { @@ -518,34 +576,58 @@ sub build_filters { 'inc' => &mt('Institutional Categorization'), 'cow' => &mt("$type Owner/Co-owner"), 'cop' => &mt("$type Personnel Includes"), - 'cog' => &mt('Course Type') + 'cog' => &mt('Type') ); - $typeselectform = ''; - $instcodetitle = $lt{'ins'}; + $typeselectform = ' '.&mt('Yes').''.(' 'x3).''; + if ($env{'form.form'} eq 'ccrs') { + $cloneabletitle = &mt('Cloneable for').' '.$cloneruname.':'.$clonerudom; } else { - $instcodetitle = $lt{'inc'}; + $cloneabletitle = &mt('Cloneable by you'); } - if ($env{'form.fixeddom'}) { - $instcodetitle .= '
('.$codedom.')'; - } - if ($jscript ne '') { - $jscript = ''."\n"; + } + my $officialjs; + if ($type eq 'Course') { + if (exists($filter->{'instcodefilter'})) { + if (($env{'form.fixeddom'}) || ($formname eq 'requestcrs') + || ($formname eq 'modifycourse')) { + $officialjs = 1; + ($instcodeform,$jscript,$$numtitlesref) = + &instcode_selectors($codedom,'filterpicker',$officialjs); + if ($jscript) { + $jscript = ''."\n"; + } + } + if ($instcodeform eq '') { + $instcodeform = + ''; + $instcodetitle = $lt{'ins'}; + } else { + $instcodetitle = $lt{'inc'}; + } + if ($env{'form.fixeddom'}) { + $instcodetitle .= '
('.$codedom.')'; + } } } - foreach my $posstype ('Course','Non-standard Course') { + + foreach my $posstype ('Course','Community') { $typeselectform.='\n"; } @@ -621,16 +703,44 @@ $multelement .$list->{'coursefilter'}.'" />' .&Apache::lonhtmlcommon::row_closure(); } + if ($cloneableonlyform) { + $output .= &Apache::lonhtmlcommon::row_title($cloneabletitle). + $cloneableonlyform.&Apache::lonhtmlcommon::row_closure(); + } if (exists($filter->{'descriptfilter'})) { $output .= &Apache::lonhtmlcommon::row_title($lt{'cde'}) .'' .&Apache::lonhtmlcommon::row_closure(1); } - $output .= &Apache::lonhtmlcommon::end_pick_box(); - $output .= '

'.&mt('Intended course owner does not exist'). + ''; + } else { + if ($env{'form.form'} eq 'ccrs') { + $output .= ''."\n"; + } + my %ccroles = &Apache::lonnet::get_my_roles($cloneruname,$clonerudom, + 'userroles',['active'], ['cc']); + foreach my $key (sort(keys(%ccroles))) { + my ($cnum,$cdom,$role) = split(':',$key); + $cc_clone .= $cdom.':'.$cnum.'&'; + } + $cc_clone =~ s/\&$//; + } + if ($cc_clone ne '') { + $output .= ''; + } + } + $output .= ''."\n". + '

'."\n".''."\n".'
'."\n"; - return $jscript.$output; + return $jscript.$warning.$output; } sub instcode_selectors { @@ -640,16 +750,16 @@ sub instcode_selectors { &Apache::courseclassifier::instcode_selectors_data($codedom,$formname, \%cat_items,\@codetitles,\%cat_titles,\%cat_order,$officialjs); if ($numtitles > 0) { - my $unofficial = ' checked="checked" '; - my $official = ''; - if ($env{'form.official'}) { - $official = $unofficial; - $unofficial = ''; + my $official = ' checked="checked" '; + my $unofficial = ''; + if ($env{'form.official'} eq 'off') { + $unofficial = $official; + $official = ''; } $output .= ''.&mt('Official course:').' '.(' 'x3).'
'. &Apache::courseclassifier::build_instcode_selectors($numtitles, $lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order)."\n". @@ -661,8 +771,8 @@ sub instcode_selectors { } sub search_courses { - my ($r,$type,$onlyown,$filter,$numtitles) = @_; - my (%courses,%showcourses); + my ($r,$type,$onlyown,$filter,$numtitles,$cloneruname,$clonerudom) = @_; + my (%courses,%showcourses,$cloner); if (!$onlyown) { $r->print(&mt('Searching ...').'
 
'); $r->rflush(); @@ -680,17 +790,25 @@ sub search_courses { ($filter->{'sincefilter'}==-1?1:time-$filter->{'sincefilter'}); my ($instcodefilter,$regexpok); if ($numtitles) { - if ($env{'form.official'}) { + if ($env{'form.official'} eq 'on') { $instcodefilter = - &Apache::courseclassifier::instcode_search_str($filter->{'domainfilter'}, - $numtitles); + &Apache::courseclassifier::instcode_search_str($filter->{'domainfilter'},$numtitles); $regexpok = 1; + } elsif ($env{'form.official'} eq 'off') { + $instcodefilter = &Apache::courseclassifier::instcode_search_str($filter->{'domainfilter'},$numtitles); + unless ($instcodefilter eq '') { + $regexpok = -1; + } } } else { $instcodefilter = $filter->{'instcodefilter'}; } if ($instcodefilter eq '') { $instcodefilter = '.'; } if ($type eq '') { $type = '.'; } + + if (($clonerudom ne '') && ($cloneruname ne '')) { + $cloner = $cloneruname.':'.$clonerudom; + } %courses = &Apache::lonnet::courseiddump($filter->{'domainfilter'}, $filter->{'descriptfilter'}, @@ -698,7 +816,9 @@ sub search_courses { $instcodefilter, $filter->{'combownerfilter'}, $filter->{'coursefilter'}, - undef,undef,$type,$regexpok); + undef,undef,$type,$regexpok,undef,undef, + undef,undef,$cloner,$env{'form.cc_clone'}, + $filter->{'cloneableonly'}); if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) { my %rolehash = &Apache::lonnet::get_my_roles($filter->{'personfilter'}, $filter->{'persondomfilter'}, @@ -734,10 +854,16 @@ sub search_courses { } sub course_chooser { - my ($multiple,$cdom,$cnum,$cleandesc) = @_; + my ($multiple,$cdom,$cnum,$cleandesc,$canclone) = @_; my $output; if ($multiple) { $output = '