--- loncom/interface/lonmsgdisplay.pm 2007/12/08 00:25:14 1.83 +++ loncom/interface/lonmsgdisplay.pm 2008/12/05 19:38:32 1.100 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.83 2007/12/08 00:25:14 raeburn Exp $ +# $Id: lonmsgdisplay.pm,v 1.100 2008/12/05 19:38:32 schafran Exp $ # # Copyright Michigan State University Board of Trustees # @@ -243,9 +243,9 @@ function folder_choice(targetform,caller      '. - '

-
'.&mt('New Folder').'
'. + '
'.&mt('Name').'
'. '
@@ -353,7 +353,7 @@ sub makefolder { } } else { $outcome = - &mt('Error - could not obtain lock on email folders record.'); + &mt('Error - could not obtain lock on e-mail folders record.'); } return ($outcome,$warning); } @@ -502,7 +502,8 @@ sub movemsg { # ======================================================= Display a course list sub discourse { - my $result; + my ($statushash) = @_; + my ($result,$active,$previous,$future); my ($course_personnel, $current_members, $expired_members, @@ -511,33 +512,55 @@ sub discourse { unshift @$current_members, (@$course_personnel); my %defaultUsers; - $result .= ''."\n"; + my $tmptext; + if ($tmptext = &Apache::lonselstudent::render_student_list($current_members, + "activeusers", + "current", + \%defaultUsers, + 1,"selectedusers",1,'email') + ) { + $result .= '
'.&mt('Bcc: course members with current access').'
'; + $result .= $tmptext.'

'; + if (ref($statushash) eq 'HASH') { + $statushash->{'active'} = 1; + } + } + if ($tmptext = &Apache::lonselstudent::render_student_list($expired_members, + "previoususers", + "expired", + \%defaultUsers, + 1, "selectedusers",0,'email') + ) { + $result .= '
'.&mt('Bcc: course members with expired access').'
'; + $result .= $tmptext.'

'; + if (ref($statushash) eq 'HASH') { + $statushash->{'previous'} = 1; + } + + } + if ($tmptext = &Apache::lonselstudent::render_student_list($future_members, + "futureusers", + "future", + \%defaultUsers, + 1, "selectedusers",0,'email') + ) { + $result .= '
'.&mt('Bcc: course members with future access').'
'; + $result .= $tmptext.'
'; + if (ref($statushash) eq 'HASH') { + $statushash->{'future'} = 1; + } - $result .= &Apache::lonselstudent::render_student_list($current_members, - "compemail", - "current", - \%defaultUsers, - 1,"selectedusers",1); - - $result .= &Apache::lonselstudent::render_student_list($expired_members, - "compemail", - "expired", - \%defaultUsers, - 1, "selectedusers",0); - $result .= &Apache::lonselstudent::render_student_list($future_members, - "compemail", - "future", - \%defaultUsers, - 1, "selectedusers", 0); + } return $result; } sub disgroup { - my ($cdom,$cnum,$group,$viewgrps,$editgrps) = @_; + my ($cdom,$cnum,$group,$access_status) = @_; my $result; # Needs to be in a course if (!($env{'request.course.fn'})) { - $result = &mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.'); + $result = &mt('Error: you must have a course role selected to be able to send a broadcast +e-mail to a group in the course.'); return $result; } if ($cdom eq '' || $cnum eq '') { @@ -547,6 +570,10 @@ sub disgroup { my ($memberinfo,$numitems) = &Apache::longroup::group_memberlist($cdom,$cnum,$group,{},[]); my @statustypes = ('active'); + my $viewgrps = &Apache::lonnet::allowed('vcg',$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); + my $editgrps = &Apache::lonnet::allowed('mdg',$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); if ($viewgrps || $editgrps) { push(@statustypes,('future','previous')); } @@ -555,7 +582,6 @@ sub disgroup { 'recipients to select.'); return $result; } else { - $result = &mt('Select message recipients from the group members listed below.
'); my %Sortby = ( active => {}, previous => {}, @@ -565,9 +591,9 @@ sub disgroup { 'name' => 'Name', 'usnm' => 'Username', 'doma' => 'Domain', - 'active' => 'Active Members', - 'previous' => 'Former Members', - 'future' => 'Future Members', + 'active' => 'Broadcast to Active Members', + 'previous' => 'Broadcast (Bcc) to Former Members', + 'future' => 'Broadcast (Bcc) to Future Members', ); foreach my $user (sort(keys(%{$memberinfo}))) { my $status = $$memberinfo{$user}{status}; @@ -582,26 +608,34 @@ sub disgroup { } } $result .= &group_check_uncheck(); - $result .= ''. - ''; foreach my $status (@statustypes) { if (ref($numitems) eq 'HASH') { if ((defined($$numitems{$status})) && ($$numitems{$status})) { - $result.='". + 'onclick="javascript:toggleAll('."this.form,'uncheck'".')" />'. + ''; + if ($status eq 'active') { + $result .= '   '; + } + $result .= '
'.&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + "". "". "". - &Apache::loncommon::end_data_table_header_row(); + &Apache::loncommon::end_data_table_header_row(); foreach my $key (sort(keys(%{$Sortby{$status}}))) { foreach my $user (@{$Sortby{$status}{$key}}) { $result .= @@ -615,12 +649,10 @@ sub disgroup { &Apache::loncommon::end_data_table_row(); } } - $result .= &Apache::loncommon::end_data_table(); + $result .= &Apache::loncommon::end_data_table().'
'; } } - $result .= ''; } - $result .= '
'. - '
'.$lt{$status}. - ''. + my $formname = $status.'users'; + if (ref($access_status) eq 'HASH') { + $access_status->{$status} = $$numitems{$status}; + } + $result.='
'.$lt{$status}. + '
'. + ''. ''. + 'onclick="javascript:toggleAll('."this.form,'check'".')" />'. '  '. ''. - '

'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(); - $result .= "
$lt{'name'}$lt{'name'}$lt{'usnm'}$lt{'doma'}  
'; } return $result; } @@ -628,24 +660,19 @@ sub disgroup { sub group_check_uncheck { my $output = qq| + +|; + } + } if ($forwarding) { %message=&Apache::lonnet::get('nohist_email'.$suffix,[$forwarding]); %content=&Apache::lonmsg::unpackagemsg($message{$forwarding},$folder); $dispcrit.=''; - $func=&mt('Forward'); + $func1='Forward'; # do not translate here! $dissub=&mt('Forwarding').': '.$content{'subject'}; $dismsg=&mt('Forwarded message from').' '. @@ -1272,7 +1383,7 @@ will be forwarded to the recipient(s) yo %content=&Apache::lonmsg::unpackagemsg($message{$replying},$folder); $dispcrit.=''; - $func=&mt('Send Reply to'); + $func1='Send Reply to'; # do not translate here! $dissub=&mt('Reply').': '.$content{'subject'}; $dismsg='> '.$content{'message'}; @@ -1296,40 +1407,29 @@ $jscript ENDREPSCRIPT } my $citation=&displayresource(%content); - my ($can_grp_broadcast,$viewgrps,$editgrps); + my $onsubmit; if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; } if ($env{'form.text'}) { $dismsg=$env{'form.text'}; } if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; } + if ($hasfloat) { + $r->print($broadcast_js.'
'); + $onsubmit = ' onsubmit="javascript:courseRecipients();" '; + } $r->print( '
'."\n". - ''."\n"); - if ($broadcast eq 'group' && $env{'form.group'} ne '') { - $can_grp_broadcast = - &Apache::lonnet::allowed('sgb',$env{'request.course.id'}.'/'. - $group); - $viewgrps = - &Apache::lonnet::allowed('vcg',$env{'request.course.id'}. - ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); - $editgrps = - &Apache::lonnet::allowed('mdg',$env{'request.course.id'}. - ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); - if ($viewgrps || $editgrps || $can_grp_broadcast) { - $r->print(&disgroup($cdom,$cnum,$group,$viewgrps,$editgrps)); - } - } - $r->print(''); - if (($broadcast eq 'group') && ($group ne '') && - (!$can_grp_broadcast && !$viewgrps && !$editgrps)) { + ' enctype="multipart/form-data"'.$onsubmit.'>'."\n". + ''."\n". + '
'); + if (($broadcast eq 'group') && ($group ne '') && (!$can_grp_broadcast)) { $r->print(&recipient_input_row($cdom,%lt)); - } + } if (($broadcast ne 'group') && ($broadcast ne 'upload')) { if ($replying) { if ($content{'noreplies'}) { $r->print('
'.&mt('This message was designated by the sender not to allow replies.').'
'); return; } - $r->print(''.&mt('Replying to').' '); + $r->print(''.&mt('Replying to').' '); if ($content{'replytoaddr'}) { my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'}); if ($replytoname ne '' && $replytodom ne '') { @@ -1356,9 +1456,31 @@ ENDREPSCRIPT $content{'senderdomain'}.'" />'); } if ($content{'recipid'}) { - my @ccs = &retrieve_cc_recips('replying',%content); - if (@ccs > 0) { - my $replyall = qq| + my %recips; + &retrieve_recips('replying',\%content,\%recips); + if (ref($recips{'to'}) eq 'ARRAY') { + if (@{$recips{'to'}} > 0) { + my $replyall; + if (@{$recips{'to'}} > 1) { + $replyall = qq| + + +    + + +|; + } + my $tolist = join(' ',@{$recips{'to'}}); + $r->print('
'.&mt('[_1]Send reply[_2] to other recipients','','').':
'.$replyall.'
'.$tolist.'
'); + } + } + if (ref($recips{'cc'}) eq 'ARRAY') { + if (@{$recips{'cc'}} > 0) { + my $replyall; + if (@{$recips{'cc'}} > 1) { + $replyall = qq| @@ -1367,15 +1489,40 @@ ENDREPSCRIPT onclick="javascript:uncheckAll(document.compemail.replying_cc)" /> |; - my $cclist = join(' ',@ccs); - $r->print(''.&mt('Reply to other recipients').':
'.$replyall.''.$cclist.''); + } + my $cclist = join(' ',@{$recips{'cc'}}); + $r->print('
'.&mt('[_1]Cc[_2] to other copied recipients','','').':
'.$replyall.'
'.$cclist.'
'); + } + } + if ($content{'group'} ne '') { + if (&check_group_priv($content{'group'})) { + if (ref($recips{'group_cc_broadcast'}) eq 'ARRAY') { + if (@{$recips{'group_cc_broadcast'}} > 0) { + my $replyall; + if (@{$recips{'group_cc_broadcast'}} > 1) { + $replyall = qq| + + +    + + +|; + } + my $groupcclist = join(' ',@{$recips{'group_cc_broadcast'}}); + $r->print('
'.&mt('[_1]Cc[_2] to other copied group members','','').':
'.$replyall.'
'.$groupcclist.'
'); + } + } + } } } } else { $r->print(&recipient_input_row($defdom,%lt)); } } - my $latexHelp = Apache::loncommon::helpLatexCheatsheet(); + my $latexHelp = &Apache::loncommon::helpLatexCheatsheet(); + my $wysiwyglink=&Apache::lonhtmlcommon::htmlareaselectactive('message').'
'; my $subj_size; if ($multiforward) { $r->print(&additional_rec_row(\%lt)); @@ -1383,7 +1530,7 @@ ENDREPSCRIPT &mt('Unless you choose otherwise:').''); - $func=&mt('Forward'); + $func1='Forward'; # do not translate here! $dissub = &mt('Forwarding').': '; $subj_size = '10'; my $extra = '<'.&mt('original subject').'>   '. @@ -1393,16 +1540,17 @@ ENDREPSCRIPT $r->print(&msg_subject_row($dissub,\%lt,$subj_size,$extra)); $r->print(''.&mt('Message begins with:').' '.$sender.'   '.&mt('Yes').' '.&mt('No').' -
'. -$latexHelp. -&mt("Any new text to display before the text of the original messages:").'
-


'); +
+
'."\n". +$latexHelp."
\n". +&mt("Any new text to display before the text of the original messages:").'
'."\n". +''. +$wysiwyglink); my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark'); foreach my $msg (@to_forward) { $r->print(''); } - $r->print(&submit_button_row($folder,$dismode,$func.' '.$lt{'msg'}, + $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'msg'}), \%lt)); } elsif ($broadcast ne 'upload') { $subj_size = '50'; @@ -1414,15 +1562,17 @@ $latexHelp. } $r->print(&msg_subject_row($dissub,\%lt,$subj_size)); $r->print(<<"ENDCOMP"); -
+$attachrow +
$latexHelp


+$wysiwyglink +$sendmode $dispcrit $disbase ENDCOMP - $r->print(&submit_button_row($folder,$dismode,$func.' '.$lt{'ma'}, - \%lt)); + $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'ma'}), + \%lt,$hasfloat,$group)); $r->print($citation); if (exists($env{'form.ref'})) { $r->print('

$lt{'gmt'}:

+$wysiwyglink

$lt{'tff'}: ENDBLOCK @@ -1463,22 +1613,30 @@ $dispcrit

ENDUPLOAD } - if ($broadcast eq 'group') { - if ($group eq '') { - my $studentsel = &discourse(); - $r->print($studentsel); - } - } if ($env{'form.displayedcrit'}) { $r->print(''); } - $r->print(''. - &Apache::lonfeedback::generate_preview_button('compemail','message'). - &Apache::lonhtmlcommon::htmlareaselectactive('message')); + $r->print(''); + if ($hasfloat) { + $r->print('
'); + } + $r->print(&generate_preview_form); +} + +sub check_group_priv { + my ($group) = @_; + my $cid = $env{'request.course.id'}; + my $sec = $env{'request.course.sec'}; + return if !$cid; + my $can_broadcast = &Apache::lonnet::allowed('sgb',$cid.'/'.$group); + my $viewgrps = &Apache::lonnet::allowed('vcg',$cid.($sec?'/'.$sec:'')); + my $editgrps = &Apache::lonnet::allowed('mdg',$cid.($sec?'/'.$sec:'')); + if ($viewgrps || $editgrps || $can_broadcast) { + return 1; + } + return; } -# ---------------------------------------------------- Display all face to face - sub recipient_input_row { my ($dom,%lt) = @_; my $domform = &Apache::loncommon::select_dom_form($dom,'recdomain'); @@ -1486,7 +1644,7 @@ sub recipient_input_row { &Apache::loncommon::selectstudent_link('compemail','recuname', 'recdomain'); my $output = <<"ENDREC"; -$lt{'us'}:  $lt{'do'}: $domform  $selectlink +$lt{'to'} $lt{'us'}:  $lt{'do'}: $domform  $selectlink ENDREC return $output; } @@ -1496,7 +1654,7 @@ sub reply_to_row { my $radioyes = &mt('Yes'); my $radiono = &mt('No'); my $output = <<"ENDREP"; -$lt->{'ar'}:      $lt->{'rt'}:  +$lt->{'ar'}:      $lt->{'rt'}:  ENDREP return $output; } @@ -1504,35 +1662,59 @@ ENDREP sub additional_rec_row { my ($lt) = @_; my $cc = &mt('Cc:'); - my $bcc = &mt('Bcc:'); + my $bcc = &mt('Bcc:'); + my $exmpl = &mt('username:domain,username:domain,...'); my $output = <<"ENDADD"; -$lt->{'ad'} :
username:domain,username:domain, ... - $cc -
-$bcc +
$lt->{'ad'} ($exmpl): + + +
 $lt->{'to'}
 $cc
 $bcc
ENDADD return $output; } sub submit_button_row { - my ($folder,$dismode,$sendtext,$lt) = @_; - my $output = qq| + my ($folder,$dismode,$sendtext,$lt,$is_crsform,$group) = @_; + my $pre=&mt("Show Preview and Check Spelling"); + my $value=&mt('Send'); + my $prevbutton = ''; + my $output = qq| - - -
+|; + if ($is_crsform) { + $output .= ''."\n"; + if ($group ne '') { + $output .= ''."\n"; + } + } + $output .= qq| +
+ + + $prevbutton
|; return $output; } sub msg_subject_row { my ($dissub,$lt,$subj_size,$extra) = @_; - my $output = ''.$lt->{'sb'}.': '.$lt->{'sb'}.''.$extra. ''; return $output; } +sub generate_preview_form { + my $prevbutton = (< + + + +ENDPREVIEW +} + +# ---------------------------------------------------- Display all face to face + sub retrieve_instructor_comments { my ($user,$domain)=@_; my $target=$env{'form.grade_target'}; @@ -2054,7 +2236,6 @@ sub displaymessage { my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]); my %content=&Apache::lonmsg::unpackagemsg($message{$msgid}); my $counter=0; - $r->print('
');
     my $escmsgid=&escape($msgid);
     foreach (@messages) {
 	if ($_->[5] eq $escmsgid){
@@ -2062,7 +2243,6 @@ sub displaymessage {
 	}
 	$counter++;
     }
-    $r->print('
'); my $see_anonymous; my $from_student = 0; @@ -2113,34 +2293,57 @@ sub displaymessage { $symb=&Apache::lonnet::symbread($content{'baseurl'}); } if ($env{'user.adv'}) { - my $adv_actions; - $r->print(''); + my $actionlist=''; if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) { - $r->print(''); - } + $actionlist.=''; + } if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) && $symb) { - $r->print(''); + $actionlist.=''; } if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'}) && $symb) { - $r->print(''); - } - $r->print('
'.&mt('Currently available actions (will open extra window)').':'.&Apache::loncommon::track_student_link(&mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check').'' + .&Apache::loncommon::track_student_link( + &mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check') + .''.&Apache::loncommon::pprmlink(&mt('Set/Change parameters'),$content{'sendername'},$content{'senderdomain'},$symb,'check').'' + .&Apache::loncommon::pprmlink( + &mt('Set/Change parameters'),$content{'sendername'},$content{'senderdomain'},$symb,'check') + .''.&Apache::loncommon::pgrdlink(&mt('Set/Change grades'),$content{'sendername'},$content{'senderdomain'},$symb,'check').'
'); + $actionlist.='' + .&Apache::loncommon::pgrdlink( + &mt('Set/Change grades'),$content{'sendername'},$content{'senderdomain'},$symb,'check') + .''; + } + if ($actionlist) { + $r->print('' + .'' + .$actionlist + .'
' + .&mt('Currently available actions (will open extra window):') + .'
'); + } + } + my ($tonum,$tolist,$cclist,$bcclist,$groupcclist,%recipients); + if ($content{'recipid'}) { + $tonum = &retrieve_recips('display',\%content,\%recipients); + if (ref($recipients{'cc'}) eq 'ARRAY') { + $cclist = join(', ',@{$recipients{'cc'}}); + } + if (ref($recipients{'to'}) eq 'ARRAY') { + $tolist = join(', ',@{$recipients{'to'}}); + } + if (ref($recipients{'bcc'}) eq 'ARRAY') { + $bcclist = join(', ',@{$recipients{'bcc'}}); + } } - my ($tolist,$cclist); - my (@recipients,@ccs); - if (ref($content{'recuser'}) eq 'ARRAY') { + if (!$tolist && ref($content{'recuser'}) eq 'ARRAY') { + my @recipients; for (my $i=0; $i<@{$content{'recuser'}}; $i++) { $recipients[$i] = &Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($content{'recuser'}[$i], $content{'recdomain'}[$i]), $content{'recuser'}[$i],$content{'recdomain'}[$i]). - ' ('.$content{'recuser'}[$i].' '.&mt('at').' '.$content{'recdomain'}[$i].') '; + ' ('.$content{'recuser'}[$i].':'.$content{'recdomain'}[$i].') '; } - } - $tolist = join(', ',@recipients); - if ($content{'recipid'}) { - @ccs = &retrieve_cc_recips('display',%content); - $cclist = join(', ',@ccs); + $tolist = join(', ',@recipients); } my ($restitle,$baseurl,$refers_to); if (defined($content{'resource_title'})) { @@ -2157,46 +2360,144 @@ sub displaymessage { $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'})); } - $r->print('
'.&mt('Subject').': '.$content{'subject'}); + my $broadcast_link; + if (($content{'courseid'}) && ($content{'recipid'} && + (ref($recipients{'course_broadcast'}) eq 'ARRAY') || + (ref($recipients{'group_cc_broadcast'}) eq 'ARRAY') || + (ref($recipients{'group_bcc_broadcast'}) eq 'ARRAY'))) { + $broadcast_link = &recipients_link($r,\%content,\%recipients); + } + + # Display LON-CAPA Message (Start) + # Subject + $r->print('
' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title(&mt('Subject')) + .$content{'subject'} + .&Apache::lonhtmlcommon::row_closure() + ); if ($folder eq 'sent') { - $r->print('
'.&mt('To').': '.$tolist); + # To + $r->print(&Apache::lonhtmlcommon::row_title(&mt('To')) + .$tolist + .&Apache::lonhtmlcommon::row_closure() + ); + if ($cclist) { + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc')) + .$cclist + .&Apache::lonhtmlcommon::row_closure() + ); + } + if ($bcclist) { + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Bcc')) + .$bcclist + .&Apache::lonhtmlcommon::row_closure() + ); + } + if (($content{'courseid'}) && ($content{'recipid'})) { + my %broadcast_types = + &Apache::lonlocal::texthash ( + course_broadcast => 'Broadcast to', + group_cc_broadcast => 'Cc to group', + group_bcc_broadcast => 'Bcc to group', + ); + foreach my $type (sort(keys(%broadcast_types))) { + if (ref($recipients{$type}) eq 'ARRAY') { + my $num = @{$recipients{$type}}; + my $broadcastlist = join(', ',@{$recipients{$type}}); + if ($broadcastlist && $broadcast_link) { + if ($type eq 'group_cc_broadcast') { + $groupcclist = $broadcastlist; + } + $r->print(&Apache::lonhtmlcommon::row_title( + $broadcast_types{$type}) + .&mt('[quant,_1,recipient]',$num) + .' [' + .&mt('Show').']' + .&Apache::lonhtmlcommon::row_closure()); + } + } + } + } if ($content{'replytoaddr'}) { my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'}); if ($replytoname ne '' && $replytodom ne '') { - $r->print('
'.&mt('Reply To').': '. - $replytoname.' '.&mt('at').' '.$replytodom); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Reply To')) + .$replytoname.':'.$replytodom + .&Apache::lonhtmlcommon::row_closure() + ); } } } else { - $r->print('
'.&mt('From').': '. - &Apache::loncommon::aboutmewrapper( - &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), - $content{'sendername'},$content{'senderdomain'})); + # From, Reply + $r->print(&Apache::lonhtmlcommon::row_title(&mt('From')) + .&Apache::loncommon::aboutmewrapper( + &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), + $content{'sendername'},$content{'senderdomain'}) + ); if ($content{'noreplies'}) { - $r->print(' ('.&mt('No replies to sender').')'); + $r->print(' ('.&mt('No replies to sender').')' + .&Apache::lonhtmlcommon::row_closure() + ); } else { if ($content{'replytoaddr'}) { my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'}); if ($replytoname ne '' && $replytodom ne '') { - $r->print('
'.&mt('Reply To').': '. - $replytoname.' '.&mt('at').' '.$replytodom); + $r->print(&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('Reply To')) + .$replytoname.':'.$replytodom + .&Apache::lonhtmlcommon::row_closure() + ); + } else { + $r->print(&Apache::lonhtmlcommon::row_closure()); } } else { - $r->print(' ('.$content{'sendername'}.' '.&mt('at').' '. - $content{'senderdomain'}.') '); - } - if ($cclist) { - $r->print('
'.&mt('Cc').': '.$cclist); + $r->print(' ('.$content{'sendername'}.':'.$content{'senderdomain'}.') ' + .&Apache::lonhtmlcommon::row_closure() + ); + } + if ($tonum && $tolist) { + $r->print(&Apache::lonhtmlcommon::row_title(&mt('To')) + .$tolist + .&Apache::lonhtmlcommon::row_closure() + ); + } + if ($cclist) { + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc')) + .$cclist + .&Apache::lonhtmlcommon::row_closure() + ); + } + if ($content{'group'} ne '') { + if (&check_group_priv($content{'group'})) { + $groupcclist = join(', ',@{$recipients{'group_cc_broadcast'}}); + if ($groupcclist) { + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group Cc')) + .$groupcclist + .&Apache::lonhtmlcommon::row_closure() + ); + } + } } - } + } } + + # Course if ($content{'courseid'}) { - $r->print('
'.&mt($crstype).': '.$courseinfo{'description'}); + $r->print(&Apache::lonhtmlcommon::row_title(&mt($crstype)) + .$courseinfo{'description'} + ); if ($content{'coursesec'}) { $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')'); } + $r->print(&Apache::lonhtmlcommon::row_closure()); } - $r->print('
'.&mt('Time').': '.$content{'time'}); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Time')) + .$content{'time'} + .&Apache::lonhtmlcommon::row_closure() + ); + + # Refers to if ($baseurl) { if (defined($content{'courseid'}) && defined($env{'request.course.id'})) { if ($content{'courseid'} eq $env{'request.course.id'}) { @@ -2214,7 +2515,10 @@ sub displaymessage { if ($encrypturl =~ /^yes$/i && !$env{'request.role.adv'}) { $showurl = $baseurl; } - $r->print('
'.&mt('Refers to').': '.$restitle.''); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to')) + .''.$restitle.'' + .&Apache::lonhtmlcommon::row_closure() + ); $refers_to = 1; } } @@ -2227,58 +2531,167 @@ sub displaymessage { $content{'courseid'}); if ($unencurl ne '') { if (&Apache::lonnet::allowed('bre',$unencurl)) { - $r->print('
'.&mt('Refers to'). - ': '. - $restitle.''); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to')) + .''.$restitle.'' + .&Apache::lonhtmlcommon::row_closure() + ); } } } } } else { if (&Apache::lonnet::allowed('bre',$baseurl)) { - $r->print('
'.&mt('Refers to'). - ': '.$restitle.''); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to')) + .''.$restitle.'' + .&Apache::lonhtmlcommon::row_closure() + ); + } } } } - $r->print('

'.
-	      &Apache::lontexconvert::msgtexconverted($content{'message'},1).
-	      '

'.&displayresource(%content).'

'); + + # Message + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Message')) + .'
'
+	     .&Apache::lontexconvert::msgtexconverted($content{'message'},1)
+	     .'
' + ); + if (&displayresource(%content)) { + $r->print(&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('Resource Details')) + .&displayresource(%content) + ); + } + $r->print(&Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::end_pick_box()); + # Display LON-CAPA Message (End) return; } -sub retrieve_cc_recips { - my ($context,%content) = @_; - my %reciphash = - &Apache::lonnet::get('nohist_emailrecip',[$content{'recipid'}], - $content{'senderdomain'},$content{'sendername'}); - my $recipinfo = $reciphash{$content{'recipid'}}; - my @ccs; - if (ref($recipinfo) eq 'HASH') { - if (ref($recipinfo->{'cc'}) eq 'HASH') { - foreach my $cc (sort(keys(%{$recipinfo->{'cc'}}))) { - my ($ccname,$ccdom) = split(/:/,$cc); - if (!(($ccname eq $env{'user.name'}) && - ($ccdom eq $env{'user.domain'}))) { - my $showcc =''; - if ($context eq 'replying') { - $showcc = ''; - } - $showcc .= ''; - push(@ccs,$showcc); +sub retrieve_recips { + my ($context,$content,$recips)= @_; + my $tonum = 0; + if (ref($content) eq 'HASH') { + my %reciphash = + &Apache::lonnet::get('nohist_emailrecip',[$content->{'recipid'}], + $content->{'senderdomain'},$content->{'sendername'}); + my $recipinfo = $reciphash{$content->{'recipid'}}; + if (ref($recipinfo) eq 'HASH') { + foreach my $type ('to','cc','course_broadcast','group_cc_broadcast','group_bcc_broadcast') { + if (ref($recipinfo->{$type}) eq 'HASH') { + if ($type eq 'to') { + $tonum = keys(%{$recipinfo->{$type}}); + } + foreach my $user (sort(keys(%{$recipinfo->{$type}}))) { + my ($uname,$udom) = split(/:/,$user); + next if (($context eq 'replying') && ($uname eq $env{'user.name'}) + && ($udom eq $env{'user.domain'})); + my $showuser =''; + if ($context eq 'replying') { + if (($type eq 'to') || ($type eq 'cc')) { + $showuser = ''; + if (ref($recips) eq 'HASH') { + push(@{$recips->{$type}},$showuser); + } + } } } } } - return @ccs; + return $tonum; +} + +sub recipients_link { + my ($r,$content,$recipients) = @_; + my ($broadcast_link,$show); + if ((ref($content) eq 'HASH') && (ref($recipients) eq 'HASH')) { + if (ref($recipients->{'course_broadcast'}) eq 'ARRAY') { + if (@{$recipients->{'course_broadcast'}} > 0) { + $show = 'course'; + } + } elsif (ref($recipients->{'group_cc_broadcast'}) eq 'ARRAY') { + if (@{$recipients->{'group_cc_broadcast'}} > 0) { + $show = 'group_cc'; + } + } elsif (ref($recipients->{'group_bcc_broadcast'}) eq 'ARRAY') { + if (@{$recipients->{'group_bcc_broadcast'}} > 0) { + $show = 'group_bcc'; + } + } + if ($show) { + my ($nothing,$height,$width,$start_page,$end_page,$body); + $nothing=&Apache::lonhtmlcommon::javascript_nothing(); + $height = 400; + $width = 600; + my $start_page = + &Apache::loncommon::start_page('Broadcast List', undef, + {only_body => 1, + js_ready => 1,}); + my $end_page = &Apache::loncommon::end_page({js_ready => 1,}); + my $body = '

