--- loncom/interface/Attic/lonspreadsheet.pm 2002/11/08 15:28:03 1.136 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/11/20 16:46:31 1.144 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.136 2002/11/08 15:28:03 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.144 2002/11/20 16:46:31 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -53,16 +53,16 @@ built-in functions. package Apache::lonspreadsheet; use strict; +use Apache::Constants qw(:common :http); +use Apache::lonnet; +use Apache::lonhtmlcommon; +use Apache::loncoursedata; +use Apache::File(); use Safe; use Safe::Hole; use Opcode; -use Apache::lonnet; -use Apache::Constants qw(:common :http); use GDBM_File; use HTML::TokeParser; -use Apache::lonhtmlcommon; -use Apache::loncoursedata; -use Apache::File(); use Spreadsheet::WriteExcel; # @@ -1086,6 +1086,44 @@ sub geterrorlog { return ${$sheet->{'safe'}->varglob('errorlog')}; } +sub gettitle { + my $sheet = shift; + if ($sheet->{'sheettype'} eq 'classcalc') { + return $sheet->{'coursedesc'}; + } elsif ($sheet->{'sheettype'} eq 'studentcalc') { + return 'Grades for '.$sheet->{'uname'}.'@'.$sheet->{'udom'}; + } elsif ($sheet->{'sheettype'} eq 'assesscalc') { + if (($sheet->{'usymb'} eq '_feedback') || + ($sheet->{'usymb'} eq '_evaluation') || + ($sheet->{'usymb'} eq '_discussion') || + ($sheet->{'usymb'} eq '_tutoring')) { + my $title = $sheet->{'usymb'}; + $title =~ s/^_//; + $title = ucfirst($title); + return $title; + } + return if (! defined($sheet->{'mapid'}) || + $sheet->{'mapid'} !~ /^\d+$/); + my $mapid = $sheet->{'mapid'}; + return if (! defined($sheet->{'resid'}) || + $sheet->{'resid'} !~ /^\d+$/); + my $resid = $sheet->{'resid'}; + my %course_db; + tie(%course_db,'GDBM_File',$sheet->{'coursefilename'}.'.db', + &GDBM_READER(),0640); + return if (! tied(%course_db)); + my $key = 'title_'.$mapid.'.'.$resid; + my $title = ''; + if (exists($course_db{$key})) { + $title = $course_db{$key}; + } else { + $title = $sheet->{'usymb'}; + } + untie (%course_db); + return $title; + } +} + # ----------------------------------------------------- Get value of $f{'A'.$n} sub getfa { my $sheet = shift; @@ -1111,7 +1149,7 @@ sub exportdata { sub update_student_sheet{ - my $sheet = shift; + my ($sheet,$r,$c) = @_; # Load in the studentcalc sheet &readsheet($sheet,'default_studentcalc'); # Determine the structure (contained assessments, etc) of the sheet @@ -1119,7 +1157,7 @@ sub update_student_sheet{ # Load in the cached sheets for this student &cachedssheets($sheet); # Load in the (possibly cached) data from the assessment sheets - &loadstudent($sheet); + &loadstudent($sheet,$r,$c); # Compute the sheet &calcsheet($sheet); } @@ -1148,16 +1186,45 @@ sub get_row { ######################################################################## sub sort_indicies { my $sheet = shift; - # - # Sort the rows in some manner - # - my @sortby=(); my @sortidx=(); - for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { - push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}')); - push (@sortidx, $row); + # + if ($sheet->{'sheettype'} eq 'classcalc') { + my @sortby=(undef); + # Skip row 0 + for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { + my (undef,$sname,$sdom,$fullname,$section,$id) = + split(':',$sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$row}}); + push (@sortby, lc($fullname)); + push (@sortidx, $row); + } + @sortidx = sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; + } elsif ($sheet->{'sheettype'} eq 'studentcalc') { + my @sortby1=(undef); + my @sortby2=(undef); + # Skip row 0 + for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { + my (undef,$symb,$uname,$udom,$mapid,$resid,$title) = + split(':',$sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$row}}); + $symb = &Apache::lonnet::unescape($symb); + my ($sequence) = ($symb =~ /\/([^\/]*\.sequence)/); + if ($sequence eq '') { + $sequence = $symb; + } + push (@sortby1, $sequence); + push (@sortby2, $title); + push (@sortidx, $row); + } + @sortidx = sort { $sortby1[$a] cmp $sortby1[$b] || + $sortby2[$a] cmp $sortby2[$b] } @sortidx; + } else { + my @sortby=(undef); + # Skip row 0 + for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { + push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}')); + push (@sortidx, $row); + } + @sortidx = sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; } - @sortidx=sort { lc($sortby[$a]) cmp lc($sortby[$b]); } @sortidx; return @sortidx; } @@ -1190,6 +1257,7 @@ sub html_editable_cell { if ($value =~ /^\s*$/ ) { $value = '<font color="'.$bgcolor.'">#</font>'; } + $formula =~ s/\n/\\n/gs; $result .= '<a href="javascript:celledit(\''. $name.'\',\''.$formula.'\');">'.$value.'</a>'; return $result; @@ -1267,7 +1335,6 @@ END # Print out summary/export row #################################### my ($rowlabel,@rowdata) = &get_row($sheet,'0'); - my $rowcount = 0; $row_html = '<tr><td>'.&format_html_rowlabel($rowlabel).'</td>'; $num_cols_output = 0; foreach my $cell (@rowdata) { @@ -1293,6 +1360,20 @@ END foreach my $rownum (@Rows) { my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); next if ($rowlabel =~ /^\s*$/); + next if (($sheet->{'sheettype'} eq 'assesscalc') && + (! $ENV{'form.showall'}) && + ($rowdata[0]->{'value'} =~ /^\s*$/)); + if (! $ENV{'form.showall'} && + $sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) { + my $row_is_empty = 1; + foreach my $cell (@rowdata) { + if ($cell->{'value'} !~ /^\s*$/) { + $row_is_empty = 0; + last; + } + } + next if ($row_is_empty); + } # my $defaultbg='#E0FF'; # @@ -1457,7 +1538,7 @@ END # Create a new spreadsheet my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef); # Read in the spreadsheet definition - &update_student_sheet($studentsheet); + &update_student_sheet($studentsheet,$r,$c); # Stuff the sheet into excel &export_sheet_as_excel($studentsheet,$student_excel_worksheet); my $totaltime = int((time - $starttime) / $count * $sheet->{'maxrow'}); @@ -1520,7 +1601,6 @@ sub create_excel_spreadsheet { my $filename = '/prtspool/'. $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. time.'_'.rand(1000000000).'.xls'; - #&Apache::lonnet::logthis("spreadsheet:filename = ".$filename); my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); if (! defined($workbook)) { $r->log_error("Error creating excel spreadsheet $filename: $!"); @@ -1543,25 +1623,57 @@ sub create_excel_spreadsheet { sub export_sheet_as_excel { my $sheet = shift; my $worksheet = shift; + # + my $rows_output = 0; + my $cols_output = 0; + #################################### + # Write an identifying row # + #################################### + my @Headerinfo = ($sheet->{'coursedesc'}); + my $title = &gettitle($sheet); + $cols_output = 0; + if (defined($title)) { + $worksheet->write($rows_output++,$cols_output++,$title); + } + #################################### + # Write the summary/export row # + #################################### + my ($rowlabel,@rowdata) = &get_row($sheet,'0'); + my $label = &format_excel_rowlabel($rowlabel); + $cols_output = 0; + $worksheet->write($rows_output,$cols_output++,$label); + foreach my $cell (@rowdata) { + $worksheet->write($rows_output,$cols_output++,$cell->{'value'}); + } + $rows_output+= 2; # Skip a row, just for fun #################################### # Prepare to output rows #################################### my @Rows = &sort_indicies($sheet); # # Loop through the rows and output them one at a time - my $rows_output=0; foreach my $rownum (@Rows) { my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); - next if ($rowlabel =~ /^\s*$/); - my $cols_output = 0; + next if ($rowlabel =~ /^[\s]*$/); + $cols_output = 0; my $label = &format_excel_rowlabel($rowlabel); + if ( ! $ENV{'form.showall'} && + $sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) { + my $row_is_empty = 1; + foreach my $cell (@rowdata) { + if ($cell->{'value'} !~ /^\s*$/) { + $row_is_empty = 0; + last; + } + } + next if ($row_is_empty); + } $worksheet->write($rows_output,$cols_output++,$label); if (ref($label)) { $cols_output = (scalar(@$label)); } foreach my $cell (@rowdata) { - $worksheet->write($rows_output,$cols_output++, - $cell->{'value'}); + $worksheet->write($rows_output,$cols_output++,$cell->{'value'}); } $rows_output++; } @@ -1582,7 +1694,7 @@ sub outsheet_xml { ## Outsheet - calls other outsheet_* functions ## sub outsheet { - my ($r,$sheet)=@_; + my ($sheet,$r)=@_; if (! exists($ENV{'form.output'})) { $ENV{'form.output'} = 'HTML'; } @@ -1694,7 +1806,8 @@ sub readsheet { if ($fh=Apache::File->new($includedir.'/'.$dfn)) { $sheetxml=join('',<$fh>); } else { - $sheetxml='<field row="0" col="A">"Error"</field>'; + # $sheetxml='<field row="0" col="A">"Error"</field>'; + $sheetxml='<field row="0" col="A"></field>'; } %f=%{&parse_sheet(\$sheetxml)}; } elsif($fn=~/\/*\.spreadsheet$/) { @@ -1730,6 +1843,8 @@ sub makenewsheet { $sheet->{'udom'} = $udom; $sheet->{'sheettype'} = $stype; $sheet->{'usymb'} = $usymb; + $sheet->{'mapid'} = $ENV{'form.mapid'}; + $sheet->{'resid'} = $ENV{'form.resid'}; $sheet->{'cid'} = $ENV{'request.course.id'}; $sheet->{'csec'} = $Section{$uname.':'.$udom}; $sheet->{'coursefilename'} = $ENV{'request.course.fn'}; @@ -1737,7 +1852,7 @@ sub makenewsheet { $sheet->{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; $sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; $sheet->{'coursedesc'} = $ENV{'course.'.$ENV{'request.course.id'}. - 'description'}; + '.description'}; $sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom); # # @@ -1943,10 +2058,11 @@ sub format_html_rowlabel { my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$title) = split(':',$labeldata); + my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); $symb = &Apache::lonnet::unescape($symb); $result = '<a href="/adm/assesscalc?usymb='.$symb. - '&uname='.$uname.'&udom='.$udom.'">'.$title.'</a>'; + '&uname='.$uname.'&udom='.$udom. + '&mapid='.$mapid.'&resid='.$resid.'">'.$title.'</a>'; } elsif ($type eq 'student') { my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); $result ='<a href="/adm/studentcalc?uname='.$sname. @@ -1966,7 +2082,7 @@ sub format_csv_rowlabel { my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$title) = split(':',$labeldata); + my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); $symb = &Apache::lonnet::unescape($symb); $result = $title; } elsif ($type eq 'student') { @@ -1987,7 +2103,7 @@ sub format_excel_rowlabel { my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$title) = split(':',$labeldata); + my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); $symb = &Apache::lonnet::unescape($symb); $result = $title; } elsif ($type eq 'student') { @@ -2025,6 +2141,7 @@ sub updateclasssheet { foreach my $student (keys(%$classlist)) { my ($studentDomain,$studentName,$end,$start,$id,$studentSection, $fullname,$status) = @{$classlist->{$student}}; + $Section{$studentName.':'.$studentDomain} = $studentSection; if ($ENV{'form.Status'} eq $status || $ENV{'form.Status'} eq 'Any') { $currentlist{$student}=join(':',('student',$studentName, $studentDomain,$fullname, @@ -2098,7 +2215,7 @@ sub get_student_rowlabels { my %assesslist; foreach ('Feedback','Evaluation','Tutoring','Discussion') { my $symb = '_'.lc($_); - $assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,$_)); + $assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,0,0,$_)); } # while (my ($key,$srcf) = each(%course_db)) { @@ -2111,7 +2228,8 @@ sub get_student_rowlabels { &Apache::lonnet::declutter($course_db{'map_id_'.$mapid}). '___'.$resid.'___'.&Apache::lonnet::declutter($srcf); $assesslist{$symb}='symb:'.&Apache::lonnet::escape($symb).':' - .$uname.':'.$udom.':'.$course_db{'title_'.$id}; + .$uname.':'.$udom.':'.$mapid.':'.$resid.':'. + $course_db{'title_'.$id}; } } untie(%course_db); @@ -2232,9 +2350,9 @@ sub updatestudentassesssheet { # ------------------------------------------------ Load data for one assessment sub loadstudent{ - my ($sheet)=@_; - my %c=(); - my %f=&getformulas($sheet); + my ($sheet,$r,$c)=@_; + my %constants=(); + my %formulas=&getformulas($sheet); $cachedassess=$sheet->{'uname'}.':'.$sheet->{'udom'}; # Get ALL the student preformance data my @tmp = &Apache::lonnet::dump($sheet->{'cid'}, @@ -2247,26 +2365,29 @@ sub loadstudent{ undef @tmp; # my @assessdata=(); - while (my ($cell,$value) = each (%f)) { + while (my ($cell,$value) = each (%formulas)) { + if(defined($c) && ($c->aborted())) { + last; + } next if ($cell !~ /^A(\d+)/); my $row=$1; next if (($value =~ /^[!~-]/) || ($row==0)); my ($usy,$ufn)=split(/__&&&\__/,$value); @assessdata=&exportsheet($sheet,$sheet->{'uname'}, $sheet->{'udom'}, - 'assesscalc',$usy,$ufn); + 'assesscalc',$usy,$ufn,$r); my $index=0; foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z') { if (defined($assessdata[$index])) { my $col=$_; if ($assessdata[$index]=~/\D/) { - $c{$col.$row}="'".$assessdata[$index]."'"; + $constants{$col.$row}="'".$assessdata[$index]."'"; } else { - $c{$col.$row}=$assessdata[$index]; + $constants{$col.$row}=$assessdata[$index]; } unless ($col eq 'A') { - $f{$col.$row}='import'; + $formulas{$col.$row}='import'; } } $index++; @@ -2274,23 +2395,23 @@ sub loadstudent{ } $cachedassess=''; undef %cachedstores; - $sheet->{'f'} = \%f; + $sheet->{'f'} = \%formulas; &setformulas($sheet); - &setconstants($sheet,\%c); + &setconstants($sheet,\%constants); } # --------------------------------------------------- Load data for one student # sub loadcourse { - my ($sheet,$r)=@_; + my ($sheet,$r,$c)=@_; # - my %c=(); - my %f=&getformulas($sheet); + my %constants=(); + my %formulas=&getformulas($sheet); # my $total=0; - foreach (keys(%f)) { + foreach (keys(%formulas)) { if ($_=~/^A(\d+)/) { - unless ($f{$_}=~/^[\!\~\-]/) { $total++; } + unless ($formulas{$_}=~/^[\!\~\-]/) { $total++; } } } my $now=0; @@ -2307,12 +2428,16 @@ sub loadcourse { </script> ENDPOP $r->rflush(); - foreach (keys(%f)) { + foreach (keys(%formulas)) { + if(defined($c) && ($c->aborted())) { + last; + } next if ($_!~/^A(\d+)/); my $row=$1; - next if (($f{$_}=~/^[\!\~\-]/) || ($row==0)); - my ($sname,$sdom) = split(':',$f{$_}); - my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc'); + next if (($formulas{$_}=~/^[\!\~\-]/) || ($row==0)); + my ($sname,$sdom) = split(':',$formulas{$_}); + my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc', + undef,undef,$r); undef %userrdatas; $now++; $r->print('<script>popwin.document.popremain.remaining.value="'. @@ -2326,20 +2451,20 @@ ENDPOP if (defined($studentdata[$index])) { my $col=$_; if ($studentdata[$index]=~/\D/) { - $c{$col.$row}="'".$studentdata[$index]."'"; + $constants{$col.$row}="'".$studentdata[$index]."'"; } else { - $c{$col.$row}=$studentdata[$index]; + $constants{$col.$row}=$studentdata[$index]; } unless ($col eq 'A') { - $f{$col.$row}='import'; + $formulas{$col.$row}='import'; } } $index++; } } - $sheet->{'f'}=\%f; + $sheet->{'f'}=\%formulas; &setformulas($sheet); - &setconstants($sheet,\%c); + &setconstants($sheet,\%constants); $r->print('<script>popwin.close()</script>'); $r->rflush(); } @@ -2347,7 +2472,7 @@ ENDPOP # ------------------------------------------------ Load data for one assessment # sub loadassessment { - my ($sheet)=@_; + my ($sheet,$r,$c)=@_; my $uhome = $sheet->{'uhome'}; my $uname = $sheet->{'uname'}; @@ -2511,13 +2636,14 @@ sub updatesheet { sub loadrows { my ($sheet,$r)=@_; + my $c = $r->connection; my $stype=$sheet->{'sheettype'}; if ($stype eq 'classcalc') { - &loadcourse($sheet,$r); + &loadcourse($sheet,$r,$c); } elsif ($stype eq 'studentcalc') { - &loadstudent($sheet); + &loadstudent($sheet,$r,$c); } else { - &loadassessment($sheet); + &loadassessment($sheet,$r,$c); } } @@ -2525,7 +2651,11 @@ sub loadrows { sub checkthis { my ($keyname,$time)=@_; - return ($time<$expiredates{$keyname}); + if (! exists($expiredates{$keyname})) { + return 0; + } else { + return ($time<$expiredates{$keyname}); + } } sub forcedrecalc { @@ -2558,7 +2688,7 @@ sub forcedrecalc { # returns the export row for a spreadsheet. # sub exportsheet { - my ($sheet,$uname,$udom,$stype,$usymb,$fn)=@_; + my ($sheet,$uname,$udom,$stype,$usymb,$fn,$r)=@_; $uname = $uname || $sheet->{'uname'}; $udom = $udom || $sheet->{'udom'}; $stype = $stype || $sheet->{'sheettype'}; @@ -2573,7 +2703,6 @@ sub exportsheet { my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; my $found=''; if ($oldsheets{$key}) { - &Apache::lonnet::logthis("got cached $stype for $uname"); foreach (split(/___&\___/,$oldsheets{$key})) { my ($name,$value)=split(/___=___/,$_); if ($name eq $fn) { @@ -2584,7 +2713,6 @@ sub exportsheet { unless ($found) { &cachedssheets($sheet,$uname,$udom); if ($oldsheets{$key}) { - &Apache::lonnet::logthis("got cached $stype for $uname"); foreach (split(/___&\___/,$oldsheets{$key})) { my ($name,$value)=split(/___=___/,$_); if ($name eq $fn) { @@ -2614,7 +2742,7 @@ sub exportsheet { my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb); &readsheet($newsheet,$fn); &updatesheet($newsheet); - &loadrows($newsheet); + &loadrows($newsheet,$r); &calcsheet($newsheet); @exportarr=&exportdata($newsheet); ## @@ -2655,17 +2783,19 @@ sub exportsheet { # # Store away the new value # + my $timekey = $key.'.time'; if ($stype eq 'studentcalc') { - &Apache::lonnet::put('nohist_calculatedsheets', - { $key => $newstore, - $key.time => $now }, - $sheet->{'cdom'},$sheet->{'cnum'}); - } else { - &Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'}, - { $key => $newstore, - $key.time => $now }, - $sheet->{'udom'}, - $sheet->{'uname'}) + my $result = &Apache::lonnet::put('nohist_calculatedsheets', + { $key => $newstore, + $timekey => $now }, + $sheet->{'cdom'}, + $sheet->{'cnum'}); + } else { + my $result = &Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'}, + { $key => $newstore, + $timekey => $now }, + $sheet->{'udom'}, + $sheet->{'uname'}); } return @exportarr; } @@ -2680,7 +2810,7 @@ sub load_spreadsheet_expirationdates { my @tmp = &Apache::lonnet::dump('nohist_expirationdates', $ENV{'course.'.$cid.'.domain'}, $ENV{'course.'.$cid.'.num'}); - if (lc($tmp[0])!~/^error/){ + if (lc($tmp[0]) !~ /^error/){ %expiredates = @tmp; } } @@ -2723,7 +2853,6 @@ sub cachedssheets { $oldsheets{$key} = $value; $count++; } - &Apache::lonnet::logthis('saved '.$count.' cached sheets for '.$uname); $loadedcaches{$sheet->{'uname'}.'_'.$sheet->{'udom'}}=1; } } @@ -2789,8 +2918,8 @@ sub handler { # # Get query string for limited number of parameters # - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['uname','udom','usymb','ufn']); + &Apache::loncommon::get_unprocessed_cgi + ($ENV{'QUERY_STRING'},['uname','udom','usymb','ufn','mapid','resid']); # # Deal with restricted student permissions # @@ -2832,17 +2961,45 @@ sub handler { # Header.... # $r->print('<html><head><title>LON-CAPA Spreadsheet</title>'); + my $nothing = "''"; + if ($ENV{'browser.type'} eq 'explorer') { + $nothing = "'javascript:void(0);'"; + } + if ($ENV{'request.role'} !~ /^st\./) { $r->print(<<ENDSCRIPT); <script language="JavaScript"> - function celledit(cn,cf) { - var cnf=prompt(cn,cf); - if (cnf!=null) { - document.sheet.unewfield.value=cn; - document.sheet.unewformula.value=cnf; - document.sheet.submit(); + var editwin; + + function celledit(cellname,cellformula) { + var edit_text = ''; + edit_text +='<html><head><title>Cell Edit Window</title></head><body>'; + edit_text += '<form name="editwinform">'; + edit_text += '<center><h3>Cell '+cellname+'</h3>'; + edit_text += '<textarea name="newformula" cols="40" rows="6"'; + edit_text += ' wrap="off" >'+cellformula+'</textarea>'; + edit_text += '</br>'; + edit_text += '<input type="button" name="accept" value="Accept"'; + edit_text += ' onClick=\\\'javascript:'; + edit_text += 'opener.document.sheet.unewfield.value='; + edit_text += '"'+cellname+'";'; + edit_text += 'opener.document.sheet.unewformula.value='; + edit_text += 'document.editwinform.newformula.value;'; + edit_text += 'opener.document.sheet.submit();'; + edit_text += 'self.close()\\\' />'; + edit_text += ' '; + edit_text += '<input type="button" name="abort" '; + edit_text += 'value="Discard Changes"'; + edit_text += ' onClick="javascript:self.close()" />'; + edit_text += '</center></body></html>'; + + if (editwin != null && !(editwin.closed) ) { + editwin.close(); } + + editwin = window.open($nothing,'CellEditWin','height=200,width=350,scrollbars=no,resizeable=yes,alwaysRaised=yes,dependent=yes',true); + editwin.document.write(edit_text); } function changesheet(cn) { @@ -2861,7 +3018,7 @@ sub handler { ENDSCRIPT } $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet'). - '<form action="'.$r->uri.'" name=sheet method=post>'); + '<form action="'.$r->uri.'" name="sheet" method="post">'); $r->print(&hiddenfield('uname',$ENV{'form.uname'}). &hiddenfield('udom',$ENV{'form.udom'}). &hiddenfield('usymb',$ENV{'form.usymb'}). @@ -2882,6 +3039,30 @@ ENDSCRIPT # Read new sheet or modified worksheet my ($sheet)=&makenewsheet($aname,$adom,$sheettype,$ENV{'form.usymb'}); # + # Check user permissions + if (($sheet->{'sheettype'} eq 'classcalc' ) || + ($sheet->{'uname'} ne $ENV{'user.name'} ) || + ($sheet->{'udom'} ne $ENV{'user.domain'})) { + unless (&Apache::lonnet::allowed('vgr',$sheet->{'cid'})) { + $r->print('<h1>Access Permission Denied</h1>'. + '</form></body></html>'); + return OK; + } + } + # Print out user information + $r->print('<h2>'.$sheet->{'coursedesc'}.'</h2>'); + if ($sheet->{'sheettype'} ne 'classcalc') { + $r->print('<h2>'.&gettitle($sheet).'</h2><p>'); + } + if ($sheet->{'sheettype'} eq 'assesscalc') { + $r->print('<b>User:</b> '.$sheet->{'uname'}. + '<br /><b>Domain:</b> '.$sheet->{'udom'}.'<br />'); + } + if ($sheet->{'sheettype'} eq 'studentcalc' || + $sheet->{'sheettype'} eq 'assesscalc') { + $r->print('<b>Section/Group:</b>'.$sheet->{'csec'}.'</p>'); + } + # # If a new formula had been entered, go from work copy if ($ENV{'form.unewfield'}) { $r->print('<h2>Modified Workcopy</h2>'); @@ -2896,43 +3077,23 @@ ENDSCRIPT } else { &readsheet($sheet,$ENV{'form.ufn'}); } - # Print out user information - if ($sheet->{'sheettype'} ne 'classcalc') { - $r->print('<p><b>User:</b> '.$sheet->{'uname'}. - '<br><b>Domain:</b> '.$sheet->{'udom'}); - $r->print('<br><b>Section/Group:</b> '.$sheet->{'csec'}); - if ($ENV{'form.usymb'}) { - $r->print('<br><b>Assessment:</b> <tt>'. - $ENV{'form.usymb'}.'</tt>'); - } - } - # - # Check user permissions - if (($sheet->{'sheettype'} eq 'classcalc' ) || - ($sheet->{'uname'} ne $ENV{'user.name'} ) || - ($sheet->{'udom'} ne $ENV{'user.domain'})) { - unless (&Apache::lonnet::allowed('vgr',$sheet->{'cid'})) { - $r->print('<h1>Access Permission Denied</h1>'. - '</form></body></html>'); - return OK; - } - } # Additional options - $r->print('<br />'. - '<input type="submit" name="forcerecalc" '. - 'value="Completely Recalculate Sheet"><p>'); if ($sheet->{'sheettype'} eq 'assesscalc') { $r->print('<p><font size=+2>'. '<a href="/adm/studentcalc?'. 'uname='.$sheet->{'uname'}. '&udom='.$sheet->{'udom'}.'">'. - 'Level up: Student Sheet</a></font><p>'); + 'Level up: Student Sheet</a></font></p>'); } if (($sheet->{'sheettype'} eq 'studentcalc') && (&Apache::lonnet::allowed('vgr',$sheet->{'cid'}))) { $r->print ('<p><font size=+2><a href="/adm/classcalc">'. - 'Level up: Course Sheet</a></font><p>'); + 'Level up: Course Sheet</a></font></p>'); } + # Recalc button + $r->print('<br />'. + '<input type="submit" name="forcerecalc" '. + 'value="Completely Recalculate Sheet"></p>'); # Save dialog if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { my $fname=$ENV{'form.ufn'}; @@ -3012,12 +3173,12 @@ ENDSCRIPT } # # Write the modified worksheet - $r->print('<b>Current sheet:</b> '.$sheet->{'filename'}.'<p>'); + $r->print('<b>Current sheet:</b> '.$sheet->{'filename'}.'</p>'); &tmpwrite($sheet); - if ($sheet->{'sheettype'} eq 'studentcalc') { - $r->print('<br>Show rows with empty A column: '); + if ($sheet->{'sheettype'} eq 'assesscalc') { + $r->print('<p>Show rows with empty A column: '); } else { - $r->print('<br>Show empty rows: '); + $r->print('<p>Show empty rows: '); } # $r->print(&hiddenfield('userselhidden','true'). @@ -3070,7 +3231,7 @@ ENDSCRIPT #value='Insert Row Bottom'><br> #ENDINSERTBUTTONS # Print out sheet - &outsheet($r,$sheet); + &outsheet($sheet,$r); $r->print('</form></body></html>'); # Done return OK;