--- loncom/interface/lonhelper.pm 2005/07/12 16:11:19 1.112 +++ loncom/interface/lonhelper.pm 2005/10/17 19:46:12 1.124 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.112 2005/07/12 16:11:19 albertel Exp $ +# $Id: lonhelper.pm,v 1.124 2005/10/17 19:46:12 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1536,6 +1536,7 @@ sub start_date { $paramHash->{'variable'} = $token->[2]{'variable'}; $helper->declareVar($paramHash->{'variable'}); $paramHash->{'hoursminutes'} = $token->[2]{'hoursminutes'}; + $paramHash->{'anytime'} = $token->[2]{'anytime'}; } sub end_date { @@ -1554,9 +1555,22 @@ sub render { my $var = $self->{'variable'}; my $date; - + + my $time=time; + my ($anytime,$onclick); + + if (defined($self->{DEFAULT_VALUE})) { + my $valueFunc = eval($self->{DEFAULT_VALUE}); + die('Error in default value code for variable ' . + $self->{'variable'} . ', Perl said: ' . $@) if $@; + $time = &$valueFunc($helper, $self); + if (lc($time) eq 'anytime') { $time=time; $anytime=1; } + } + if ($anytime) { + $onclick = "onclick=\"javascript:updateCheck(this.form,'${var}anytime',false)\""; + } # Default date: The current hour. - $date = localtime(); + $date = localtime($time); $date->min(0); if (defined $self->{ERROR_MSG}) { @@ -1565,7 +1579,7 @@ sub render { # Month my $i; - $result .= "<select name='${var}month'>\n"; + $result .= "<select $onclick name='${var}month'>\n"; for ($i = 0; $i < 12; $i++) { if ($i == $date->mon) { $result .= "<option value='$i' selected='selected'>"; @@ -1577,7 +1591,7 @@ sub render { $result .= "</select>\n"; # Day - $result .= "<select name='${var}day'>\n"; + $result .= "<select $onclick name='${var}day'>\n"; for ($i = 1; $i < 32; $i++) { if ($i == $date->mday) { $result .= '<option selected="selected">'; @@ -1589,7 +1603,7 @@ sub render { $result .= "</select>,\n"; # Year - $result .= "<select name='${var}year'>\n"; + $result .= "<select $onclick name='${var}year'>\n"; for ($i = 2000; $i < 2030; $i++) { # update this after 64-bit dates if ($date->year + 1900 == $i) { $result .= "<option selected='selected'>"; @@ -1606,7 +1620,7 @@ sub render { my $am = &mt('a.m.'); my $pm = &mt('p.m.'); # Build hour - $result .= "<select name='${var}hour'>\n"; + $result .= "<select $onclick name='${var}hour'>\n"; $result .= "<option " . ($date->hour == 0 ? 'selected="selected" ':'') . " value='0'>" . &mt('midnight') . "</option>\n"; for ($i = 1; $i < 12; $i++) { @@ -1629,14 +1643,16 @@ sub render { $result .= "</select> :\n"; - $result .= "<select name='${var}minute'>\n"; - for ($i = 0; $i < 60; $i++) { + $result .= "<select $onclick name='${var}minute'>\n"; + my $selected=0; + for my $i ((0,15,30,45,59,undef,0..59)) { my $printedMinute = $i; - if ($i < 10) { + if (defined($i) && $i < 10) { $printedMinute = "0" . $printedMinute; } - if ($date->min == $i) { + if (!$selected && $date->min == $i) { $result .= "<option selected='selected'>"; + $selected=1; } else { $result .= "<option>"; } @@ -1644,7 +1660,23 @@ sub render { } $result .= "</select>\n"; } - + if ($self->{'anytime'}) { + $result.=(<<CHECK); +<script type="text/javascript"> +// <!-- + function updateCheck(form,name,value) { + var checkbox=form[name]; + checkbox.checked = value; + } +// --> +</script> +CHECK + $result.=" or <label><input type='checkbox' "; + if ($anytime) { + $result.=' checked="checked" ' + } + $result.="name='${var}anytime'/>".&mt('Anytime').'</label>' + } return $result; } @@ -1652,41 +1684,44 @@ sub render { sub postprocess { my $self = shift; my $var = $self->{'variable'}; - my $month = $env{'form.' . $var . 'month'}; - my $day = $env{'form.' . $var . 'day'}; - my $year = $env{'form.' . $var . 'year'}; - my $min = 0; - my $hour = 0; - if ($self->{'hoursminutes'}) { - $min = $env{'form.' . $var . 'minute'}; - $hour = $env{'form.' . $var . 'hour'}; - } + if ($env{'form.' . $var . 'anytime'}) { + $helper->{VARS}->{$var} = undef; + } else { + my $month = $env{'form.' . $var . 'month'}; + my $day = $env{'form.' . $var . 'day'}; + my $year = $env{'form.' . $var . 'year'}; + my $min = 0; + my $hour = 0; + if ($self->{'hoursminutes'}) { + $min = $env{'form.' . $var . 'minute'}; + $hour = $env{'form.' . $var . 'hour'}; + } + + my $chosenDate; + eval {$chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);}; + my $error = $@; + + # Check to make sure that the date was not automatically co-erced into a + # valid date, as we want to flag that as an error + # This happens for "Feb. 31", for instance, which is coerced to March 2 or + # 3, depending on if it's a leap year + my $checkDate = localtime($chosenDate); + + if ($error || $checkDate->mon != $month || $checkDate->mday != $day || + $checkDate->year + 1900 != $year) { + unless (Apache::lonlocal::current_language()== ~/^en/) { + $self->{ERROR_MSG} = &mt("Invalid date entry"); + return 0; + } + # LOCALIZATION FIXME: Needs to be parameterized + $self->{ERROR_MSG} = "Can't use " . $months[$month] . " $day, $year as a " + . "date because it doesn't exist. Please enter a valid date."; - my $chosenDate; - eval {$chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);}; - my $error = $@; - - # Check to make sure that the date was not automatically co-erced into a - # valid date, as we want to flag that as an error - # This happens for "Feb. 31", for instance, which is coerced to March 2 or - # 3, depending on if it's a leap year - my $checkDate = localtime($chosenDate); - - if ($error || $checkDate->mon != $month || $checkDate->mday != $day || - $checkDate->year + 1900 != $year) { - unless (Apache::lonlocal::current_language()== ~/^en/) { - $self->{ERROR_MSG} = &mt("Invalid date entry"); return 0; } - # LOCALIZATION FIXME: Needs to be parameterized - $self->{ERROR_MSG} = "Can't use " . $months[$month] . " $day, $year as a " - . "date because it doesn't exist. Please enter a valid date."; - - return 0; + $helper->{VARS}->{$var} = $chosenDate; } - $helper->{VARS}->{$var} = $chosenDate; - if (defined($self->{NEXTSTATE})) { $helper->changeState($self->{NEXTSTATE}); } @@ -1982,6 +2017,17 @@ BUTTONS $mapUrl = $self->{MAP_URL}; } + my @defaultSymbs; + if (defined($self->{DEFAULT_VALUE})) { + my $valueFunc = eval($self->{DEFAULT_VALUE}); + die 'Error in default value code for variable ' . + $self->{'variable'} . ', Perl said: ' . $@ if $@; + @defaultSymbs = &$valueFunc($helper, $self); + if (!$multichoice) { # only allowed 1 + @defaultSymbs = ($defaultSymbs[0]); + } + } + # Create the composite function that renders the column on the nav map # have to admit any language that lets me do this can't be all bad @@ -2030,13 +2076,21 @@ BUTTONS } $col .= "<td align='center'><input type='$inputType' name='${var}.forminput' "; - if (!$checked && !$multichoice) { - $col .= "checked='checked' "; - $checked = 1; - } - if ($multichoice) { # all resources start checked; see bug 1174 - $col .= "checked='checked' "; - $checked = 1; + if (@defaultSymbs) { + my $symb=$resource->symb(); + if (grep(/\Q$symb\E/,@defaultSymbs)) { + $col .= "checked='checked' "; + $checked = 1; + } + } else { + if (!$checked && !$multichoice) { + $col .= "checked='checked' "; + $checked = 1; + } + if ($multichoice) { # all resources start checked; see bug 1174 + $col .= "checked='checked' "; + $checked = 1; + } } $col .= "value='" . $resource_name . "' /></td>"; @@ -2154,6 +2208,10 @@ selection. Defaults to false. If true, only active students and course personnel will be shown. Defaults to false. +=item * B<emptyallowed>: + +If true, the selection of no users is allowed. Defaults to false. + =back =cut @@ -2189,6 +2247,7 @@ sub start_student { if (defined($token->[2]{'nextstate'})) { $paramHash->{NEXTSTATE} = $token->[2]{'nextstate'}; } + $paramHash->{'emptyallowed'} = $token->[2]{'emptyallowed'}; } @@ -2243,6 +2302,43 @@ sub render { } } } + function getDesiredState() { // Return desired person state radio value. + numRadio = document.forms.helpform.personstate.length; + for (i =0; i < numRadio; i++) { + if (document.forms.helpform.personstate[i].checked) { + return document.forms.helpform.personstate[i].value; + } + } + return ""; + } + + function checksections(value) { // Check selected sections. + numSections = document.forms.helpform.chosensections.length; + desiredState = getDesiredState(); + + for (var option = 0; option < numSections; option++) { + if(document.forms.helpform.chosensections.options[option].selected) { + section = document.forms.helpform.chosensections.options[option].text; + if (section == "none") { + section =""; + } + for (i = 0; i < document.forms.helpform.elements.length; i++ ) { + if (document.forms.helpform.elements[i].value.indexOf(':') != -1) { + info = document.forms.helpform.elements[i].value.split(':'); + hisSection = info[2]; + hisState = info[4]; + if (desiredState == hisState || + desiredState == "All") { + if(hisSection == section || + section =="" ) { + document.forms.helpform.elements[i].checked = value; + } + } + } + } + } + } + } // --> </script> SCRIPT @@ -2258,23 +2354,12 @@ SCRIPT $buttons = <<BUTTONS; <br /> <table> - <tr> - <td><input type="button" onclick="checkactive()" value="$lt{'ocs'}" /></td> - <td><input type="button" onclick="uncheckexpired()" value="$lt{'ues'}" /><br /></td> - </tr> <tr> <td><input type="button" onclick="checkall(true, '$var')" value="$lt{'sas'}" /></td> <td> <input type="button" onclick="checkall(false, '$var')" value="$lt{'uas'}" /><br /></td> </tr> - <tr> - <td><input type="button" onclick="checksec(true)" value="$lt{'sfsg'}"></td> - <td><input type="text" size="5" name="chksec"> </td> - </tr> - <tr> - <td><input type="button" onclick="checksec(false)" value="$lt{'ufsg'}"></td> - <td></td> - </tr> + </table> <br /> BUTTONS @@ -2372,8 +2457,51 @@ BUTTONS } $result .= "</table>\n\n"; - $result .= $buttons; - + $result .= $buttons; + # + # now add the fancy section choice... first enumerate the sections: + if ($self->{'multichoice'}) { + my %sections; + for my $key (@keys) { + my $section_name = $classlist->{$key}->[$section]; + if ($section_name ne "") { + $sections{$section_name} = 1; + } + } + # The variable $choice_widget will have the html to make the choice + # selector. + my $size=5; + if (scalar(keys(%sections)) < 5) { + $size=scalar(keys(%sections)); + } + my $choice_widget = '<select multiple name="chosensections" size="'.$size.'">'."\n"; + foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) { + $choice_widget .= "<option name=\"$sec\">$sec</option>\n"; + } + $choice_widget .= "<option>none</option></select>\n"; + + # Build a table without any borders to contain the section based + # selection: + + my $section_selectors =<<SECTIONSELECT; +<table border="0"> + <tr valign="top"> + <td>For Sections:</td><td>$choice_widget</td> + <td><label><input type="radio" name="personstate" value="Active" checked /> + Current Students</label></td> + <td><label><input type="radio" name="personstate" value="All" /> + All students</label></td> + <td><label><input type="radio" name="personstate" value="Expired" /> + Expired Students</label></td> + </tr> + <tr> + <td><input type="button" value="Select" onclick="checksections(true);" /></td> + <td><input type="button" value="Unselect" onclick="checksections(false);" /></td></tr> +</table> +<br /> +SECTIONSELECT + $result .= $section_selectors; + } return $result; } @@ -2381,9 +2509,14 @@ sub postprocess { my $self = shift; my $result = $env{'form.' . $self->{'variable'} . '.forminput'}; - if (!$result) { - $self->{ERROR_MSG} = - &mt('You must choose at least one student to continue.'); + if (!$result && !$self->{'emptyallowed'}) { + if ($self->{'coursepersonnel'}) { + $self->{ERROR_MSG} = + &mt('You must choose at least one user to continue.'); + } else { + $self->{ERROR_MSG} = + &mt('You must choose at least one student to continue.'); + } return 0; }