mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-27 19:19:21 +03:00
Many interface improvements, optimizations
This commit is contained in:
parent
40d2548a53
commit
53dc509d79
42 changed files with 686 additions and 461 deletions
|
|
@ -41,6 +41,18 @@ function AbstractApp()
|
|||
);
|
||||
}
|
||||
});
|
||||
|
||||
$document.on('keydown', function (oEvent) {
|
||||
if (oEvent && oEvent.ctrlKey)
|
||||
{
|
||||
$html.addClass('rl-ctrl-key-pressed');
|
||||
}
|
||||
}).on('keyup', function (oEvent) {
|
||||
if (oEvent && !oEvent.ctrlKey)
|
||||
{
|
||||
$html.removeClass('rl-ctrl-key-pressed');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_.extend(AbstractApp.prototype, KnoinAbstractBoot.prototype);
|
||||
|
|
|
|||
|
|
@ -207,10 +207,20 @@ RainLoopApp.prototype.contactsSync = function (fResultFunc)
|
|||
|
||||
RainLoopApp.prototype.messagesMoveTrigger = function ()
|
||||
{
|
||||
var self = this;
|
||||
var
|
||||
self = this,
|
||||
sSpamFolder = RL.data().spamFolder()
|
||||
;
|
||||
|
||||
_.each(this.oMoveCache, function (oItem) {
|
||||
RL.remote().messagesMove(self.moveOrDeleteResponseHelper, oItem['From'], oItem['To'], oItem['Uid']);
|
||||
|
||||
var
|
||||
bSpam = sSpamFolder === oItem['To'],
|
||||
bHam = !bSpam && sSpamFolder === oItem['From'] && 'INBOX' === oItem['To']
|
||||
;
|
||||
|
||||
RL.remote().messagesMove(self.moveOrDeleteResponseHelper, oItem['From'], oItem['To'], oItem['Uid'],
|
||||
bSpam ? 'SPAM' : (bHam ? 'HAM' : ''));
|
||||
});
|
||||
|
||||
this.oMoveCache = {};
|
||||
|
|
@ -307,6 +317,9 @@ RainLoopApp.prototype.deleteMessagesFromFolder = function (iDeleteType, sFromFol
|
|||
oMoveFolder = oCache.getFolderFromCacheList(oData.spamFolder());
|
||||
nSetSystemFoldersNotification = Enums.SetSystemFoldersNotification.Spam;
|
||||
break;
|
||||
case Enums.FolderType.NotSpam:
|
||||
oMoveFolder = oCache.getFolderFromCacheList('INBOX');
|
||||
break;
|
||||
case Enums.FolderType.Trash:
|
||||
oMoveFolder = oCache.getFolderFromCacheList(oData.trashFolder());
|
||||
nSetSystemFoldersNotification = Enums.SetSystemFoldersNotification.Trash;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ Enums.FolderType = {
|
|||
'Trash': 13,
|
||||
'Spam': 14,
|
||||
'Archive': 15,
|
||||
'NotSpam': 80,
|
||||
'User': 99
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ ko.bindingHandlers.draggable = {
|
|||
}
|
||||
|
||||
oConf['helper'] = function (oEvent) {
|
||||
return fValueAccessor()(oEvent && oEvent.target ? ko.dataFor(oEvent.target) : null, !!oEvent.shiftKey);
|
||||
return fValueAccessor()(oEvent && oEvent.target ? ko.dataFor(oEvent.target) : null);
|
||||
};
|
||||
|
||||
$(oElement).draggable(oConf).on('mousedown', function () {
|
||||
|
|
|
|||
|
|
@ -1337,7 +1337,7 @@ Utils.convertPlainTextToHtml = function (sPlain)
|
|||
|
||||
Utils.draggeblePlace = function ()
|
||||
{
|
||||
return $('<div class="draggablePlace"><span class="text"></span> <i class="icon-mail icon-white"></i></div>').appendTo('#rl-hidden');
|
||||
return $('<div class="draggablePlace"><span class="text"></span> <i class="icon-copy icon-white visible-on-ctrl"></i><i class="icon-mail icon-white hidden-on-ctrl"></i></div>').appendTo('#rl-hidden');
|
||||
};
|
||||
|
||||
Utils.defautOptionsAfterRender = function (oOption, oItem)
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ var
|
|||
I18n = window['rainloopI18N'] || {},
|
||||
|
||||
$html = $('html'),
|
||||
|
||||
// $body = $('body'),
|
||||
|
||||
$window = $(window),
|
||||
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ Knoin.prototype.buildViewModel = function (ViewModelClass, oScreen)
|
|||
this.storeAndSetKeyScope();
|
||||
|
||||
RL.popupVisibilityNames.push(this.viewModelName);
|
||||
oViewModel.viewModelDom.css('z-index', 3000 + RL.popupVisibilityNames().length + 10);
|
||||
|
||||
Utils.delegateRun(this, 'onFocus', [], 500);
|
||||
}
|
||||
|
|
@ -119,6 +120,7 @@ Knoin.prototype.buildViewModel = function (ViewModelClass, oScreen)
|
|||
this.restoreKeyScope();
|
||||
|
||||
RL.popupVisibilityNames.remove(this.viewModelName);
|
||||
oViewModel.viewModelDom.css('z-index', 2000);
|
||||
|
||||
_.delay(function () {
|
||||
self.viewModelDom.hide();
|
||||
|
|
|
|||
|
|
@ -612,13 +612,15 @@ WebMailAjaxRemoteStorage.prototype.folderSetSubscribe = function (fCallback, sFo
|
|||
* @param {string} sFolder
|
||||
* @param {string} sToFolder
|
||||
* @param {Array} aUids
|
||||
* @param {string=} sLearning
|
||||
*/
|
||||
WebMailAjaxRemoteStorage.prototype.messagesMove = function (fCallback, sFolder, sToFolder, aUids)
|
||||
WebMailAjaxRemoteStorage.prototype.messagesMove = function (fCallback, sFolder, sToFolder, aUids, sLearning)
|
||||
{
|
||||
this.defaultRequest(fCallback, 'MessageMove', {
|
||||
'FromFolder': sFolder,
|
||||
'ToFolder': sToFolder,
|
||||
'Uids': aUids.join(',')
|
||||
'Uids': aUids.join(','),
|
||||
'Learning': sLearning || ''
|
||||
}, null, '', ['MessageList']);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,6 @@
|
|||
.popups {
|
||||
.b-ask-content {
|
||||
|
||||
&.modal {
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
.popups {
|
||||
.b-folder-system-content {
|
||||
&.modal {
|
||||
z-index: 1102;
|
||||
}
|
||||
.modal-header {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
.b-languages-content {
|
||||
|
||||
&.modal {
|
||||
z-index: 1103;
|
||||
width: 700px;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -225,6 +225,22 @@ html.rl-no-preview-pane {
|
|||
}
|
||||
}
|
||||
|
||||
.visible-on-ctrl {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.hidden-on-ctrl {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
html.rl-ctrl-key-pressed .visible-on-ctrl {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
html.rl-ctrl-key-pressed .hidden-on-ctrl {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#rl-loading, #rl-loading-error {
|
||||
position: absolute;
|
||||
font: 30px Tahoma;
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ html.rl-no-preview-pane {
|
|||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
|
||||
.b-message-list-wrapper {
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
|
|
|
|||
|
|
@ -116,6 +116,22 @@ MailBoxFolderListViewModel.prototype.onBuild = function (oDom)
|
|||
return false;
|
||||
});
|
||||
|
||||
key('space', Enums.KeyState.FolderList, function () {
|
||||
var bCollapsed = true, oFolder = null, $items = $('.b-folders .e-item .e-link:not(.hidden).focused', oDom);
|
||||
if ($items.length && $items[0])
|
||||
{
|
||||
oFolder = ko.dataFor($items[0]);
|
||||
if (oFolder)
|
||||
{
|
||||
bCollapsed = oFolder.collapsed();
|
||||
Utils.setExpandedFolder(oFolder.fullNameHash, bCollapsed);
|
||||
oFolder.collapsed(!bCollapsed);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
key('esc, tab, shift+tab, right', Enums.KeyState.FolderList, function () {
|
||||
self.folderList.focused(false);
|
||||
return false;
|
||||
|
|
@ -159,7 +175,7 @@ MailBoxFolderListViewModel.prototype.messagesDrop = function (oToFolder, oUi)
|
|||
{
|
||||
var
|
||||
sFromFolderFullNameRaw = oUi.helper.data('rl-folder'),
|
||||
bCopy = '1' === oUi.helper.data('rl-copy'),
|
||||
bCopy = $html.hasClass('rl-ctrl-key-pressed'),
|
||||
aUids = oUi.helper.data('rl-uids')
|
||||
;
|
||||
|
||||
|
|
|
|||
|
|
@ -172,6 +172,12 @@ function MailBoxMessageListViewModel()
|
|||
RL.data().messageListCheckedOrSelectedUidsWithSubMails(), true);
|
||||
}, this.canBeMoved);
|
||||
|
||||
this.notSpamCommand = Utils.createCommand(this, function () {
|
||||
RL.deleteMessagesFromFolder(Enums.FolderType.NotSpam,
|
||||
RL.data().currentFolderFullNameRaw(),
|
||||
RL.data().messageListCheckedOrSelectedUidsWithSubMails(), true);
|
||||
}, this.canBeMoved);
|
||||
|
||||
this.moveCommand = Utils.createCommand(this, Utils.emptyFunction, this.canBeMoved);
|
||||
|
||||
this.reloadCommand = Utils.createCommand(this, function () {
|
||||
|
|
@ -263,30 +269,40 @@ MailBoxMessageListViewModel.prototype.cancelSearch = function ()
|
|||
* @param {string} sToFolderFullNameRaw
|
||||
* @return {boolean}
|
||||
*/
|
||||
MailBoxMessageListViewModel.prototype.moveSelectedMessagesToFolder = function (sToFolderFullNameRaw)
|
||||
MailBoxMessageListViewModel.prototype.moveSelectedMessagesToFolder = function (sToFolderFullNameRaw, bCopy)
|
||||
{
|
||||
if (this.canBeMoved())
|
||||
{
|
||||
RL.moveMessagesToFolder(
|
||||
RL.data().currentFolderFullNameRaw(),
|
||||
RL.data().messageListCheckedOrSelectedUidsWithSubMails(), sToFolderFullNameRaw);
|
||||
RL.data().messageListCheckedOrSelectedUidsWithSubMails(), sToFolderFullNameRaw, bCopy);
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
MailBoxMessageListViewModel.prototype.dragAndDronHelper = function (oMessageListItem, bCopy)
|
||||
MailBoxMessageListViewModel.prototype.dragAndDronHelper = function (oMessageListItem)
|
||||
{
|
||||
if (oMessageListItem)
|
||||
{
|
||||
oMessageListItem.checked(true);
|
||||
}
|
||||
|
||||
var oEl = Utils.draggeblePlace();
|
||||
var
|
||||
oEl = Utils.draggeblePlace(),
|
||||
aUids = RL.data().messageListCheckedOrSelectedUidsWithSubMails()
|
||||
;
|
||||
|
||||
oEl.data('rl-folder', RL.data().currentFolderFullNameRaw());
|
||||
oEl.data('rl-uids', RL.data().messageListCheckedOrSelectedUidsWithSubMails());
|
||||
oEl.data('rl-copy', bCopy ? '1' : '0');
|
||||
oEl.find('.text').text((bCopy ? '+' : '') + '' + RL.data().messageListCheckedOrSelectedUidsWithSubMails().length);
|
||||
oEl.data('rl-uids', aUids);
|
||||
oEl.find('.text').text('' + aUids.length);
|
||||
|
||||
_.defer(function () {
|
||||
var aUids = RL.data().messageListCheckedOrSelectedUidsWithSubMails();
|
||||
|
||||
oEl.data('rl-uids', aUids);
|
||||
oEl.find('.text').text('' + aUids.length);
|
||||
});
|
||||
|
||||
return oEl;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ function MailBoxMessageViewViewModel()
|
|||
this.currentMessage = oData.currentMessage;
|
||||
this.messageListChecked = oData.messageListChecked;
|
||||
this.hasCheckedMessages = oData.hasCheckedMessages;
|
||||
this.messageListCheckedOrSelectedUidsWithSubMails = oData.messageListCheckedOrSelectedUidsWithSubMails;
|
||||
this.messageLoading = oData.messageLoading;
|
||||
this.messageLoadingThrottle = oData.messageLoadingThrottle;
|
||||
this.messagesBodiesDom = oData.messagesBodiesDom;
|
||||
|
|
@ -87,7 +88,7 @@ function MailBoxMessageViewViewModel()
|
|||
{
|
||||
RL.deleteMessagesFromFolder(Enums.FolderType.Trash,
|
||||
RL.data().currentFolderFullNameRaw(),
|
||||
RL.data().messageListCheckedOrSelectedUidsWithSubMails(), false);
|
||||
[this.message().uid], false);
|
||||
}
|
||||
}, this.messageVisibility);
|
||||
|
||||
|
|
@ -109,6 +110,15 @@ function MailBoxMessageViewViewModel()
|
|||
}
|
||||
}, this.messageVisibility);
|
||||
|
||||
this.notSpamCommand = Utils.createCommand(this, function () {
|
||||
if (this.message())
|
||||
{
|
||||
RL.deleteMessagesFromFolder(Enums.FolderType.NotSpam,
|
||||
this.message().folderFullNameRaw,
|
||||
[this.message().uid], true);
|
||||
}
|
||||
}, this.messageVisibility);
|
||||
|
||||
// viewer
|
||||
this.viewSubject = ko.observable('');
|
||||
this.viewFromShort = ko.observable('');
|
||||
|
|
@ -623,6 +633,16 @@ MailBoxMessageViewViewModel.prototype.showImages = function (oMessage)
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @returns {string}
|
||||
*/
|
||||
MailBoxMessageViewViewModel.prototype.printableCheckedMessageCount = function ()
|
||||
{
|
||||
var iCnt = this.messageListCheckedOrSelectedUidsWithSubMails().length;
|
||||
return 0 < iCnt ? (100 > iCnt ? iCnt : '99+') : '';
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {MessageModel} oMessage
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue