* Mail: fixed sometimes not working (un)subscribe of mailboxes, added better diagnostic and automatic (de)select children

This commit is contained in:
Ralf Becker 2014-08-15 11:25:04 +00:00
parent 4a850f63d9
commit c1275309ab
9 changed files with 101 additions and 141 deletions

View File

@ -1020,7 +1020,7 @@ class emailadmin_imapbase
//error_log(__METHOD__.' ('.__LINE__.') '.array2string($_specialUseFolders));//.'<->'.array2string($this->icServer));
self::$specialUseFolders = $_specialUseFolders[$this->icServer->ImapServerId];
egw_cache::setCache(egw_cache::INSTANCE,'email','specialUseFolders'.trim($GLOBALS['egw_info']['user']['account_id']),$_specialUseFolders, $expiration=60*60*24*5);
return $_specialUseFolders[$this->icServer->ImapServerId];
return $_specialUseFolders[$this->icServer->ImapServerId];
}
/**
@ -2181,42 +2181,6 @@ class emailadmin_imapbase
return true;
}
/**
* subscribe: do the subscription or unsubscribe on a given folder
* returns a boolean on success or failure.
*
* @param string $_folderName
* @param boolean $_status subscribe on true, unsubscribe on false
* @return boolean
*/
function subscribe($_folderName, $_status)
{
if (self::$debug) error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName);
if($_status === true) {
try
{
$rv = $this->icServer->subscribeMailbox($_folderName);
}
catch (Exception $e)
{
error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName." failed:".$e->getMessage);
return false;
}
} else {
try
{
$rv = $this->icServer->subscribeMailbox($_folderName,false);
}
catch (Exception $e)
{
error_log(__METHOD__."::".($_status?"":"un")."subscribe:".$_folderName." failed:".$e->getMessage);
return false;
}
}
return true;
}
/**
* fetchUnSubscribedFolders: get unsubscribed IMAP folder list
*
@ -2634,7 +2598,7 @@ class emailadmin_imapbase
if(!$_subscribedOnly) {
#echo $folderName."->".$type."<br>";
#_debug_array($foldersNameSpace[$type]['subscribed']);
$folderObject->subscribed = in_array($folderName, $foldersNameSpace[$type]['subscribed']);
$folderObject->subscribed = in_array($folderName, (array)$foldersNameSpace[$type]['subscribed']);
}
if($_getCounters == true) {

View File

@ -818,6 +818,19 @@ var et2_tree = et2_inputWidget.extend(
}
},
/**
* Set state of node incl. it's children
*
* @param {string} _id id of node
* @param {boolean|string} _state or "toggle" to toggle state
*/
setSubChecked: function(_id, _state)
{
if (_state === "toggle") _state = !this.input.isItemChecked(_id);
this.input.setSubChecked(_id, _state);
},
/**
* Get URL relative to image_path option
*

View File

@ -230,87 +230,36 @@ class mail_ui
if (mail_bo::$debugTimes) mail_bo::logRunTimes($starttime,null,'',__METHOD__.__LINE__);
}
/**
* Subscribe or Unsubscribe to a folder
* also it is consider if the folder is valid to un/subscribe
*
* @param boolean $folderName subscribe if true and unsubscribe if false
* @param string $status folder name
*
* @example setSubscribe('INBOX', true) subscribe to folder INBOX
*
*/
function setSubscribe ($folderName,$status=true)
{
$validFolder = true;
$result = true;
$nameSpaces = $this->mail_bo->_getNameSpaces();
foreach($nameSpaces as &$value )
{
if (str_replace($value['delimiter'],"",$value['prefix']) == $folderName &&
$value['type'] == 'others' || $value['type'] == 'shared')
{
$validFolder = false;
}
}
if ($status && $validFolder)
{
try
{
$this->mail_bo->subscribe($folderName, $status);
} catch (Exception $e)
{
$result = false;
error_log(__METHOD__.__LINE__."() error ".$e->getMessage()." happend while subscribing to folder ". $folderName );
}
}
else if($validFolder)
{
try
{
$this->mail_bo->subscribe($folderName, $status);
} catch (Exception $e)
{
$result = false;
error_log(__METHOD__.__LINE__."() error ".$e->getMessage()." happend while unsubscribing of folder ". $folderName );
}
}
return $result;
}
/**
* Subscription popup window
*
* @param array $content
* @param type $msg
*/
function subscription(array $content=null ,$msg='')
function subscription(array $content=null ,$msg=null)
{
$stmpl = new etemplate_new('mail.subscribe');
$profileId = $_GET['acc_id'];
$allFolders = $this->mail_bo->getFolderObjects(false,false,false,false);
$sel_options['foldertree'] = $this->getFolderTree(false, $profileId,false,false);
if(is_array($content))
{
$profileId = $content['profileId'];
}
elseif (!($profileId = (int)$_GET['acc_id']))
{
egw_framework::window_close('Missing acc_id!');
}
$sel_options['foldertree'] = $this->getFolderTree(false, $profileId, false, false);
if (!is_array($content))
{
if ($profileId)
$content['foldertree'] = array();
$allFolders = $this->mail_bo->getFolderObjects(false,false,false,false);
foreach ($allFolders as $folder)
{
$content['foldertree'] = array();
$content['profileId'] = $profileId;
foreach ($allFolders as $folder)
$folderName = $profileId . self::$delimiter . $folder->folderName;
if ($folder->subscribed)
{
$folderName = $profileId . self::$delimiter . $folder->folderName;
if ($folder->subscribed)
{
array_push($content['foldertree'], $folderName);
}
array_push($content['foldertree'], $folderName);
}
}
}
@ -322,48 +271,65 @@ class mail_ui
case 'save':
case 'apply':
{
foreach ($allFolders as $folder)
// do not let user (un)subscribe namespace roots eg. "other", "user" or "INBOX", same for tree-root/account itself
$namespace_roots = array($profileId);
foreach($this->mail_bo->_getNameSpaces() as $namespace)
{
$folderName = $content['profileId'] . self::$delimiter . $folder->folderName;
if (!in_array($folderName, $content['foldertree']))
$namespace_roots[] = $profileId . self::$delimiter . str_replace($namespace['delimiter'], '', $namespace['prefix']);
}
error_log(__METHOD__."() namespace_roots=".array2string($namespace_roots));
$to_subscribe = array_diff($content['foldertree'], $content['current_subscribed'], $namespace_roots);
$to_unsubscribe = array_diff($content['current_subscribed'], $content['foldertree'], $namespace_roots);
foreach(array_merge($to_subscribe, $to_unsubscribe) as $mailbox)
{
$subscribe = in_array($mailbox, $to_subscribe);
list(,$mailbox) = explode(self::$delimiter, $mailbox); // remove profileId and delimiter
try {
$this->mail_bo->icServer->subscribeMailbox($mailbox, $subscribe);
}
catch (Exception $ex)
{
if($this->setSubscribe($folder->folderName, false))
$msg_type = 'error';
if ($subscribe)
{
$msg = lang('Subscription successfully saved!');
$msg .= lang('Failed to subscribe folder %1!', $mailbox).' '.$ex->getMessage();
}
else
{
$msg = lang('Subscription faild!');
$msg .= lang('Failed to unsubscribe folder %1!', $mailbox).' '.$ex->getMessage();
}
}
}
if (!isset($msg))
{
$msg_type = 'success';
if ($to_subscribe || $to_unsubscribe)
{
$msg = lang('Subscription successfully saved.');
}
else
{
if($this->setSubscribe($folder->folderName, true))
{
$msg = lang('Subscription successfully saved!');
}
else
{
$msg = lang('Subscription faild!');
}
$msg = lang('Nothing to change.');
}
}
// update foldertree in main window
$parentFolder='INBOX';
$refreshData = array(
$content['profileId'] => lang($parentFolder)
$profileId => lang($parentFolder)
);
// Send full info back in the response
$response = egw_json_response::get();
foreach($refreshData as $folder => &$name)
{
$name = $this->getFolderTree(true, $folder, true, true,false);
$name = $this->getFolderTree(true, $folder, true, true, false);
}
// give success/error message to opener and popup itself
$response->call('opener.app.mail.mail_reloadNode',$refreshData);
egw_framework::refresh_opener($msg, 'mail');
if ($button == 'apply') break;
egw_framework::refresh_opener($msg, 'mail', null, null, null, null, null, $msg_type);
if ($button == 'apply')
{
egw_framework::message($msg, $msg_type);
break;
}
}
case 'cancel':
{
@ -372,10 +338,10 @@ class mail_ui
}
}
$preserv['profileId'] = $content['profileId'];
$preserv['profileId'] = $profileId;
$preserv['current_subscribed'] = $content['foldertree'];
$readonlys = array();
$stmpl->exec('mail.mail_ui.subscription', $content,$sel_options,$readonlys,$preserv,2);
}

