--- loncom/interface/lonmsgdisplay.pm 2007/05/02 01:33:49 1.72
+++ loncom/interface/lonmsgdisplay.pm 2009/07/25 23:16:04 1.128
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging display
#
-# $Id: lonmsgdisplay.pm,v 1.72 2007/05/02 01:33:49 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.128 2009/07/25 23:16:04 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -136,6 +136,9 @@ sub folderlist {
);
+ # set se lastvisit for the new mail check in the toplevel menu
+ &Apache::lonnet::appenv({'user.mailcheck.lastvisit'=>time});
+
my %actions = &Apache::lonlocal::texthash(
view => 'View Folder',
rename => 'Rename Folder',
@@ -170,6 +173,7 @@ sub folderlist {
$formhash{'select_form_order'} = ['','critical',@userorder,'sent','trash'];
my $output = qq||;
my %show = ('select_form_order' => [10,20,50,100,200],
map {$_=>$_} (10,20,50,100,200));
@@ -236,16 +241,16 @@ function folder_choice(targetform,caller
'.$lt{'actn'}.' '.
&Apache::loncommon::select_form('view','folderaction',%actions).'
'.
- '
+ '
@@ -292,11 +297,11 @@ sub scrollbuttons {
}
return
''.&mt('Page').' : '.
- ' '.
- ' '.
- ' of '.$maxdis.
- ' '.
- ' '.
+ ' '.
+ ' '.
+ ' / '.$maxdis.' '.
+ ' '.
+ ' '.
&mt('[_1] messages : showing messages [_2] through [_3] of [_4].',$status,$first,$finish,$total).'';
}
# =============================================================== Status Change
@@ -353,7 +358,7 @@ sub makefolder {
}
} else {
$outcome =
- &mt('Error - could not obtain lock on email folders record.');
+ &mt('Error - could not obtain lock on message folders record.');
}
return ($outcome,$warning);
}
@@ -390,6 +395,9 @@ sub renamefolder {
if ($env{'form.renamed'} eq '') {
return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is an invalid name.',$folder,$newname);
}
+ if (defined($permfolders{$folder})) {
+ return &mt('The folder "[_1]" may not be renamed as it is a folder provided by the system.',$folder);
+ }
if (defined($permfolders{$newname})) {
return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is reserved for folders provided automatically by the system.',$folder,$newname);
}
@@ -499,7 +507,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,
@@ -508,51 +517,89 @@ 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')
+ .' '
+ .' ';
+ 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')
+ .' '
+ .' ';
+ 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')
+ .' '
+ .' ';
+ 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 $result;
+ my ($r,$cdom,$cnum,$group,$access_status) = @_;
+ my $hasfloat;
# 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.');
- return $result;
+ $r->print(''.&mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.').' ');
+ return;
}
if ($cdom eq '' || $cnum eq '') {
- $result = &mt('Error: could not determine domain or number of course');
- return $result;
+ $r->print(''.&mt('Error: could not determine domain or number of course').' ');
+ return;
}
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'));
}
if (keys(%{$memberinfo}) == 0) {
- $result = &mt('As this group has no members, there are no '.
- 'recipients to select.');
- return $result;
+ $r->print(''.
+ &mt('As this group has no members, there are no recipients to select').
+ ' ');
+ return;
} else {
- $result = &mt('Select message recipients from the group members listed below. ');
+ $hasfloat = 1;
+ unless($env{'environment.wysiwygeditor'} eq 'on') {
+ $r->print('');
+ }
my %Sortby = (
active => {},
previous => {},
@@ -562,9 +609,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};
@@ -578,75 +625,82 @@ sub disgroup {
push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
}
}
- $result .= &group_check_uncheck();
- $result .= '
';
+ unless($env{'environment.wysiwygeditor'} eq 'on') {
+ $r->print('
');
+ }
}
- return $result;
+ return $hasfloat;
}
sub group_check_uncheck {
my $output = qq|
|;
}
@@ -688,13 +742,13 @@ sub groupmail_header {
{href=>"/adm/email?compose=group&group=".
"$env{'form.group'}&$refarg",
text=>"Send a Message in a Group",
- title=>"Compose Group Email Message"},);
+ title=>"Compose Group Message"},);
if ($action eq 'sending') {
&Apache::lonhtmlcommon::add_breadcrumb
({text=>"Messages being sent.",
- title=>"Messages sent"},);
+ title=>"E-mails sent"},);
}
- my $groupheader = &Apache::loncommon::start_page('Group Email');
+ my $groupheader = &Apache::loncommon::start_page('Group Message');
$groupheader .= &Apache::lonhtmlcommon::breadcrumbs
('Group - '.$env{'form.group'}.' Email');
return $groupheader;
@@ -708,7 +762,7 @@ sub groupmail_sent {
}
my $output .= ''.
- &mt('Send another group email').' '.' '.
+ &mt('Send another group message').''.' '.
''. &mt('Return to group page').' ';
return $output;
@@ -718,28 +772,59 @@ sub groupmail_sent {
sub discrit {
my $r=shift;
- my $header = ''.&mt('Critical Messages').' '.
- '');
+ $r->print(' ');
if ($numblocked > 0) {
$r->print(&blocked_in_folder($numblocked,$startblock,$endblock,
\%setters));
@@ -1187,8 +1264,9 @@ sub compout {
&printheader($r,'/adm/email?compose=multiforward',
'Forwarding Multiple Messages');
if ($multiforward > 1) {
- $r->print(&mt('Each of the [quant,_1,message] you checked
-will be forwarded to the recipient(s) you select below.',$multiforward).' ');
+ $r->print(&mt('Each of the [quant,_1,message] you checked'
+ .' will be forwarded to the recipient(s) you select below.',$multiforward)
+ .' ');
} else {
$r->print(&mt('The message you checked will be forwarded to the recipient(s) you select below.').' ');
}
@@ -1202,54 +1280,126 @@ will be forwarded to the recipient(s) yo
my $dissub='';
my $dismsg='';
my $disbase='';
- my $func=&mt('Send New');
+ my $attachrow;
+ my $func1='Send'; # do not translate here!
+ my %func2=( # do not translate here!
+ 'ma' => 'Message',
+ 'msg' => 'Messages',
+ );
my %lt=&Apache::lonlocal::texthash('us' => 'Username',
'do' => 'Domain',
'ad' => 'Additional Recipients',
+ 'rt' => 'Reply to',
+ 'ar' => 'Allow replies',
'sb' => 'Subject',
'ca' => 'Cancel',
- 'ma' => 'Mail',
- 'msg' => 'Messages',
'gen' => 'Generate messages from a file',
'gmt' => 'General message text',
'tff' => 'The file format for the uploaded portion of the message is',
'uas' => 'Upload and Send',
+ 'atta' => 'Attachment',
+ 'to' => 'To:',
);
+ my %attachmax = (
+ text => &mt('(128 KB max size)'),
+ num => 131072,
+ );
+ if (!$forwarding && !$multiforward) {
+ $attachrow = ''.$lt{'atta'}.' '.$attachmax{'text'}.': ';
+ }
if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
|| &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
$dispcrit=
- ' '.&mt('Send as critical message').' ' . $crithelp .
- '
'.
- ' '.&mt('Send as critical message').' ' .
- &mt('and return receipt') . ' ' . $crithelp .
- '
'.
-&mt('Send copy to permanent email address (if known)').'
'.
-' '.
- &mt('Include in course RSS newsfeed').'
';
+ ' '.&mt('Send as critical message').'. '.$crithelp.' '.&mt('Require return receipt?').' '.&mt('Yes').' '.&mt('No').' '.
+ ' '.
+&mt('Send copy to permanent e-mail address (if known)').' '.
+' '.
+ &mt('Include in course RSS newsfeed').' ';
}
if ($broadcast ne 'group') {
if (&Apache::lonnet::allowed('dff',$env{'request.course.id'}) ||
&Apache::lonnet::allowed('dff',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
- $dispcrit.=''.
+ $dispcrit.=''.
' '.
&mt("Include in course's 'User records' for recipient(s)").
- '
';
+ ' ';
}
}
my %message;
my %content;
+ my ($hasfloat,$broadcast_js,$sendmode,$can_grp_broadcast);
my $defdom=$env{'user.domain'};
+ if ($broadcast eq 'group') {
+ my %access_status = (
+ active => 0,
+ previous => 0,
+ future => 0,
+ );
+
+ if ($group eq '') {
+ my $studentsel = &discourse(\%access_status);
+ if ($studentsel) {
+ if ($env{'environment.wysiwygeditor'} eq 'on') {
+ $r->print($studentsel);
+ } else {
+ $r->print(''.$studentsel.'
');
+ }
+ $hasfloat = 1;
+ }
+ } else {
+ $can_grp_broadcast = &check_group_priv($group);
+ if ($can_grp_broadcast) {
+ $hasfloat = &disgroup($r,$cdom,$cnum,$group,\%access_status);
+ }
+ }
+ if ($hasfloat) {
+ $sendmode = ' '."\n";
+ $broadcast_js = 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').' '.
@@ -1263,7 +1413,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'};
@@ -1279,50 +1429,136 @@ will be forwarded to the recipient(s) yo
&mt('Show re-usable messages').' ';
}
}
+ my $jscript = &Apache::loncommon::check_uncheck_jscript();
+ $r->print(<<"ENDREPSCRIPT");
+
+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) {
+ if ($env{'environment.wysiwygeditor'} eq 'on') {
+ $r->print($broadcast_js);
+ } else {
+ $r->print($broadcast_js.'');
+ }
+ $onsubmit = ' onsubmit="javascript:courseRecipients();" ';
+ }
$r->print(
'
'.
- &Apache::lonfeedback::generate_preview_button('compemail','message').
- &Apache::lonhtmlcommon::htmlareaselectactive('message'));
+ $r->print('');
+ if ($hasfloat) {
+ unless($env{'environment.wysiwygeditor'} eq 'on') {
+ $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');
@@ -1428,42 +1682,77 @@ sub recipient_input_row {
&Apache::loncommon::selectstudent_link('compemail','recuname',
'recdomain');
my $output = <<"ENDREC";
-$lt{'us'}: $selectlink
-$lt{'do'}:
-$domform
+$lt{'to'} $lt{'us'}: $lt{'do'}: $domform $selectlink
ENDREC
return $output;
}
+sub reply_to_row {
+ my ($lt) = @_;
+ my $radioyes = &mt('Yes');
+ my $radiono = &mt('No');
+ my $output = <<"ENDREP";
+$lt->{'ar'} : $radioyes $radiono $lt->{'rt'}:
+ENDREP
+ return $output;
+}
+
sub additional_rec_row {
my ($lt) = @_;
+ my $cc = &mt('Cc:');
+ my $bcc = &mt('Bcc:');
+ my $exmpl = &mt('username:domain,username:domain,...');
my $output = <<"ENDADD";
-$lt->{'ad'}:username:domain,username:domain, ...
-
-
+$lt->{'ad'} ($exmpl)
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|
+
|;
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'};
@@ -1563,7 +1852,7 @@ $content{'sendername'}.':'.
}
# Check to see if there were any messages.
if ($result eq '') {
- my $lctype = lc(&Apache::loncommon::course_type());
+ my $lctype = &mt(lc(&Apache::loncommon::course_type()));
if ($target ne 'tex') {
$r->print("".&mt('No notes, face-to-face discussion records, critical messages, or broadcast messages in this [_1].',$lctype)."
");
} else {
@@ -1597,8 +1886,8 @@ sub facetoface {
return;
}
my $crstype = &Apache::loncommon::course_type();
- my $leaders = ($crstype eq 'Group') ? 'coordinators and leaders'
- : 'faculty and staff';
+ my $leaders = ($crstype eq 'Community') ? 'coordinators and leaders'
+ : 'faculty and staff';
&printheader($r,
'/adm/email?recordftf=query',
"User Notes, Face-to-Face, Critical Messages, Broadcast Messages, Archived Messages");
@@ -1620,21 +1909,23 @@ sub facetoface {
'subm' => 'Retrieve discussion and message records',
'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',
'post' => 'Post this Record');
- $r->print(<<"ENDTREC");
-$lt{'head'}
-
-
-
-
-ENDTREC
+
+ $r->print(''.$lt{'head'}.' '
+ .''
+ .' '
+ .&Apache::lonhtmlcommon::start_pick_box()
+ .&Apache::lonhtmlcommon::row_title($lt{'user'})
+ .' '
+ .' '.$stdbrws
+ .&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title($lt{'dom'})
+ .$domform
+ .&Apache::lonhtmlcommon::row_closure(1)
+ .&Apache::lonhtmlcommon::end_pick_box()
+ .' '
+ .' '
+ );
+
if (($stage ne 'query') &&
($env{'form.recdomain'}) && ($env{'form.recuname'})) {
chomp($env{'form.newrecord'});
@@ -1643,8 +1934,17 @@ ENDTREC
$env{'form.recuname'},
$env{'form.recdomain'});
}
- $r->print(''.&Apache::loncommon::plainname($env{'form.recuname'},
- $env{'form.recdomain'}).' ');
+ my $aboutmelink=&Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($env{'form.recuname'}
+ ,$env{'form.recdomain'})
+ ,$env{'form.recuname'},$env{'form.recdomain'});
+ $r->print(' '
+ .''
+ .&mt('Discussion and message records for [_1] ([_2])'
+ ,$aboutmelink
+ ,$env{'form.recuname'}.':'.$env{'form.recdomain'})
+ .''
+ );
&disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});
$r->print(<
@@ -1673,8 +1973,8 @@ sub examblock {
$r->print('Not allowed');
return;
}
- my $usertype = (&Apache::loncommon::course_type() eq 'Group') ? 'members'
- : 'students';
+ my $usertype = (&Apache::loncommon::course_type() eq 'Community') ? 'members'
+ : 'students';
my %lt=&Apache::lonlocal::texthash(
'comb' => 'Communication Blocking',
'cbds' => 'Communication blocking during scheduled exams',
@@ -1883,7 +2183,7 @@ END
foreach my $block (@{$typeorder}) {
my $blockstatus = '';
if ($blocks->{$block} eq 'on') {
- $blockstatus = 'checked="true"';
+ $blockstatus = 'checked="checked"';
}
$r->print(' '.$types->{$block}.' ');
}
@@ -1950,7 +2250,7 @@ END
sub blocktype_text {
my %types = &Apache::lonlocal::texthash(
'com' => 'Messaging',
- 'chat' => 'Chat',
+ 'chat' => 'Chat Room',
'boards' => 'Discussion',
'port' => 'Portfolio',
'groups' => 'Groups',
@@ -1984,9 +2284,7 @@ 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){
@@ -1994,61 +2292,149 @@ sub displaymessage {
}
$counter++;
}
- $r->print(' ');
+
+ 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('');
+
+# Prepare available actions
my $symb;
if (defined($content{'symb'})) {
$symb = $content{'symb'};
} elsif (defined($content{'baseurl'})) {
$symb=&Apache::lonnet::symbread($content{'baseurl'});
}
+ my @actionlist;
if ($env{'user.adv'}) {
- $r->print(''.&mt('Currently available actions (will open extra window)').': ');
+
if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
- $r->print(''.&Apache::loncommon::track_student_link(&mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check').' ');
- }
+ push(@actionlist,&Apache::loncommon::track_student_link(
+ &mt('View recent activity')
+ ,$content{'sendername'}
+ ,$content{'senderdomain'}
+ ,'check'));
+ }
if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) && $symb) {
- $r->print(''.&Apache::loncommon::pprmlink(&mt('Set/Change parameters'),$content{'sendername'},$content{'senderdomain'},$symb,'check').' ');
+ push(@actionlist,&Apache::loncommon::pprmlink(
+ &mt('Set/Change parameters')
+ ,$content{'sendername'}
+ ,$content{'senderdomain'}
+ ,$symb
+ ,'check'));
}
if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'}) && $symb) {
- $r->print(''.&Apache::loncommon::pgrdlink(&mt('Set/Change grades'),$content{'sendername'},$content{'senderdomain'},$symb,'check').' ');
+ push(@actionlist,&Apache::loncommon::pgrdlink(
+ &mt('Set/Change grades')
+ ,$content{'sendername'}
+ ,$content{'senderdomain'}
+ ,$symb
+ ,'check'));
}
- $r->print('
');
}
- my $tolist;
- my @recipients = ();
- for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
- $recipients[$i] = &Apache::loncommon::aboutmewrapper(
- &Apache::loncommon::plainname($content{'recuser'}[$i],
+
+# Print functionlist and actionlist in page header
+ my $functions='';
+
+ # Functionlist
+ $functions.=&Apache::lonhtmlcommon::start_funclist();
+ foreach my $item (@functionlist) {
+ $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
+ }
+ $functions .= &Apache::lonhtmlcommon::end_funclist();
+
+ # Actionlist
+ if (@actionlist) {
+ my $legendtext=&mt('Currently available actions (will open extra window)');
+ $functions.=&Apache::lonhtmlcommon::start_funclist($legendtext);
+ foreach my $item (@actionlist) {
+ $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
+ }
+ $functions.=&Apache::lonhtmlcommon::end_funclist();
+ }
+
+ $functions.='
';
+ $r->print(&Apache::loncommon::head_subbox($functions));
+
+
+ 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 $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);
+ }
+
+ if (((!$tolist) && (!$broadcast_link)) && 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].' at '.$content{'recdomain'}[$i].') ';
+ $content{'recuser'}[$i],$content{'recdomain'}[$i]).
+ ' ('.$content{'recuser'}[$i].':'.$content{'recdomain'}[$i].') ';
+ }
+ $tolist = join(', ',@recipients);
}
- $tolist = join(', ',@recipients);
my ($restitle,$baseurl,$refers_to);
if (defined($content{'resource_title'})) {
$restitle = $content{'resource_title'};
@@ -2060,18 +2446,143 @@ sub displaymessage {
if (defined($content{'baseurl'})) {
$baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});
}
- $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));
- $r->print(''.&mt('Subject').': '.$content{'subject'}.
- ($folder ne 'sent'?''.&mt('From').': '.
- &Apache::loncommon::aboutmewrapper(
- &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),
- $content{'sendername'},$content{'senderdomain'}).' ('.
- $content{'sendername'}.' at '.
- $content{'senderdomain'}.') ':''.&mt('To').': '.
- $tolist).
- ($content{'courseid'}?''.&mt($crstype).': '.$courseinfo{'description'}.
- ($content{'coursesec'}?' ('.&mt('Section').': '.$content{'coursesec'}.')':''):'').
- ''.&mt('Time').': '.$content{'time'});
+ $r->print(''
+ .&Apache::lonhtmlcommon::start_pick_box()
+ .&Apache::lonhtmlcommon::row_title(&mt('Subject'))
+ .$content{'subject'}
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ if ($folder eq 'sent') {
+ # To
+ if ($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 ($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(&Apache::lonhtmlcommon::row_title(&mt('Reply To'))
+ .$replytoname.':'.$replytodom
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ }
+ } else {
+ # 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').')'
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ } else {
+ if ($content{'replytoaddr'}) {
+ my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+ if ($replytoname ne '' && $replytodom ne '') {
+ $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'}.':'.$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(&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(&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'}) {
@@ -2089,7 +2600,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;
}
}
@@ -2102,28 +2616,170 @@ 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()
+ );
+
+ }
+ }
+ }
+ }
+
+ # 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_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 = ' ';
+ } elsif ($type eq 'group_cc_broadcast') {
+ $showuser = ' ';
+ }
+ }
+ $showuser .= &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($uname,
+ $udom),$uname,$udom);
+ if ($context eq 'replying') {
+ $showuser .=' ';
+ }
+ $showuser .= ' ';
+ if (ref($recips) eq 'HASH') {
+ push(@{$recips->{$type}},$showuser);
+ }
+ }
}
}
}
}
- $r->print('
'.
- &Apache::lontexconvert::msgtexconverted($content{'message'},1).
- ' '.&displayresource(%content).'');
+ 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;
+ $start_page =
+ &Apache::loncommon::start_page('Broadcast List', undef,
+ {only_body => 1,
+ js_ready => 1,});
+ $end_page = &Apache::loncommon::end_page({js_ready => 1,});
+ $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{}{<\\/}g;
+ $body =~ s{\n}{}g;
+ $r->print(<
+//
+
+
+ENDJS
+ $broadcast_link = 1;
+ }
+ }
+ return $broadcast_link;
+}
+
# =========================================================== Show the citation
sub displayresource {
@@ -2168,15 +2824,14 @@ sub displayresource {
sub header {
my ($r,$title,$baseurl)=@_;
-
my $extra = &Apache::loncommon::studentbrowser_javascript();
if ($baseurl) {
$extra .= " ";
}
- $r->print(&Apache::loncommon::start_page('Communication and Messages',
+ $r->print(&Apache::loncommon::start_page('Communication',
$extra));
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- (($title?$title:'Communication and Messages')));
+ (($title?$title:'Send and Receive Messages')));
}
# ---------------------------------------------------------------- Print header
@@ -2233,6 +2888,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'};
@@ -2255,10 +2912,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'};
@@ -2267,28 +2927,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;
- 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 =~ /^([^:]+:[^:]+):(.*)$/);
@@ -2296,22 +2952,84 @@ 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'}}='';
+ $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
}
}
- if ($env{'form.additionalrec'}) {
- foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec'})) {
+ 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}='';
+ $toaddr{$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) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ if (!defined($tos->{$auname.':'.$audom})) {
+ $cc->{$auname.':'.$audom}='';
+ }
+ }
+ }
+ }
+ 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}='';
+ 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}='';
+ }
+ }
+ }
+ }
my $savemsg;
my $msgtype;
my %sentmessage;
@@ -2327,12 +3045,47 @@ sub sendoffmail {
} else {
$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 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))) {
my ($recuname,$recdomain)=split(/\:/,$address);
my $msgtxt = $savemsg;
- if ($toaddr{$address}) { $msgtxt.=' '.$toaddr{$address}; }
+ if ($toaddr{$address}) {
+ $msgtxt.=' '.$toaddr{$address};
+ }
my @thismsg;
if ($msgtype eq 'critical') {
$r->print(&mt('Sending critical message').' '.
@@ -2343,18 +3096,18 @@ sub sendoffmail {
$env{'form.sendbck'},
$env{'form.permanent'},
\$sentmessage{$address},
- $nosentstore);
+ $nosentstore,$recipid);
} else {
$r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
@thismsg=
&Apache::lonmsg::user_normal_msg($recuname,$recdomain,
$msgsubj,$msgtxt,
$content{'citation'},
- undef,undef,
+ undef,$attachmenturl,
$env{'form.permanent'},
\$sentmessage{$address},
undef,undef,undef,
- $nosentstore);
+ $nosentstore,$recipid);
}
$msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {
@@ -2367,23 +3120,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') {
@@ -2400,18 +3165,18 @@ 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'}.' 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;
@@ -2420,7 +3185,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'}) {
@@ -2436,8 +3202,8 @@ sub sendoffmail {
&Apache::loncommunicate::menu($r);
}
} else {
- $r->print(''.&mt('Could not deliver message').' '.
- &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'
');
+ $r->print(''.&Apache::lonhtmlcommon::confirm_success(&mt('Could not deliver message'),1).' '.
+ &mt('Please use the browser "Back" button and correct the recipient addresses ([_1]).',$sendstatus).'
');
}
}
}
@@ -2463,7 +3229,7 @@ sub handler {
'recordftf','sortedby','block','folder','startdis','interdis',
'showcommentbaseurl','dismode','group','subject','text','ref',
'msgstatus']);
- $sqs='&sortedby='.$env{'form.sortedby'};
+ $sqs='&sortedby='.$env{'form.sortedby'};
# ------------------------------------------------------ They checked for email
unless ($env{'form.block'}) {
@@ -2484,7 +3250,7 @@ sub handler {
unless ($folder) {
$folder='';
} else {
- $sqs.='&folder='.&escape($folder);
+ $sqs.='&folder='.&escape($folder);
}
# ------------------------------------------------------------ Get Display Mode
@@ -2516,7 +3282,7 @@ sub handler {
$startdis++;
}
my $postedstartdis=$startdis+1;
- $sqs.='&startdis='.$postedstartdis;
+ $sqs.='&startdis='.$postedstartdis;
# --------------------------------------------------------------- Render Output
@@ -2528,16 +3294,19 @@ sub handler {
&printheader($r,'','Confirmed Receipt');
my $replying = 0;
foreach my $envkey (keys(%env)) {
- if ($envkey=~/^form\.rec\_(.*)$/) {
- $r->print(''.&mt('Confirming Receipt').': '.
- &Apache::lonmsg::user_crit_received($1).' ');
- }
- if ($envkey=~/^form\.reprec\_(.*)$/) {
- my $msgid=$1;
- $r->print(''.&mt('Confirming Receipt').': '.
- &Apache::lonmsg::user_crit_received($msgid).' ');
- &compout($r,'','','',$msgid);
- $replying = 1;
+ if ($envkey=~/^form\.(rep)?rec\_(.*)$/) {
+ my $repchk = $1;
+ my $msgid = $2;
+ $r->print(''.&mt('Confirming Receipt').': ');
+ my $result = &Apache::lonmsg::user_crit_received($msgid);
+ if ($result =~ /trans:\s+ok/) {
+ &statuschange($msgid,'read');
+ }
+ $r->print($result.' ');
+ if ($repchk eq 'rep') {
+ &compout($r,'','','',$msgid);
+ $replying = 1;
+ }
}
}
if (!$replying) {
@@ -2669,7 +3438,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 {
@@ -2683,8 +3452,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);
@@ -2735,7 +3506,7 @@ sub handler {
my $showfolder = $env{'form.newfolder'};
my ($makeresult,$warning) = &makefolder($env{'form.newfolder'});
if ($makeresult eq 'ok') {
- $r->print(&mt('Mail folder "[_1]" created.',$showfolder).' ');
+ $r->print(&mt('Folder "[_1]" created.',$showfolder).' ');
} else {
$r->print(&mt('Creation failed.').' '.$makeresult.' '.
$warning);
@@ -2750,7 +3521,7 @@ sub handler {
my $showfolder = '';
my $delresult = &deletefolder($folder);
if ($delresult eq 'ok') {
- $r->print(&mt('Mail folder "[_1]" deleted.',$folder).' ');
+ $r->print(&mt('Folder "[_1]" deleted.',$folder).' ');
$env{'form.folder'} = '';
} else {
$r->print(&mt('Deletion failed.').' '.$delresult.' ');
@@ -2763,7 +3534,7 @@ sub handler {
my $showfolder = $env{'form.renamed'};
my $renresult = &renamefolder($folder);
if ($renresult eq 'ok') {
- $r->print(&mt('Mail folder "[_1]" renamed "[_2]".',$folder,$showfolder).' ');
+ $r->print(&mt('Folder "[_1]" renamed to "[_2]".',$folder,$showfolder).' ');
} else {
$r->print(&mt('Renaming failed.').' '.$renresult.' ');
$showfolder = $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.