Skip to content

Commit

Permalink
feat(mail): filter mailbox by unread messages
Browse files Browse the repository at this point in the history
Fixes #1146
Fixes #3156
Fixes #4752
  • Loading branch information
cgx committed Oct 19, 2021
1 parent 248516e commit e5dbebb
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 20 deletions.
3 changes: 3 additions & 0 deletions UI/MailerUI/English.lproj/Localizable.strings
Expand Up @@ -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";
Expand Down
48 changes: 28 additions & 20 deletions UI/MailerUI/UIxMailListActions.m
Expand Up @@ -421,29 +421,30 @@ - (NSString *) imap4SortOrdering

- (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];
Expand All @@ -465,36 +466,42 @@ - (EOQualifier *) searchQualifier
[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];
}

Expand Down Expand Up @@ -737,6 +744,7 @@ - (NSDictionary *) getUIDsInFolder: (SOGoMailFolder *) folder
* @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
Expand Down
4 changes: 4 additions & 0 deletions UI/Templates/MailerUI/UIxMailFolderTemplate.wox
Expand Up @@ -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()">
Expand Down
14 changes: 14 additions & 0 deletions UI/WebServerResources/js/Mailer/Mailbox.service.js
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit e5dbebb

Please sign in to comment.