version 1.64, 2011/01/21 16:28:32
|
version 1.65, 2011/01/30 01:21:29
|
Line 399 sub outputTable {
|
Line 399 sub outputTable {
|
} |
} |
|
|
# |
# |
# Outputting category-based grades. |
# === Outputting category-based grades. |
|
# |
|
# $category{'order'}: output order of categories by id |
|
# $category{'all'}: complete list of all categories |
|
# $category{$id.'_name'}: display-name of category |
# |
# |
|
|
sub outputCategories { |
sub outputCategories { |
Line 413 sub outputCategories {
|
Line 417 sub outputCategories {
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my %categories=(); |
my %categories=(); |
|
# Loading old categories |
|
%categories=&Apache::lonnet::dump('grading_categories',$cdom,$cnum); |
# Storing |
# Storing |
if (($cangrade) && ($env{'form.storechanges'})) { |
if (($cangrade) && (($env{'form.storechanges'}) || ($env{'form.storemove'} ne ''))) { |
|
# Process the changes |
|
%categories=&process_category_edits($r,$cangrade,%categories); |
# Actually store |
# Actually store |
&Apache::lonnet::put('grading_categories',\%categories,$cdom,$cnum); |
&Apache::lonnet::put('grading_categories',\%categories,$cdom,$cnum); |
} else { |
|
# Loading |
|
%categories=&Apache::lonnet::dump('grading_categories',$cdom,$cnum); |
|
} |
} |
# categories loaded now |
# new categories loaded now |
# Form only generated if user can change the grading categories |
# Form only generated if user can change the grading categories |
if ($cangrade) { |
if ($cangrade) { |
$r->print('<form method="post">'); |
$r->print('<form method="post">'); |
} |
} |
|
# |
|
&output_category_table($r,$cangrade,$navmap,%categories); |
|
# |
|
if ($cangrade) { |
|
$r->print('<input type="hidden" name="storemove" value="" />'. |
|
'<input type="submit" name="storechanges" value="'.&mt("Save changes to grading categories").'" /></form>'); |
|
} |
|
} |
|
|
|
# |
|
# Process editing commands, update category hash |
|
# |
|
|
|
sub process_category_edits { |
|
my ($r,$cangrade,%categories)=@_; |
|
unless ($cangrade) { return %categories; } |
# |
# |
# Business logic here |
# Business logic here |
# |
# |
if ($cangrade) { |
return %categories; |
$r->print('<input type="submit" name="storechanges" value="'.&mt("Save changes to grading categories").'" /></form>'); |
} |
} |
|
|
# |
|
# Output the table |
|
# |
|
|
|
sub output_category_table { |
|
my ($r,$cangrade,$navmaps,%categories)=@_; |
|
my $sum=0; |
|
$r->print(&Apache::loncommon::start_data_table()); |
|
# |
|
&output_category_table_header($r,$cangrade); |
|
# |
|
my @order=split(/\,/,$categories{'order'}); |
|
# |
|
# FIXME: Debug only |
|
@order=('3131_4123_42124','4124_34231_3412'); |
|
# |
|
my $maxpos=$#order; |
|
for (my $i=0;$i<=$maxpos;$i++) { |
|
my ($value,$weight)=&output_and_calc_category($r,$cangrade,$navmaps,$order[$i],$i,$maxpos,%categories); |
|
} |
|
# |
|
&bottom_line_category($r,$cangrade); |
|
# |
|
$r->print(&Apache::loncommon::end_data_table()); |
|
return $sum; |
|
} |
|
|
|
sub output_category_table_header { |
|
my ($r,$cangrade)=@_; |
|
$r->print(&Apache::loncommon::start_data_table_header_row()); |
|
if ($cangrade) { |
|
$r->print('<th colspan="2">'.&mt("Move").'</th><th>'.&mt('Action').'</th>'); |
|
} |
|
$r->print('<th>'.&mt('Category').'</th>'. |
|
'<th>'.&mt('Contents').'</th>'. |
|
'<th>'.&mt('Calculation').'</th>'. |
|
'<th>'.&mt('Weight').'</th>'. |
|
'<th>'.&mt('Percent Overall').'</th>'); |
|
$r->print(&Apache::loncommon::end_data_table_header_row()); |
|
} |
|
|
|
|
|
# |
|
# Output one category to table |
|
# |
|
|
|
sub output_and_calc_category { |
|
my ($r,$cangrade,$navmaps,$id,$currentpos,$maxpos,%categories)=@_; |
|
my $value=0; |
|
my $weight=0; |
|
my $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/"); |
|
my %lt=&Apache::lonlocal::texthash( |
|
'up' => 'Move Up', |
|
'dw' => 'Move Down'); |
|
$r->print("\n".&Apache::loncommon::start_data_table_row()); |
|
|
|
if ($cangrade) { |
|
$r->print(<<ENDMOVE); |
|
<td> |
|
<div class="LC_docs_entry_move"> |
|
<a href='/adm/quickgrades?cmd=up_$id&storechanges=1'> |
|
<img src="${iconpath}move_up.gif" alt='$lt{'up'}' class="LC_icon" /> |
|
</a> |
|
</div> |
|
<div class="LC_docs_entry_move"> |
|
<a href='/adm/quickgrades?cmd=down_$id&storechanges=1'> |
|
<img src="${iconpath}move_down.gif" alt='$lt{'dw'}' class="LC_icon" /> |
|
</a> |
|
</div> |
|
</td> |
|
ENDMOVE |
|
$r->print("\n<td>\n<select name='newpos_$id' onchange='this.form.storemove.value=\"$id\";this.form.submit()'>"); |
|
for (my $i=0;$i<=$maxpos;$i++) { |
|
if ($i==$currentpos) { |
|
$r->print('<option value="" selected="selected">('.$i.')</option>'); |
|
} else { |
|
$r->print('<option value="'.$i.'">'.$i.'</option>'); |
|
} |
|
} |
|
$r->print("\n</select>\n</td>\n"); |
|
|
|
} |
|
$r->print(&Apache::loncommon::end_data_table_row()."\n"); |
|
return ($value,$weight); |
|
} |
|
|
|
# |
|
# Bottom line with grades |
|
# |
|
|
|
sub bottom_line_category { |
|
my ($r,$cangrade)=@_; |
|
} |
|
|
|
# |
|
# Make one new category |
|
# |
|
|
|
sub make_new_category { |
|
my ($r,$cangrade,$ordernum,%categories)=@_; |
|
unless ($cangrade) { return %categories; } |
|
# Generate new ID |
|
my $id=time.'_'.$$.'_'.rand(10000); |
|
# Add new ID to list of all IDs ever created in this course |
|
$categories{'all'}.=','.$id; |
|
$categories{'all'}=~s/^\,//; |
|
# Add new ID to ordered list of displayed and evaluated categories |
|
$categories{'order'}.=','.$id; |
|
$categories{'order'}=~s/^\,//; |
|
# Move it into desired space |
|
if (defined($ordernum)) { |
|
%categories=&move_category($id,$cangrade,$ordernum,%categories); |
|
} |
|
return %categories; |
|
} |
|
|
|
# |
|
# Move a category to a desired position n the display order |
|
# |
|
|
|
sub move_category { |
|
my ($id,$cangrade,$ordernum,%categories)=@_; |
|
unless ($cangrade) { return %categories; } |
|
my @order=split(/\,/,$categories{'order'}); |
|
# Where is the index currently? |
|
my $currentpos=¤t_pos_category($id,%categories); |
|
if (defined($currentpos)) { |
|
if ($currentpos<$ordernum) { |
|
# This is moving to a higher index |
|
# ....X1234.... |
|
# ....1234X.... |
|
for (my $i=$currentpos;$i<$ordernum;$i++) { |
|
$order[$i]=$order[$i+1]; |
|
} |
|
$order[$ordernum]=$id; |
|
} |
|
if ($currentpos>$ordernum) { |
|
# This is moving to a lower index |
|
# ....1234X.... |
|
# ....X1234.... |
|
for (my $i=$currentpos;$i>$ordernum;$i--) { |
|
$order[$i]=$order[$i-1]; |
|
} |
|
$order[$ordernum]=$id; |
|
} |
|
} |
|
$categories{'order'}=join(',',@order); |
|
return %categories; |
|
} |
|
|
|
# |
|
# Find current postion of a category in the order |
|
# |
|
|
|
sub current_pos_category { |
|
my ($id,%categories)=@_; |
|
my @order=split(/\,/,$categories{'order'}); |
|
for (my $i=0;$i<=$#order;$i++) { |
|
if ($order[$i] eq $id) { return $i; } |
|
} |
|
# not found |
|
return undef; |
|
} |
|
|
|
# |
|
# Set name of a category |
|
# |
|
sub set_category_name { |
|
my ($canedit,$id,$name,%categories)=@_; |
|
unless ($canedit) { return %categories; } |
|
$categories{$id.'_name'}=$name; |
|
return %categories; |
} |
} |
|
|
|
# |
|
# === end category-related |
|
# |
|
# |
# Pass this two refs to arrays for the start and end color, and a number |
# Pass this two refs to arrays for the start and end color, and a number |
# from 0 to 1 for how much of the latter you want to mix in. It will |
# from 0 to 1 for how much of the latter you want to mix in. It will |
# return a string ready to show ("#FFC309"); |
# return a string ready to show ("#FFC309"); |