';
- $result .= $tmptext;
+ $result .= '';
+ if (ref($statushash) eq 'HASH') {
+ $statushash->{'future'} = 1;
+ }
+
}
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 => {},
@@ -577,9 +598,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};
@@ -593,71 +614,75 @@ sub disgroup {
push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
}
}
- $result .= &group_check_uncheck();
- $result .= '
'.
- '
';
+ $r->print(&group_check_uncheck());
foreach my $status (@statustypes) {
if (ref($numitems) eq 'HASH') {
if ((defined($$numitems{$status})) && ($$numitems{$status})) {
- $result.='
ENDREC
return $output;
}
@@ -1521,7 +1673,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;
}
@@ -1532,33 +1684,56 @@ sub additional_rec_row {
my $bcc = &mt('Bcc:');
my $exmpl = &mt('username:domain,username:domain,...');
my $output = <<"ENDADD";
-
$lt->{'ad'} : ($exmpl)
-
$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'};
@@ -1658,7 +1833,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 {
@@ -1978,7 +2153,7 @@ END
foreach my $block (@{$typeorder}) {
my $blockstatus = '';
if ($blocks->{$block} eq 'on') {
- $blockstatus = 'checked="true"';
+ $blockstatus = 'checked="checked"';
}
$r->print(' ');
}
@@ -2045,7 +2220,7 @@ END
sub blocktype_text {
my %types = &Apache::lonlocal::texthash(
'com' => 'Messaging',
- 'chat' => 'Chat',
+ 'chat' => 'Chat Room',
'boards' => 'Discussion',
'port' => 'Portfolio',
'groups' => 'Groups',
@@ -2080,7 +2255,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){
@@ -2088,7 +2262,6 @@ sub displaymessage {
}
$counter++;
}
- $r->print('
');
my $see_anonymous;
my $from_student = 0;
@@ -2109,29 +2282,51 @@ sub displaymessage {
# start output
&printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
-# Functions
- $r->print('
'.&mt('Functions').':
');
+
+# Prepare available functions
+ my @functionlist;
if (!$content{'noreplies'}) {
- $r->print('
';
+ }
+ $body .= &Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::end_data_table();
+ $body =~ s{}{<\\/}g;
+ $body =~ s{\n}{}g;
+ $r->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
@@ -2351,15 +2797,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
@@ -2455,28 +2900,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 =~ /^([^:]+:[^:]+):(.*)$/);
@@ -2484,40 +2925,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}='';
+ 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}='';
- $cc->{$auname.':'.$audom}='';
+ if ((!defined($tos->{$auname.':'.$audom})) &&
+ (!defined($cc->{$auname.':'.$audom}))) {
+ $bcc->{$auname.':'.$audom}='';
+ }
}
}
}
@@ -2537,14 +3019,26 @@ 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) {
@@ -2599,19 +3093,31 @@ 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,
@@ -2636,11 +3142,11 @@ sub sendoffmail {
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,undef,$attachmenturl);
+ \@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');
@@ -2652,7 +3158,8 @@ sub sendoffmail {
&Apache::lonmsg::process_sent_mail($msgsubj,$subj_prefix,
$numsent,$stamp,$env{'user.name'},
$env{'user.domain'},$msgcount,$context,
- $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl);
+ $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl,
+ '','','','',$recipid);
}
}
if (!$env{'form.multiforward'}) {
@@ -2668,7 +3175,7 @@ sub sendoffmail {
&Apache::loncommunicate::menu($r);
}
} else {
- $r->print('
'.&mt('Could not deliver message').' '.
+ $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).'
');
}
}
@@ -2972,7 +3479,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);
@@ -2987,7 +3494,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.' ');
@@ -3000,7 +3507,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;