From acb4f11d24eb0de128295083b7e580f6e44727d8 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 19 Feb 2015 12:01:18 +0000 Subject: [PATCH] * Mail: feature to allow to void the (configured) spam/junk folder on right-click action on foldertree --- mail/inc/class.mail_ui.inc.php | 65 +++++++++++++++++++++++++++++++++- mail/js/app.js | 51 ++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php index 03ef6d2601..6c58b72b6c 100644 --- a/mail/inc/class.mail_ui.inc.php +++ b/mail/inc/class.mail_ui.inc.php @@ -624,6 +624,19 @@ class mail_ui ); break; } + ++$group; // put empty spam immediately in own group + $junkFolder = $this->mail_bo->getJunkFolder(); + //error_log(__METHOD__.__LINE__.$junkFolder); + if ($junkFolder && !empty($junkFolder)) + { + $tree_actions['empty_spam'] = array( + 'caption' => 'empty spam', + 'icon' => 'dhtmlxtree/MailFolderJunk', + 'enabled' => 'javaScript:app.mail.spamfolder_enabled', + 'onExecute' => 'javaScript:app.mail.mail_emptySpam', + 'group' => $group, + ); + } // enforce global (group-specific) ACL if (!mail_hooks::access('aclmanagement')) @@ -817,7 +830,7 @@ class mail_ui 'child'=> (int)($acc_id != $_profileID || $folderObjects), // dynamic loading on unfold 'parent' => '', // mark on account if Sieve is enabled - 'data' => array('sieve' => $accountObj->imapServer()->acc_sieve_enabled), + 'data' => array('sieve' => $accountObj->imapServer()->acc_sieve_enabled,'spamfolder'=>($accountObj->imapServer()->acc_folder_junk?true:false)), ); $this->setOutStructure($oA, $out, self::$delimiter); @@ -4213,6 +4226,56 @@ class mail_ui $response->call('app.mail.mail_setQuotaDisplay',array('data'=>$content)); } + /** + * Empty spam/junk folder + * + * @param string $icServerID id of the server to empty its junkFolder + * @param string $selectedFolder seleted(active) folder by nm filter + * @return nothing + */ + function ajax_emptySpam($icServerID, $selectedFolder) + { + //error_log(__METHOD__.__LINE__.' '.$icServerID); + translation::add_app('mail'); + $response = egw_json_response::get(); + $rememberServerID = $this->mail_bo->profileID; + if ($icServerID && $icServerID != $this->mail_bo->profileID) + { + //error_log(__METHOD__.__LINE__.' change Profile to ->'.$icServerID); + $this->changeProfile($icServerID); + } + $junkFolder = $this->mail_bo->getJunkFolder(); + if(!empty($junkFolder)) { + if ($selectedFolder == $icServerID.self::$delimiter.$junkFolder) + { + // Lock the tree if the active folder is Trash folder + $response->call('app.mail.lock_tree'); + } + $this->mail_bo->deleteMessages('all',$junkFolder,'remove_immediately'); + + $heirarchyDelimeter = $this->mail_bo->getHierarchyDelimiter(true); + $fShortName = array_pop(explode($heirarchyDelimeter, $junkFolder)); + $fStatus = array( + $icServerID.self::$delimiter.$trashFolder => lang($fShortName) + ); + //Call to reset folder status counter, after junkFolder triggered not from Junk folder + //-as we don't have trash folder specific information available on client-side we need to deal with it on server + $response->call('app.mail.mail_setFolderStatus',$fStatus); + } + if ($rememberServerID != $this->mail_bo->profileID) + { + $oldFolderInfo = $this->mail_bo->getFolderStatus($junkFolder,false,false,false); + $response->call('egw.message',lang('empty junk')); + $response->call('app.mail.mail_reloadNode',array($icServerID.self::$delimiter.$junkFolder=>$oldFolderInfo['shortDisplayName'])); + //error_log(__METHOD__.__LINE__.' change Profile to ->'.$rememberServerID); + $this->changeProfile($rememberServerID); + } + else if ($selectedFolder == $icServerID.self::$delimiter.$junkFolder) + { + $response->call('egw.refresh',lang('empty junk'),'mail'); + } + } + /** * Empty trash folder * diff --git a/mail/js/app.js b/mail/js/app.js index cf7755be72..399424375f 100644 --- a/mail/js/app.js +++ b/mail/js/app.js @@ -1210,6 +1210,25 @@ app.classes.mail = AppJS.extend( return true; }, + /** + * Check if SpamFolder is enabled on that account + * + * SpamFolder enabled is stored as data { spamfolder: true/false } on account node. + * + * @param {object} _action + * @param {object} _senders the representation of the tree leaf to be manipulated + * @param {object} _currentNode + */ + spamfolder_enabled: function(_action,_senders,_currentNode) + { + var ftree = this.et2.getWidgetById(this.nm_index+'[foldertree]'); + var acc_id = _senders[0].id.split('::')[0]; + var node = ftree ? ftree.getNode(acc_id) : null; + + return node && node.data && node.data.spamfolder; + }, + + /** * Check if Sieve is enabled on that account * @@ -1574,6 +1593,38 @@ app.classes.mail = AppJS.extend( // setting class of row, the old style }, + /** + * mail_emptySpam + * + * @param {object} action + * @param {object} _senders + */ + mail_emptySpam: function(action,_senders) { + var server = _senders[0].iface.id.split('::'); + var activeFilters = this.mail_getActiveFilters(); + var self = this; + + this.egw.message(this.egw.lang('empty spam')); + egw.json('mail.mail_ui.ajax_emptySpam',[server[0], activeFilters['selectedFolder']? activeFilters['selectedFolder']:null],function(){self.unlock_tree();}) + .sendRequest(true); + + // Directly delete any trash cache for selected server + if(window.localStorage) + { + for(var i = 0; i < window.localStorage.length; i++) + { + var key = window.localStorage.key(i); + + // Find directly by what the key would look like + if(key.indexOf('cached_fetch_mail::{"selectedFolder":"'+server[0]+'::') == 0 && + key.toLowerCase().indexOf(egw.lang('junk').toLowerCase()) > 0) + { + window.localStorage.removeItem(key); + } + } + } + }, + /** * mail_emptyTrash *