'.&mt('Store message for re-use').
+ $disbase.=' '.&mt('Save message for re-use').
' '.
&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);
@@ -1318,6 +1327,22 @@ will be forwarded to the recipient(s) yo
' '.
' '.
'');
+ if ($content{'recipid'}) {
+ my @ccs = &retrieve_cc_recips('replying',%content);
+ if (@ccs > 0) {
+ my $replyall = qq|
+
+
+
+
+
+|;
+ my $cclist = join(' ',@ccs);
+ $r->print(''.&mt('Reply to other recipients').': '.$replyall.' '.$cclist.' ');
+ }
+ }
} else {
$r->print(&recipient_input_row($defdom,%lt));
}
@@ -1437,10 +1462,13 @@ ENDREC
sub additional_rec_row {
my ($lt) = @_;
+ my $cc = &mt('Cc:');
+ my $bcc = &mt('Bcc:');
my $output = <<"ENDADD";
-$lt->{'ad'}:username:domain,username:domain, ...
-
-
+$lt->{'ad'} :username:domain,username:domain, ...
+ $cc
+
+$bcc
ENDADD
return $output;
}
@@ -1680,8 +1708,8 @@ sub examblock {
'cbds' => 'Communication blocking during scheduled exams',
'desc' => "You can use communication blocking to prevent $usertype enrolled in this course from displaying LON-CAPA messages sent by other $usertype during an online exam. As blocking of communication could potentially interrupt legitimate communication between $usertype who are also both enrolled in a different LON-CAPA course, please be careful that you select the correct start and end times for your scheduled exam when setting or modifying these parameters.",
'mecb' => 'Modify existing communication blocking periods',
- 'ncbc' => 'No communication blocks currently stored',
- 'stor' => 'Store',
+ 'ncbc' => 'No communication blocks currently saved',
+ 'stor' => 'Save',
);
my %ltext = &Apache::lonlocal::texthash(
@@ -1984,7 +2012,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);
@@ -2039,16 +2066,22 @@ sub displaymessage {
}
$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],
+ my ($tolist,$cclist);
+ my (@recipients,@ccs);
+ if (ref($content{'recuser'}) eq 'ARRAY') {
+ 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].' at '.$content{'recdomain'}[$i].') ';
+ }
}
$tolist = join(', ',@recipients);
+ if ($content{'recipid'}) {
+ @ccs = &retrieve_cc_recips('display',%content);
+ $cclist = join(', ',@ccs);
+ }
my ($restitle,$baseurl,$refers_to);
if (defined($content{'resource_title'})) {
$restitle = $content{'resource_title'};
@@ -2061,17 +2094,27 @@ sub displaymessage {
$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').': '.
+ $r->print(''.&mt('Subject').': '.$content{'subject'});
+ if ($folder eq 'sent') {
+ $r->print(''.&mt('To').': '.$tolist);
+ } else {
+ $r->print(''.&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'});
+ $content{'senderdomain'}.') ');
+ if ($cclist) {
+ $r->print(''.&mt('Cc').': '.$cclist);
+ }
+ }
+ if ($content{'courseid'}) {
+ $r->print(''.&mt($crstype).': '.$courseinfo{'description'});
+ if ($content{'coursesec'}) {
+ $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')');
+ }
+ }
+ $r->print(''.&mt('Time').': '.$content{'time'});
if ($baseurl) {
if (defined($content{'courseid'}) && defined($env{'request.course.id'})) {
if ($content{'courseid'} eq $env{'request.course.id'}) {
@@ -2124,6 +2167,34 @@ sub displaymessage {
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 .= &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($ccname,
+ $ccdom),$ccname,$ccdom).' ';
+ push (@ccs,$showcc);
+ }
+ }
+ }
+ }
+ return @ccs;
+}
+
# =========================================================== Show the citation
sub displayresource {
@@ -2208,10 +2279,10 @@ sub storedcommentlisting {
my ($r)=@_;
my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef,
'^'.&escape(&escape($env{'form.showcommentbaseurl'})));
- $r->print(&Apache::loncommon::start_page('Stored Comment Listing',undef,
+ $r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef,
{'onlybody' => 1}));
if ((keys %msgs)[0]=~/^error\:/) {
- $r->print(&mt('No stored comments yet.'));
+ $r->print(&mt('No saved comments yet.'));
} else {
my $found=0;
foreach my $key (sort(keys(%msgs))) {
@@ -2219,7 +2290,7 @@ sub storedcommentlisting {
$found=1;
}
unless ($found) {
- $r->print(&mt('No stored comments yet for this resource.'));
+ $r->print(&mt('No saved comments yet for this resource.'));
}
}
}
@@ -2271,7 +2342,7 @@ sub sendoffmail {
&Apache::loncommon::get_env_multiple('form.selectedusers_forminput');
my $mode = $env{'form.sendmode'};
- my %toaddr;
+ my (%toaddr,$cc,$bcc);
if (@to) {
foreach my $dest (@to) {
my ($user,$domain) = split(/:/, $dest);
@@ -2301,17 +2372,38 @@ sub sendoffmail {
} else {
if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
$toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+ $cc->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
}
}
- if ($env{'form.additionalrec'}) {
- foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec'})) {
+ 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}='';
+ $cc->{$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}='';
+ $bcc->{$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}='';
+ $cc->{$auname.':'.$audom}='';
+ }
+ }
+ }
my $savemsg;
my $msgtype;
my %sentmessage;
@@ -2327,12 +2419,24 @@ sub sendoffmail {
} else {
$savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
}
+ my %reciphash = (
+ cc => $cc,
+ bcc => $bcc,
+ );
+ 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'});
+ }
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,7 +2447,7 @@ sub sendoffmail {
$env{'form.sendbck'},
$env{'form.permanent'},
\$sentmessage{$address},
- $nosentstore);
+ $nosentstore,$recipid);
} else {
$r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
@thismsg=
@@ -2354,7 +2458,7 @@ sub sendoffmail {
$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)/) {