From 7ca9e5c6bfa66b590f7e7e2b1603f862cf4b67b1 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Fri, 12 Sep 2014 11:52:38 +0000 Subject: [PATCH] Restructure compose save as draft functionality and implement it as an ajax function --- mail/inc/class.mail_compose.inc.php | 153 +++++++++++++++------------- mail/js/app.js | 104 +++++++++++++++---- mail/templates/default/compose.xet | 4 +- 3 files changed, 173 insertions(+), 88 deletions(-) diff --git a/mail/inc/class.mail_compose.inc.php b/mail/inc/class.mail_compose.inc.php index 91b451337f..313a293520 100644 --- a/mail/inc/class.mail_compose.inc.php +++ b/mail/inc/class.mail_compose.inc.php @@ -386,74 +386,7 @@ class mail_compose egw_framework::message(lang('Message send failed: %1',$message),'error');// maybe error is more appropriate } } - if ($_content['button']['saveAsDraft']||$_content['button']['saveAsDraftAndPrint']) - { - $buttonClicked = $suppressSigOnTop = true; - $savedOK = true; - try - { - $_content['isDraft'] = 1; - $previouslyDrafted = $_content['lastDrafted']; - // save as draft - $folder = $this->mail_bo->getDraftFolder(); - $this->mail_bo->reopen($folder); - $status = $this->mail_bo->getFolderStatus($folder); - //error_log(__METHOD__.__LINE__.array2string(array('Folder'=>$folder,'Status'=>$status))); - $uidNext = $status['uidnext']; // we may need that, if the server does not return messageUIDs of saved/appended messages - $_content['body'] = ($_content['body'] ? $_content['body'] : $_content['mail_'.($_content['mimeType'] == 'html'?'html':'plain').'text']); - $messageUid = $this->saveAsDraft($_content,$folder); // folder may change - if (!$messageUid) { - //try to reopen the mail from session data - throw new egw_exception_wrong_userinput(lang("Error: Could not save Message as Draft")." ".lang("Trying to recover from session data")); - } - // saving as draft, does not mean closing the message - $messageUid = ($messageUid===true ? $uidNext : $messageUid); - //error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.'/'.gettype($messageUid).' in folder:'.$folder); - if ($this->mail_bo->getMessageHeader($messageUid, '',false, false, $folder)) - { - $draft_id = mail_ui::createRowID($folder, $messageUid); - //error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$draft_id.'/'.$previouslyDrafted.' in folder:'.$folder); - if (isset($previouslyDrafted) && $previouslyDrafted!=$draft_id) - { - $dhA = mail_ui::splitRowID($previouslyDrafted); - $duid = $dhA['msgUID']; - $dmailbox = $dhA['folder']; - try - { - //error_log(__METHOD__.__LINE__."->".print_r($duid,true).' folder:'.$dmailbox.' Method:'.'remove_immediately'); - $this->mail_bo->deleteMessages($duid,$dmailbox,'remove_immediately'); - } - catch (egw_exception $e) - { - $error = str_replace('"',"'",$e->getMessage()); - error_log(__METHOD__.__LINE__.$error); - } - } - $_content['lastDrafted'] = $draft_id; - //$draftContent = $this->bocompose->getDraftData($this->mail_bo->icServer, $folder, $messageUid); - //$this->compose($draftContent,null,'to',true); - //return true; - } - } - catch (egw_exception_wrong_userinput $e) - { - $error = str_replace('"',"'",$e->getMessage()); - error_log(__METHOD__.__LINE__.$error); - $savedOK = false; - } - //error_log(__METHOD__.__LINE__.' :'.$draft_id.'->'.$savedOK); - if ($savedOK) - { - egw_framework::message(lang('Message saved successfully.'),'mail'); - $response = egw_json_response::get(); - if (isset($previouslyDrafted) && $previouslyDrafted!=$draft_id) $response->call('opener.egw_refresh',lang('Message saved successfully.'),'mail',$previouslyDrafted,'delete'); - $response->call('opener.egw_refresh',lang('Message saved successfully.'),'mail',$draft_id,'add'); - if ($_content['button']['saveAsDraftAndPrint']) - { - $response->call('app.mail.mail_compose_print',"mail::" .$draft_id); - } - } - } + if ($activeProfile != $composeProfile) $this->changeProfile($activeProfile); $insertSigOnTop = false; $content = (is_array($_content)?$_content:array()); @@ -1322,7 +1255,7 @@ class mail_compose } //error_log(__METHOD__.__LINE__.array2string($content)); - $etpl->exec('mail.mail_compose.compose',$content,$sel_options,$readonlys,$preserv,2); + $etpl->exec('mail.mail_compose.compose',$content,$sel_options,array(),$preserv,2); } /** @@ -2426,6 +2359,88 @@ class mail_compose $mail_bo->closeConnection(); } + /** + * Save compose mail as draft + * + * @param array $content content sent from client-side + */ + public function ajax_saveAsDraft ($content) + { + $response = egw_json_response::get(); + $success = true; + + // check if default account is changed then we need to change profile + if (!empty($content['serverID']) && $content['serverID'] != $this->mail_bo->profileID) + { + $this->changeProfile($content['serverID']); + } + + $formData = array_merge($content, array( + 'isDrafted' => 1, + 'body' => $content['mail_'.($content['mimeType']?'htmltext':'plaintext')], + 'mimeType' => $content['mimeType']?'html':'plain' // checkbox has only true|false value + )); + + //Saving draft procedure + try + { + $folder = $this->mail_bo->getDraftFolder(); + $this->mail_bo->reopen($folder); + $status = $this->mail_bo->getFolderStatus($folder); + if (($messageUid = $this->saveAsDraft($formData,$folder))) + { + // saving as draft, does not mean closing the message + $messageUid = ($messageUid===true ? $status['uidnext'] : $messageUid); + if (is_array($this->mail_bo->getMessageHeader($messageUid, '',false, false, $folder))) + { + $draft_id = mail_ui::createRowID($folder, $messageUid); + if ($content['lastDrafted'] != $draft_id && isset($content['lastDrafted'])) + { + $dhA = mail_ui::splitRowID($content['lastDrafted']); + $duid = $dhA['msgUID']; + $dmailbox = $dhA['folder']; + try + { + $this->mail_bo->deleteMessages($duid,$dmailbox,'remove_immediately'); + } + catch (egw_exception $e) + { + $msg = str_replace('"',"'",$e->getMessage()); + $success = false; + error_log(__METHOD__.__LINE__.$msg); + } + } + } + } + else + { + throw new egw_exception_wrong_userinput(lang("Error: Could not save Message as Draft")); + } + } + catch (egw_exception_wrong_userinput $e) + { + $msg = str_replace('"',"'",$e->getMessage()); + error_log(__METHOD__.__LINE__.$msg); + $success = false; + } + + if ($success) $msg = lang('Message saved successfully.'); + + // Include new information to json respose, because we need them in client-side callback + $response->data(array( + 'draftedId' => $draft_id, + 'message' => $msg, + 'success' => $success + )); + } + + /** + * Save message as draft to specific folder + * + * @param type $_formData content + * @param type $savingDestination destination folder + * @return boolean return messageUID| false due to an error + */ function saveAsDraft($_formData, &$savingDestination='') { $mail_bo = $this->mail_bo; diff --git a/mail/js/app.js b/mail/js/app.js index c884313c04..876a5dcd1b 100644 --- a/mail/js/app.js +++ b/mail/js/app.js @@ -3139,29 +3139,99 @@ app.classes.mail = AppJS.extend( } } }, - + /** - * Save as Draft (VFS) - * - * @param {egw object} _egw - * @param {widget object} _widget - * @param {window object} _window - */ - saveAsDraft: function(_egw, _widget, _window) + * Save as Draft (VFS) + * -handel both actions save as draft and save as draft and print + * + * @param {egw object} _egw + * @param {widget object} _widget + * @param {string} _action autosaving trigger action + */ + saveAsDraft: function(_egw, _widget, _action) { - this.et2_obj.submit(); + //this.et2_obj.submit(); + var content = this.et2.getArrayMgr('content').data; + if (_widget ) + { + var action = _action == 'autosaving'?_action: _widget.id; + } + + var widgets = ['from','to','cc','bcc','subject','folder','replyto','mailaccount', 'mail_htmltext', 'mail_plaintext', 'lastDrafted']; + var widget = {}; + for (var index in widgets) + { + widget = this.et2.getWidgetById(widgets[index]); + if (widget) + { + content[widgets[index]] = widget.get_value(); + } + } + var self = this; + if (content) + { + this.egw.json('mail.mail_compose.ajax_saveAsDraft',[content],function(_data){ + self.savingDraft_response(_data,action); + }).sendRequest(true); + } }, /** - * Save as Draf and pring (VFS) - * - * @param {egw object} _egw - * @param {widget object} _widget - * @param {window object} _window - */ - saveAsDraftAndPrint: function(_egw, _widget, _window) + * Set content of drafted message with new information sent back from server + * This function would be used as callback of send request to ajax_saveAsDraft. + * + * @param {object} _responseData response data sent back from server by ajax_saveAsDraft function. + * the object conatins below items: + * -draftedId: new drafted id created by server + * -message: resault message + * -success: true if saving was successful otherwise false + * + * @param {string} _action action is the element which caused saving draft, it could be as such: + * -button[saveAsDraft] + * -button[saveAsDraftAndPrint] + * -autosaving + */ + savingDraft_response: function(_responseData, _action) { - this.et2_obj.submit(); + //Make sure there's a response from server otherwise shoot an error message + if (jQuery.isEmptyObject(_responseData)) + { + this.egw.message('Could not saved the message. Besause, the response from server failed.', 'error'); + return false; + } + + if (_responseData.success) + { + var content = this.et2.getArrayMgr('content'); + var lastDrafted = this.et2.getWidgetById('lastDrafted'); + if (content) + { + var prevDraftedId = content.data.lastDrafted; + content.data.lastDrafted = _responseData.draftedId; + this.et2.setArrayMgr('content', content); + lastDrafted.set_value(_responseData.draftedId); + if (prevDraftedId) + { + opener.egw_refresh(_responseData.message,'mail', prevDraftedId, 'delete'); + } + this.egw.refresh(_responseData.message,'mail',_responseData.draftedId,'add'); + switch (_action) + { + case 'button[saveAsDraftAndPrint]': + this.mail_compose_print('mail::'+_responseData.draftedId); + this.egw.message(_responseData.message, 'add'); + break; + case 'autosaving': + //Any sort of thing if it's an autosaving action + default: + this.egw.message(_responseData.message, 'add'); + } + } + } + else + { + this.egw.message(_responseData.message, 'error'); + } }, /** diff --git a/mail/templates/default/compose.xet b/mail/templates/default/compose.xet index e650cf044a..195df3a8f2 100644 --- a/mail/templates/default/compose.xet +++ b/mail/templates/default/compose.xet @@ -10,7 +10,7 @@ - + @@ -56,7 +56,7 @@ - +