View File

@ -1068,7 +1068,7 @@ app.classes.mail = AppJS.extend(
// as jsonq is too fast wrap it to be delayed a bit, to ensure the folder actions
// are executed last of the queue
window.setTimeout(function() {
egw.jsonq('mail.mail_ui.ajax_setFolderStatus',[_folders], function (){self.unlock_tree()});
egw.jsonq('mail.mail_ui.ajax_setFolderStatus',[_folders], function (){self.unlock_tree();});
}, 100);
},
@ -1476,7 +1476,7 @@ app.classes.mail = AppJS.extend(
var self = this;
this.egw.message(this.egw.lang('empty trash'));
egw.json('mail.mail_ui.ajax_emptyTrash',[server[0], activeFilters['selectedFolder']? activeFilters['selectedFolder']:null],function(){self.unlock_tree()})
egw.json('mail.mail_ui.ajax_emptyTrash',[server[0], activeFilters['selectedFolder']? activeFilters['selectedFolder']:null],function(){self.unlock_tree();})
.sendRequest(true);
// Directly delete any trash cache for selected server
@ -3292,6 +3292,19 @@ app.classes.mail = AppJS.extend(
.sendRequest();
},
/**
* Onclick for node/foldername in subscription popup
*
* Used to (un)check node including all children
*
* @param {string} _id id of clicked node
* @param {et2_tree} _widget reference to tree widget
*/
subscribe_onclick: function(_id, _widget)
{
_widget.setSubChecked(_id, "toggle");
},
/**
* Edit a folder acl for account(s)
*

View File

@ -95,7 +95,7 @@ displaying plain messages is disabled mail de Die Anzeige von reinen Text E-Mail
do not auto create folders mail de Automatische Ordnererstellung verhindern für
do you really want to apply %1 to all messages in the current view? mail de Wollen Sie wirklich %1 auf alle Nachrichten in der aktuellen Ansicht anwenden?
do you really want to delete folder %1 ? mail de Wollen Sie den Ordner %1 wirklich löschen?
do you really want to mark ALL messages as read in the current folder? mail de Wollen Sie wirklich alle eMails im aktuellen Ordner als gelesen markieren?
do you really want to mark all messages as read in the current folder? mail de Wollen Sie wirklich alle eMails im aktuellen Ordner als gelesen markieren?
do you really want to toggle flag %1 for all messages in current view? mail de Wollen Sie wirklich den Wert für %1 für alle Nachrichten in der aktuellen Ansicht umschalten?
do you want to be asked for confirmation before attaching selected messages to new mail? mail de Möchten Sie vor dem Anhängen von einer oder mehreren (ausgewählten) E-Mails an eine neue E-Mail gefragt werden?
do you want to be asked for confirmation before moving selected messages to another folder? mail de Möchten Sie vor dem Verschieben von E-Mails in andere Ordner gefragt werden?
@ -147,6 +147,8 @@ failed to delete %1 ! reason: %2 mail de Löschen von %1 fehlgeschlagen! Grund:
failed to delete %1. server responded: mail de Löschen von %1 fehlgeschlagen! Grund: %2
failed to move %1 ! reason: %2 mail de Verschieben von %1 fehlgeschlagen! Grund: %2
failed to rename %1 ! reason: %2 mail de Umbenenne zu %1 fehlgeschlagen! Grund: %2
failed to subscribe folder %1! mail de Fehler beim Abonnieren des Folders %1!
failed to unsubscribe folder %1! mail de Fehler beim Abbestellen des Folders %1!
file into mail de verschiebe nach
file into: mail de verschieben nach:
file rejected, no %2. is:%1 mail de Datei abgelehnt; die vorliegende Datei ist nicht vom Typ %2. Sie ist vom Typ %1
@ -271,6 +273,7 @@ no text body supplied, check attachments for message text mail de Keine Text vor
no valid %1 folder configured! mail de Kein gültiger %1 Ordner eingestellt!
non mail de Kein
none, create all mail de keine, erstellt alle
nothing to change. mail de Nichts zu Ändern.
notify about new mail in this folders mail de Über neue Mails in diesem Ordner benachrichtigen
notify when new mails arrive in these folders mail de Benachrichtigung, sobald neue E-Mails in den folgenden Ordnern ankommen
on mail de am
@ -392,9 +395,8 @@ subject(a->z) mail de Betreff (A->Z)
subject(z->a) mail de Betreff (Z->A)
subscribe folder mail de Abonnieren
subscribe folder ... mail de Ordner abonieren ...
subscription faild! mail de Das Abonnieren ist fehlgeschlagen.
subscription folders mail de Ordner Abonieren
subscription successfully saved! mail de Das Abonnieren der Ordner wurde erfolgreich gespeichert.
subscription successfully saved. mail de Das Abonnieren der Ordner wurde erfolgreich gespeichert.
successfully connected mail de erfolgreich verbunden
template folder mail de Vorlagen Ordner
templates mail de Vorlagen

View File

@ -95,7 +95,7 @@ displaying plain messages is disabled mail en displaying plain messages is disab
do not auto create folders mail en do not auto create folders
do you really want to apply %1 to all messages in the current view? mail en Do you really want to apply %1 to ALL messages in the current view?
do you really want to delete folder %1 ? mail en Do you really want to DELETE Folder %1 ?
do you really want to mark ALL messages as read in the current folder? mail en Do you really want to mark ALL messages as read in the current folder?
do you really want to mark all messages as read in the current folder? mail en Do you really want to mark ALL messages as read in the current folder?
do you really want to toggle flag %1 for all messages in current view? mail en Do you really want to toggle flag %1 for ALL messages in current view?
do you want to be asked for confirmation before attaching selected messages to new mail? mail en Do you want to be asked for confirmation before attaching selected messages to new mail?
do you want to be asked for confirmation before moving selected messages to another folder? mail en Do you want to be asked for confirmation before moving selected messages to another folder?
@ -147,6 +147,8 @@ failed to delete %1 ! reason: %2 mail en failed to delete %1 ! Reason: %2
failed to delete %1. server responded: mail en Failed to delete %1. Server responded:
failed to move %1 ! reason: %2 mail en failed to move %1 ! Reason: %2
failed to rename %1 ! reason: %2 mail en failed to rename %1 ! Reason: %2
failed to subscribe folder %1! mail en Failed to subscribe folder %1!
failed to unsubscribe folder %1! mail en Failed to unsubscribe folder %1!
file into mail en file into
file into: mail en File into:
file rejected, no %2. is:%1 mail en File rejected, no %2. Is:%1
@ -271,6 +273,7 @@ no text body supplied, check attachments for message text mail en no text body s
no valid %1 folder configured! mail en No valid %1 folder configured!
non mail en Non
none, create all mail en none, create all
nothing to change. mail en Nothing to change.
notify about new mail in this folders mail en Notify about new mail in this folders
notify when new mails arrive in these folders mail en notify when new mails arrive in these folders
on mail en on
@ -392,9 +395,8 @@ subject(a->z) mail en subject(A->Z)
subject(z->a) mail en subject(Z->A)
subscribe folder mail en Subscribe folder
subscribe folder ... mail en Subscribe folder ...
subscription faild! mail en Subscription faild!
subscription folders mail en Subscription folders
subscription successfully saved! mail en Subscription successfully saved!
subscription successfully saved. mail en Subscription successfully saved.
successfully connected mail en Successfully connected
template folder mail en template folder
templates mail en Templates

View File

@ -380,7 +380,7 @@ subscribe folder mail it Sottoscrivi cartella
subscribe folder ... mail it Sottoscrivi cartella...
subscription faild! mail it Sottoscrizione fallita!
subscription folders mail it Cartelle da sottoscrivere
subscription successfully saved! mail it Sottoscrizione salvata corretamente!
subscription successfully saved. mail it Sottoscrizione salvata corretamente.
successfully connected mail it Connesso con successo
template folder mail it Cartella dei modelli
templates mail it Modelli

View File

@ -341,7 +341,7 @@ subscribe folder mail pt Assinar pasta
subscribe folder ... mail pt Assinar pasta ...
subscription faild! mail pt Faild Assinatura!
subscription folders mail pt Pastas de Subscrição
subscription successfully saved! mail pt Assinatura salvo com sucesso!
subscription successfully saved. mail pt Assinatura salvo com sucesso.
successfully connected mail pt Conectado com sucesso
template folder mail pt pasta de modelo
templates mail pt Templates

View File

@ -12,7 +12,7 @@
</row>
<row>
<box scrolling="auto">
<tree id="foldertree" onclick="" multiple="true"/>
<tree id="foldertree" onclick="app.mail.subscribe_onclick" multiple="true"/>
</box>
</row>
</rows>
@ -20,7 +20,7 @@
<hbox class="dialogFooterToolbar">
<button statustext="Saves subscription changes" label="Save" id="button[save]"/>
<button statustext="Applies the changes made" label="Apply" id="button[apply]"/>
<button label="Cancel" id="button[cancel]"/>
<button label="Cancel" id="button[cancel]" onclick="window.close()"/>
</hbox>
</template>
</overlay>