'.&mt("Recipients of broadcast message").'

'. + &Apache::loncommon::start_data_table(); + my $cell = 0; + $body .= &Apache::loncommon::start_data_table_row(); + foreach my $item (@{$recipients->{$show.'_broadcast'}}) { + $item =~ s/'/\\'/g; + if (!($cell%2) && $cell > 0) { + $body .= &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::start_data_table_row(); + } + $cell ++; + $body .= ''.$cell.' '.$item.'  '; + } + if ($cell%2) { + $body .= ' '; + } + $body .= &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); + $body =~ s{print(< +function showBroadcastList() { + var caller = this; + var newWindow = null; + try { + newWindow = window.open($nothing,"broadcast","HEIGHT=$height,WIDTH=$width,resizable=yes,scrollbars=yes" ); + } + catch(error) { + writeWin(caller); + return; + } + if (newWindow) { + caller = newWindow; + } + writeWin(caller); + return; +} + +function writeWin(caller) { + caller.document.writeln('$start_page $body $end_page'); + caller.document.close(); + caller.focus(); +} + + + +ENDJS + $broadcast_link = 1; + } + } + return $broadcast_link; } # =========================================================== Show the citation @@ -2390,6 +2803,8 @@ sub sendoffmail { my %msg_status; my $numsent = 0; my $nosentstore = 1; + my $attachmenturl; + my $now = time; my ($cdom,$cnum,$group); if (exists($env{'form.group'})) { $group = $env{'form.group'}; @@ -2412,10 +2827,13 @@ sub sendoffmail { if ($env{'form.forwid'}) { my $msgid=$env{'form.forwid'}; my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]); - %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1); + %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1,1); &statuschange($msgid,'forwarded',$folder); - $env{'form.message'}.="\n\n-- Forwarded message --\n\n". - $content{'message'}; + if ($content{'attachmenturl'} ne '') { + $attachmenturl = $content{'attachmenturl'}; + } + $env{'form.message'} .= "\n\n-- Forwarded message --\n\n". + $content{'message'}; } if ($env{'form.replyid'}) { my $msgid=$env{'form.replyid'}; @@ -2424,28 +2842,24 @@ sub sendoffmail { &statuschange($msgid,'replied',$folder); } - my @to = - &Apache::loncommon::get_env_multiple('form.selectedusers_forminput'); my $mode = $env{'form.sendmode'}; + my (%toaddr,$tos,$cc,$bcc,$broadcast); - my (%toaddr,$cc,$bcc); - if (@to) { - foreach my $dest (@to) { - my ($user,$domain) = split(/:/, $dest); - if (($user ne '') && ($domain ne '')) { - my $address = $user.":".$domain; # How the code below expects it. - $toaddr{$address} = ''; - } - } - } - - if ($env{'form.sendmode'} eq 'group') { - foreach my $address (keys(%env)) { - if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) { - $toaddr{$1}=''; - } - } - } elsif ($env{'form.sendmode'} eq 'upload') { + if ($mode eq 'group') { + if (defined($env{'form.courserecips'})) { + my $courseusers = $env{'form.courserecips'}; + $courseusers =~ s/^_\&\&\&_//; + my @to = split('_&&&_',$courseusers); + foreach my $dest (@to) { + my ($user,$domain) = split(/:/, $dest); + if (($user ne '') && ($domain ne '')) { + my $rec = $user.":".$domain; + $toaddr{$rec} = ''; + $broadcast->{$rec} = ''; + } + } + } + } elsif ($mode eq 'upload') { $nosentstore = 0; foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) { my ($rec,$txt) = ($line =~ /^([^:]+:[^:]+):(.*)$/); @@ -2453,40 +2867,81 @@ sub sendoffmail { $rec =~ s/^\s+//; $rec =~ s/\s+$//; $toaddr{$rec}.=$txt."\n"; + $broadcast->{$rec} = ''; } } } else { if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) { $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; - $cc->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; + $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}=''; } } + if ($env{'form.additionalrec_to'}) { + foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_to'})) { + my ($auname,$audom)=split(/:/,$rec); + if (($auname ne "") && ($audom ne "")) { + $toaddr{$auname.':'.$audom}=''; + $tos->{$auname.':'.$audom}=''; + } + } + } + if ($env{'form.replying_to'}) { + my @toreplies = + &Apache::loncommon::get_env_multiple('form.replying_to'); + foreach my $rec (@toreplies) { + my ($auname,$audom)=split(/:/,$rec); + if (($auname ne "") && ($audom ne "")) { + $toaddr{$auname.':'.$audom}=''; + $tos->{$auname.':'.$audom}=''; + } + } + } if ($env{'form.additionalrec_cc'}) { foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { $toaddr{$auname.':'.$audom}=''; - $cc->{$auname.':'.$audom}=''; + if (!defined($tos->{$auname.':'.$audom})) { + $cc->{$auname.':'.$audom}=''; + } } } } - if ($env{'form.additionalrec_bcc'}) { - foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) { + if ($env{'form.replying_cc'}) { + my @ccreplies = + &Apache::loncommon::get_env_multiple('form.replying_cc'); + foreach my $rec (@ccreplies) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { $toaddr{$auname.':'.$audom}=''; - $bcc->{$auname.':'.$audom}=''; + if (!defined($tos->{$auname.':'.$audom})) { + $cc->{$auname.':'.$audom}=''; + } } } } - if ($env{'form.replying_cc'}) { - my @ccreplies = - &Apache::loncommon::get_env_multiple('form.replying_cc'); - foreach my $rec (@ccreplies) { + if ($env{'form.replying_groupcc'}) { + my @groupreplies = + &Apache::loncommon::get_env_multiple('form.replying_groupcc'); + foreach my $rec (@groupreplies) { my ($auname,$audom)=split(/:/,$rec); if (($auname ne "") && ($audom ne "")) { $toaddr{$auname.':'.$audom}=''; - $cc->{$auname.':'.$audom}=''; + if (!defined($tos->{$auname.':'.$audom})) { + $broadcast->{$auname.':'.$audom}=''; + } + } + } + } + if ($env{'form.additionalrec_bcc'}) { + foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) { + my ($auname,$audom)=split(/:/,$rec); + if (($auname ne "") && ($audom ne "")) { + $toaddr{$auname.':'.$audom}=''; + if ((!defined($tos->{$auname.':'.$audom})) && + (!defined($cc->{$auname.':'.$audom}))) { + $bcc->{$auname.':'.$audom}=''; + } } } } @@ -2506,15 +2961,38 @@ sub sendoffmail { $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'}); } my %reciphash = ( + to => $tos, cc => $cc, bcc => $bcc, - ); + ); + if ($mode eq 'group') { + if ($group eq '') { + $reciphash{'course_broadcast'} = $broadcast; + } else { + if ($env{'form.groupmail'} eq 'cc') { + $reciphash{'group_cc_broadcast'} = $broadcast; + } else { + $reciphash{'group_bcc_broadcast'} = $broadcast; + } + } + } my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'}, $env{'user.domain'},\%reciphash); if ($recipstatus ne 'ok') { - &Apache::lonnet::logthis('Failed to store Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'}); - } + &Apache::lonnet::logthis('Failed to store To, Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'}); + } + if ($env{'form.attachment'}) { + if (length($env{'form.attachment'})<131072) { + $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback/'.$now); + } else { + $r->print('

'.&mt('Attachment not included - exceeded permitted length').'

'); + } + } elsif ($env{'form.multiforward'}) { + if ($env{'form.attachmenturl'} ne '') { + $attachmenturl = $env{'form.attachmenturl'}; + } + } my @recusers; my @recudoms; foreach my $address (sort(keys(%toaddr))) { @@ -2540,7 +3018,7 @@ sub sendoffmail { &Apache::lonmsg::user_normal_msg($recuname,$recdomain, $msgsubj,$msgtxt, $content{'citation'}, - undef,undef, + undef,$attachmenturl, $env{'form.permanent'}, \$sentmessage{$address}, undef,undef,undef, @@ -2557,23 +3035,35 @@ sub sendoffmail { my $subj_prefix; if ($numsent > 0) { if (($env{'request.course.id'}) && - (($env{'form.sendmode'} eq 'group') || + (($mode eq 'group') || ($env{'form.courserecord'}) || - ($msgtype eq 'critical'))) { + ($msgtype eq 'critical')) || + ($env{'form.replyid'} && + (($content{'courseid'} ne '') && + ($mode eq 'group')))) { if ($msgtype eq 'critical') { $subj_prefix = 'Critical.'; - } elsif ($env{'form.sendmode'} eq 'group') { + } elsif ($mode eq 'group') { $subj_prefix = 'Broadcast.'; } else { $subj_prefix = 'Archive'; } my ($specialmsgid,$specialresult); - my $course_str = &escape('['.$cnum.':'.$cdom.']'); - + my $course_str; + if ($env{'form.replyid'}) { + if ($content{'courseid'} ne '') { + my %crsdesc = + &Apache::lonnet::coursedescription($content{'courseid'}, + {'one_time' => 1}); + $course_str = &escape('['.$crsdesc{'num'}.':'.$crsdesc{'domain'}.']'); + } + } elsif ($env{'request.course.id'}) { + $course_str = &escape('['.$cnum.':'.$cdom.']'); + } $specialresult = &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom, $subj_prefix.' '.$course_str,$savemsg,undef,undef, - undef,undef,undef,\$specialmsgid,undef,undef,undef, + $attachmenturl,undef,undef,\$specialmsgid,undef,undef,undef, undef,undef,1); $specialmsgid = &unescape($specialmsgid); if ($specialresult eq 'ok') { @@ -2590,15 +3080,15 @@ sub sendoffmail { $pid); &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom, $subj_prefix.' ['.$recipient.']',$msgsubj, - undef,undef,undef,undef,$usermsgid,undef, + undef,undef,$attachmenturl,undef,$usermsgid,undef, undef,$specialmsgid,undef,undef,undef,1); } } - if (($env{'form.sendmode'} ne 'upload') && (@recusers > 0)) { + if (($mode ne 'upload') && (@recusers > 0)) { &Apache::lonmsg::process_sent_mail($msgsubj, $subj_prefix,$numsent,$stamp,$msgname,$msgdom, $msgcount,$context,$pid,$savemsg,\@recusers, - \@recudoms); + \@recudoms,undef,$attachmenturl,'','','','',$recipid); } } else { &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'); @@ -2610,7 +3100,8 @@ sub sendoffmail { &Apache::lonmsg::process_sent_mail($msgsubj,$subj_prefix, $numsent,$stamp,$env{'user.name'}, $env{'user.domain'},$msgcount,$context, - $$,$savemsg,\@recusers,\@recudoms); + $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl, + '','','','',$recipid); } } if (!$env{'form.multiforward'}) { @@ -2627,7 +3118,7 @@ sub sendoffmail { } } else { $r->print('

'.&mt('Could not deliver message').' '. - &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'

'); + &mt('Please use the browser "Back" button and correct the recipient addresses ([_1]).',$sendstatus).'

'); } } } @@ -2862,7 +3353,7 @@ sub handler { foreach my $item (@to_forward) { my $msgid=&unescape($item); my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]); - my %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1); + my %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1,1); if ($env{'form.showorigsubj'}) { $env{'form.subject'} = $fixed_subj.$content{'subject'}; } else { @@ -2876,8 +3367,10 @@ sub handler { &Apache::loncommon::plainname($uname,$udom).' ('. $uname.':'.$udom.')'; } - $env{'form.message'} .= "\n\n-- Forwarded message --\n\n". - $content{'message'}; + $env{'form.message'}.="\n\n-- Forwarded message --\n\n". + $content{'message'}; + $env{'form.attachmenturl'} = $content{'attachmenturl'}; + $env{'form.multiforwid'} = $item; $fwdcount ++; $r->print($fwdcount.': '); $sendresult{$msgid} = &sendoffmail($r,$folder); 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.