diff --git a/mail/inc/class.mail_bo.inc.php b/mail/inc/class.mail_bo.inc.php
index 627f99b3ab..1c42e1f8f0 100644
--- a/mail/inc/class.mail_bo.inc.php
+++ b/mail/inc/class.mail_bo.inc.php
@@ -547,7 +547,7 @@ class mail_bo
static $folderOpened;
//if (empty($folderOpened) || $folderOpened!=$_foldername)
//{
- //error_log( "------------------------reopen- $_foldername
");
+ //error_log( __METHOD__.__LINE__." $_foldername ".function_backtrace());
//error_log(__METHOD__.__LINE__.' Connected with icServer for Profile:'.$this->profileID.'?'.print_r($this->icServer->_connected,true));
if (!($this->icServer->_connected == 1)) {
$tretval = $this->openConnection($this->profileID,false);
@@ -2329,6 +2329,134 @@ class mail_bo
}
}
+ /**
+ * delete a Message
+ *
+ * @param mixed array/string _messageUID array of ids to flag, or 'all'
+ * @param string _folder foldername
+ * @param string _forceDeleteMethod - "no", or deleteMethod like 'move_to_trash',"mark_as_deleted","remove_immediately"
+ *
+ * @return bool true, as we do not handle return values yet
+ */
+ function deleteMessages($_messageUID, $_folder=NULL, $_forceDeleteMethod='no')
+ {
+ //error_log(__METHOD__.__LINE__.'->'.array2string($_messageUID).','.array2string($_folder));
+ $msglist = '';
+ $oldMailbox = '';
+ if (is_null($_folder) || empty($_folder)) $_folder = $this->sessionData['mailbox'];
+ if(!is_array($_messageUID) || count($_messageUID) === 0)
+ {
+ if ($_messageUID=='all')
+ {
+ $_messageUID= null;
+ }
+ else
+ {
+ if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID));
+ return false;
+ }
+ }
+ $deleteOptions = $_forceDeleteMethod; // use forceDeleteMethod if not "no", or unknown method
+ if ($_forceDeleteMethod === 'no' || !in_array($_forceDeleteMethod,array('move_to_trash',"mark_as_deleted","remove_immediately"))) $deleteOptions = $this->mailPreferences->preferences['deleteOptions'];
+ //error_log(__METHOD__.__LINE__.'->'.array2string($_messageUID).','.$_folder.'/'.$this->sessionData['mailbox'].' Option:'.$deleteOptions);
+ $trashFolder = $this->getTrashFolder();
+ $draftFolder = $this->getDraftFolder(); //$GLOBALS['egw_info']['user']['preferences']['felamimail']['draftFolder'];
+ $templateFolder = $this->getTemplateFolder(); //$GLOBALS['egw_info']['user']['preferences']['felamimail']['templateFolder'];
+ if(($_folder == $trashFolder && $deleteOptions == "move_to_trash") ||
+ ($_folder == $draftFolder)) {
+ $deleteOptions = "remove_immediately";
+ }
+ if($this->icServer->getCurrentMailbox() != $_folder) {
+ $oldMailbox = $this->icServer->getCurrentMailbox();
+ $this->icServer->selectMailbox($_folder);
+ }
+ $updateCache = false;
+ switch($deleteOptions) {
+ case "move_to_trash":
+ $updateCache = true;
+ if(!empty($trashFolder)) {
+ if (self::$debug) error_log(implode(' : ', $_messageUID));
+ if (self::$debug) error_log("$trashFolder <= ". $this->sessionData['mailbox']);
+ // copy messages
+ $retValue = $this->icServer->copyMessages($trashFolder, $_messageUID, $_folder, true);
+ if ( PEAR::isError($retValue) ) {
+ if (self::$debug) error_log(__METHOD__." failed to copy Message(s) from $_folder to $trashFolder: ".implode(',',$_messageUID));
+ throw new egw_exception("failed to copy Message(s) from $_folder to $trashFolder: ".implode(',',$_messageUID).' due to:'.array2string($retValue->message));
+ return false;
+ }
+ // mark messages as deleted
+ $retValue = $this->icServer->deleteMessages($_messageUID, true);
+ if ( PEAR::isError($retValue)) {
+ if (self::$debug) error_log(__METHOD__." failed to delete Message(s) from $_folder: ".implode(',',$_messageUID)." due to:".$retValue->message);
+ throw new egw_exception("failed to delete Message(s) from $_folder: ".implode(',',$_messageUID)." due to:".array2string($retValue->message));
+ return false;
+ }
+ // delete the messages finaly
+ $rv = $this->icServer->expunge();
+ if ( PEAR::isError($rv)) error_log(__METHOD__." failed to expunge Message(s) from Folder: ".$_folder.' due to:'.$rv->message);
+ }
+ break;
+
+ case "mark_as_deleted":
+ // mark messages as deleted
+ foreach((array)$_messageUID as $key =>$uid)
+ {
+ //flag messages, that are flagged for deletion as seen too
+ $this->flagMessages('read', $uid, $_folder);
+ $flags = $this->getFlags($uid);
+ //error_log(__METHOD__.__LINE__.array2string($flags));
+ if (strpos( array2string($flags),'Deleted')!==false) $undelete[] = $uid;
+ unset($flags);
+ }
+ $retValue = PEAR::isError($this->icServer->deleteMessages($_messageUID, true));
+ foreach((array)$undelete as $key =>$uid)
+ {
+ $this->flagMessages('undelete', $uid, $_folder);
+ }
+ if ( PEAR::isError($retValue)) {
+ if (self::$debug) error_log(__METHOD__." failed to mark as deleted for Message(s) from $_folder: ".implode(',',$_messageUID));
+ throw new egw_exception("failed to mark as deleted for Message(s) from $_folder: ".implode(',',$_messageUID).' due to:'.array2string($retValue->message));
+ return false;
+ }
+ break;
+
+ case "remove_immediately":
+ $updateCache = true;
+ // mark messages as deleted
+ $retValue = $this->icServer->deleteMessages($_messageUID, true);
+ if ( PEAR::isError($retValue)) {
+ if (self::$debug) error_log(__METHOD__." failed to remove immediately Message(s) from $_folder: ".implode(',',$_messageUID));
+ throw new egw_exception("failed to remove immediately Message(s) from $_folder: ".implode(',',$_messageUID).' due to:'.array2string($retValue->message));
+ return false;
+ }
+ // delete the messages finaly
+ $this->icServer->expunge();
+ break;
+ }
+ if ($updateCache)
+ {
+ $structure = egw_cache::getCache(egw_cache::INSTANCE,'email','structureCache'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
+ $cachemodified = false;
+ foreach ((array)$_messageUID as $k => $_uid)
+ {
+ if (isset($structure[$this->icServer->ImapServerId][$_folder][$_uid]) || $_uid=='all')
+ {
+ $cachemodified = true;
+ if ($_uid=='all')
+ unset($structure[$this->icServer->ImapServerId][$_folder]);
+ else
+ unset($structure[$this->icServer->ImapServerId][$_folder][$_uid]);
+ }
+ }
+ if ($cachemodified) egw_cache::setCache(egw_cache::INSTANCE,'email','structureCache'.trim($GLOBALS['egw_info']['user']['account_id']),$structure,$expiration=60*60*1);
+ }
+ if($oldMailbox != '') {
+ $this->icServer->selectMailbox($oldMailbox);
+ }
+
+ return true;
+ }
+
/**
* flag a Message
*
@@ -2525,6 +2653,87 @@ class mail_bo
return $structure[$this->icServer->ImapServerId][$_folder][$_uid];
}
+ /**
+ * getMessageRawHeader
+ * get parsed headers from message
+ * @param string/int $_uid the messageuid,
+ * @param string/int $_partID='' , the partID, may be omitted
+ * @param boolean $decode flag to do the decoding on the fly
+ * @return string the message header
+ */
+ function getMessageHeader($_uid, $_partID = '',$decode=false)
+ {
+ $retValue = $this->icServer->getParsedHeaders($_uid, true, $_partID, true);
+ if (PEAR::isError($retValue))
+ {
+ error_log(__METHOD__.__LINE__.array2string($retValue->message));
+ $retValue = null;
+ }
+ return ($decode ? self::decode_header($retValue,true):$retValue);
+ }
+
+ /**
+ * getMessageRawHeader
+ * get messages raw header data
+ * @param string/int $_uid the messageuid,
+ * @param string/int $_partID='' , the partID, may be omitted
+ * @return string the message header
+ */
+ function getMessageRawHeader($_uid, $_partID = '')
+ {
+ static $rawHeaders;
+ $_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox());
+ //error_log(__METHOD__.__LINE__." Try Using Cache for raw Header $_uid, $_partID in Folder $_folder");
+
+ if (is_null($rawHeaders)) $rawHeaders = egw_cache::getCache(egw_cache::INSTANCE,'email','rawHeadersCache'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
+ if (isset($rawHeaders[$this->icServer->ImapServerId][$_folder][$_uid][($_partID==''?'NIL':$_partID)]))
+ {
+ //error_log(__METHOD__.__LINE__." Using Cache for raw Header $_uid, $_partID in Folder $_folder");
+ return $rawHeaders[$this->icServer->ImapServerId][$_folder][$_uid][($_partID==''?'NIL':$_partID)];
+ }
+
+ $retValue = $this->icServer->getRawHeaders($_uid, $_partID, true);
+ if (PEAR::isError($retValue))
+ {
+ error_log(__METHOD__.__LINE__.array2string($retValue->message));
+ $retValue = "Could not retrieve RawHeaders in ".__METHOD__.__LINE__." PEAR::Error:".array2string($retValue->message);
+ }
+ $rawHeaders[$this->icServer->ImapServerId][$_folder][$_uid][($_partID==''?'NIL':$_partID)]=$retValue;
+ egw_cache::setCache(egw_cache::INSTANCE,'email','rawHeadersCache'.trim($GLOBALS['egw_info']['user']['account_id']),$rawHeaders,$expiration=60*60*1);
+ return $retValue;
+ }
+
+ /**
+ * getMessageRawBody
+ * get the message raw body
+ * @param string/int $_uid the messageuid,
+ * @param string/int $_partID='' , the partID, may be omitted
+ * @return string the message body
+ */
+ function getMessageRawBody($_uid, $_partID = '')
+ {
+ //TODO: caching einbauen static!
+ static $rawBody;
+ $_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox());
+ if (isset($rawBody[$_folder][$_uid][($_partID==''?'NIL':$_partID)]))
+ {
+ //error_log(__METHOD__.__LINE__." Using Cache for raw Body $_uid, $_partID in Folder $_folder");
+ return $rawBody[$this->icServer->ImapServerId][$_folder][$_uid][($_partID==''?'NIL':$_partID)];
+ }
+ if($_partID != '') {
+ $body = $this->icServer->getBody($_uid, true);
+ } else {
+ $body = $this->icServer->getBodyPart($_uid, $_partID, true);
+ }
+ if (PEAR::isError($body))
+ {
+ error_log(__METHOD__.__LINE__.' failed:'.$body->message);
+ return false;
+ }
+ $rawBody[$this->icServer->ImapServerId][$_folder][$_uid][($_partID==''?'NIL':$_partID)] = $body;
+ return $body;
+ }
+
/**
* getMessageAttachments
* parse the structure for attachments, it returns not the attachments itself, but an array of information about the attachment
diff --git a/mail/inc/class.mail_hooks.inc.php b/mail/inc/class.mail_hooks.inc.php
index 3cb37b59db..d41c8e507a 100644
--- a/mail/inc/class.mail_hooks.inc.php
+++ b/mail/inc/class.mail_hooks.inc.php
@@ -453,11 +453,12 @@ class mail_hooks
'admin' => False,
'default'=> 50,
),
- 'PreViewFrameHeight' => array(
- 'type' => 'input',
- 'label' => 'Message preview size',
- 'help' => 'If you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here. 300 seems to be a good working value. The preview will be displayed at the end of the message list when a message is selected.',
- 'name' => 'PreViewFrameHeight',
+ 'enablePreViewArea' => array(
+ 'type' => 'select',
+ 'label' => 'Message preview area',
+ 'help' => 'If you want to see a preview of a mail by single clicking onto the subject, enable this.',
+ 'name' => 'enablePreViewArea',
+ 'values' => $no_yes_copy,
'xmlrpc' => True,
'admin' => False,
'forced' => '300',
diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php
index 50dbe1bb55..5db18e4cb3 100644
--- a/mail/inc/class.mail_ui.inc.php
+++ b/mail/inc/class.mail_ui.inc.php
@@ -23,6 +23,8 @@ class mail_ui
var $public_functions = array
(
'index' => True,
+ 'displayHeader' => True,
+ 'saveMessage' => True,
'TestConnection' => True,
);
@@ -66,12 +68,12 @@ class mail_ui
}
if ($connectionReset)
{
- error_log(__METHOD__.__LINE__.' Connection Reset triggered:'.$connectionReset.' for Profile with ID:'.self::$icServerID);
+ if (mail_bo::$debug) error_log(__METHOD__.__LINE__.' Connection Reset triggered:'.$connectionReset.' for Profile with ID:'.self::$icServerID);
emailadmin_bo::unsetCachedObjects(self::$icServerID);
}
$this->mail_bo = mail_bo::getInstance(false,$icServerID);
- error_log(__METHOD__.__LINE__.' Fetched IC Server:'.self::$icServerID.'/'.$this->mail_bo->profileID.':'.function_backtrace());
+ if (mail_bo::$debug) error_log(__METHOD__.__LINE__.' Fetched IC Server:'.self::$icServerID.'/'.$this->mail_bo->profileID.':'.function_backtrace());
// no icServer Object: something failed big time
if (!isset($this->mail_bo->icServer)) exit; // ToDo: Exception or the dialog for setting up a server config
if (!($this->mail_bo->icServer->_connected == 1)) $this->mail_bo->openConnection(self::$icServerID);
@@ -85,10 +87,10 @@ class mail_ui
function changeProfile($_icServerID)
{
self::$icServerID = $_icServerID;
- error_log(__METHOD__.__LINE__.'->'.self::$icServerID);
+ if (mail_bo::$debug) error_log(__METHOD__.__LINE__.'->'.self::$icServerID);
emailadmin_bo::unsetCachedObjects(self::$icServerID);
$this->mail_bo = mail_bo::getInstance(false,self::$icServerID);
- error_log(__METHOD__.__LINE__.' Fetched IC Server:'.self::$icServerID.'/'.$this->mail_bo->profileID.':'.function_backtrace());
+ if (mail_bo::$debug) error_log(__METHOD__.__LINE__.' Fetched IC Server:'.self::$icServerID.'/'.$this->mail_bo->profileID.':'.function_backtrace());
// no icServer Object: something failed big time
if (!isset($this->mail_bo->icServer)) exit; // ToDo: Exception or the dialog for setting up a server config
/*if (!($this->mail_bo->icServer->_connected == 1))*/ $this->mail_bo->openConnection(self::$icServerID);
@@ -397,7 +399,7 @@ class mail_ui
{
if ($_profileID && $_profileID != $this->mail_bo->profileID)
{
- error_log(__METHOD__.__LINE__.' change Profile to ->'.$_profileID);
+ //error_log(__METHOD__.__LINE__.' change Profile to ->'.$_profileID);
$this->changeProfile($_profileID);
}
}
@@ -434,7 +436,7 @@ class mail_ui
'im1' => 'thunderbird.png',
'im2' => 'thunderbird.png',
'path'=> array($icServer->ImapServerId),
- 'child'=> 1,
+ 'child'=> 1, // dynamic loading on unfold
'parent' => ''
);
$this->setOutStructure($oA,$out,self::$delimiter);
@@ -484,13 +486,13 @@ class mail_ui
}
$path = $this->mail_bo->profileID.self::$delimiter.$key; //$obj->folderName; //$obj->delimiter
$oA['id'] = $path; // ID holds the PATH
- if (stripos(array2string($fS['attributes']),'\noselect')!== false)
+ if (!empty($fS['attributes']) && stripos(array2string($fS['attributes']),'\noselect')!== false)
{
$oA['im0'] = "folderNoSelectClosed.gif"; // one Level
$oA['im1'] = "folderNoSelectOpen.gif";
$oA['im2'] = "folderNoSelectClosed.gif"; // has Children
}
- if (stripos(array2string($fS['attributes']),'\hasnochildren')=== false)
+ if (!empty($fS['attributes']) && stripos(array2string($fS['attributes']),'\hasnochildren')=== false)
{
$oA['child']=1; // translates to: hasChildren -> dynamicLoading
}
@@ -923,7 +925,7 @@ class mail_ui
unset($query['actions']);
//error_log(__METHOD__.__LINE__.array2string($query));
//error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Start:'.$query['start'].' NumRows:'.$query['num_rows']);
-$starttime = microtime(true);
+ //$starttime = microtime(true);
//error_log(__METHOD__.__LINE__.array2string($query['search']));
//$query['search'] is the phrase in the searchbox
@@ -943,7 +945,7 @@ $starttime = microtime(true);
{
if ($_profileID && $_profileID != $this->mail_bo->profileID)
{
- error_log(__METHOD__.__LINE__.' change Profile to ->'.$_profileID);
+ //error_log(__METHOD__.__LINE__.' change Profile to ->'.$_profileID);
$this->changeProfile($_profileID);
}
$_folderName = $folderName;
@@ -1031,8 +1033,8 @@ $starttime = microtime(true);
if ($GLOBALS['egw_info']['user']['preferences']['common']['select_mode']=='EGW_SELECTMODE_TOGGLE') unset($cols[0]);
$rows = $this->header2gridelements($sortResult['header'],$cols, $_folderName, $folderType,$previewMessage);
//error_log(__METHOD__.__LINE__.array2string($rows));
-$endtime = microtime(true) - $starttime;
-error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Start:'.$query['start'].' NumRows:'.$query['num_rows'].' Took:'.$endtime);
+ //$endtime = microtime(true) - $starttime;
+ //error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Start:'.$query['start'].' NumRows:'.$query['num_rows'].' Took:'.$endtime);
return $rowsFetched['messages'];
}
@@ -1373,6 +1375,102 @@ error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Star
return $rv;
}
+ /**
+ * display messages header lines
+ *
+ * all params are passed as GET Parameters
+ */
+ function displayHeader()
+ {
+ if(isset($_GET['id'])) $rowID = $_GET['id'];
+ if(isset($_GET['part'])) $partID = $_GET['part'];
+
+ $hA = $this->splitRowID($rowID);
+ $uid = $hA['msgUID'];
+ $mailbox = $hA['folder'];
+
+ //$transformdate =& CreateObject('felamimail.transformdate');
+ //$htmlFilter =& CreateObject('felamimail.htmlfilter');
+ //$uiWidgets =& CreateObject('felamimail.uiwidgets');
+ $this->mail_bo->reopen($mailbox);
+ $rawheaders = $this->mail_bo->getMessageRawHeader($uid, $partID);
+
+ $webserverURL = $GLOBALS['egw_info']['server']['webserver_url'];
+
+ #$nonDisplayAbleCharacters = array('[\016]','[\017]',
+ # '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]',
+ # '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]');
+
+ #print "
";print_r($rawheaders);print"";exit; + + // add line breaks to $rawheaders + $newRawHeaders = explode("\n",$rawheaders); + reset($newRawHeaders); + + // reset $rawheaders + $rawheaders = ""; + // create it new, with good line breaks + reset($newRawHeaders); + while(list($key,$value) = @each($newRawHeaders)) { + $rawheaders .= wordwrap($value, 90, "\n "); + } + + $this->mail_bo->closeConnection(); + + header('Content-type: text/html; charset=iso-8859-1'); + print '
'. htmlspecialchars($rawheaders, ENT_NOQUOTES, 'iso-8859-1') .''; + + } + + /** + * save messages on disk or filemanager, or display it in popup + * + * all params are passed as GET Parameters + */ + function saveMessage() + { + $display = false; + if(isset($_GET['id'])) $rowID = $_GET['id']; + if(isset($_GET['part'])) $partID = $_GET['part']; + if (isset($_GET['location'])&& ($_GET['location']=='display'||$_GET['location']=='filemanager')) $display = $_GET['location']; + + $hA = $this->splitRowID($rowID); + $uid = $hA['msgUID']; + $mailbox = $hA['folder']; + + $this->mail_bo->reopen($mailbox); + + $message = $this->mail_bo->getMessageRawBody($uid, $partID); + $headers = $this->mail_bo->getMessageHeader($uid, $partID); + + $this->mail_bo->closeConnection(); + + $GLOBALS['egw']->session->commit_session(); + if ($display==false) + { + $subject = str_replace('$$','__',mail_bo::decode_header($headers['SUBJECT'])); + header ("Content-Type: message/rfc822; name=\"". $subject .".eml\""); + header ("Content-Disposition: attachment; filename=\"". $subject .".eml\""); + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo $message; + + $GLOBALS['egw']->common->egw_exit(); + exit; + } + //elseif ($display=='filemanager') // done in vfsSaveMessage + //{ + //} + else + { + header('Content-type: text/html; charset=iso-8859-1'); + print '
'. htmlspecialchars($message, ENT_NOQUOTES, 'iso-8859-1') .''; + } + } + /** * getFolderStatus - its called via json, so the function must start with ajax (or the class-name must contain ajax) * gets the counters and sets the text of a treenode if needed (unread Messages found) @@ -1420,7 +1518,7 @@ error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Star function ajax_changeProfile($icServerID) { if ($icServerID && $icServerID != $this->mail_bo->profileID) - error_log(__METHOD__.__LINE__.' change Profile to ->'.$icServerID); + //error_log(__METHOD__.__LINE__.' change Profile to ->'.$icServerID); $this->changeProfile($icServerID); $response = egw_json_response::get(); $response->call('egw_refresh',lang('changed profile'),'mail'); @@ -1470,7 +1568,7 @@ error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Star */ function ajax_flagMessages($_flag, $_messageList) { - if($this->_debug) error_log(__METHOD__."->".$_flag.':'.print_r($_messageList,true)); + if(mail_bo::$debug) error_log(__METHOD__."->".$_flag.':'.print_r($_messageList,true)); if ($_messageList=='all' || !empty($_messageList['msg'])) { if ($_messageList=='all') @@ -1492,7 +1590,7 @@ error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Star } else { - if($this->_debug) error_log(__METHOD__."-> No messages selected."); + if(mail_bo::$debug) error_log(__METHOD__."-> No messages selected."); } // unset preview, as refresh would mark message again read @@ -1507,4 +1605,40 @@ error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Star $response->call('egw_refresh',lang('flagged %1 messages as %2 in %3',count($_messageList['msg']),$_flag,$folder),'mail'); } + /** + * delete messages + * + * @param array _messageList list of UID's + * + * @return xajax response + */ + function ajax_deleteMessages($_messageList) + { + if(mail_bo::$debug) error_log(__METHOD__."->".$_flag.':'.print_r($_messageList,true)); + if ($_messageList=='all' || !empty($_messageList['msg'])) + { + if ($_messageList=='all') + { + // we have no folder information + $folder=null; + } + else + { + $uidA = $this->splitRowID($_messageList['msg'][0]); + $folder = $uidA['folder']; // all messages in one set are supposed to be within the same folder + } + foreach($_messageList['msg'] as $rowID) + { + $hA = $this->splitRowID($rowID); + $messageList[] = $hA['msgUID']; + } + $this->mail_bo->deleteMessages(($_messageList=='all' ? 'all':$messageList),$folder); + } + else + { + if(mail_bo::$debug) error_log(__METHOD__."-> No messages selected."); + } + $response = egw_json_response::get(); + $response->call('egw_refresh',lang('deleted %1 messages in %2',count($_messageList['msg']),$folder),'mail'); + } } diff --git a/mail/js/app.js b/mail/js/app.js index b8f75ec391..84d3079b64 100644 --- a/mail/js/app.js +++ b/mail/js/app.js @@ -160,6 +160,44 @@ function mail_setMsg(myMsg) } } +/** + * Delete mails + * takes in all arguments + * @param _action + * @param _elems + */ +function mail_delete(_action,_elems) +{ + var msg = mail_getFormData(_elems); + //alert(_action.id+','+ msg); + app_refresh(egw.lang('delete messages'), 'mail'); + mail_setRowClass(_elems,'deleted'); + var request = new egw_json_request('mail.mail_ui.ajax_deleteMessages',[msg]); + request.sendRequest(false); + mail_refreshMessageGrid() +} + +/** + * UnDelete mailMessages + * + * @param _messageList + */ +function mail_undeleteMessages(_messageList) { +// setting class of row, the old style +/* + for(var i=0;i<_messageList['msg'].length;i++) { + _id = _messageList['msg'][i]; + var dataElem = egw_appWindow('felamimail').mailGrid.dataRoot.getElementById(_id); + if (dataElem) + { + //dataElem.clearData(); + //dataElem.addClass('deleted'); + dataElem.removeClass('deleted'); + } + } +*/ +} + /** * mail_emptyTrash */ @@ -271,6 +309,47 @@ function mail_flagMessages(_flag, _elems) mail_refreshMessageGrid() } +/** + * display header lines, or source of mail, depending on the url given + * + * @param _url + */ +function mail_displayHeaderLines(_url) { + // only used by right clickaction + egw_openWindowCentered(_url,'mail_display_headerLines','700','600',window.outerWidth/2,window.outerHeight/2); +} + +/** + * View header of a message + * + * @param _action + * @param _elems _elems[0].id is the row-id + */ +function mail_header(_action, _elems) +{ + //alert('mail_header('+_elems[0].id+')'); + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=mail.mail_ui.displayHeader'; // todo compose for Draft folder + url += '&id='+_elems[0].id; + mail_displayHeaderLines(url); +} + +/** + * View message source + * + * @param _action + * @param _elems _elems[0].id is the row-id + */ +function mail_mailsource(_action, _elems) +{ + //alert('mail_mailsource('+_elems[0].id+')'); + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=mail.mail_ui.saveMessage'; // todo compose for Draft folder + url += '&id='+_elems[0].id; + url += '&location=display'; + mail_displayHeaderLines(url); +} + /** * mail_getFormData * @@ -295,6 +374,26 @@ function mail_getFormData(_actionObjects) { return messages; } +/** + * mail_setRowClass + * + * @param _actionObjects, the senders + */ +function mail_setRowClass(_actionObjects,_class) { + if (typeof _class == 'undefined') return false; + + for (var i = 0; i < _actionObjects.length; i++) + { + if (_actionObjects[i].id.length>0) + { + var _id = _actionObjects[i].id; + var dataElem = $j(_actionObjects[i].iface.getDOMNode()); + dataElem.addClass(_class); + + } + } +} + // Tree widget stubs mail_dragStart = function(action,sender) { console.log(action,sender);