mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-04-01 11:32:44 +00:00
(feat) can now batch delete messages
This commit is contained in:
committed by
Francis Lachapelle
parent
0edc2c1217
commit
6cd02043af
@@ -273,7 +273,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div layout="row" layout-align="space-between center" ng-show="currentFolder.$selectedCount() > 0">
|
||||
<div layout="row" layout-align="start center" ng-show="currentFolder.$selectedCount() > 0">
|
||||
<md-button ng-click="unselectCards()">
|
||||
<i class="md-icon-arrow-back"><!-- unselect all --></i>
|
||||
</md-button>
|
||||
|
||||
@@ -20,9 +20,16 @@
|
||||
ng-click="selectMessage(currentMessage)"
|
||||
ui-sref="mail.account.mailbox.message({accountId: account.id, mailboxId: (mailbox.path | encodeUri), messageId: currentMessage.uid})"
|
||||
ui-sref-active="sg-active">
|
||||
<div class="sg-selected-avatar" ng-show="currentMessage.selected"
|
||||
ng-click="currentMessage.selected = !currentMessage.selected">
|
||||
<!-- selected avatar -->
|
||||
</div>
|
||||
<sg-gravatar-image class="md-tile-left"
|
||||
ng-show="!currentMessage.selected"
|
||||
ng-click="currentMessage.selected = !currentMessage.selected"
|
||||
email="{{currentMessage['from'][0].email}}"
|
||||
size="48"><!-- gravatar -->
|
||||
size="48">
|
||||
<!-- gravatar -->
|
||||
</sg-gravatar-image>
|
||||
<div class="sg-tile-content">
|
||||
<span class="msg-date"
|
||||
|
||||
@@ -318,7 +318,9 @@
|
||||
</md-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-toolbar-tools md-toolbar-tools-bottom" layout="row" layout-align="space-between center">
|
||||
<div class="md-toolbar-tools md-toolbar-tools-bottom"
|
||||
layout="row" layout-align="space-between center"
|
||||
ng-show="mailbox.$selectedCount() == 0">
|
||||
<div class="view-list cols-6 sg-padded" layout="row" layout-align="space-between center"
|
||||
sg-search="mailbox.$filter({ sort: 'date', asc: false }, [{ searchBy: searchField, searchInput: searchText }])">
|
||||
<md-input-container class="sg-search-field-container">
|
||||
@@ -338,6 +340,18 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div layout="row" layout-align="start center" ng-show="mailbox.$selectedCount() > 0">
|
||||
<md-button ng-click="unselectMessages()">
|
||||
<i class="md-icon-arrow-back"><!-- unselect all --></i>
|
||||
</md-button>
|
||||
<label>{{mailbox.$selectedCount()}} selected</label>
|
||||
<md-button ng-click="confirmDeleteSelectedMessages()">
|
||||
<i class="md-icon-delete"><!-- delete --></i>
|
||||
</md-button>
|
||||
<md-button>
|
||||
<i class="md-icon-star"><!-- flag mails --></i>
|
||||
</md-button>
|
||||
</div>
|
||||
</md-toolbar>
|
||||
<div layout="row" ui-view="mailbox"><!-- messages list --></div>
|
||||
</section>
|
||||
|
||||
@@ -12,49 +12,49 @@
|
||||
|
||||
$rootScope.currentFolder = stateAddressbook;
|
||||
$rootScope.card = null;
|
||||
|
||||
|
||||
$scope.selectCard = function(card) {
|
||||
$state.go('app.addressbook.card.view', {addressbookId: stateAddressbook.id, cardId: card.id});
|
||||
};
|
||||
|
||||
$scope.newComponent = function(ev) {
|
||||
$mdDialog.show({
|
||||
parent: angular.element(document.body),
|
||||
targetEvent: ev,
|
||||
clickOutsideToClose: true,
|
||||
escapeToClose: true,
|
||||
template: [
|
||||
'<md-dialog aria-label="' + l('Create component') + '">',
|
||||
' <md-content>',
|
||||
' <div layout="column">',
|
||||
' <md-button ng-click="create(\'card\')">',
|
||||
' ' + l('Contact'),
|
||||
' </md-button>',
|
||||
' <md-button ng-click="create(\'list\')">',
|
||||
' ' + l('List'),
|
||||
' </md-button>',
|
||||
' </div>',
|
||||
' </md-content>',
|
||||
'</md-dialog>'
|
||||
].join(''),
|
||||
locals: {
|
||||
state: $state,
|
||||
addressbookId: $scope.currentFolder.id
|
||||
},
|
||||
controller: ComponentDialogController
|
||||
});
|
||||
|
||||
/**
|
||||
* @ngInject
|
||||
*/
|
||||
ComponentDialogController.$inject = ['scope', '$mdDialog', 'state', 'addressbookId'];
|
||||
function ComponentDialogController(scope, $mdDialog, state, addressbookId) {
|
||||
scope.create = function(type) {
|
||||
$mdDialog.hide();
|
||||
state.go('app.addressbook.new', { addressbookId: addressbookId, contactType: type });
|
||||
}
|
||||
|
||||
$scope.newComponent = function(ev) {
|
||||
$mdDialog.show({
|
||||
parent: angular.element(document.body),
|
||||
targetEvent: ev,
|
||||
clickOutsideToClose: true,
|
||||
escapeToClose: true,
|
||||
template: [
|
||||
'<md-dialog aria-label="' + l('Create component') + '">',
|
||||
' <md-content>',
|
||||
' <div layout="column">',
|
||||
' <md-button ng-click="create(\'card\')">',
|
||||
' ' + l('Contact'),
|
||||
' </md-button>',
|
||||
' <md-button ng-click="create(\'list\')">',
|
||||
' ' + l('List'),
|
||||
' </md-button>',
|
||||
' </div>',
|
||||
' </md-content>',
|
||||
'</md-dialog>'
|
||||
].join(''),
|
||||
locals: {
|
||||
state: $state,
|
||||
addressbookId: $scope.currentFolder.id
|
||||
},
|
||||
controller: ComponentDialogController
|
||||
});
|
||||
|
||||
/**
|
||||
* @ngInject
|
||||
*/
|
||||
ComponentDialogController.$inject = ['scope', '$mdDialog', 'state', 'addressbookId'];
|
||||
function ComponentDialogController(scope, $mdDialog, state, addressbookId) {
|
||||
scope.create = function(type) {
|
||||
$mdDialog.hide();
|
||||
state.go('app.addressbook.new', { addressbookId: addressbookId, contactType: type });
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
$scope.notSelectedComponent = function(currentCard, type) {
|
||||
return (currentCard.tag == type && !currentCard.selected);
|
||||
|
||||
@@ -143,6 +143,22 @@
|
||||
return Mailbox.$absolutePath(this.$account.id, this.path);
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $selectedCount
|
||||
* @memberof Mailbox.prototype
|
||||
* @desc Return the number of messages selected by the user.
|
||||
* @returns the number of selected messages
|
||||
*/
|
||||
Mailbox.prototype.$selectedCount = function() {
|
||||
var count;
|
||||
|
||||
count = 0;
|
||||
if (this.$messages) {
|
||||
count = (_.filter(this.$messages, function(message) { return message.selected })).length;
|
||||
}
|
||||
return count;
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $filter
|
||||
* @memberof Mailbox.prototype
|
||||
@@ -348,6 +364,7 @@
|
||||
* @return a promise of the HTTP operation
|
||||
*/
|
||||
Mailbox.prototype.$deleteMessages = function(uids) {
|
||||
var _this = this;
|
||||
return Mailbox.$$resource.post(this.id, 'batchDelete', {uids: uids});
|
||||
};
|
||||
|
||||
|
||||
@@ -11,9 +11,11 @@
|
||||
$scope.account = stateAccount;
|
||||
$rootScope.mailbox = stateMailbox;
|
||||
$rootScope.currentFolder = stateMailbox;
|
||||
|
||||
$scope.selectMessage = function(message) {
|
||||
$state.go('mail.account.mailbox.message', {accountId: stateAccount.id, mailboxId: encodeUriFilter(stateMailbox.path), messageId: message.uid});
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
angular
|
||||
|
||||
@@ -59,6 +59,24 @@
|
||||
});
|
||||
};
|
||||
|
||||
$scope.unselectMessages = function() {
|
||||
_.each($rootScope.mailbox.$messages, function(message) { message.selected = false; });
|
||||
};
|
||||
|
||||
$scope.confirmDeleteSelectedMessages = function() {
|
||||
Dialog.confirm(l('Warning'),
|
||||
l('Are you sure you want to delete the selected messages?'))
|
||||
.then(function() {
|
||||
// User confirmed the deletion
|
||||
var selectedMessages = _.filter($rootScope.mailbox.$messages, function(message) { return message.selected });
|
||||
var selectedUIDs = _.pluck(selectedMessages, 'uid');
|
||||
$rootScope.mailbox.$deleteMessages(selectedUIDs).then(function() {
|
||||
$rootScope.mailbox.$messages = _.difference($rootScope.mailbox.$messages, selectedMessages);
|
||||
});
|
||||
}, function(data, status) {
|
||||
// Delete failed
|
||||
});
|
||||
};
|
||||
if ($state.current.name == 'mail' && $scope.accounts.length > 0 && $scope.accounts[0].$mailboxes.length > 0) {
|
||||
// Redirect to first mailbox of first account if no mailbox is selected
|
||||
var account = $scope.accounts[0];
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
// The promise will be unwrapped first
|
||||
this.$unwrap(futureMessageData);
|
||||
}
|
||||
this.selected = false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user