--- loncom/interface/lonmsgdisplay.pm 2007/05/02 19:56:34 1.73 +++ loncom/interface/lonmsgdisplay.pm 2007/12/08 00:25:14 1.83 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.73 2007/05/02 19:56:34 raeburn Exp $ +# $Id: lonmsgdisplay.pm,v 1.83 2007/12/08 00:25:14 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -737,12 +737,27 @@ $content{'sendername'}.':'. '<br />'.&mt('Subject').': '.$content{'subject'}. '<br /><pre>'. &Apache::lontexconvert::msgtexconverted($content{'message'}). - '</pre><small>'. -&mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox'). - '</small><br />'. - '<input type="submit" name="rec_'.$key.'" value="'.&mt('Confirm Receipt').'" />'. - '<input type="submit" name="reprec_'.$key.'" '. - 'value="'.&mt('Confirm Receipt and Reply').'" />'; + '</pre><small>'; + my ($rec_button,$reprec_button); + $rec_button = &mt('Move to Inbox'); + if (!$content{'noreplies'}) { + $reprec_button = &mt('Move to Inbox/Compose reply'); + } + if ($content{'sendback'}) { + $rec_button = &mt('Confirm Receipt'); + if (!$content{'noreplies'}) { + $reprec_button = &mt('Confirm Receipt and Reply'); + } + $result .= &mt('You have to confirm that you have received this message before you can view other pages. After confirmation, this message will be moved to your regular inbox'); + } else { + $result .= &mt('Access to other pages will be prevented until you have moved the message to your inbox.'); + } + $result .= '</small><br />'. + '<input type="submit" name="rec_'.$key.'" value="'.$rec_button.'" />'; + if (!$content{'noreplies'}) { + $result .= '<input type="submit" name="reprec_'.$key.'" '. + 'value="'.$reprec_button.'" />'; + } } # Check to see if there were any messages. if ($result eq '') { @@ -877,8 +892,7 @@ sub get_course_desc { sub disall { my ($r,$folder,$msgstatus)=@_; - my %saveable = ('folder' => 'scalar', - 'msgstatus' => 'scalar', + my %saveable = ('msgstatus' => 'scalar', 'sortedby' => 'scalar', 'interdis' => 'scalar', ); @@ -915,16 +929,6 @@ sub disfolder { <script type="text/javascript"> $jscript - function checkfoldermove() { - if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') { - if (document.disall.movetofolder.options[document.disall.movetofolder.selectedIndex].value == "") { - alert("$lt{'sede'}"); - return; - } - } - return; - } - function validate_checkedaction() { document.disall.markedaction.value = document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value; if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') { @@ -1096,7 +1100,7 @@ ENDDISHEADER '<input type="button" onclick="javascript:uncheckAll(document.disall.delmark)" value="'.&mt('Uncheck All').'" />'."\n". '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" /></td><td> </td>'."\n". '<td align="center"><b>'.&mt('Action').'</b><br />'."\n". - ' <select name="checkedaction" onchange="javascript:checkfoldermove()">'."\n"); + ' <select name="checkedaction">'."\n"); if ($folder ne 'trash') { $r->print(' <option value="markeddel">'.&mt('Delete').'</option>'."\n"); @@ -1209,6 +1213,8 @@ will be forwarded to the recipient(s) yo my %lt=&Apache::lonlocal::texthash('us' => 'Username', 'do' => 'Domain', 'ad' => 'Additional Recipients', + 'rt' => 'Reply to', + 'ar' => 'Allow replies', 'sb' => 'Subject', 'ca' => 'Cancel', 'ma' => 'Mail', @@ -1319,14 +1325,36 @@ ENDREPSCRIPT } if (($broadcast ne 'group') && ($broadcast ne 'upload')) { if ($replying) { - $r->print('<tr><td colspan="2">'.&mt('Replying to').' '. - &Apache::loncommon::aboutmewrapper( + if ($content{'noreplies'}) { + $r->print('<tr><td>'.&mt('This message was designated by the sender not to allow replies.').'</td></tr></table></form>'); + return; + } + $r->print('<tr><td colspan="2">'.&mt('Replying to').' '); + if ($content{'replytoaddr'}) { + my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'}); + if ($replytoname ne '' && $replytodom ne '') { + $r->print(&Apache::loncommon::plainname($replytoname, + $replytodom).' ('.$replytoname.':'. + $replytodom.')'); + $r->print('<input type="hidden" name="recuname" value="'. + $replytoname.'" />'. + '<input type="hidden" name="recdomain" value="'. + $replytodom.'" /></td></tr>'); + + } else { + $r->print(&mt('The sender did not designate a reply to address for this message.').'</td></tr></table>'); + return; + } + } else { + $r->print(&Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. $content{'sendername'}.':'. - $content{'senderdomain'}.')'. - '<input type="hidden" name="recuname" value="'.$content{'sendername'}.'" />'. - '<input type="hidden" name="recdomain" value="'.$content{'senderdomain'}.'" />'. - '</td></tr>'); + $content{'senderdomain'}.')'); + $r->print('<input type="hidden" name="recuname" value="'. + $content{'sendername'}.'" />'. + '<input type="hidden" name="recdomain" value="'. + $content{'senderdomain'}.'" /></td></tr>'); + } if ($content{'recipid'}) { my @ccs = &retrieve_cc_recips('replying',%content); if (@ccs > 0) { @@ -1379,6 +1407,11 @@ $latexHelp. } elsif ($broadcast ne 'upload') { $subj_size = '50'; $r->print(&additional_rec_row(\%lt)); + if (&Apache::lonnet::allowed('srm',$env{'request.course.id'}) + || &Apache::lonnet::allowed('srm',$env{'request.course.id'}. + '/'.$env{'request.course.sec'})) { + $r->print(&reply_to_row(\%lt)); + } $r->print(&msg_subject_row($dissub,\%lt,$subj_size)); $r->print(<<"ENDCOMP"); </table> @@ -1453,22 +1486,30 @@ sub recipient_input_row { &Apache::loncommon::selectstudent_link('compemail','recuname', 'recdomain'); my $output = <<"ENDREC"; -<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$env{'form.recname'}" /></td><td rowspan="2">$selectlink</td></tr> -<tr><td>$lt{'do'}:</td> -<td>$domform</td></tr> +<tr><td colspan="2"><span class="LC_nobreak">$lt{'us'}: <input type="text" size="12" name="recuname" value="$env{'form.recname'}" /> $lt{'do'}: $domform $selectlink</span></td></tr> ENDREC return $output; } +sub reply_to_row { + my ($lt) = @_; + my $radioyes = &mt('Yes'); + my $radiono = &mt('No'); + my $output = <<"ENDREP"; +<tr><td colspan="2"><span class="LC_nobreak">$lt->{'ar'}:<label><input type="radio" name="can_reply" value="Y" checked="checked" />$radioyes</label> <label><input type="radio" name="can_reply" value="N" />$radiono</label></span> <span class="LC_nobreak">$lt->{'rt'}: <input type="text" size="25" name="reply_to_addr" value="$env{'user.name'}:$env{'user.domain'}" /></span></td></tr> +ENDREP + return $output; +} + sub additional_rec_row { my ($lt) = @_; my $cc = &mt('Cc:'); my $bcc = &mt('Bcc:'); my $output = <<"ENDADD"; <tr><td>$lt->{'ad'} :<br /><tt>username:domain,username:domain, ... -</tt></td><td> <span class="span.LC_nobreak">$cc -<input type="text" size="50" name="additionalrec_cc" /></nospan><br /> -<span class="span.LC_nobreak">$bcc <input type="text" size="50" name="additionalrec_bcc" /></nospan></td></tr> +</tt></td><td> <span class="LC_nobreak">$cc +<input type="text" size="50" name="additionalrec_cc" /></span><br /> +<span class="LC_nobreak">$bcc <input type="text" size="50" name="additionalrec_bcc" /></span></td></tr> ENDADD return $output; } @@ -1486,7 +1527,7 @@ sub submit_button_row { sub msg_subject_row { my ($dissub,$lt,$subj_size,$extra) = @_; - my $output = '<tr><td>'.$lt->{'sb'}.':</td><td><input type="text" size="'. + my $output = '<tr><td colspan="2">'.$lt->{'sb'}.': <input type="text" size="'. $subj_size.'" name="subject" value="'.$dissub.'" />'.$extra. '</td></tr>'; return $output; @@ -2022,15 +2063,33 @@ sub displaymessage { $counter++; } $r->print('</pre>'); + + my $see_anonymous; + my $from_student = 0; + if ($env{'request.course.id'} eq $content{'courseid'}) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $username = $content{'sendername'}.':'.$content{'senderdomain'}; + my %classlist_entry = + &Apache::lonnet::get('classlist',[$username],$cdom,$cnum); + if (exists($classlist_entry{$username})) { + $from_student = 1; + $see_anonymous = &Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); + } + } + + my $number_of_messages = scalar(@messages); #subtract 1 for last index # start output &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'}); my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'}); # Functions - $r->print('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'. - '<td><a href="/adm/email?replyto='.&escape($msgid).$sqs. - '"><b>'.&mt('Reply').'</b></a></td>'. - '<td><a href="/adm/email?forward='.&escape($msgid).$sqs. + $r->print('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'); + if (!$content{'noreplies'}) { + $r->print('<td><a href="/adm/email?replyto='.&escape($msgid).$sqs. + '"><b>'.&mt('Reply').'</b></a></td>'); + } + $r->print('<td><a href="/adm/email?forward='.&escape($msgid).$sqs. '"><b>'.&mt('Forward').'</b></a></td>'. '<td><a href="/adm/email?markunread='.&escape($msgid).$sqs. '"><b>'.&mt('Mark Unread').'</b></a></td>'. @@ -2054,6 +2113,7 @@ sub displaymessage { $symb=&Apache::lonnet::symbread($content{'baseurl'}); } if ($env{'user.adv'}) { + my $adv_actions; $r->print('<table border="2" width="100%"><tr bgcolor="#FFAAAA"><td>'.&mt('Currently available actions (will open extra window)').':</td>'); if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) { $r->print('<td><b>'.&Apache::loncommon::track_student_link(&mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check').'</b></td>'); @@ -2074,7 +2134,7 @@ sub displaymessage { &Apache::loncommon::plainname($content{'recuser'}[$i], $content{'recdomain'}[$i]), $content{'recuser'}[$i],$content{'recdomain'}[$i]). - ' ('.$content{'recuser'}[$i].' at '.$content{'recdomain'}[$i].') '; + ' ('.$content{'recuser'}[$i].' '.&mt('at').' '.$content{'recdomain'}[$i].') '; } } $tolist = join(', ',@recipients); @@ -2093,20 +2153,42 @@ sub displaymessage { if (defined($content{'baseurl'})) { $baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'}); } - $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'})); + if ($from_student && $see_anonymous ) { + $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'})); + } + $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'}); if ($folder eq 'sent') { $r->print('<br /><b>'.&mt('To').':</b> '.$tolist); + if ($content{'replytoaddr'}) { + my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'}); + if ($replytoname ne '' && $replytodom ne '') { + $r->print('<br /><b>'.&mt('Reply To').':</b> '. + $replytoname.' '.&mt('at').' '.$replytodom); + } + } } else { $r->print('<br /><b>'.&mt('From').':</b> '. &Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), - $content{'sendername'},$content{'senderdomain'}).' ('. - $content{'sendername'}.' at '. - $content{'senderdomain'}.') '); - if ($cclist) { - $r->print('<br /><b>'.&mt('Cc').':</b> '.$cclist); - } + $content{'sendername'},$content{'senderdomain'})); + if ($content{'noreplies'}) { + $r->print(' ('.&mt('No replies to sender').')'); + } else { + if ($content{'replytoaddr'}) { + my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'}); + if ($replytoname ne '' && $replytodom ne '') { + $r->print('<br /><b>'.&mt('Reply To').':</b> '. + $replytoname.' '.&mt('at').' '.$replytodom); + } + } else { + $r->print(' ('.$content{'sendername'}.' '.&mt('at').' '. + $content{'senderdomain'}.') '); + } + if ($cclist) { + $r->print('<br /><b>'.&mt('Cc').':</b> '.$cclist); + } + } } if ($content{'courseid'}) { $r->print('<br /><b>'.&mt($crstype).':</b> '.$courseinfo{'description'}); @@ -2182,12 +2264,16 @@ sub retrieve_cc_recips { ($ccdom eq $env{'user.domain'}))) { my $showcc ='<span class="LC_nobreak">'; if ($context eq 'replying') { - $showcc = '<label><input type="checkbox" name="replying_cc" value="'.$cc.'">'; + $showcc = '<label><input type="checkbox" name="replying_cc" value="'.$cc.'" />'; } $showcc .= &Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($ccname, - $ccdom),$ccname,$ccdom).'</label></span>'; - push (@ccs,$showcc); + $ccdom),$ccname,$ccdom); + if ($context eq 'replying') { + $showcc .='</label>'; + } + $showcc .= '</span>'; + push(@ccs,$showcc); } } } @@ -2515,7 +2601,7 @@ sub sendoffmail { \@recudoms); } } else { - &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' at '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated'); + &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' '&mt('at').' '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated'); } } else { my $stamp = time; @@ -2632,16 +2718,19 @@ sub handler { &printheader($r,'','Confirmed Receipt'); my $replying = 0; foreach my $envkey (keys(%env)) { - if ($envkey=~/^form\.rec\_(.*)$/) { - $r->print('<b>'.&mt('Confirming Receipt').':</b> '. - &Apache::lonmsg::user_crit_received($1).'<br>'); - } - if ($envkey=~/^form\.reprec\_(.*)$/) { - my $msgid=$1; - $r->print('<b>'.&mt('Confirming Receipt').':</b> '. - &Apache::lonmsg::user_crit_received($msgid).'<br>'); - &compout($r,'','','',$msgid); - $replying = 1; + if ($envkey=~/^form\.(rep)?rec\_(.*)$/) { + my $repchk = $1; + my $msgid = $2; + $r->print('<b>'.&mt('Confirming Receipt').':</b> '); + my $result = &Apache::lonmsg::user_crit_received($msgid); + if ($result =~ /trans:\s+ok/) { + &statuschange($msgid,'read'); + } + $r->print($result.'<br />'); + if ($repchk eq 'rep') { + &compout($r,'','','',$msgid); + $replying = 1; + } } } if (!$replying) {