--- loncom/interface/Attic/lonspreadsheet.pm 2002/11/08 20:18:29 1.137 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/11/12 22:44:28 1.139 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.137 2002/11/08 20:18:29 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.139 2002/11/12 22:44:28 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -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; @@ -1153,6 +1191,7 @@ sub sort_indicies { # my @sortby=(); my @sortidx=(); + # Skip row 0 for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}')); push (@sortidx, $row); @@ -1190,6 +1229,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 +1307,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) { @@ -1542,25 +1581,46 @@ 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; + $cols_output = 0; my $label = &format_excel_rowlabel($rowlabel); $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++; } @@ -1729,6 +1789,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'}; @@ -1736,7 +1798,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); # # @@ -1942,10 +2004,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. @@ -1965,7 +2028,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') { @@ -1986,7 +2049,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') { @@ -2024,6 +2087,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, @@ -2097,7 +2161,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)) { @@ -2110,7 +2174,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); @@ -2785,8 +2850,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 # @@ -2828,17 +2893,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) { @@ -2857,7 +2950,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'}). @@ -2878,6 +2971,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>'); @@ -2892,43 +3009,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'}; @@ -3008,12 +3105,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: '); + $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').