File:  [LON-CAPA] / loncom / interface / lonpickcourse.pm
Revision 1.19: download - view: text, annotated - select for diffs
Tue Nov 23 18:03:04 2004 UTC (19 years, 5 months ago) by raeburn
Branches: MAIN
CVS tags: HEAD
DC can now add user roles to courses without needing an role in the target course.  Choice of sections can be made from existing sections, or new sections can be added.  Still need to add contextual help, and javascript to alert/prohibit > 1 section for a student role.

# The LearningOnline Network
# Pick a course
#
# $Id: lonpickcourse.pm,v 1.19 2004/11/23 18:03:04 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#

package Apache::lonpickcourse;

use strict;
use Apache::Constants qw(:common);
use Apache::loncommon;
use Apache::loncoursedata;
use Apache::lonnet;
use Apache::lonlocal;

sub handler {
    my $r = shift;
    &Apache::loncommon::content_type($r,'text/html');
    $r->send_http_header;
    return OK if $r->header_only;

# ------------------------------------------------------------ Print the screen
    $r->print(<<ENDDOCUMENT);
<html>
<head>
<title>The LearningOnline Network with CAPA</title>
</head>
ENDDOCUMENT
# Get parameters from query string
    &Apache::loncommon::get_unprocessed_cgi
        ($ENV{'QUERY_STRING'},['domainfilter','descriptfilter',
			       'sincefilter','form','cnumelement',
			       'cdomelement','cnameelement','roleelement',
                               'pickedcourse']);
# domain filter and selection
    my $domainfilter=$ENV{'form.domainfilter'};
    $domainfilter=~s/\W//g;
    unless ($domainfilter) { $domainfilter=''; }
    my $domainselectform=&Apache::loncommon::select_dom_form($domainfilter,
                                                          'domainfilter',1);
# description filter
    my $descriptfilter=$ENV{'form.descriptfilter'};
    unless ($descriptfilter) { $descriptfilter=''; }
    my $listdescript=&HTML::Entities::encode($descriptfilter,'<>&"');
# last course activity filter and selection
    my $sincefilter=$ENV{'form.sincefilter'};
    $sincefilter=~s/[^\d-]//g;
    unless ($sincefilter) { $sincefilter=-1; }
    my $sincefilterform=&Apache::loncommon::select_form($sincefilter,
       'sincefilter',('-1'=>'',
                      '86400' => 'today',
                      '604800' => 'last week',
                      '2592000' => 'last month',
                      '7776000' => 'last three months',
                      '15552000' => 'last six months',
                      '31104000' => 'last year',
                      'select_form_order' =>
                      ['-1','86400','604800','2592000','7776000',
		      '15552000','31104000']));
# if called from loncreateuser, report sections, then close
    my ($loaditem,$seclist);
    my $num_sections = 0;
    my @sections = ();
    if ($ENV{'form.form'} eq 'cu' && $ENV{'form.pickedcourse'}) {
        $loaditem = 'onLoad="setSections()"';
        my ($cdom,$cnum) = split/_/,$ENV{'form.pickedcourse'};
        my %sections_count = ();
        $num_sections = &Apache::loncommon::get_sections($cdom,$cnum,\%sections_count);
        my @sections = ();
        if ($num_sections > 0) {
            @sections = (sort {$a <=> $b} keys %sections_count);
            $seclist = join('","',@sections);
        }
    }
    $r->print(&Apache::loncommon::bodytag("Selecting a Course",undef,$loaditem));
    my %lt=&Apache::lonlocal::texthash(
				       'cac' => 'Course Activity',
				       'cde' => 'Course Description',
				       'cdo' => 'Course Domain');
    my ($name_code,$name_input);
    if (defined($ENV{'form.cnameelement'}) && $ENV{'form.cnameelement'} ne '') {
	$name_code = "opener.document.$ENV{'form.form'}.$ENV{'form.cnameelement'}.value=cdesc;";
	$name_input ='<input type="hidden" name="cnameelement" value="'.
	    $ENV{'form.cnameelement'}.'" />';
    }
    my $submitopener = '';
    my $autosubmit = '';
    my $roleelement = '';
    my $lastaction = 'self.close()';
    if ($ENV{'form.form'} eq 'cu') {
        $lastaction = 'document.courselist.pickedcourse.value = cdom+"_"+cname;'."\n".
                      'document.courselist.submit();';
    }
    my $roledom = $ENV{'form.roleelement'};
    if ($roledom) {
        $roleelement = '<input type="hidden" name="roleelement" value="'.$roledom.'" />';
        $submitopener = &Apache::lonroles::processpick($roledom);
        $autosubmit = 'process_pick("'.$roledom.'")';
    }
    $r->print(<<ENDSCRIPT);
<script>
function gochoose(cname,cdom,cdesc) {
    $name_code
    var openerForm = "$ENV{'form.form'}";
    opener.document.$ENV{'form.form'}.$ENV{'form.cnumelement'}.value=cname;
    if (openerForm == 'cu' || openerForm == 'rolechoice') {
         opener.document.$ENV{'form.form'}.$ENV{'form.cdomelement'}.value=cdom;
    }
    else {
        var slct=opener.document.$ENV{'form.form'}.$ENV{'form.cdomelement'};
        var i;
        for (i=0;i<slct.length;i++) {
            if (slct.options[i].value==cdom) { slct.selectedIndex=i; }
        }
    }
    $autosubmit
    $lastaction
}

function setSections() {
    var numSections = $num_sections
    var sectionsArray = new Array("$seclist")
    opener.document.$ENV{"form.form"}.currsec.length = 0
    if (numSections == 0) {
        opener.document.$ENV{"form.form"}.currsec.options[0] = new Option('No existing sections','-1',false,false)
    }
    else {
        for (var i=0; i<numSections; i++) {
            opener.document.$ENV{"form.form"}.currsec.options[i] = new Option(sectionsArray[i],sectionsArray[i],false,false)
        }
        opener.document.$ENV{"form.form"}.currsec.multiple=true
        if (numSections < 3) {
            opener.document.$ENV{"form.form"}.currsec.size=numSections;
        }
        else {
            opener.document.$ENV{"form.form"}.currsec.size=3;
        }
        opener.document.$ENV{"form.form"}.currsec.options[0].selected = false
    }
    self.close()
}
</script>
$submitopener
<form method="post">
<input type="hidden" name="cnumelement" value="$ENV{'form.cnumelement'}" />
<input type="hidden" name="cdomelement" value="$ENV{'form.cdomelement'}" />
$name_input
<input type="hidden" name="form" value="$ENV{'form.form'}" />
$roleelement
$lt{'cac'}: $sincefilterform
<br />
$lt{'cdo'}: $domainselectform
<br />
$lt{'cde'}:
<input type="text" name="descriptfilter" size="40" value="$listdescript" />
<p><input type="submit" name="gosearch" value="Search" /></p>
</form>
<hr />
ENDSCRIPT
# ---------------------------------------------------------------- Get the data
    if ($ENV{'form.gosearch'}) {
        $r->print(&mt('Searching').' ...<br />&nbsp;<br />');
        $r->rflush();
	unless ($descriptfilter) { $descriptfilter='.'; }
        my $timefilter=($sincefilter==-1?1:time-$sincefilter);
	my %courses=
	    &Apache::lonnet::courseiddump
	    ($domainfilter,$descriptfilter,$timefilter);
	$r->print('<form name="courselist">');
	my %by_descrip;
	foreach my $course (keys %courses) {
            my $descr;
            if ($courses{$course} =~ m/^([^:]*):/) {
                $descr = &Apache::lonnet::unescape($1);
            } else {
                $descr = &Apache::lonnet::unescape($courses{$course});
            }
            $by_descrip{lc($descr)}=$course;
	}
	foreach my $description (sort(keys(%by_descrip))) {
	    my $course=$by_descrip{$description};
	    my $cleandesc=&HTML::Entities::encode($description,'<>&"');
	    $cleandesc=~s/'/\\'/g;
	    my ($cdom,$cnum)=split(/\_/,$course);
	    $r->print('<input type="button" value="Select" onClick="gochoose('.
		  "'".$cnum."','".$cdom."','".$cleandesc."')".'" /> '.$description.' ('.
		  ($Apache::lonnet::domaindescription{$cdom}?
                   $Apache::lonnet::domaindescription{$cdom}:$cdom).
                 ")<br />\n");
	}
	if (!%courses) { $r->print(&mt('None found')); }
        $r->print('<input type="hidden" name="form" value="'.$ENV{'form.form'}.'" />'."\n".
                   '<input type="hidden" name="pickedcourse" value="" />'."\n".
                   '<input type="hidden" name="cnumelement" value="'.$ENV{'form.cnumelement'}.'" />'."\n".
                   '<input type="hidden" name="cdomelement" value="'.$ENV{'form.cdomelement'}.'" />'."\n".
                   '</form>');
    }
    $r->print('</body></html>');
    return OK;
}

1;
__END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>