feat(mail): filter mailbox by unread messages

Fixes #1146
Fixes #3156
Fixes #4752
This commit is contained in:
Francis Lachapelle
2021-10-19 14:49:50 -04:00
parent 248516e947
commit e5dbebb100
4 changed files with 49 additions and 20 deletions

View File

@@ -166,6 +166,9 @@
"Mark Read" = "Mark Read";
"Untitled" = "Untitled";
/* Filter option in messages list */
"Show unread messages only" = "Show unread messages only";
/* Tree */
"SentFolderName" = "Sent";
"TrashFolderName" = "Trash";

View File

@@ -421,29 +421,30 @@
- (EOQualifier *) searchQualifier
{
EOQualifier *qualifier, *searchQualifier;
EOQualifier *qualifier, *notDeleted, *searchQualifier;
WORequest *request;
NSDictionary *sortingAttributes, *content, *filter;
NSArray *filters;
NSString *searchBy, *searchInput, *searchString, *match;
NSMutableArray *searchArray;
NSMutableArray *qualifiers, *searchArray;
BOOL unseenOnly;
int nbFilters, i;
request = [context request];
content = [[request contentAsString] objectFromJSONString];
notDeleted = [EOQualifier qualifierWithQualifierFormat: @"(not (flags = %@))", @"deleted"];
qualifier = nil;
qualifiers = [NSMutableArray arrayWithObject: notDeleted];
searchString = nil;
match = nil;
filters = [content objectForKey: @"filters"];
unseenOnly = [[content objectForKey: @"unseenOnly"] boolValue];
if (filters)
{
nbFilters = [filters count];
if (nbFilters > 0) {
searchArray = [NSMutableArray arrayWithCapacity: nbFilters];
sortingAttributes = [content objectForKey: @"sortingAttributes"];
if (sortingAttributes)
match = [sortingAttributes objectForKey: @"match"]; // AND, OR
for (i = 0; i < nbFilters; i++)
{
filter = [filters objectAtIndex:i];
@@ -465,36 +466,42 @@
[self errorWithFormat: @"Missing parameters in search filter: %@", filter];
}
}
sortingAttributes = [content objectForKey: @"sortingAttributes"];
if (sortingAttributes)
match = [sortingAttributes objectForKey: @"match"]; // AND, OR
if ([match isEqualToString: @"OR"])
qualifier = [[EOOrQualifier alloc] initWithQualifierArray: searchArray];
else
qualifier = [[EOAndQualifier alloc] initWithQualifierArray: searchArray];
[qualifier autorelease];
[qualifiers addObject: qualifier];
}
}
if (unseenOnly)
{
searchQualifier = [EOQualifier qualifierWithQualifierFormat: @"(not (flags = %@))", @"seen"];
[qualifiers addObject: searchQualifier];
}
if ([qualifiers count] > 1)
{
qualifier = [[EOAndQualifier alloc] initWithQualifierArray: qualifiers];
[qualifier autorelease];
}
else
qualifier = notDeleted;
return qualifier;
}
- (NSArray *) getSortedUIDsInFolder: (SOGoMailFolder *) mailFolder
{
EOQualifier *qualifier, *fetchQualifier, *notDeleted;
if (!sortedUIDs)
{
notDeleted = [EOQualifier qualifierWithQualifierFormat: @"(not (flags = %@))", @"deleted"];
qualifier = [self searchQualifier];
if (qualifier)
{
fetchQualifier = [[EOAndQualifier alloc] initWithQualifiers: notDeleted, qualifier, nil];
[fetchQualifier autorelease];
}
else
fetchQualifier = notDeleted;
sortedUIDs = [mailFolder fetchUIDsMatchingQualifier: fetchQualifier
sortedUIDs = [mailFolder fetchUIDsMatchingQualifier: [self searchQualifier]
sortOrdering: [self imap4SortOrdering]
threaded: sortByThread];
[sortedUIDs retain];
}
@@ -737,6 +744,7 @@
* @apiParam {String} filters.searchBy Field criteria. Either subject, from, to, cc, or body.
* @apiParam {String} filters.searchInput String to match.
* @apiParam {String} [filters.negative] Reverse the condition when true. Defaults to false.
* @apiParam {Boolean} [unseenOnly] Filter out seen messages when true. Defaults to false.
*
* @apiSuccess (Success 200) {Number} threaded 1 if threading is enabled for the user.
* @apiSuccess (Success 200) {Number} unseenCount Number of unread messages

View File

@@ -73,6 +73,10 @@
</md-button>
<a href="#" class="sg-folder-name"
ng-click="mailbox.searchMode($event)" ng-bind="mailbox.service.selectedFolder.$displayName"><!-- mailbox name --></a>
<md-button class="sg-icon-button" label:aria-label="Show unread messages only"
ng-click="mailbox.selectedFolder.toggleUnseenOnly()">
<md-icon class="md-default-theme md-fg md-primary" ng-class="{ 'md-hue-2': mailbox.selectedFolder.$unseenOnly }" >mark_as_unread</md-icon>
</md-button>
<md-menu>
<md-button class="sg-icon-button" label:aria-label="Sort"
ng-click="$mdMenu.open()">

View File

@@ -342,6 +342,17 @@
return angular.isDefined(this.$selectedMessage);
};
/**
* @function toggleUnseenOnly
* @memberof Mailbox.prototype
* @desc Toggle filter by unseen messages only. Requires a round trip to the server.
*/
Mailbox.prototype.toggleUnseenOnly = function() {
var _this = this;
this.$unseenOnly = !this.$unseenOnly;
this.$filter(Mailbox.$query);
};
/**
* @function $filter
* @memberof Mailbox.prototype
@@ -394,6 +405,9 @@
options.syncToken = this.$syncToken;
}
if (this.$unseenOnly)
options.unseenOnly = 1;
// Restart the refresh timer, if needed
if (!Mailbox.$virtualMode) {
var refreshViewCheck = Mailbox.$Preferences.defaults.SOGoRefreshViewCheck;