Skip to content
This repository was archived by the owner on Jul 10, 2019. It is now read-only.

Commit 6b0b71d

Browse files
author
Tankred Hase
committed
Merge pull request #377 from whiteout-io/dev/WO-997
[WO-997] Select multiple messages at once
2 parents b038ac2 + 4683583 commit 6b0b71d

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

src/js/controller/app/action-bar.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,42 @@ var ActionBarCtrl = function($scope, $q, email, dialog, status) {
88
// scope functions
99
//
1010

11+
$scope.CHECKNONE = 0;
12+
$scope.CHECKALL = 1;
13+
$scope.CHECKUNREAD = 2;
14+
$scope.CHECKREAD = 3;
15+
$scope.CHECKFLAGGED = 4;
16+
$scope.CHECKUNFLAGGED = 5;
17+
$scope.CHECKENCRYPTED = 6;
18+
$scope.CHECKUNENCRYPTED = 7;
19+
20+
$scope.check = function(option) {
21+
currentFolder().messages.forEach(function(email) {
22+
if (!email.from) {
23+
// only mark loaded messages, not the dummy messages
24+
return;
25+
}
26+
27+
if (option === $scope.CHECKNONE) {
28+
email.checked = false;
29+
} else if (option === $scope.CHECKALL) {
30+
email.checked = true;
31+
} else if (option === $scope.CHECKUNREAD) {
32+
email.checked = !!email.unread;
33+
} else if (option === $scope.CHECKREAD) {
34+
email.checked = !email.unread;
35+
} else if (option === $scope.CHECKFLAGGED) {
36+
email.checked = !!email.flagged;
37+
} else if (option === $scope.CHECKUNFLAGGED) {
38+
email.checked = !email.flagged;
39+
} else if (option === $scope.CHECKENCRYPTED) {
40+
email.checked = !!email.encrypted;
41+
} else if (option === $scope.CHECKUNENCRYPTED) {
42+
email.checked = !email.encrypted;
43+
}
44+
});
45+
};
46+
1147
/**
1248
* Move a single message from the currently selected folder to another folder
1349
* @param {Object} message The message that is to be moved

src/tpl/action-bar.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<div class="action-bar" ng-controller="ActionBarCtrl">
22
<div class="action-bar__primary">
3+
<button class="btn btn--light-dropdown" ng-hide="state.read.open" wo-dropdown="#dropdown-checkmessages">
4+
<svg role="presentation"><use xlink:href="#icon-check" />Check messages</svg>
5+
<svg class="btn__dropdown" role="presentation"><use xlink:href="#icon-dropdown" /></svg>
6+
</button>
37
<button class="btn btn--light" wo-touch="state.read.open ? deleteMessage(state.mailList.selected) : deleteCheckedMessages()">Delete</button>
48
<button class="btn btn--light" wo-touch="state.read.open ? moveMessage(state.mailList.selected, getJunkFolder()) : moveCheckedMessages(getJunkFolder())">Spam</button>
59
<button class="btn btn--light-dropdown" wo-dropdown="#dropdown-folder">
@@ -34,6 +38,17 @@
3438
</li>
3539
</ul><!--/dropdown-->
3640

41+
<ul id="dropdown-checkmessages" class="dropdown">
42+
<li><button wo-touch="check(CHECKALL)">All</button></li>
43+
<li><button wo-touch="check(CHECKNONE)">None</button></li>
44+
<li><button wo-touch="check(CHECKENCRYPTED)">Encrypted</button></li>
45+
<li><button wo-touch="check(CHECKUNENCRYPTED)">Unencrypted</button></li>
46+
<li><button wo-touch="check(CHECKUNREAD)">Unread</button></li>
47+
<li><button wo-touch="check(CHECKREAD)">Read</button></li>
48+
<li><button wo-touch="check(CHECKFLAGGED)">Starred</button></li>
49+
<li><button wo-touch="check(CHECKUNFLAGGED)">Unstarred</button></li>
50+
</ul><!--/checkmessages-->
51+
3752
<ul id="dropdown-more" class="dropdown">
3853
<li><button wo-touch="state.read.open ? markMessage(state.mailList.selected, false) : markCheckedMessages(false)">Mark as read</button></li>
3954
<li><button wo-touch="state.read.open ? markMessage(state.mailList.selected, true) : markCheckedMessages(true)">Mark as unread</button></li>

test/unit/controller/app/action-bar-ctrl-test.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,20 @@ describe('Action Bar Controller unit test', function() {
2424
type: 'Inbox',
2525
path: 'INBOX',
2626
messages: [{
27+
from: [],
2728
checked: true
2829
}, {
30+
from: [],
2931
checked: false
32+
}, {
33+
from: [],
34+
flagged: true
35+
}, {
36+
from: [],
37+
encrypted: true
38+
}, {
39+
from: [],
40+
unread: true
3041
}]
3142
}
3243
};
@@ -43,6 +54,83 @@ describe('Action Bar Controller unit test', function() {
4354

4455
afterEach(function() {});
4556

57+
describe('check', function() {
58+
it('should check all', function() {
59+
scope.check(scope.CHECKALL);
60+
61+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.true;
62+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.true;
63+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.true;
64+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.true;
65+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.true;
66+
});
67+
68+
it('should check none', function() {
69+
scope.check(scope.CHECKNONE);
70+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.false;
71+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.false;
72+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.false;
73+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.false;
74+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.false;
75+
});
76+
77+
it('should check encrypted', function() {
78+
scope.check(scope.CHECKENCRYPTED);
79+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.false;
80+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.false;
81+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.false;
82+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.true;
83+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.false;
84+
});
85+
86+
it('should check unencrypted', function() {
87+
scope.check(scope.CHECKUNENCRYPTED);
88+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.true;
89+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.true;
90+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.true;
91+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.false;
92+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.true;
93+
});
94+
95+
it('should check unread', function() {
96+
scope.check(scope.CHECKUNREAD);
97+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.false;
98+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.false;
99+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.false;
100+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.false;
101+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.true;
102+
});
103+
104+
it('should check read', function() {
105+
scope.check(scope.CHECKREAD);
106+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.true;
107+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.true;
108+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.true;
109+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.true;
110+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.false;
111+
112+
});
113+
114+
it('should check starred', function() {
115+
scope.check(scope.CHECKFLAGGED);
116+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.false;
117+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.false;
118+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.true;
119+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.false;
120+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.false;
121+
122+
});
123+
124+
it('should check unstarred', function() {
125+
scope.check(scope.CHECKUNFLAGGED);
126+
expect(scope.state.nav.currentFolder.messages[0].checked).to.be.true;
127+
expect(scope.state.nav.currentFolder.messages[1].checked).to.be.true;
128+
expect(scope.state.nav.currentFolder.messages[2].checked).to.be.false;
129+
expect(scope.state.nav.currentFolder.messages[3].checked).to.be.true;
130+
expect(scope.state.nav.currentFolder.messages[4].checked).to.be.true;
131+
});
132+
});
133+
46134
describe('deleteMessage', function() {
47135
it('should not delete without a selected mail', function() {
48136
scope.deleteMessage();

0 commit comments

Comments
 (0)