mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-08 00:54:15 +01:00
* Mail: detect and handle actions on ALL-messages for setting and removing flags and lables for the mailbox we operate on
This commit is contained in:
parent
577e336b0e
commit
30ae5f1b81
@ -4302,24 +4302,116 @@ $this->partID = $partID;
|
||||
function ajax_flagMessages($_flag, $_messageList, $_sendJsonResponse=true)
|
||||
{
|
||||
if(mail_bo::$debug) error_log(__METHOD__."->".$_flag.':'.array2string($_messageList));
|
||||
$alreadyFlagged=false;
|
||||
if ($_messageList=='all' || !empty($_messageList['msg']))
|
||||
{
|
||||
if ($_messageList=='all')
|
||||
if (isset($_messageList['all']) && $_messageList['all'])
|
||||
{
|
||||
// we have no folder information
|
||||
$folder=null;
|
||||
// we have both messageIds AND allFlag folder information
|
||||
$uidA = self::splitRowID($_messageList['msg'][0]);
|
||||
$folder = $uidA['folder']; // all messages in one set are supposed to be within the same folder
|
||||
if (isset($_messageList['activeFilters']) && $_messageList['activeFilters'])
|
||||
{
|
||||
$query = $_messageList['activeFilters'];
|
||||
if (!empty($query['search']) || !empty($query['filter']))
|
||||
{
|
||||
//([filterName] => Schnellsuche[type] => quick[string] => ebay[status] => any
|
||||
if (is_null(emailadmin_imapbase::$supportsORinQuery) || !isset(emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]))
|
||||
{
|
||||
emailadmin_imapbase::$supportsORinQuery = egw_cache::getCache(egw_cache::INSTANCE,'email','supportsORinQuery'.trim($GLOBALS['egw_info']['user']['account_id']), null, array(), 60*60*10);
|
||||
if (!isset(emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID])) emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]=true;
|
||||
}
|
||||
$filter = $filter2toggle = array('filterName' => (emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]?lang('quicksearch'):lang('subject')),'type' => ($query['filter2']?$query['filter2']:(emailadmin_imapbase::$supportsORinQuery[$this->mail_bo->profileID]?'quick':'subject')),'string' => $query['search'],'status' => 'any');
|
||||
}
|
||||
else
|
||||
{
|
||||
$filter = $filter2toggle = array();
|
||||
}
|
||||
// flags read,flagged,label1,label2,label3,label4,label5 can be toggled: handle this when all mails in a folder
|
||||
// should be affected serverside. here.
|
||||
$messageList = $messageListForToggle = array();
|
||||
if (in_array($_flag,array('read','flagged','label1','label2','label3','label4','label5')))
|
||||
{
|
||||
$filter2toggle['status'] = array('un'.$_flag);
|
||||
if ($query['filter'])
|
||||
{
|
||||
$filter2toggle['status'][] = $query['filter'];
|
||||
}
|
||||
$_sR = $this->mail_bo->getSortedList(
|
||||
$folder,
|
||||
$sort=0,
|
||||
$reverse=1,
|
||||
$filter2toggle,
|
||||
$rByUid=true,
|
||||
false
|
||||
);
|
||||
$messageListForToggle = $_sR['match']->ids;
|
||||
$filter['status'] = array($_flag);
|
||||
if ($query['filter'])
|
||||
{
|
||||
$filter['status'][] = $query['filter'];
|
||||
}
|
||||
$_sR = $this->mail_bo->getSortedList(
|
||||
$folder,
|
||||
$sort=0,
|
||||
$reverse=1,
|
||||
$filter,
|
||||
$rByUid=true,
|
||||
false
|
||||
);
|
||||
$messageList = $_sR['match']->ids;
|
||||
if (count($messageListForToggle)>0)
|
||||
{
|
||||
$flag2set = (strtolower($_flag));
|
||||
//error_log(__METHOD__.__LINE__." toggle un$_flag -> $flag2set ".array2string($filter2toggle).array2string($messageListForToggle));
|
||||
$this->mail_bo->flagMessages($flag2set, $messageListForToggle,$folder);
|
||||
}
|
||||
if (count($messageList)>0)
|
||||
{
|
||||
$flag2set = 'un'.$_flag;
|
||||
//error_log(__METHOD__.__LINE__." $_flag -> $flag2set ".array2string($filter).array2string($messageList));
|
||||
$this->mail_bo->flagMessages($flag2set, $messageList,$folder);
|
||||
}
|
||||
$alreadyFlagged=true;
|
||||
//unset($_messageList['all']);
|
||||
}
|
||||
elseif (!in_array($_flag,array('read','flagged','label1','label2','label3','label4','label5')) && !empty($filter))
|
||||
{
|
||||
$_sR = $this->mail_bo->getSortedList(
|
||||
$folder,
|
||||
$sort=0,
|
||||
$reverse=1,
|
||||
$filter,
|
||||
$rByUid=true,
|
||||
false
|
||||
);
|
||||
$messageList = $_sR['match']->ids;
|
||||
unset($_messageList['all']);
|
||||
$_messageList['msg'] = array();
|
||||
}
|
||||
else
|
||||
{
|
||||
$alreadyFlagged=true;
|
||||
$uidA = self::splitRowID($_messageList['msg'][0]);
|
||||
$folder = $uidA['folder']; // all messages in one set are supposed to be within the same folder
|
||||
$this->mail_bo->flagMessages($_flag, 'all', $folder);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$uidA = self::splitRowID($_messageList['msg'][0]);
|
||||
$folder = $uidA['folder']; // all messages in one set are supposed to be within the same folder
|
||||
}
|
||||
foreach($_messageList['msg'] as $rowID)
|
||||
if (!$alreadyFlagged)
|
||||
{
|
||||
$hA = self::splitRowID($rowID);
|
||||
$messageList[] = $hA['msgUID'];
|
||||
foreach($_messageList['msg'] as $rowID)
|
||||
{
|
||||
$hA = self::splitRowID($rowID);
|
||||
$messageList[] = $hA['msgUID'];
|
||||
}
|
||||
$this->mail_bo->flagMessages($_flag, ((isset($_messageList['all']) && $_messageList['all']) ? 'all':$messageList),$folder);
|
||||
}
|
||||
$this->mail_bo->flagMessages($_flag, ($_messageList=='all' ? 'all':$messageList),$folder);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4337,7 +4429,7 @@ $this->partID = $partID;
|
||||
if ($_sendJsonResponse)
|
||||
{
|
||||
$response = egw_json_response::get();
|
||||
$response->call('egw_message',lang('flagged %1 messages as %2 in %3',count($_messageList['msg']),lang($_flag),$folder));
|
||||
$response->call('egw_message',lang('flagged %1 messages as %2 in %3',(isset($_messageList['all']) && $_messageList['all']?lang('all'):count($_messageList['msg'])),lang($_flag),$folder));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,7 +214,9 @@ app.classes.mail = AppJS.extend(
|
||||
case 'edit':
|
||||
if (node) // we dont care for updated accounts not shown (eg. other users)
|
||||
{
|
||||
tree.refreshItem(_id);
|
||||
//tree.refreshItem(_id);
|
||||
egw.json('mail.mail_ui.ajax_reloadNode',[_id])
|
||||
.sendRequest(true);
|
||||
}
|
||||
break;
|
||||
case 'add':
|
||||
@ -1522,6 +1524,64 @@ app.classes.mail = AppJS.extend(
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* mail_checkAllSelected
|
||||
*
|
||||
* @param _action
|
||||
* @return boolean
|
||||
*/
|
||||
mail_checkAllSelected: function(_action, _confirm)
|
||||
{
|
||||
if (typeof _confirm == 'undefiend') _confirm = false;
|
||||
var obj_manager = egw_getObjectManager(_action.getManager().id, false);
|
||||
if (obj_manager && obj_manager.getAllSelected())
|
||||
{
|
||||
if (_confirm)
|
||||
{
|
||||
/* var buttons = [
|
||||
{text: this.egw.lang("Yes"), id: "all", class: "ui-priority-primary", "default": true},
|
||||
{text: this.egw.lang("Cancel"), id:"cancel"}
|
||||
];
|
||||
et2_dialog.show_dialog(function(_button_id, _value) {
|
||||
switch (_button_id)
|
||||
{
|
||||
case "all":
|
||||
return true;
|
||||
case "cancel":
|
||||
return false;
|
||||
}
|
||||
},
|
||||
this.egw.lang("Do you really want to apply %1 to ALL messages in the current folder?",this.egw.lang(_action.id))+" ",
|
||||
this.egw.lang("Confirm"),
|
||||
_action.id, buttons);
|
||||
*/
|
||||
return confirm(this.egw.lang("Do you really want to apply/toggle %1 to ALL messages in the current folder?\n %2: All (filtered) mesages, will be affected.\n %3: only the selected range will be affected ",this.egw.lang(_action.id),this.egw.lang('ok'),this.egw.lang('cancel')));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* mail_getActiveFilters
|
||||
*
|
||||
* @param _action
|
||||
* @return mixed boolean/activeFilters object
|
||||
*/
|
||||
mail_getActiveFilters: function(_action)
|
||||
{
|
||||
var obj_manager = egw_getObjectManager(this.nm_index, false);
|
||||
if (obj_manager && obj_manager.manager && obj_manager.manager.data && obj_manager.manager.data.nextmatch && obj_manager.manager.data.nextmatch.activeFilters)
|
||||
{
|
||||
return obj_manager.manager.data.nextmatch.activeFilters;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Flag mail as 'read', 'unread', 'flagged' or 'unflagged'
|
||||
*
|
||||
@ -1534,6 +1594,7 @@ app.classes.mail = AppJS.extend(
|
||||
var msg;
|
||||
var ftree;
|
||||
var _folder;
|
||||
|
||||
if (_action.id=='read')
|
||||
{
|
||||
ftree = this.et2.getWidgetById(this.nm_index+'[foldertree]');
|
||||
@ -1573,6 +1634,8 @@ app.classes.mail = AppJS.extend(
|
||||
if (do_nmactions)
|
||||
{
|
||||
msg = this.mail_getFormData(_elems);
|
||||
msg['all'] = this.mail_checkAllSelected(_action,true);
|
||||
msg['activeFilters'] = this.mail_getActiveFilters(_action);
|
||||
if (_action.id.substring(0,2)=='un') {
|
||||
//old style, only available for undelete and unlabel (no toggle)
|
||||
if ( _action.id=='unlabel') // this means all labels should be removed
|
||||
@ -1637,12 +1700,14 @@ app.classes.mail = AppJS.extend(
|
||||
// Notify server of changes
|
||||
if (msg_unset['msg'] && msg_unset['msg'].length)
|
||||
{
|
||||
this.mail_flagMessages('un'+_action.id,msg_unset);
|
||||
if (!msg['all']) this.mail_flagMessages('un'+_action.id,msg_unset);
|
||||
}
|
||||
if (msg_set['msg'] && msg_set['msg'].length)
|
||||
{
|
||||
this.mail_flagMessages(_action.id,msg_set);
|
||||
if (!msg['all']) this.mail_flagMessages(_action.id,msg_set);
|
||||
}
|
||||
//server must do the toggle, as we apply to ALL, not only the visible
|
||||
if (msg['all']) this.mail_flagMessages(_action.id,msg);
|
||||
// No further update needed, only in case of read, the counters should be refreshed
|
||||
if (_action.id=='read') this.mail_refreshFolderStatus(_folder,'thisfolderonly',false,true);
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user