mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-26 16:49:10 +01:00
implement delete folder with subfolders; fix encoding issue when creating folders with umlauts
This commit is contained in:
parent
f1f9fd45a9
commit
d3a2dff6a9
@ -1648,8 +1648,8 @@ class mail_bo
|
|||||||
function createFolder($_parent, $_folderName, $_subscribe=false)
|
function createFolder($_parent, $_folderName, $_subscribe=false)
|
||||||
{
|
{
|
||||||
if (self::$debug) error_log(__METHOD__.__LINE__."->"."$_parent, $_folderName, $_subscribe");
|
if (self::$debug) error_log(__METHOD__.__LINE__."->"."$_parent, $_folderName, $_subscribe");
|
||||||
$parent = $this->_encodeFolderName($_parent);
|
$parent = $_parent;//$this->_encodeFolderName($_parent);
|
||||||
$folderName = $this->_encodeFolderName($_folderName);
|
$folderName = $_folderName;//$this->_encodeFolderName($_folderName);
|
||||||
|
|
||||||
if(empty($parent)) {
|
if(empty($parent)) {
|
||||||
$newFolderName = $folderName;
|
$newFolderName = $folderName;
|
||||||
@ -1718,13 +1718,15 @@ class mail_bo
|
|||||||
*/
|
*/
|
||||||
function deleteFolder($_folderName)
|
function deleteFolder($_folderName)
|
||||||
{
|
{
|
||||||
$folderName = $this->_encodeFolderName($_folderName);
|
//$folderName = $this->_encodeFolderName($_folderName);
|
||||||
|
try
|
||||||
$this->icServer->subscribeMailbox($folderName,false);
|
{
|
||||||
$rv = $this->icServer->deleteMailbox($folderName);
|
$this->icServer->subscribeMailbox($_folderName,false);
|
||||||
if ( PEAR::isError($rv) ) {
|
$this->icServer->deleteMailbox($_folderName);
|
||||||
if (self::$debug) error_log(__METHOD__." failed for $folderName with error: ".print_r($rv->message,true));
|
}
|
||||||
return $rv;
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
throw new egw_exception("Deleting Folder $_foldername failed! Error:".$e->getMessage());;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1734,15 +1736,23 @@ class mail_bo
|
|||||||
{
|
{
|
||||||
if (self::$debug) error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName);
|
if (self::$debug) error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName);
|
||||||
if($_status === true) {
|
if($_status === true) {
|
||||||
|
try
|
||||||
|
{
|
||||||
$rv = $this->icServer->subscribeMailbox($_folderName);
|
$rv = $this->icServer->subscribeMailbox($_folderName);
|
||||||
if ( PEAR::isError($rv)) {
|
}
|
||||||
error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName." failed:".$rv->message);
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName." failed:".$e->getMessage);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
try
|
||||||
|
{
|
||||||
$rv = $this->icServer->subscribeMailbox($_folderName,false);
|
$rv = $this->icServer->subscribeMailbox($_folderName,false);
|
||||||
if ( PEAR::isError($rv)) {
|
}
|
||||||
error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName." failed:".$rv->message);
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName." failed:".$e->getMessage);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1774,7 +1784,7 @@ class mail_bo
|
|||||||
if (is_null($folders2return)) $folders2return = egw_cache::getCache(egw_cache::INSTANCE,'email','folderObjects'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
|
if (is_null($folders2return)) $folders2return = egw_cache::getCache(egw_cache::INSTANCE,'email','folderObjects'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
|
||||||
if ($_useCacheIfPossible && isset($folders2return[$this->icServer->ImapServerId]) && !empty($folders2return[$this->icServer->ImapServerId]))
|
if ($_useCacheIfPossible && isset($folders2return[$this->icServer->ImapServerId]) && !empty($folders2return[$this->icServer->ImapServerId]))
|
||||||
{
|
{
|
||||||
//error_log(__METHOD__.__LINE__.' using Cached folderObjects');
|
//error_log(__METHOD__.__LINE__.' using Cached folderObjects'.array2string($folders2return[$this->icServer->ImapServerId]));
|
||||||
return $folders2return[$this->icServer->ImapServerId];
|
return $folders2return[$this->icServer->ImapServerId];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1881,15 +1891,12 @@ class mail_bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( PEAR::isError($allMailboxesExt) ) {
|
|
||||||
#echo __METHOD__;_debug_array($allMailboxesExt);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$allMailBoxesExtSorted = array();
|
$allMailBoxesExtSorted = array();
|
||||||
if (!is_array($allMailboxesExt))
|
if (!is_array($allMailboxesExt))
|
||||||
{
|
{
|
||||||
error_log(__METHOD__.__LINE__.' Expected Array but got:'.array2string($allMailboxesExt));
|
//error_log(__METHOD__.__LINE__.' Expected Array but got:'.array2string($allMailboxesExt). 'Type:'.$type.' Prefix:'.$foldersNameSpace[$type]['prefix']);
|
||||||
$allMailboxesExt=array();
|
continue;
|
||||||
|
//$allMailboxesExt=array();
|
||||||
}
|
}
|
||||||
foreach ($allMailboxesExt as $mbx) {
|
foreach ($allMailboxesExt as $mbx) {
|
||||||
//echo __METHOD__;_debug_array($mbx);
|
//echo __METHOD__;_debug_array($mbx);
|
||||||
|
@ -193,6 +193,10 @@ class mail_ui
|
|||||||
$this->mail_bo->reopen($sessionFolder); // needed to fetch full set of capabilities
|
$this->mail_bo->reopen($sessionFolder); // needed to fetch full set of capabilities
|
||||||
//$toSchema = $this->mail_bo->isDraftFolder($sessionFolder)||$this->mail_bo->isSentFolder($sessionFolder)||$this->mail_bo->isTemplateFolder($sessionFolder);
|
//$toSchema = $this->mail_bo->isDraftFolder($sessionFolder)||$this->mail_bo->isSentFolder($sessionFolder)||$this->mail_bo->isTemplateFolder($sessionFolder);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sessionFolder = $this->mail_bo->sessionData['mailbox'] = 'INBOX';
|
||||||
|
}
|
||||||
//error_log(__METHOD__.__LINE__.' SessionFolder:'.$sessionFolder.' isToSchema:'.$toSchema);
|
//error_log(__METHOD__.__LINE__.' SessionFolder:'.$sessionFolder.' isToSchema:'.$toSchema);
|
||||||
//_debug_array($content);
|
//_debug_array($content);
|
||||||
if (!is_array($content))
|
if (!is_array($content))
|
||||||
@ -1152,13 +1156,16 @@ unset($query['actions']);
|
|||||||
}
|
}
|
||||||
//save selected Folder to sessionData (mailbox)->currentFolder
|
//save selected Folder to sessionData (mailbox)->currentFolder
|
||||||
if (isset($query['selectedFolder'])) $this->mail_bo->sessionData['mailbox']=$_folderName;
|
if (isset($query['selectedFolder'])) $this->mail_bo->sessionData['mailbox']=$_folderName;
|
||||||
$this->mail_bo->saveSessionData();
|
|
||||||
$toSchema = false;//decides to select list schema with column to selected (if false fromaddress is default)
|
$toSchema = false;//decides to select list schema with column to selected (if false fromaddress is default)
|
||||||
if ($this->mail_bo->folderExists($_folderName))
|
if ($this->mail_bo->folderExists($_folderName))
|
||||||
{
|
{
|
||||||
$toSchema = $this->mail_bo->isDraftFolder($_folderName)||$this->mail_bo->isSentFolder($_folderName)||$this->mail_bo->isTemplateFolder($_folderName);
|
$toSchema = $this->mail_bo->isDraftFolder($_folderName)||$this->mail_bo->isSentFolder($_folderName)||$this->mail_bo->isTemplateFolder($_folderName);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$query['selectedFolder']=$this->mail_bo->sessionData['mailbox']=$_folderName='INBOX';
|
||||||
|
}
|
||||||
|
$this->mail_bo->saveSessionData();
|
||||||
$rowsFetched['messages'] = null;
|
$rowsFetched['messages'] = null;
|
||||||
$offset = $query['start']+1; // we always start with 1
|
$offset = $query['start']+1; // we always start with 1
|
||||||
$maxMessages = $query['num_rows'];
|
$maxMessages = $query['num_rows'];
|
||||||
@ -3172,7 +3179,8 @@ blockquote[type=cite] {
|
|||||||
{
|
{
|
||||||
$created = false;
|
$created = false;
|
||||||
$decodedFolderName = $this->mail_bo->decodeEntityFolderName($_parentFolderName);
|
$decodedFolderName = $this->mail_bo->decodeEntityFolderName($_parentFolderName);
|
||||||
$_newName = translation::convert($this->mail_bo->decodeEntityFolderName($_newName), $this->charset, 'UTF7-IMAP');
|
//the conversion is handeled by horde, frontend interaction is all utf-8
|
||||||
|
$_newName = $this->mail_bo->decodeEntityFolderName($_newName);//translation::convert($this->mail_bo->decodeEntityFolderName($_newName), $this->charset, 'UTF7-IMAP');
|
||||||
$del = $this->mail_bo->getHierarchyDelimiter(false);
|
$del = $this->mail_bo->getHierarchyDelimiter(false);
|
||||||
list($profileID,$parentFolderName) = explode(self::$delimiter,$decodedFolderName,2);
|
list($profileID,$parentFolderName) = explode(self::$delimiter,$decodedFolderName,2);
|
||||||
if (is_numeric($profileID))
|
if (is_numeric($profileID))
|
||||||
@ -3366,25 +3374,58 @@ blockquote[type=cite] {
|
|||||||
{
|
{
|
||||||
//error_log(__METHOD__.__LINE__."$folderName, $parentFolder, $_newName");
|
//error_log(__METHOD__.__LINE__."$folderName, $parentFolder, $_newName");
|
||||||
$oA = array();
|
$oA = array();
|
||||||
|
$subFolders = array();
|
||||||
$oldFolderInfo = $this->mail_bo->getFolderStatus($folderName,false);
|
$oldFolderInfo = $this->mail_bo->getFolderStatus($folderName,false);
|
||||||
//error_log(__METHOD__.__LINE__.array2string($oldFolderInfo));
|
//error_log(__METHOD__.__LINE__.array2string($oldFolderInfo));
|
||||||
if (!empty($oldFolderInfo['attributes']) && stripos(array2string($oldFolderInfo['attributes']),'\hasnochildren')=== false)
|
if (!empty($oldFolderInfo['attributes']) && stripos(array2string($oldFolderInfo['attributes']),'\hasnochildren')=== false)
|
||||||
{
|
{
|
||||||
$hasChildren=true; // translates to: hasChildren -> dynamicLoading
|
$hasChildren=true; // translates to: hasChildren -> dynamicLoading
|
||||||
$msg = lang("refused to delete folder with subfolders");
|
//$msg = lang("refused to delete folder with subfolders");
|
||||||
|
$delimiter = $this->mail_bo->getHierarchyDelimiter();
|
||||||
|
$nameSpace = $this->mail_bo->_getNameSpaces();
|
||||||
|
$prefix = $this->mail_bo->getFolderPrefixFromNamespace($nameSpace, $folderName);
|
||||||
|
//error_log(__METHOD__.__LINE__.'->'."$_folderName, $delimiter, $prefix");
|
||||||
|
$subFolders = $this->mail_bo->getMailBoxesRecursive($folderName, $delimiter, $prefix);
|
||||||
|
//error_log(__METHOD__.__LINE__.'->'."$folderName, $delimiter, $prefix");
|
||||||
|
foreach ($subFolders as $k => $f)
|
||||||
|
{
|
||||||
|
if (!isset($ftD[substr_count($f,$delimiter)])) $ftD[substr_count($f,$delimiter)]=array();
|
||||||
|
$ftD[substr_count($f,$delimiter)][]=$f;
|
||||||
}
|
}
|
||||||
else
|
krsort($ftD,SORT_NUMERIC);//sort per level
|
||||||
|
//we iterate per level of depth of the subtree, deepest nesting is to be deleted first, and then up the tree
|
||||||
|
foreach($ftD as $k => $lc)//collection per level
|
||||||
{
|
{
|
||||||
$success = $this->mail_bo->deleteFolder($folderName);
|
foreach($lc as $i => $f)//folders contained in that level
|
||||||
if (PEAR::isError($success))
|
|
||||||
{
|
{
|
||||||
$msg = $success->message;
|
try
|
||||||
|
{
|
||||||
|
//error_log(__METHOD__.__LINE__.array2string($f).'<->'.$folderName);
|
||||||
|
$this->mail_bo->deleteFolder($f);
|
||||||
|
$success = true;
|
||||||
|
if ($f==$folderName) $oA[$_folderName] = $oldFolderInfo['shortDisplayName'];
|
||||||
|
}
|
||||||
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
$msg .= ($msg?' ':'').lang("Failed to delete %1. Server responded:",$f).$e->getMessage();
|
||||||
$success = false;
|
$success = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$this->mail_bo->deleteFolder($folderName);
|
||||||
|
$success = true;
|
||||||
$oA[$_folderName] = $oldFolderInfo['shortDisplayName'];
|
$oA[$_folderName] = $oldFolderInfo['shortDisplayName'];
|
||||||
}
|
}
|
||||||
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
$msg = $e->getMessage();
|
||||||
|
$success = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3395,6 +3436,19 @@ blockquote[type=cite] {
|
|||||||
$response = egw_json_response::get();
|
$response = egw_json_response::get();
|
||||||
if ($success)
|
if ($success)
|
||||||
{
|
{
|
||||||
|
$folders2return = egw_cache::getCache(egw_cache::INSTANCE,'email','folderObjects'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
|
||||||
|
if (isset($folders2return[$this->mail_bo->profileID]))
|
||||||
|
{
|
||||||
|
//error_log(__METHOD__.__LINE__.array2string($folders2return[$this->mail_bo->profileID]));
|
||||||
|
if (empty($subFolders)) $subFolders = array($folderName);
|
||||||
|
//error_log(__METHOD__.__LINE__.array2string($subFolders));
|
||||||
|
foreach($subFolders as $i => $f)
|
||||||
|
{
|
||||||
|
//error_log(__METHOD__.__LINE__.$f.'->'.array2string($folders2return[$this->mail_bo->profileID][$f]));
|
||||||
|
if (isset($folders2return[$this->mail_bo->profileID][$f])) unset($folders2return[$this->mail_bo->profileID][$f]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
egw_cache::setCache(egw_cache::INSTANCE,'email','folderObjects'.trim($GLOBALS['egw_info']['user']['account_id']),$folders2return, $expiration=60*60*1);
|
||||||
//error_log(__METHOD__.__LINE__.array2string($oA));
|
//error_log(__METHOD__.__LINE__.array2string($oA));
|
||||||
$response->call('app.mail.mail_removeLeaf',$oA,'mail');
|
$response->call('app.mail.mail_removeLeaf',$oA,'mail');
|
||||||
}
|
}
|
||||||
@ -3412,6 +3466,7 @@ blockquote[type=cite] {
|
|||||||
*/
|
*/
|
||||||
function ajax_changeProfile($icServerID)
|
function ajax_changeProfile($icServerID)
|
||||||
{
|
{
|
||||||
|
//lang('Connect to Profile %1',$icServerID);
|
||||||
if ($icServerID && $icServerID != $this->mail_bo->profileID)
|
if ($icServerID && $icServerID != $this->mail_bo->profileID)
|
||||||
{
|
{
|
||||||
//error_log(__METHOD__.__LINE__.' change Profile to ->'.$icServerID);
|
//error_log(__METHOD__.__LINE__.' change Profile to ->'.$icServerID);
|
||||||
|
@ -997,6 +997,7 @@ app.classes.mail = AppJS.extend(
|
|||||||
*/
|
*/
|
||||||
mail_changeProfile: function(folder,_widget) {
|
mail_changeProfile: function(folder,_widget) {
|
||||||
// alert(folder);
|
// alert(folder);
|
||||||
|
egw_message(this.egw.lang('Connect to Profile %1',_widget.getSelectedLabel()));
|
||||||
egw.json('mail.mail_ui.ajax_changeProfile',[folder])
|
egw.json('mail.mail_ui.ajax_changeProfile',[folder])
|
||||||
.sendRequest();
|
.sendRequest();
|
||||||
|
|
||||||
@ -1013,11 +1014,13 @@ app.classes.mail = AppJS.extend(
|
|||||||
var server = folder.split('::');
|
var server = folder.split('::');
|
||||||
app.mail.app_refresh(this.egw.lang('change folder')+'...', 'mail');
|
app.mail.app_refresh(this.egw.lang('change folder')+'...', 'mail');
|
||||||
var img = _widget.getSelectedNode().images[0]; // fetch first image
|
var img = _widget.getSelectedNode().images[0]; // fetch first image
|
||||||
|
var profileChange = false;
|
||||||
if (!(img.search(eval('/'+'NoSelect'+'/'))<0) || !(img.search(eval('/'+'thunderbird'+'/'))<0))
|
if (!(img.search(eval('/'+'NoSelect'+'/'))<0) || !(img.search(eval('/'+'thunderbird'+'/'))<0))
|
||||||
{
|
{
|
||||||
if (!(img.search(eval('/'+'thunderbird'+'/'))<0))
|
if (!(img.search(eval('/'+'thunderbird'+'/'))<0))
|
||||||
{
|
{
|
||||||
rv = this.mail_changeProfile(folder,_widget);
|
rv = this.mail_changeProfile(folder,_widget);
|
||||||
|
profileChange = true;
|
||||||
}
|
}
|
||||||
else if (_widget.event_args.length==2)
|
else if (_widget.event_args.length==2)
|
||||||
{
|
{
|
||||||
@ -1050,7 +1053,7 @@ app.classes.mail = AppJS.extend(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
myMsg = (displayname?displayname:folder)+' '+this.egw.lang('selected');
|
myMsg = (displayname?displayname:folder)+' '+this.egw.lang('selected');
|
||||||
egw_message(myMsg);
|
if (profileChange == false) egw_message(myMsg);
|
||||||
|
|
||||||
//mail_refreshMessageGrid();// its done in refreshFolderStatus already
|
//mail_refreshMessageGrid();// its done in refreshFolderStatus already
|
||||||
this.mail_refreshFolderStatus(folder,'forced');
|
this.mail_refreshFolderStatus(folder,'forced');
|
||||||
@ -1850,14 +1853,30 @@ app.classes.mail = AppJS.extend(
|
|||||||
OldFolderName = OldFolderName.trim();
|
OldFolderName = OldFolderName.trim();
|
||||||
OldFolderName = OldFolderName.replace(/\([0-9]*\)/g,'').trim();
|
OldFolderName = OldFolderName.replace(/\([0-9]*\)/g,'').trim();
|
||||||
//console.log(OldFolderName);
|
//console.log(OldFolderName);
|
||||||
reallyDelete = confirm(this.egw.lang("Do you really want to DELETE Folder %1 ?",OldFolderName)+" \r\n"+(ftree.hasChildren(_senders[0].iface.id)?this.egw.lang("All subfolders will be deleted too, and all messages in all affected folders will be lost"):this.egw.lang("All messages in the folder will be lost")));
|
var buttons = [
|
||||||
if (reallyDelete)
|
{text: this.egw.lang("Yes"), id: "delete", class: "ui-priority-primary", "default": true},
|
||||||
|
{text: this.egw.lang("Cancel"), id:"cancel"},
|
||||||
|
];
|
||||||
|
var dialog = et2_dialog.show_dialog(function(_button_id, _value) {
|
||||||
|
var senders = this.my_data.data;
|
||||||
|
switch (_button_id)
|
||||||
{
|
{
|
||||||
app.mail.app_refresh(this.egw.lang("Deleting Folder %1",OldFolderName, 'mail'));
|
case "delete":
|
||||||
egw.json('mail.mail_ui.ajax_deleteFolder',[_senders[0].iface.id])
|
egw.json('mail.mail_ui.ajax_deleteFolder',[senders[0].iface.id])
|
||||||
.sendRequest(true);
|
.sendRequest(true);
|
||||||
|
return;
|
||||||
|
case "cancel":
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
this.egw.lang("Do you really want to DELETE Folder %1 ?",OldFolderName)+" "+(ftree.hasChildren(_senders[0].iface.id)?this.egw.lang("All subfolders will be deleted too, and all messages in all affected folders will be lost"):this.egw.lang("All messages in the folder will be lost")),
|
||||||
|
this.egw.lang("DELETE Folder %1 ?",OldFolderName),
|
||||||
|
OldFolderName, buttons);
|
||||||
|
// setting required data for callback in as my_data
|
||||||
|
dialog.my_data = {
|
||||||
|
data: _senders,
|
||||||
|
};
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send names of uploaded files (again) to server, to process them: either copy to vfs or ask overwrite/rename
|
* Send names of uploaded files (again) to server, to process them: either copy to vfs or ask overwrite/rename
|
||||||
|
Loading…
Reference in New Issue
Block a user