--- loncom/interface/lonmsgdisplay.pm 2007/12/08 00:25:14 1.83 +++ loncom/interface/lonmsgdisplay.pm 2025/01/29 09:11:10 1.202 @@ -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.202 2025/01/29 09:11:10 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -102,6 +102,8 @@ use HTML::TokeParser(); use Apache::Constants qw(:common); use Apache::loncommon(); use Apache::lonhtmlcommon(); +use Apache::longroup; +use Apache::lonnavmaps; use Apache::lontexconvert(); use HTML::Entities(); use Apache::lonlocal; @@ -109,32 +111,38 @@ use Apache::loncommunicate; use Apache::lonfeedback; use Apache::lonrss(); use Apache::lonselstudent(); +use Apache::lonenc(); use lib '/home/httpd/lib/perl/'; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); # Querystring component with sorting type -my $sqs; -my $startdis; +my $sqs=''; +my $startdis=''; # ============================================================ List all folders sub folderlist { my ($folder,$msgstatus) = @_; - my %lt = &Apache::lonlocal::texthash( + my %html_lt = &Apache::lonlocal::texthash( actn => 'Action', fold => 'Folder', show => 'Show', status => 'Message Status', go => 'Go', + + ); + &html_escape(\%html_lt); + my %js_lt = &Apache::lonlocal::texthash( nnff => 'New Name for Folder', newn => 'New Name', - thfm => 'The folder may not be renamed', - fmnb => 'folder may not be renamed as it is a folder provided by the system.', - asth => 'as this name is already in use for a system-provided or user-defined folder.', - the => 'The', - tnfm => 'The new folder may not be named', + fmnb => 'Folder may not be renamed as it is a folder provided by the system.', + asth => 'Requested name already in use for a system-provided or user-defined folder.', ); + &js_escape(\%js_lt); + + # 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', @@ -143,7 +151,7 @@ sub folderlist { ); $actions{'select_form_order'} = ['view','rename','delete']; - my %statushash = &get_msgstatus_types(); + my %statushash = &Apache::lonlocal::texthash(&get_msgstatus_types()); $statushash{'select_form_order'} = ['','new','read','replied','forwarded']; @@ -170,6 +178,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)); - - + $output .= '
':''); + ''; return $output; } @@ -261,19 +269,20 @@ sub get_permanent_folders { my %permfolders = &Apache::lonlocal::texthash('' => 'INBOX', 'trash' => 'TRASH', - 'critical' => 'Critical', - 'sent' => 'Sent Messages', + 'critical' => 'CRITICAL', + 'sent' => 'SENT MESSAGES', ); return %permfolders; } sub get_msgstatus_types { - my %statushash = &Apache::lonlocal::texthash( - '' => 'Any', - new => 'Unread', - read => 'Read', - replied => 'Replied to', - forwarded => 'Forwarded', + # Don't translate here! + my %statushash = ( + '' => 'Any', + 'new' => 'Unread', + 'read' => 'Read', + 'replied' => 'Replied to', + 'forwarded' => 'Forwarded', ); return %statushash; } @@ -286,18 +295,31 @@ sub scrollbuttons { my %statushash = &get_msgstatus_types(); my $status; if ($msgstatus eq '') { - $status = &mt('All'); + $status = 'All'; # Don't translate here! } else { $status = $statushash{$msgstatus}; } - return - ''.&mt('Page').': '. - ''. - ''. - ' of '.$maxdis. - ''. - '' + .''.&mt($status.' messages:').' ' + .&mt('showing messages [_1] through [_2] of [_3].', + $first,$finish,$total) + .'
' + .''; + + return $output; } # =============================================================== Status Change @@ -353,7 +375,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); } @@ -364,7 +386,7 @@ sub deletefolder { my ($folder)=@_; my %permfolders = &get_permanent_folders(); if (defined($permfolders{$folder})) { - return &mt('The folder "[_1]" may not be deleted',$folder); + return &mt('The folder "[_1]" may not be deleted.',$permfolders{$folder}); } my %userfolders = &Apache::lonmsg::get_user_folders(); if (!defined($userfolders{$folder})) { @@ -502,7 +524,9 @@ sub movemsg { # ======================================================= Display a course list sub discourse { - my $result; + my ($statushash) = @_; + my ($result,$active,$previous,$future); + my $crstype = &Apache::loncommon::course_type(); my ($course_personnel, $current_members, $expired_members, @@ -511,51 +535,106 @@ 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') + ) { + my $bcc_curr_hdr; + if ($crstype eq 'Community') { + $bcc_curr_hdr = &mt('Bcc: community participants with current access'); + } else { + $bcc_curr_hdr = &mt('Bcc: course members with current access'); + } + $result .= ''.
- ' '. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(); - $result .= " | $lt{'name'} | ". - "$lt{'usnm'} | ". - "$lt{'doma'} | ". - &Apache::loncommon::end_data_table_header_row(); + my $formname = $status.'users'; + if (ref($access_status) eq 'HASH') { + $access_status->{$status} = $$numitems{$status}; + } + $r->print(''; } - $result .= ' |
---|
'. + &mt('Sending of LON-CAPA messages is blocked for your current IP address: [_1].',$clientip).'
'. + '' . $crithelp . - '
'. - '' . $crithelp . - '
'. -''; + ''.$crithelp.' '.&mt('Require return receipt?').'+ + + | $prevbutton |
'. + '-ENDTREC + + $r->print(''. &Apache::lontexconvert::msgtexconverted($content{'message'}). ''; } # 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)."
"); + $r->print("".&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.')."
"); } else { - $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\'); + $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.').'}\\\\'); } + } elsif ($target eq 'tex') { + $r->print(&Apache::lonxml::xmlparse($r,$target,$result)); } else { - $r->print($result); + $r->print(''.$result.''); } } @@ -1666,8 +2047,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"); @@ -1689,21 +2070,24 @@ 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'}
-
'); my $escmsgid=&escape($msgid); foreach (@messages) { if ($_->[5] eq $escmsgid){ @@ -2062,7 +2159,6 @@ sub displaymessage { } $counter++; } - $r->print(''); my $see_anonymous; my $from_student = 0; @@ -2080,67 +2176,162 @@ sub displaymessage { my $number_of_messages = scalar(@messages); #subtract 1 for last index + my $head_extra; + +# if student's view of resource will be included +# get tag(s) for css file(s) in use, and pass to &header to include +# in call to loncommon::start_page() + + if (($env{'request.course.id'} eq $content{'courseid'}) && + (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) { + my $symb; + if (defined($content{'symb'})) { + $symb = $content{'symb'}; + } elsif (defined($content{'baseurl'})) { + $symb=&Apache::lonnet::symbread($content{'baseurl'}); + } + if ($symb) { + $head_extra = &Apache::loncommon::css_links($symb); + } + } + # 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').': | '); + &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','', + $content{'baseurl'},$head_extra); + +# Prepare available functions + my @functionlist; if (!$content{'noreplies'}) { - $r->print(''.&mt('Reply').' | '); - } - $r->print(''.&mt('Forward').' | '. - ''.&mt('Mark Unread').' | '. - ''.&mt('Delete').' | '. - ''.&mt('Back to Folder Display').' | '); + push(@functionlist,'' + .&mt('Reply') + .''); + } + push(@functionlist,'' + .&mt('Forward') + .''); + push(@functionlist,'' + .&mt('Mark Unread') + .''); + push(@functionlist,'' + .&mt('Delete') + .''); + +# Prepare available navigation + my @navigationlist; if ($counter > 0){ - $r->print(''.&mt('Previous').' | '); + push(@navigationlist,'' + .&mt('Previous') + .''); } if ($counter < $number_of_messages - 1){ - $r->print(''.&mt('Next').' | '); - } - $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').' | '); - } + + if (($env{'request.course.id'}) && ($from_student) && + (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) { + push(@actionlist,&Apache::loncommon::track_student_link( + '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('
'. - &Apache::lontexconvert::msgtexconverted($content{'message'},1). - '
' + .&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 = '
'.&mt('Attachment not included - exceeded permitted length').'
'.&mt('Could not deliver message').' '. - &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'
'); + my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not deliver message'),1); + $message .= ''. - &mt('Failed to delete the message.').'
'. - ''.$msg."
\n"); + my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Failed to delete the message.'),1); + $message .= ''.$msg.'
'; + $message = &Apache::loncommon::confirmwrapper($message); + $r->print($message); } &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode),$msgstatus); @@ -2770,7 +3399,10 @@ sub handler { $total ++; } &printheader($r,'','Marked Messages Read'); - $r->print(&mt('Marked [_1] message(s) read',$total).''); + my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Marked [quant,_1,message] read',$total)); + $message = &Apache::loncommon::confirmwrapper($message); + $r->print($message); + # $r->print('
'); &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode),$msgstatus); } elsif ($env{'form.markedaction'} eq 'markedunread') { @@ -2781,7 +3413,10 @@ sub handler { $total ++; } &printheader($r,'','Marked Messages Unread'); - $r->print(&mt('Marked [_1] message(s) unread',$total).'
'); + my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Marked [quant,_1,message] unread',$total)); + $message = &Apache::loncommon::confirmwrapper($message); + $r->print($message); + # $r->print('
'); &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode),$msgstatus); } elsif ($env{'form.markedaction'} eq 'markedmove') { @@ -2790,7 +3425,7 @@ sub handler { &printheader($r,'','Moved Messages'); if (!defined($gotfolders{$destfolder})) { $r->print(&mt('Destination folder [_1] is not a valid folder', - $destfolder)); + ''.$destfolder.'')); } else { my ($total,$failed,@failed_msg)=(0,0); my @to_move = &Apache::loncommon::get_env_multiple('form.delmark'); @@ -2804,15 +3439,17 @@ sub handler { push(@failed_msg,$msg); } } - if ($failed) { - $r->print('
- '.&mt('Failed to move [_1] message(s)',$failed). - '
'); - $r->print(''. - join("
\n",@failed_msg). - "
\n"); - } - $r->print(&mt('Moved [_1] message(s)',$total).''); + my $message = ''; + if ($failed) { + $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Failed to move [quant,_1,message]',$failed),1); + $message .= '
'. + join("
\n",@failed_msg). + "
\n"; + } + $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Moved [quant,_1,message]',$total)); + $message = &Apache::loncommon::confirmwrapper($message); + $r->print($message); + # $r->print(''); } &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode),$msgstatus); @@ -2830,15 +3467,17 @@ sub handler { } } &printheader($r,'','Deleted Messages'); + my $message = ''; if ($failed) { - $r->print('
- '.&mt('Failed to delete [_1] message(s)',$failed). - '
'); - $r->print(''. - join("
\n",@failed_msg). - "
\n"); - } - $r->print(&mt('Deleted [_1] message(s)',$total).''); + $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Failed to delete [quant,_1,message]',$failed),1); + $message .= '
'. + join("
\n",@failed_msg). + "
\n"; + } + $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Deleted [quant,_1,message]',$total)); + $message = &Apache::loncommon::confirmwrapper($message); + $r->print($message); + # $r->print('');
&Apache::loncommunicate::menu($r);
&disall($r,($folder?$folder:$dismode),$msgstatus);
} elsif ($env{'form.markunread'}) {
@@ -2850,8 +3489,6 @@ sub handler {
&compout($r,'','',$env{'form.compose'});
} elsif ($env{'form.recordftf'}) {
&facetoface($r,$env{'form.recordftf'});
- } elsif ($env{'form.block'}) {
- &examblock($r,$env{'form.block'});
} elsif ($env{'form.sendmail'}) {
if ($env{'form.multiforward'}) {
&printheader($r,'','Messages being sent.');
@@ -2862,7 +3499,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 +3513,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);
@@ -2892,19 +3531,23 @@ sub handler {
}
if (keys(%forwardok) > 0) {
my $count = keys(%forwardok);
- $r->print('
'.
- &mt('[quant,_1,message] forwarded.',$count).
- '');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('[quant,_1,message] forwarded.',$count));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
}
if (keys(%forwardfail) > 0) {
my $count = keys(%forwardfail);
- $r->print('
'.
- &mt('Could not forward [quant,_1,message].',$count).
- ' ');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not forward [quant,_1,message].',$count),1);
foreach my $key (keys(%forwardfail)) {
- $r->print(&mt('Could not deliver forwarded message.').' '.
- &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.').
');
+ $message .= '
'.&mt('Could not deliver forwarded message.').' ';
+ if ($forwardfail{$key} eq 'blocked') {
+ $message .= &mt('Sending messages is blocked from your IP address');
+ } else {
+ $message .= &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.')';
+ }
}
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
}
&Apache::loncommunicate::menu($r);
} else {
@@ -2928,10 +3571,13 @@ 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).'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" created.',$showfolder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
} else {
- $r->print(&mt('Creation failed.').' '.$makeresult.'
'.
- $warning);
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Creation failed.').' '.$makeresult.'
'.$warning,1);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
$showfolder = $folder;
}
&Apache::loncommunicate::menu($r);
@@ -2943,10 +3589,14 @@ sub handler {
my $showfolder = '';
my $delresult = &deletefolder($folder);
if ($delresult eq 'ok') {
- $r->print(&mt('Mail folder "[_1]" deleted.',$folder).'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" deleted.',$folder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
$env{'form.folder'} = '';
} else {
- $r->print(&mt('Deletion failed.').' '.$delresult.'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Deletion failed.').' '.$delresult,1);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
$showfolder = $folder;
}
&Apache::loncommunicate::menu($r);
@@ -2956,9 +3606,13 @@ 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).'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" renamed to "[_2]".',$folder,$showfolder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
} else {
- $r->print(&mt('Renaming failed.').' '.$renresult.'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Renaming failed.').' '.$renresult,1);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
$showfolder = $folder;
}
&Apache::loncommunicate::menu($r);