From 47239b3d2352a913e10ebc8f1408351127b1ffbe Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Thu, 23 Jul 2015 13:26:43 +0000 Subject: [PATCH] More W.I.P of mail tree --- mail/inc/class.mail_tree.inc.php | 74 ++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/mail/inc/class.mail_tree.inc.php b/mail/inc/class.mail_tree.inc.php index 256f97eeee..78c4d95f2d 100644 --- a/mail/inc/class.mail_tree.inc.php +++ b/mail/inc/class.mail_tree.inc.php @@ -114,11 +114,14 @@ class mail_tree /** * getTree provides tree structure regarding to selected node * - * @param string $_parent = null, no parent node means root with the first level of folders - * @param string $_profileID icServer id + * @param string $_parent = null no parent node means root with the first level of folders + * @param string $_profileID = '' icServer id + * @param int|boolean $_openTopLevel = 1 Open top level folders on load if it's set to 1|true, + * false|0 leaves them in closed state + * * @return array returns an array of mail tree structure according to provided node */ - function getTree ($_parent = null, $_profileID = '') + function getTree ($_parent = null, $_profileID = '', $_openTopLevel = 1) { //Init mail folders $tree = array(tree::ID=> $_parent?$_parent:0,tree::CHILDREN => array()); @@ -181,16 +184,18 @@ class mail_tree { if (!$accObj->is_imap()|| $acc_id != $_profileID) continue; $identity = emailadmin_account::identity_name($accObj,true,$GLOBALS['egw_info']['user']['acount_id']); - $baseNode = array('id' => $acc_id, - 'text' => str_replace(array('<','>'),array('[',']'),$identity), - 'tooltip' => '('.$acc_id.') '.htmlspecialchars_decode($identity), - 'im0' => self::$leafImages['folderAccount'], - 'im1' => self::$leafImages['folderAccount'], - 'im2' => self::$leafImages['folderAccount'], + $baseNode = array( + tree::ID=> $acc_id, + tree::LABEL => str_replace(array('<','>'),array('[',']'),$identity), + tree::TOOLTIP => '('.$acc_id.') '.htmlspecialchars_decode($identity), + tree::IMAGE_LEAF => self::$leafImages['folderAccount'], + tree::IMAGE_FOLDER_OPEN => self::$leafImages['folderAccount'], + tree::IMAGE_FOLDER_CLOSED => self::$leafImages['folderAccount'], 'path'=> array($acc_id), - 'child'=> true, // dynamic loading on unfold + tree::CHILDREN => array(), // dynamic loading on unfold + tree::AUTOLOAD_CHILDREN => true, 'parent' => '', - 'open' => 1, + tree::OPEN => $_openTopLevel, // mark on account if Sieve is enabled 'data' => array( 'sieve' => $accObj->imapServer()->acc_sieve_enabled, @@ -201,40 +206,43 @@ class mail_tree } //List of folders $foldersList = $this->ui->mail_bo->getFolderArray(null, true); - $nameSpaces = $this->ui->mail_bo->_getNameSpaces(); + // Parent node arrays $parentNode = $parentNodes = array(); - foreach ($nameSpaces as &$nameSpace) + foreach ($foldersList as $index => $topFolder) { - list($index) = explode($nameSpace['delimiter'], $nameSpace['prefix']); - $parentNode = array( - tree::ID=>$_profileID.self::$delimiter.$foldersList[$index]['MAILBOX'], - tree::AUTOLOAD_CHILDREN => $fn_nodeHasChildren($foldersList[$index]), + tree::ID=>$_profileID.self::$delimiter.$topFolder[$index]['MAILBOX'], + tree::AUTOLOAD_CHILDREN => $fn_nodeHasChildren($topFolder[$index]), tree::CHILDREN =>array(), - tree::LABEL =>lang($foldersList[$index]['MAILBOX']), - tree::OPEN => 1, - tree::TOOLTIP => lang($foldersList[$index]['MAILBOX']), - tree::CHECKED => $node['SUBSCRIBED'] + tree::LABEL =>lang($topFolder[$index]['MAILBOX']), + tree::OPEN => $_openTopLevel, + tree::TOOLTIP => lang($topFolder[$index]['MAILBOX']), + tree::CHECKED => $topFolder[$index]['SUBSCRIBED'] ); if ($index === "INBOX") { - $parentNode[tree::IMAGE_LEAF] = self::$leafImages['folderLeaf']; - $parentNode[tree::IMAGE_FOLDER_OPEN] = self::$leafImages['folderOpen']; - $parentNode[tree::IMAGE_FOLDER_CLOSED] = self::$leafImages['folderClose']; + $parentNode[tree::IMAGE_LEAF] = self::$leafImages['folderHome']; + $parentNode[tree::IMAGE_FOLDER_OPEN] = self::$leafImages['folderHome']; + $parentNode[tree::IMAGE_FOLDER_CLOSED] = self::$leafImages['folderHome']; + } + if(stripos(array2string($topFolder[$index]['ATTRIBUTES']),'\noselect')!== false) + { + $parentNode[tree::IMAGE_LEAF] = self::$leafImages['folderNoSelectClosed']; + $parentNode[tree::IMAGE_FOLDER_OPEN] = self::$leafImages['folderNoSelectOpen']; + $parentNode[tree::IMAGE_FOLDER_CLOSED] = self::$leafImages['folderNoSelectClosed']; } // Save parentNodes $parentNodes []= $index; // Remove the parent nodes from the list - unset ($foldersList[$index]); + unset ($topFolder[$index]); //$parentNode[tree::CHILDREN][] =$childrenNode; $baseNode[tree::CHILDREN][] = $parentNode; } foreach ($parentNodes as $pIndex => $parent) { - $indxPattern = '/^'.$parent.'/'; $childrenNodes = $childNode = array(); $definedFolders = array( 'Trash' => $this->ui->mail_bo->getTrashFolder(false), @@ -244,12 +252,16 @@ class mail_tree 'Junk' => $this->ui->mail_bo->getJunkFolder(false), 'Outbox' => $this->ui->mail_bo->getOutboxFolder(false), ); - foreach ($foldersList as &$node) + // Iterate over childern of each top folder(namespaces) + foreach ($foldersList[$parent] as &$node) { + // Skipe the parent node itself + if (is_array($foldersList[$parent][$parent]) && + $foldersList[$parent][$parent]['MAILBOX'] === $node['MAILBOX']) continue; + $pathArr = explode($node['delimiter'], $node['MAILBOX']); $folderName = array_pop($pathArr); $parentPath = $_profileID.self::$delimiter.implode($pathArr,$node['delimiter']); - if (!preg_match($indxPattern, $node['MAILBOX'])) continue; $nodeId = $_profileID.self::$delimiter.$node['MAILBOX']; @@ -269,6 +281,12 @@ class mail_tree $childNode[tree::IMAGE_FOLDER_OPEN] = $childNode [tree::IMAGE_FOLDER_CLOSED] = "MailFolder".$folderName.".png"; } + elseif(stripos(array2string($node['ATTRIBUTES']),'\noselect')!== false) + { + $childNode[tree::IMAGE_LEAF] = self::$leafImages['folderNoSelectClosed']; + $childNode[tree::IMAGE_FOLDER_OPEN] = self::$leafImages['folderNoSelectOpen']; + $childNode[tree::IMAGE_FOLDER_CLOSED] = self::$leafImages['folderNoSelectClosed']; + } else { $childNode[tree::IMAGE_LEAF] = self::$leafImages['folderLeaf'];