mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-06-02 17:09:44 +00:00
Tagging labels with 1 AJAX request
This commit is contained in:
@@ -618,7 +618,7 @@
|
||||
return response;
|
||||
}
|
||||
|
||||
- (WOResponse *) addLabelAction
|
||||
- (WOResponse *) addOrRemoveLabelAction
|
||||
{
|
||||
WOResponse *response;
|
||||
WORequest *request;
|
||||
@@ -626,14 +626,14 @@
|
||||
NSException *error;
|
||||
NSArray *msgUIDs, *flags;
|
||||
NSString *operation;
|
||||
NSDictionary *content;
|
||||
NSDictionary *content, *result;
|
||||
BOOL addOrRemove;
|
||||
NGImap4Client *client;
|
||||
|
||||
request = [context request];
|
||||
content = [[request contentAsString] objectFromJSONString];
|
||||
flags = [content objectForKey:@"flags"];
|
||||
msgUIDs = [content objectForKey:@"msgUIDs"];
|
||||
flags = [NSArray arrayWithObject:[content objectForKey:@"flags"]];
|
||||
msgUIDs = [NSArray arrayWithArray:[content objectForKey:@"msgUIDs"]];
|
||||
operation = [content objectForKey:@"operation"];
|
||||
|
||||
if ([operation isEqualToString:@"add"])
|
||||
@@ -643,60 +643,46 @@
|
||||
|
||||
co = [self clientObject];
|
||||
client = [[co imap4Connection] client];
|
||||
error = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:addOrRemove];
|
||||
if (error)
|
||||
response = (WOResponse *) error;
|
||||
else
|
||||
[[co imap4Connection] selectFolder: [co imap4URL]];
|
||||
result = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:addOrRemove];
|
||||
if ([[[[result objectForKey:@"RawResponse"] objectForKey:@"ResponseResult"] objectForKey:@"description"] isEqualToString:@"Completed"])
|
||||
response = [self responseWith204];
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
- (WOResponse *) removeLabelAction
|
||||
{
|
||||
WOResponse *response;
|
||||
SOGoMailObject *co;
|
||||
NSException *error;
|
||||
NSArray *flags;
|
||||
NSString *flag;
|
||||
|
||||
flag = [[[self->context request] formValueForKey: @"flag"] fromCSSIdentifier];
|
||||
co = [self clientObject];
|
||||
flags = [NSArray arrayWithObject: flag];
|
||||
|
||||
error = [co removeFlags: flags];
|
||||
if (error)
|
||||
response = (WOResponse *) error;
|
||||
else
|
||||
response = [self responseWith204];
|
||||
|
||||
response = nil;
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
- (WOResponse *) removeAllLabelsAction
|
||||
{
|
||||
NSMutableArray *flags;
|
||||
WOResponse *response;
|
||||
SOGoMailObject *co;
|
||||
NSException *error;
|
||||
NSDictionary *v;
|
||||
|
||||
|
||||
co = [self clientObject];
|
||||
|
||||
v = [[[context activeUser] userDefaults] mailLabelsColors];
|
||||
|
||||
WORequest *request;
|
||||
SOGoMailFolder *co;
|
||||
NGImap4Client *client;
|
||||
NSArray *msgUIDs;
|
||||
NSMutableArray *flags;
|
||||
NSDictionary *v, *content, *result;
|
||||
|
||||
request = [context request];
|
||||
content = [[request contentAsString] objectFromJSONString];
|
||||
msgUIDs = [NSArray arrayWithArray:[content objectForKey:@"msgUIDs"]];
|
||||
|
||||
// We always unconditionally remove the Mozilla tags
|
||||
flags = [NSMutableArray arrayWithObjects: @"$Label1", @"$Label2", @"$Label3",
|
||||
@"$Label4", @"$Label5", nil];
|
||||
|
||||
|
||||
co = [self clientObject];
|
||||
v = [[[context activeUser] userDefaults] mailLabelsColors];
|
||||
[flags addObjectsFromArray: [v allKeys]];
|
||||
|
||||
error = [co removeFlags: flags];
|
||||
if (error)
|
||||
response = (WOResponse *) error;
|
||||
else
|
||||
client = [[co imap4Connection] client];
|
||||
[[co imap4Connection] selectFolder: [co imap4URL]];
|
||||
result = [client storeFlags:flags forUIDs:msgUIDs addOrRemove:NO];
|
||||
|
||||
if ([[[[result objectForKey:@"RawResponse"] objectForKey:@"ResponseResult"] objectForKey:@"description"] isEqualToString:@"Completed"])
|
||||
response = [self responseWith204];
|
||||
else
|
||||
response = nil;
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -181,15 +181,10 @@
|
||||
pageName = "UIxMailUserRightsEditor";
|
||||
actionName = "saveUserRights";
|
||||
};
|
||||
addLabel = {
|
||||
addOrRemoveLabel = {
|
||||
protectedBy = "View";
|
||||
actionClass = "UIxMailFolderActions";
|
||||
actionName = "addLabel";
|
||||
};
|
||||
removeLabel = {
|
||||
protectedBy = "View";
|
||||
actionClass = "UIxMailFolderActions";
|
||||
actionName = "removeLabel";
|
||||
actionName = "addOrRemoveLabel";
|
||||
};
|
||||
removeAllLabels = {
|
||||
protectedBy = "View";
|
||||
|
||||
@@ -879,14 +879,28 @@ function openMailbox(mailbox, reload) {
|
||||
* Called from SOGoDataTable.render()
|
||||
*/
|
||||
function messageListCallback(row, data, isNew) {
|
||||
var currentMessage = Mailer.currentMessages[Mailer.currentMailbox];
|
||||
var currentMessages = [];
|
||||
if (!Object.isArray(document.menuTarget)) {
|
||||
// Menu called from one selection in message list view
|
||||
currentMessages.push(Mailer.currentMessages[Mailer.currentMailbox]);
|
||||
}
|
||||
else {
|
||||
// Menu called from multiple selection in messages list view
|
||||
var rows = $(document.menuTarget);
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
var _row = $(rows[i]);
|
||||
if (_row) {
|
||||
currentMessages.push(rows[i].substr(4));
|
||||
}
|
||||
}
|
||||
}
|
||||
row.id = data['rowID'];
|
||||
row.writeAttribute('labels', (data['labels']?data['labels']:""));
|
||||
row.className = data['rowClasses'];
|
||||
row.show(); // make sure the row is visible
|
||||
|
||||
// Restore previous selection
|
||||
if (data['uid'] == currentMessage)
|
||||
if (currentMessages.indexOf(String(data['uid'])) != -1)
|
||||
row.addClassName('_selected');
|
||||
|
||||
if (data['Thread'])
|
||||
@@ -2444,40 +2458,47 @@ function onMenuToggleMessageRead(event) {
|
||||
}
|
||||
|
||||
function onMenuLabelNone() {
|
||||
var messages = [];
|
||||
var msgUIDs = [];
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox);
|
||||
|
||||
if (document.menuTarget.tagName == "DIV")
|
||||
// Menu called from message content view
|
||||
messages.push(Mailer.currentMessages[Mailer.currentMailbox]);
|
||||
else if (Object.isArray(document.menuTarget))
|
||||
if (!Object.isArray(document.menuTarget)) {
|
||||
if (document.menuTarget.tagName == "DIV")
|
||||
// Menu called from message content view
|
||||
msgUIDs.push(Mailer.currentMessages[Mailer.currentMailbox]);
|
||||
|
||||
else
|
||||
// Menu called from one selection in message list view
|
||||
msgUIDs.push(document.menuTarget.getAttribute("id").substr(4));
|
||||
}
|
||||
else {
|
||||
// Menu called from multiple selection in messages list view
|
||||
$(document.menuTarget).collect(function(row) {
|
||||
messages.push(row.substr(4));
|
||||
});
|
||||
else
|
||||
// Menu called from one selection in messages list view
|
||||
messages.push(document.menuTarget.getAttribute("id").substr(4));
|
||||
var rows = $(document.menuTarget);
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
var row = $(rows[i]);
|
||||
if (row) {
|
||||
msgUIDs.push(rows[i].substr(4));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/";
|
||||
messages.each(function(id) {
|
||||
triggerAjaxRequest(url + id + "/removeAllLabels",
|
||||
messageFlagCallback,
|
||||
{ mailbox: Mailer.currentMailbox, msg: id, label: null } );
|
||||
});
|
||||
var callbackData = { mailbox: Mailer.currentMailbox, msgUIDs: msgUIDs };
|
||||
var content = { mailbox: Mailer.currentMailbox, msgUIDs: msgUIDs };
|
||||
content = Object.toJSON(content);
|
||||
triggerAjaxRequest(url + "/removeAllLabels", messageFlagCallback, callbackData, content);
|
||||
}
|
||||
|
||||
function onMenuLabelFlag() {
|
||||
var flag = this.readAttribute("data-name");
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/";
|
||||
var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox);
|
||||
var operation = "add";
|
||||
var msgUIDs;
|
||||
var msgUIDs = [];
|
||||
var msgLabels;
|
||||
|
||||
if (!Object.isArray(document.menuTarget)) {
|
||||
msgUIDs = Mailer.currentMessages[Mailer.currentMailbox];
|
||||
msgUIDs.push(Mailer.currentMessages[Mailer.currentMailbox]);
|
||||
if (document.menuTarget.tagName == "DIV")
|
||||
// Menu called from message content view
|
||||
msgLabels = $('row_' + msgLabels).getAttribute("labels");
|
||||
msgLabels = $('row_' + msgUIDs[0]).getAttribute("labels");
|
||||
else
|
||||
// Menu called from one selection in messages list view
|
||||
msgLabels = document.menuTarget.getAttribute("labels");
|
||||
@@ -2508,10 +2529,42 @@ function onMenuLabelFlag() {
|
||||
}
|
||||
}
|
||||
|
||||
var callbackData = { mailbox: Mailer.currentMailbox, operation: operation, flag: flag };
|
||||
var callbackData = { mailbox: Mailer.currentMailbox, operation: operation, flag: flag, msgUIDs: msgUIDs};
|
||||
var content = {flags: flag.asCSSIdentifier(), msgUIDs: msgUIDs, operation: operation};
|
||||
content = Object.toJSON(content);
|
||||
triggerAjaxRequest(url + operation + "Label", messageFlagCallback, callbackData, content);
|
||||
triggerAjaxRequest(url + "/addOrRemoveLabel", messageFlagCallback, callbackData, content);
|
||||
}
|
||||
|
||||
function messageFlagCallback(http) {
|
||||
if (http.readyState == 4
|
||||
&& isHttpStatus204(http.status)) {
|
||||
var data = http.callbackData;
|
||||
if (data["mailbox"] == Mailer.currentMailbox) {
|
||||
var msgUIDs = data["msgUIDs"];
|
||||
for (var i = 0; i < msgUIDs.length; i++) {
|
||||
Mailer.dataTable.invalidate(msgUIDs[i]);
|
||||
var row = $("row_" + msgUIDs[i]);
|
||||
var operation = data["operation"];
|
||||
if (operation) {
|
||||
var labels = row.getAttribute("labels");
|
||||
var flags = [];
|
||||
if (labels.length > 0)
|
||||
flags = labels.split(" ");
|
||||
if (operation == "add")
|
||||
flags.push(data["flag"]);
|
||||
else {
|
||||
// Remove flag
|
||||
var flag = data["flag"];
|
||||
var idx = flags.indexOf(flag);
|
||||
flags.splice(idx, 1);
|
||||
}
|
||||
row.writeAttribute("labels", flags.join(" "));
|
||||
}
|
||||
else
|
||||
row.writeAttribute("labels", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onMenuToggleMessageFlag(event) {
|
||||
@@ -2566,35 +2619,6 @@ function folderRefreshCallback(http) {
|
||||
}
|
||||
}
|
||||
|
||||
function messageFlagCallback(http) {
|
||||
if (http.readyState == 4
|
||||
&& isHttpStatus204(http.status)) {
|
||||
var data = http.callbackData;
|
||||
if (data["mailbox"] == Mailer.currentMailbox) {
|
||||
Mailer.dataTable.invalidate(data["msg"]);
|
||||
var row = $("row_" + data["msg"]);
|
||||
var operation = data["label"];
|
||||
if (operation) {
|
||||
var labels = row.getAttribute("labels");
|
||||
var flags = [];
|
||||
if (labels.length > 0)
|
||||
flags = labels.split(" ");
|
||||
if (operation.substr(0, 3) == "add")
|
||||
flags.push(operation.substr(3));
|
||||
else {
|
||||
// Remove flag
|
||||
var flag = operation.substr(6);
|
||||
var idx = flags.indexOf(flag);
|
||||
flags.splice(idx, 1);
|
||||
}
|
||||
row.writeAttribute("labels", flags.join(" "));
|
||||
}
|
||||
else
|
||||
row.writeAttribute("labels", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onMessageListMenuPrepareVisibility() {
|
||||
/* This method attaches the right mailbox-menu to the generic message list
|
||||
menu. */
|
||||
|
||||
Reference in New Issue
Block a user