implement folder list and selection

This commit is contained in:
Tankred Hase 2013-09-30 21:22:46 +02:00
parent 8a40de92ea
commit abaeaec54c
4 changed files with 93 additions and 53 deletions

View File

@ -7,10 +7,9 @@ define(function(require) {
var MailListCtrl = function($scope) { var MailListCtrl = function($scope) {
var offset = 0, var offset = 0,
num = 100; num = 100,
loggedIn = false;
// show inbox at the beginning
$scope.folder = 'INBOX';
emailDao = appController._emailDao; emailDao = appController._emailDao;
// //
@ -18,7 +17,9 @@ define(function(require) {
// //
$scope.select = function(email) { $scope.select = function(email) {
email.bodyDisplayParts = email.body.split('\n'); if (email && typeof email.body === 'string') {
email.bodyDisplayParts = email.body.split('\n');
}
$scope.selected = email; $scope.selected = email;
// set selected in parent scope ro it can be displayed in the read view // set selected in parent scope ro it can be displayed in the read view
$scope.$parent.selected = $scope.selected; $scope.$parent.selected = $scope.selected;
@ -26,16 +27,15 @@ define(function(require) {
$scope.synchronize = function() { $scope.synchronize = function() {
updateStatus('Syncing ...'); updateStatus('Syncing ...');
// sync from imap to local db // sync from imap to local db
syncImapFolder({ syncImapFolder({
folder: $scope.folder, folder: getFolder().path,
offset: -num, offset: -num,
num: offset num: offset
}, function() { }, function() {
// list again from local db after syncing // list again from local db after syncing
listLocalMessages({ listLocalMessages({
folder: $scope.folder, folder: getFolder().path,
offset: offset, offset: offset,
num: num num: num
}, function() { }, function() {
@ -44,17 +44,18 @@ define(function(require) {
}); });
}; };
// production... in chrome packaged app $scope.$watch('currentFolder', function() {
if (window.chrome && chrome.identity) { // production... in chrome packaged app
initList(); if (window.chrome && chrome.identity) {
return; initList();
} return;
}
// development // development... display dummy mail objects
createDummyMails(function(emails) { createDummyMails(function(emails) {
updateStatus('Last update: ', new Date()); updateStatus('Last update: ', new Date());
$scope.emails = emails; $scope.emails = emails;
$scope.select($scope.emails[0]); $scope.select($scope.emails[0]);
});
}); });
// //
@ -66,25 +67,35 @@ define(function(require) {
// list messaged from local db // list messaged from local db
listLocalMessages({ listLocalMessages({
folder: $scope.folder, folder: getFolder().path,
offset: offset, offset: offset,
num: num num: num
}, function() { }, function() {
updateStatus('Login ...'); if (loggedIn) {
$scope.$apply(); // user is already logged in
sync();
return;
}
// login to imap // login to imap
loginImap(function() { loginImap(function() {
updateStatus('Syncing ...'); loggedIn = true;
$scope.$apply(); sync();
// sync imap folder to local db
$scope.synchronize();
}); });
}); });
function sync() {
updateStatus('Syncing ...');
$scope.$apply();
// sync imap folder to local db
$scope.synchronize();
}
} }
function loginImap(callback) { function loginImap(callback) {
updateStatus('Login ...');
$scope.$apply();
emailDao.imapLogin(function(err) { emailDao.imapLogin(function(err) {
if (err) { if (err) {
console.error(err); console.error(err);
@ -96,13 +107,23 @@ define(function(require) {
} }
function syncImapFolder(options, callback) { function syncImapFolder(options, callback) {
emailDao.imapSync(options, function(err) { emailDao.unreadMessages(getFolder().path, function(err, unreadCount) {
if (err) { if (err) {
console.error(err); console.error(err);
return; return;
} }
// set unread count in folder model
getFolder().count = unreadCount;
$scope.$apply();
callback(); emailDao.imapSync(options, function(err) {
if (err) {
console.error(err);
return;
}
callback();
});
}); });
} }
@ -114,7 +135,6 @@ define(function(require) {
} }
callback(emails); callback(emails);
// add display dates
displayEmails(emails); displayEmails(emails);
}); });
} }
@ -128,6 +148,9 @@ define(function(require) {
function displayEmails(emails) { function displayEmails(emails) {
if (!emails || emails.length < 1) { if (!emails || emails.length < 1) {
$scope.emails = [];
$scope.select();
$scope.$apply();
return; return;
} }
@ -140,6 +163,10 @@ define(function(require) {
$scope.select($scope.emails[0]); $scope.select($scope.emails[0]);
$scope.$apply(); $scope.$apply();
} }
function getFolder() {
return $scope.$parent.currentFolder;
}
}; };
function createDummyMails(callback) { function createDummyMails(callback) {

View File

@ -3,6 +3,27 @@ define(function() {
var NavigationCtrl = function($scope) { var NavigationCtrl = function($scope) {
$scope.navOpen = false; $scope.navOpen = false;
$scope.folders = [{
type: 'Inbox',
count: undefined,
path: 'INBOX'
}, {
type: 'Sent',
count: undefined,
path: '[Gmail]/Gesendet'
}, {
type: 'Outbox',
count: undefined,
path: 'OUTBOX'
}, {
type: 'Drafts',
count: undefined,
path: '[Gmail]/Entw&APw-rfe'
}, {
type: 'Trash',
count: undefined,
path: '[Gmail]/Papierkorb'
}];
$scope.openNav = function() { $scope.openNav = function() {
$scope.navOpen = true; $scope.navOpen = true;
@ -12,6 +33,13 @@ define(function() {
$scope.navOpen = false; $scope.navOpen = false;
}; };
$scope.openFolder = function(folder) {
$scope.currentFolder = folder;
$scope.closeNav();
};
// select inbox as the current folder on init
$scope.openFolder($scope.folders[0]);
$scope.write = function(replyTo) { $scope.write = function(replyTo) {
var replyToId = (replyTo) ? replyTo.uid : '', var replyToId = (replyTo) ? replyTo.uid : '',
url = 'index.html#/write/' + replyToId; url = 'index.html#/write/' + replyToId;

View File

@ -1,6 +1,6 @@
<!-- nav controll and section headline --> <!-- nav controll and section headline -->
<header data-icon="&#xe004;" ng-click="openNav(); $event.stopPropagation()"> <header data-icon="&#xe004;" ng-click="openNav(); $event.stopPropagation()">
<h2>Inbox</h2> <h2>{{currentFolder.type}}</h2>
</header> </header>
<ul class="mail-list"> <ul class="mail-list">

View File

@ -2,37 +2,22 @@
<header> <header>
<h1>WHITEOUT<span>.IO</span></h1> <h1>WHITEOUT<span>.IO</span></h1>
</header> </header>
<ul class="nav-primary"> <ul class="nav-primary">
<li> <li ng-repeat="folder in folders" ng-switch="folder.count !== undefined">
<a href="#"> <a href="#" ng-click="openFolder(folder); $event.preventDefault()">
Inbox {{folder.type}}
<span class="label-wrapper"><span class="label label-light">1000+</span></span> <span class="label-wrapper" ng-switch-when="true"><span class="label label-light">{{folder.count}}</span></span>
</a>
</li>
<li>
<a href="#">Sent</a>
</li>
<li>
<a href="#">Outbox</a>
</li>
<li>
<a href="#">
Drafts
<span class="label-wrapper"><span class="label label-light">2</span></span>
</a>
</li>
<li>
<a href="#">
Trash
<span class="label-wrapper"><span class="label label-light">100</span></span>
</a> </a>
</li> </li>
</ul> </ul>
<ul class="nav-secondary"> <ul class="nav-secondary">
<li><a href="#">Account</a></li> <li><a href="#">Account</a></li>
<li><a href="#">About whiteout.io</a></li> <li><a href="#">About whiteout.io</a></li>
<li><a href="#">Help</a></li> <li><a href="#">Help</a></li>
</ul> </ul>
<footer> <footer>
{{lastUpdateLbl}} {{lastUpdate | date:'shortTime'}} {{lastUpdateLbl}} {{lastUpdate | date:'shortTime'}}
</footer> </footer>