From df1a2e20b5fd6b7ed6f2e3153715a89f6394954e Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 28 Feb 2013 09:28:08 +0000 Subject: [PATCH] get some more actions working (delete, view header, view message body) --- mail/inc/class.mail_bo.inc.php | 211 +++++++++++++++++++++++++++++- mail/inc/class.mail_hooks.inc.php | 11 +- mail/inc/class.mail_ui.inc.php | 164 ++++++++++++++++++++--- mail/js/app.js | 99 ++++++++++++++ 4 files changed, 464 insertions(+), 21 deletions(-) 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);