Dropdown menu keyboard navigation

Keyboard shortcuts help popup (Shift + / )
This commit is contained in:
RainLoop Team 2014-04-12 05:05:57 +04:00
parent f52be6fb66
commit d961fa480a
47 changed files with 5598 additions and 583 deletions

View file

@ -54,7 +54,7 @@ function AdminContacts()
return { return {
'id': sValue, 'id': sValue,
'name': getTypeName(sValue) + (bDisabled ? ' (not supported)' : ''), 'name': getTypeName(sValue) + (bDisabled ? ' (not supported)' : ''),
'disable': bDisabled 'disabled': bDisabled
}; };
}); });

View file

@ -47,7 +47,7 @@ AdminPlugins.prototype.onBuild = function (oDom)
self.configurePlugin(oPlugin); self.configurePlugin(oPlugin);
} }
}) })
.on('click', '.e-item .disable-plugin', function () { .on('click', '.e-item .disabled-plugin', function () {
var oPlugin = ko.dataFor(this); var oPlugin = ko.dataFor(this);
if (oPlugin) if (oPlugin)
{ {

View file

@ -820,7 +820,7 @@ RainLoopApp.prototype.folderListOptionsBuilder = function (aSystem, aList, aDisa
aResult.push({ aResult.push({
'id': aHeaderLines[iIndex][0], 'id': aHeaderLines[iIndex][0],
'name': aHeaderLines[iIndex][1], 'name': aHeaderLines[iIndex][1],
'disable': false 'disabled': false
}); });
} }
@ -833,7 +833,7 @@ RainLoopApp.prototype.folderListOptionsBuilder = function (aSystem, aList, aDisa
'id': oItem.fullNameRaw, 'id': oItem.fullNameRaw,
'system': true, 'system': true,
'name': fRenameCallback ? fRenameCallback.call(null, oItem) : oItem.name(), 'name': fRenameCallback ? fRenameCallback.call(null, oItem) : oItem.name(),
'disable': !oItem.selectable || -1 < Utils.inArray(oItem.fullNameRaw, aDisabled) || 'disabled': !oItem.selectable || -1 < Utils.inArray(oItem.fullNameRaw, aDisabled) ||
(fDisableCallback ? fDisableCallback.call(null, oItem) : false) (fDisableCallback ? fDisableCallback.call(null, oItem) : false)
}); });
} }
@ -853,7 +853,7 @@ RainLoopApp.prototype.folderListOptionsBuilder = function (aSystem, aList, aDisa
'system': false, 'system': false,
'name': (new window.Array(oItem.deep + 1 - iUnDeep)).join(sDeepPrefix) + 'name': (new window.Array(oItem.deep + 1 - iUnDeep)).join(sDeepPrefix) +
(fRenameCallback ? fRenameCallback.call(null, oItem) : oItem.name()), (fRenameCallback ? fRenameCallback.call(null, oItem) : oItem.name()),
'disable': !oItem.selectable || -1 < Utils.inArray(oItem.fullNameRaw, aDisabled) || 'disabled': !oItem.selectable || -1 < Utils.inArray(oItem.fullNameRaw, aDisabled) ||
(Enums.FolderType.User !== oItem.type()) || (Enums.FolderType.User !== oItem.type()) ||
(fDisableCallback ? fDisableCallback.call(null, oItem) : false) (fDisableCallback ? fDisableCallback.call(null, oItem) : false)
}); });

View file

@ -37,6 +37,7 @@ Enums.KeyState = {
'MessageList': 'message-list', 'MessageList': 'message-list',
'MessageView': 'message-view', 'MessageView': 'message-view',
'Compose': 'compose', 'Compose': 'compose',
'Settings': 'settings',
'Menu': 'menu', 'Menu': 'menu',
'PopupComposeOpenPGP': 'compose-open-pgp', 'PopupComposeOpenPGP': 'compose-open-pgp',
'PopupAsk': 'popup-ask' 'PopupAsk': 'popup-ask'

View file

@ -10,6 +10,11 @@ Globals.now = (new Date()).getTime();
*/ */
Globals.momentTrigger = ko.observable(true); Globals.momentTrigger = ko.observable(true);
/**
* @type {?}
*/
Globals.dropdownVisibility = ko.observable(false);
/** /**
* @type {?} * @type {?}
*/ */

View file

@ -8,7 +8,7 @@ ko.bindingHandlers.tooltip = {
sClass = $(oElement).data('tooltip-class') || '', sClass = $(oElement).data('tooltip-class') || '',
sPlacement = $(oElement).data('tooltip-placement') || 'top' sPlacement = $(oElement).data('tooltip-placement') || 'top'
; ;
$(oElement).tooltip({ $(oElement).tooltip({
'delay': { 'delay': {
'show': 500, 'show': 500,
@ -46,7 +46,54 @@ ko.bindingHandlers.tooltip2 = {
} }
}; };
ko.bindingHandlers.dropdown = { ko.__detectDropdownVisibility = _.debounce(function ($el) {
Globals.dropdownVisibility(!!$el.hasClass('open'));
}, 50);
ko.bindingHandlers.dropdownOpenStatus = {
'init': function (oElement) {
var $el = $(oElement);
$el.find('.dropdown-toggle').click(function () {
ko.__detectDropdownVisibility($el);
});
// $el.on('.dropdown-menu .menuitem', 'click', function () {
// $el.removeClass('open');
// ko.__detectDropdownVisibility($el);
// });
// $el.on('.dropdown-menu .menuitem', 'keydown', function (oEvent) {
// if (oEvent && Enums.EventKeyCode.Esc === oEvent.keyCode)
// {
// $el.removeClass('open');
// ko.__detectDropdownVisibility($el);
// }
// });
$html.on('click.dropdown.data-api', function () {
ko.__detectDropdownVisibility($el);
});
}
};
ko.bindingHandlers.openDropdownTrigger = {
'update': function (oElement, fValueAccessor) {
if (ko.utils.unwrapObservable(fValueAccessor()))
{
var $el = $(oElement);
if (!$el.hasClass('open'))
{
$el.find('.dropdown-toggle').dropdown('toggle');
ko.__detectDropdownVisibility($el);
}
fValueAccessor()(false);
}
}
};
ko.bindingHandlers.dropdownCloser = {
'init': function (oElement) { 'init': function (oElement) {
$(oElement).closest('.dropdown').on('click', '.e-item', function () { $(oElement).closest('.dropdown').on('click', '.e-item', function () {
$(oElement).dropdown('toggle'); $(oElement).dropdown('toggle');

View file

@ -1370,10 +1370,10 @@ Utils.draggeblePlace = function ()
Utils.defautOptionsAfterRender = function (oOption, oItem) Utils.defautOptionsAfterRender = function (oOption, oItem)
{ {
if (oItem && !Utils.isUnd(oItem.disable)) if (oItem && !Utils.isUnd(oItem.disabled))
{ {
ko.applyBindingsToNode(oOption, { ko.applyBindingsToNode(oOption, {
'disable': oItem.disable 'disabled': oItem.disabled
}, oItem); }, oItem);
} }
}; };

View file

@ -40,11 +40,6 @@ MailBoxScreen.prototype.onShow = function ()
RL.data().keyScope(Enums.KeyState.MessageList); RL.data().keyScope(Enums.KeyState.MessageList);
}; };
MailBoxScreen.prototype.onHide = function ()
{
RL.data().keyScope(Enums.KeyState.All);
};
/** /**
* @param {string} sFolderHash * @param {string} sFolderHash
* @param {number} iPage * @param {number} iPage
@ -131,17 +126,6 @@ MailBoxScreen.prototype.onStart = function ()
}, this); }, this);
}; };
//MailBoxScreen.prototype.onBuild = function ()
//{
// if (!Globals.bMobileDevice)
// {
// _.defer(function () {
// Utils.initLayoutResizer('#rl-resizer-left', '#rl-resizer-right', '#rl-right',
// 350, 800, 350, 350, Enums.ClientSideKeyName.MailBoxListSize);
// });
// }
//};
/** /**
* @return {Array} * @return {Array}
*/ */

View file

@ -24,6 +24,7 @@ _.extend(SettingsScreen.prototype, AbstractSettings.prototype);
SettingsScreen.prototype.onShow = function () SettingsScreen.prototype.onShow = function ()
{ {
// AbstractSettings.prototype.onShow.call(this); // AbstractSettings.prototype.onShow.call(this);
RL.setTitle(this.sSettingsTitle); RL.setTitle(this.sSettingsTitle);
RL.data().keyScope(Enums.KeyState.Settings);
}; };

View file

@ -5,22 +5,55 @@
*/ */
function AbstractData() function AbstractData()
{ {
this.keyScope = ko.observable(Enums.KeyState.All); this.keyScopeReal = ko.observable(Enums.KeyState.All);
this.keyScope.subscribe(function (sValue) { this.keyScopeFake = ko.observable(Enums.KeyState.All);
this.keyScope = ko.computed({
'owner': this,
'read': function () {
return this.keyScopeFake();
},
'write': function (sValue) {
if (Enums.KeyState.Compose === sValue) if (Enums.KeyState.Menu !== sValue)
{ {
Utils.disableKeyFilter(); if (Enums.KeyState.Compose === sValue)
} {
else Utils.disableKeyFilter();
{ }
Utils.restoreKeyFilter(); else
} {
Utils.restoreKeyFilter();
}
// window.console.log(sValue); this.keyScopeFake(sValue);
if (Globals.dropdownVisibility())
{
sValue = Enums.KeyState.Menu;
}
}
// window.console.log(sValue + '/' + this.keyScopeFake());
this.keyScopeReal(sValue);
}
});
this.keyScopeReal.subscribe(function (sValue) {
window.console.log(sValue);
key.setScope(sValue); key.setScope(sValue);
}); });
Globals.dropdownVisibility.subscribe(function (bValue) {
if (bValue)
{
this.keyScope(Enums.KeyState.Menu);
}
else if (Enums.KeyState.Menu === key.getScope())
{
this.keyScope(this.keyScopeFake());
}
}, this);
Utils.initDataConstructorBySettings(this); Utils.initDataConstructorBySettings(this);
} }

View file

@ -39,17 +39,6 @@ function WebMailDataStorage()
this.projectHash = ko.observable(''); this.projectHash = ko.observable('');
this.threading = ko.observable(false); this.threading = ko.observable(false);
this.accountMenuFocus = ko.observable(false);
this.accountMenuFocus.sKeyState = Enums.KeyState.All;
this.accountMenuFocus.subscribe(function (bValue) {
if (bValue)
{
this.accountMenuFocus.sKeyState = RL.data().keyScope();
}
RL.data().keyScope(bValue ? Enums.KeyState.Menu : this.accountMenuFocus.sKeyState);
}, this);
this.lastFoldersHash = ''; this.lastFoldersHash = '';
this.remoteSuggestions = false; this.remoteSuggestions = false;
@ -288,7 +277,14 @@ function WebMailDataStorage()
}, this); }, this);
this.message.focused.subscribe(function (bValue) { this.message.focused.subscribe(function (bValue) {
RL.data().keyScope(bValue ? Enums.KeyState.MessageView : Enums.KeyState.MessageList); if (bValue)
{
RL.data().keyScope(Enums.KeyState.MessageView);
}
else if (Enums.KeyState.MessageView === RL.data().keyScope())
{
RL.data().keyScope(Enums.KeyState.MessageList);
}
}); });
this.messageLoading.subscribe(function (bValue) { this.messageLoading.subscribe(function (bValue) {

View file

@ -1,60 +1,60 @@
.b-admin-domains { .b-admin-domains {
.process-place { .process-place {
width: 600px; width: 600px;
padding: 14px 0; padding: 14px 0;
text-align: center; text-align: center;
visibility: hidden; visibility: hidden;
} }
} }
.b-admin-domains-list-table { .b-admin-domains-list-table {
width: 600px; width: 600px;
.e-item { .e-item {
.e-action { .e-action {
cursor: pointer; cursor: pointer;
} }
.domain-name { .domain-name {
display: inline-block; display: inline-block;
word-break: break-all; word-break: break-all;
.box-sizing(border-box); .box-sizing(border-box);
} }
&.disabled .domain-name { &.disabled .domain-name {
color: #bbb; color: #bbb;
} }
.button-delete { .button-delete {
margin-right: 15px; margin-right: 15px;
visibility: hidden; visibility: hidden;
.opacity(0); .opacity(0);
} }
.delete-access { .delete-access {
&.button-delete { &.button-delete {
visibility: visible; visibility: visible;
margin-right: 0; margin-right: 0;
.opacity(100); .opacity(100);
} }
} }
.delete-domain, .disable-domain { .delete-domain, .disabled-domain {
cursor: pointer; cursor: pointer;
.opacity(50); .opacity(50);
} }
&.disabled .disable-domain { &.disabled .disabled-domain {
.opacity(50); .opacity(50);
} }
.delete-domain, .disable-domain { .delete-domain, .disabled-domain {
&:hover { &:hover {
.opacity(100); .opacity(100);
} }
} }
} }
} }

View file

@ -26,7 +26,7 @@
.plugin-img, .plugin-name { .plugin-img, .plugin-name {
color: #bbb; color: #bbb;
} }
.disable-plugin { .disabled-plugin {
.opacity(50); .opacity(50);
} }
} }

View file

@ -31,7 +31,7 @@
.opacity(100); .opacity(100);
} }
.btn.disable { .btn.disabled {
&.button-delete { &.button-delete {
visibility: hidden; visibility: hidden;
} }
@ -41,7 +41,7 @@
margin-left: 8px; margin-left: 8px;
} }
.disable.button-delete { .disabled.button-delete {
margin-left: 0px; margin-left: 0px;
} }
} }

View file

@ -1,5 +1,10 @@
.popups { .popups {
.b-shortcuts-content { .b-shortcuts-content {
&.modal {
width: 1025px;
}
.modal-header { .modal-header {
background-color: #fff; background-color: #fff;
} }

View file

@ -69,14 +69,14 @@
color: #fff; color: #fff;
} }
.e-item.disable > .e-link { .e-item.disabled > .e-link {
cursor: not-allowed; cursor: not-allowed;
background-color: #fff; background-color: #fff;
background-image: none; background-image: none;
color: grey; color: grey;
} }
.e-item.disable [class^="icon-"] { .e-item.disabled [class^="icon-"] {
color: grey; color: grey;
} }
} }

View file

@ -13,8 +13,9 @@ function AbstractSystemDropDownViewModel()
this.accounts = oData.accounts; this.accounts = oData.accounts;
this.accountEmail = oData.accountEmail; this.accountEmail = oData.accountEmail;
this.accountsLoading = oData.accountsLoading; this.accountsLoading = oData.accountsLoading;
this.accountMenuFocus = oData.accountMenuFocus;
this.accountMenuDropdownTrigger = ko.observable(false);
this.allowAddAccount = RL.settingsGet('AllowAdditionalAccounts'); this.allowAddAccount = RL.settingsGet('AllowAdditionalAccounts');
this.loading = ko.computed(function () { this.loading = ko.computed(function () {
@ -22,14 +23,6 @@ function AbstractSystemDropDownViewModel()
}, this); }, this);
this.accountClick = _.bind(this.accountClick, this); this.accountClick = _.bind(this.accountClick, this);
key('`', function () {
if (oData.useKeyboardShortcuts() && !RL.popupVisibility() &&
!oData.accountMenuFocus())
{
oData.accountMenuFocus(true);
}
});
} }
_.extend(AbstractSystemDropDownViewModel.prototype, KnoinAbstractViewModel.prototype); _.extend(AbstractSystemDropDownViewModel.prototype, KnoinAbstractViewModel.prototype);
@ -76,4 +69,15 @@ AbstractSystemDropDownViewModel.prototype.logoutClick = function ()
RL.loginAndLogoutReload(true, RL.settingsGet('ParentEmail') && 0 < RL.settingsGet('ParentEmail').length); RL.loginAndLogoutReload(true, RL.settingsGet('ParentEmail') && 0 < RL.settingsGet('ParentEmail').length);
}); });
}; };
AbstractSystemDropDownViewModel.prototype.onBuild = function ()
{
var self = this;
key('`', [Enums.KeyState.MessageList, Enums.KeyState.MessageView, Enums.KeyState.Settings], function () {
if (RL.data().useKeyboardShortcuts() && !RL.popupVisibility() && !Globals.dropdownVisibility() && self.viewModelVisibility())
{
self.accountMenuDropdownTrigger(true);
}
});
};

View file

@ -42,6 +42,9 @@ function MailBoxMessageListViewModel()
this.userUsageSize = oData.userUsageSize; this.userUsageSize = oData.userUsageSize;
this.userUsageProc = oData.userUsageProc; this.userUsageProc = oData.userUsageProc;
this.moveDropdownTrigger = ko.observable(false);
this.moreDropdownTrigger = ko.observable(false);
// append drag and drop // append drag and drop
this.dragOver = ko.observable(false).extend({'throttle': 1}); this.dragOver = ko.observable(false).extend({'throttle': 1});
this.dragOverEnter = ko.observable(false).extend({'throttle': 1}); this.dragOverEnter = ko.observable(false).extend({'throttle': 1});
@ -518,7 +521,7 @@ MailBoxMessageListViewModel.prototype.flagMessages = function (oCurrentMessage)
} }
}; };
MailBoxMessageListViewModel.prototype.flagMessagesFast = function () MailBoxMessageListViewModel.prototype.flagMessagesFast = function (bFlag)
{ {
var var
aChecked = this.messageListCheckedOrSelected(), aChecked = this.messageListCheckedOrSelected(),
@ -531,24 +534,43 @@ MailBoxMessageListViewModel.prototype.flagMessagesFast = function ()
return oMessage.flagged(); return oMessage.flagged();
}); });
this.setAction(aChecked[0].folderFullNameRaw, if (Utils.isUnd(bFlag))
aChecked.length === aFlagged.length ? Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, aChecked); {
this.setAction(aChecked[0].folderFullNameRaw,
aChecked.length === aFlagged.length ? Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, aChecked);
}
else
{
this.setAction(aChecked[0].folderFullNameRaw,
!bFlag ? Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, aChecked);
}
} }
}; };
MailBoxMessageListViewModel.prototype.seenMessagesFast = function () MailBoxMessageListViewModel.prototype.seenMessagesFast = function (bSeen)
{ {
var var
aChecked = this.messageListCheckedOrSelected(), aChecked = this.messageListCheckedOrSelected(),
aUnseen = [] aUnseen = []
; ;
aUnseen = _.filter(aChecked, function (oMessage) { if (0 < aChecked.length)
return oMessage.unseen(); {
}); aUnseen = _.filter(aChecked, function (oMessage) {
return oMessage.unseen();
});
this.setAction(aChecked[0].folderFullNameRaw, if (Utils.isUnd(bSeen))
0 < aUnseen.length ? Enums.MessageSetAction.SetSeen : Enums.MessageSetAction.UnsetSeen, aChecked); {
this.setAction(aChecked[0].folderFullNameRaw,
0 < aUnseen.length ? Enums.MessageSetAction.SetSeen : Enums.MessageSetAction.UnsetSeen, aChecked);
}
else
{
this.setAction(aChecked[0].folderFullNameRaw,
bSeen ? Enums.MessageSetAction.SetSeen : Enums.MessageSetAction.UnsetSeen, aChecked);
}
}
}; };
MailBoxMessageListViewModel.prototype.onBuild = function (oDom) MailBoxMessageListViewModel.prototype.onBuild = function (oDom)
@ -648,6 +670,14 @@ MailBoxMessageListViewModel.prototype.initShortcuts = function ()
} }
}); });
key('z', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts())
{
self.moreDropdownTrigger(true);
return false;
}
});
// delete // delete
key('delete, shift+delete', Enums.KeyState.MessageList, function (event, handler) { key('delete, shift+delete', Enums.KeyState.MessageList, function (event, handler) {
if (oData.useKeyboardShortcuts() && event) if (oData.useKeyboardShortcuts() && event)
@ -677,8 +707,8 @@ MailBoxMessageListViewModel.prototype.initShortcuts = function ()
} }
}); });
// new message (open compose popup) // write/compose (open compose popup)
key('c,n', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { key('w,c', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts()) if (oData.useKeyboardShortcuts())
{ {
kn.showScreenPopup(PopupsComposeViewModel); kn.showScreenPopup(PopupsComposeViewModel);
@ -686,8 +716,8 @@ MailBoxMessageListViewModel.prototype.initShortcuts = function ()
} }
}); });
// star/flag messages // important - star/flag messages
key('s', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { key('i', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts()) if (oData.useKeyboardShortcuts())
{ {
self.flagMessagesFast(); self.flagMessagesFast();
@ -695,11 +725,29 @@ MailBoxMessageListViewModel.prototype.initShortcuts = function ()
} }
}); });
// mark as read/unread // move
key('m', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { key('m', Enums.KeyState.MessageList, function () {
if (oData.useKeyboardShortcuts()) if (oData.useKeyboardShortcuts())
{ {
self.seenMessagesFast(); self.moveDropdownTrigger(true);
return false;
}
});
// read
key('q', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts())
{
self.seenMessagesFast(true);
return false;
}
});
// unread
key('u', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts())
{
self.seenMessagesFast(false);
return false; return false;
} }
}); });

View file

@ -40,6 +40,7 @@ function MailBoxMessageViewViewModel()
this.fullScreenMode = oData.messageFullScreenMode; this.fullScreenMode = oData.messageFullScreenMode;
this.showFullInfo = ko.observable(false); this.showFullInfo = ko.observable(false);
this.moreDropdownTrigger = ko.observable(false);
this.messageDomFocused = ko.observable(false).extend({'rateLimit': 0}); this.messageDomFocused = ko.observable(false).extend({'rateLimit': 0});
this.messageVisibility = ko.computed(function () { this.messageVisibility = ko.computed(function () {
@ -360,6 +361,13 @@ MailBoxMessageViewViewModel.prototype.onBuild = function (oDom)
this.messageDomFocused(!!bValue); this.messageDomFocused(!!bValue);
}, this); }, this);
this.messageDomFocused.subscribe(function (bValue) {
if (!bValue && Enums.KeyState.MessageView === this.keyScope())
{
this.message.focused(false);
}
}, this);
this.keyScope.subscribe(function (sValue) { this.keyScope.subscribe(function (sValue) {
if (Enums.KeyState.MessageView === sValue && this.message.focused()) if (Enums.KeyState.MessageView === sValue && this.message.focused())
{ {
@ -384,10 +392,14 @@ MailBoxMessageViewViewModel.prototype.escShortcuts = function ()
{ {
this.fullScreenMode(false); this.fullScreenMode(false);
} }
else else if (Enums.Layout.NoPreview === RL.data().layout())
{ {
this.message(null); this.message(null);
} }
else
{
this.message.focused(false);
}
return false; return false;
} }
@ -412,6 +424,14 @@ MailBoxMessageViewViewModel.prototype.initShortcuts = function ()
} }
}); });
key('x', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts())
{
self.moreDropdownTrigger(true);
return false;
}
});
// reply // reply
key('r', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { key('r', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts() && oData.message()) if (oData.useKeyboardShortcuts() && oData.message())
@ -440,13 +460,13 @@ MailBoxMessageViewViewModel.prototype.initShortcuts = function ()
}); });
// message information // message information
key('i', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { // key('i', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {
if (oData.useKeyboardShortcuts()) // if (oData.useKeyboardShortcuts())
{ // {
self.showFullInfo(!self.showFullInfo()); // self.showFullInfo(!self.showFullInfo());
return false; // return false;
} // }
}); // });
// toggle message blockquotes // toggle message blockquotes
key('b', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () { key('b', [Enums.KeyState.MessageList, Enums.KeyState.MessageView], function () {

View file

@ -13,6 +13,17 @@ function SettingsPaneViewModel()
Utils.extendAsViewModel('SettingsPaneViewModel', SettingsPaneViewModel); Utils.extendAsViewModel('SettingsPaneViewModel', SettingsPaneViewModel);
SettingsPaneViewModel.prototype.onBuild = function ()
{
var self = this;
key('esc', Enums.KeyState.Settings, function () {
if (RL.data().useKeyboardShortcuts())
{
self.backToMailBoxClick();
}
});
};
SettingsPaneViewModel.prototype.onShow = function () SettingsPaneViewModel.prototype.onShow = function ()
{ {
RL.data().message(null); RL.data().message(null);

View file

@ -21,7 +21,7 @@
@dropdown-menu-background-color: #fff; @dropdown-menu-background-color: #fff;
@dropdown-menu-hover-background-color: #48525C; @dropdown-menu-hover-background-color: #48525C;
@dropdown-menu-hover-color: #eee; @dropdown-menu-hover-color: #eee;
@dropdown-menu-disable-color: #999; @dropdown-menu-disabled-color: #999;
// FOLDERS // FOLDERS
@folders-color: #fff; @folders-color: #fff;

View file

@ -20,7 +20,7 @@
@dropdown-menu-background-color: #fff; @dropdown-menu-background-color: #fff;
@dropdown-menu-hover-background-color: #757575; @dropdown-menu-hover-background-color: #757575;
@dropdown-menu-hover-color: #eee; @dropdown-menu-hover-color: #eee;
@dropdown-menu-disable-color: #999; @dropdown-menu-disabled-color: #999;
// FOLDERS // FOLDERS
@folders-color: #000; @folders-color: #000;

View file

@ -98,12 +98,12 @@
} }
} }
.g-ui-menu .e-item.disable > .e-link, .g-ui-menu .e-item.disable > .e-link:hover { .g-ui-menu .e-item.disabled > .e-link, .g-ui-menu .e-item.disabled > .e-link:hover {
color: @dropdown-menu-disable-color !important; color: @dropdown-menu-disabled-color !important;
background-color: @dropdown-menu-background-color !important; background-color: @dropdown-menu-background-color !important;
> i { > i {
color: @dropdown-menu-disable-color !important; color: @dropdown-menu-disabled-color !important;
} }
} }

View file

@ -24,7 +24,7 @@
@dropdown-menu-background-color: #fff; @dropdown-menu-background-color: #fff;
@dropdown-menu-hover-background-color: #444; @dropdown-menu-hover-background-color: #444;
@dropdown-menu-hover-color: #eee; @dropdown-menu-hover-color: #eee;
@dropdown-menu-disable-color: #999; @dropdown-menu-disabled-color: #999;
@dropdown-menu-selected-background-color: #eee; @dropdown-menu-selected-background-color: #eee;
// FOLDERS // FOLDERS

View file

@ -1,20 +1,20 @@
<tr class="e-item" data-bind="css: {'disabled': disabled }"> <tr class="e-item" data-bind="css: {'disabled': disabled }">
<td class="e-action"> <td class="e-action">
<span class="domain-name" data-bind="text: name"></span> <span class="domain-name" data-bind="text: name"></span>
</td> </td>
<td> <td>
<a class="btn btn-small btn-small-small btn-danger pull-right button-delete" data-bind="css: {'delete-access': deleteAccess()}, click: function(oDomain) { $root.deleteDomain(oDomain); }"> <a class="btn btn-small btn-small-small btn-danger pull-right button-delete" data-bind="css: {'delete-access': deleteAccess()}, click: function(oDomain) { $root.deleteDomain(oDomain); }">
<span>Are you sure?</span> <span>Are you sure?</span>
</a> </a>
</td> </td>
<td> <td>
<span class="delete-domain" data-bind="visible: !deleteAccess(), click: function (oDomain) { $root.domainForDeletion(oDomain); }"> <span class="delete-domain" data-bind="visible: !deleteAccess(), click: function (oDomain) { $root.domainForDeletion(oDomain); }">
<i class="icon-trash"></i> <i class="icon-trash"></i>
</span> </span>
</td> </td>
<td> <td>
<span class="disable-domain" data-bind="click: function (oDomain) { $root.disableDomain(oDomain); }"> <span class="disabled-domain" data-bind="click: function (oDomain) { $root.disableDomain(oDomain); }">
<i data-bind="css: {'icon-checkbox-checked': !disabled(), 'icon-checkbox-unchecked': disabled}"></i> <i data-bind="css: {'icon-checkbox-checked': !disabled(), 'icon-checkbox-unchecked': disabled}"></i>
</span> </span>
</td> </td>
</tr> </tr>

View file

@ -4,7 +4,7 @@
<span class="plugin-name" data-bind="text: name"></span> <span class="plugin-name" data-bind="text: name"></span>
</td> </td>
<td> <td>
<span class="disable-plugin"> <span class="disabled-plugin">
<i data-bind="css: {'e-action icon-checkbox-checked': !disabled(), 'e-action icon-checkbox-unchecked': disabled}"></i> <i data-bind="css: {'e-action icon-checkbox-checked': !disabled(), 'e-action icon-checkbox-unchecked': disabled}"></i>
</span> </span>
</td> </td>

View file

@ -1,9 +1,9 @@
<div class="b-folders g-ui-user-select-none thm-folders"> <div class="b-folders g-ui-user-select-none thm-folders">
<div class="b-toolbar btn-toolbar"> <div class="b-toolbar btn-toolbar">
<a class="btn buttonCompose" data-placement="bottom" data-bind="click: composeClick, tooltip: 'FOLDER_LIST/BUTTON_COMPOSE'"> <a class="btn buttonCompose" data-tooltip-placement="bottom" data-bind="click: composeClick, tooltip: 'FOLDER_LIST/BUTTON_COMPOSE'">
<i class="icon-paper-plane"></i> <i class="icon-paper-plane"></i>
</a> </a>
<a class="btn buttonContacts" data-placement="bottom" data-bind="visible: allowContacts, click: contactsClick, tooltip: 'FOLDER_LIST/BUTTON_CONTACTS'"> <a class="btn buttonContacts" data-tooltip-placement="bottom" data-bind="visible: allowContacts, click: contactsClick, tooltip: 'FOLDER_LIST/BUTTON_CONTACTS'">
<i class="icon-address-book"></i> <i class="icon-address-book"></i>
</a> </a>
</div> </div>

View file

@ -4,95 +4,95 @@
<div class="toolbar"> <div class="toolbar">
<div class="btn-toolbar"> <div class="btn-toolbar">
<div class="btn-group"> <div class="btn-group">
<a class="btn buttonReload" data-placement="bottom" data-bind="command: reloadCommand, tooltip: 'MESSAGE_LIST/BUTTON_RELOAD'"> <a class="btn buttonReload" data-tooltip-placement="bottom" data-bind="command: reloadCommand, tooltip: 'MESSAGE_LIST/BUTTON_RELOAD'">
<i class="icon-spinner" data-bind="css: {'animated': messageListCompleteLoadingThrottle}"></i> <i class="icon-spinner" data-bind="css: {'animated': messageListCompleteLoadingThrottle}"></i>
</a> </a>
</div> </div>
<div class="btn-group">&nbsp;</div> <div class="btn-group">&nbsp;</div>
<div class="btn-group"> <div class="btn-group dropdown" data-bind="dropdownOpenStatus: true, openDropdownTrigger: moveDropdownTrigger">
<a class="btn dropdown-toggle buttonMove" data-toggle="dropdown" data-placement="bottom" data-bind="command: moveCommand, tooltip: 'MESSAGE_LIST/BUTTON_MOVE_TO'"> <a id="move-dropdown-id" href="#" tabindex="-1" class="btn dropdown-toggle buttonMove" data-toggle="dropdown" data-tooltip-placement="bottom" data-bind="command: moveCommand, tooltip: 'MESSAGE_LIST/BUTTON_MOVE_TO'">
<i class="icon-folder"></i> <i class="icon-folder"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="caret"></span> <span class="caret"></span>
</a> </a>
<ul class="dropdown-menu g-ui-menu" role="menu" data-bind="foreach: folderMenuForMove"> <ul class="dropdown-menu g-ui-menu" role="menu" aria-labelledby="move-dropdown-id" role="menu" data-bind="foreach: folderMenuForMove">
<li class="e-item" data-bind="css: { 'disable': disable }, click: function () { if (!disable) $root.moveSelectedMessagesToFolder(id); }"> <li class="e-item" role="presentation" data-bind="css: { 'disabled': disabled }, click: function () { if (!disabled) $root.moveSelectedMessagesToFolder(id); }">
<a class="e-link" data-bind="text: name"></a> <a class="e-link menuitem" href="#" tabindex="-1" data-bind="text: name"></a>
</li> </li>
</ul> </ul>
</div> </div>
<div class="btn-group">&nbsp;</div> <div class="btn-group">&nbsp;</div>
<div class="btn-group"> <div class="btn-group">
<a class="btn btn-dark-disabled-border button-archive" data-placement="bottom" data-bind="visible: !isArchiveFolder() && !isArchiveDisabled() && !isDraftFolder(), command: archiveCommand, tooltip: 'MESSAGE_LIST/BUTTON_ARCHIVE'"> <a class="btn btn-dark-disabled-border button-archive" data-tooltip-placement="bottom" data-bind="visible: !isArchiveFolder() && !isArchiveDisabled() && !isDraftFolder(), command: archiveCommand, tooltip: 'MESSAGE_LIST/BUTTON_ARCHIVE'">
<i class="icon-archive"></i> <i class="icon-archive"></i>
</a> </a>
<a class="btn btn-dark-disabled-border button-spam" data-placement="bottom" data-bind="visible: !isSpamFolder() && !isSpamDisabled() && !isDraftFolder() && !isSentFolder(), command: spamCommand, tooltip: 'MESSAGE_LIST/BUTTON_SPAM'"> <a class="btn btn-dark-disabled-border button-spam" data-tooltip-placement="bottom" data-bind="visible: !isSpamFolder() && !isSpamDisabled() && !isDraftFolder() && !isSentFolder(), command: spamCommand, tooltip: 'MESSAGE_LIST/BUTTON_SPAM'">
<i class="icon-bug"></i> <i class="icon-bug"></i>
</a> </a>
<a class="btn btn-dark-disabled-border button-delete" data-placement="bottom" data-bind="command: deleteCommand, tooltip: 'MESSAGE_LIST/BUTTON_DELETE'"> <a class="btn btn-dark-disabled-border button-delete" data-tooltip-placement="bottom" data-bind="command: deleteCommand, tooltip: 'MESSAGE_LIST/BUTTON_DELETE'">
<i class="icon-trash"></i> <i class="icon-trash"></i>
<span data-bind="text: printableMessageCountForDeletion()"></span> <span data-bind="text: printableMessageCountForDeletion()"></span>
</a> </a>
</div> </div>
<div class="btn-group">&nbsp;</div> <div class="btn-group">&nbsp;</div>
<div class="btn-group"> <div class="btn-group dropdown" data-bind="dropdownOpenStatus: true, openDropdownTrigger: moreDropdownTrigger">
<a class="btn dropdown-toggle buttonMore" data-toggle="dropdown" data-placement="bottom" data-bind="tooltip: 'MESSAGE_LIST/BUTTON_MORE'"> <a class="btn dropdown-toggle buttonMore" href="#" tabindex="-1" data-toggle="dropdown" data-tooltip-placement="bottom" data-bind="tooltip: 'MESSAGE_LIST/BUTTON_MORE'">
<i class="icon-list"></i> <i class="icon-list"></i>
</a> </a>
<ul class="dropdown-menu g-ui-menu" role="menu"> <ul class="dropdown-menu g-ui-menu" role="menu">
<li class="e-item" data-bind="click: listUnsetSeen, css: {'disable': !hasCheckedOrSelectedLines()}"> <li class="e-item" role="presentation" data-bind="click: listUnsetSeen, css: {'disabled': !hasCheckedOrSelectedLines()}">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-none"></i> <i class="icon-none"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_UNSET_SEEN"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_UNSET_SEEN"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="click: listSetSeen, css: {'disable': !hasCheckedOrSelectedLines()}"> <li class="e-item" role="presentation" data-bind="click: listSetSeen, css: {'disabled': !hasCheckedOrSelectedLines()}">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-none"></i> <i class="icon-none"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_SET_SEEN"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_SET_SEEN"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="click: listSetFlags, css: {'disable': !hasCheckedOrSelectedLines()}"> <li class="e-item" role="presentation" data-bind="click: listSetFlags, css: {'disabled': !hasCheckedOrSelectedLines()}">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-none"></i> <i class="icon-none"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_SET_FLAG"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_SET_FLAG"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="click: listUnsetFlags, css: {'disable': !hasCheckedOrSelectedLines()}"> <li class="e-item" role="presentation" data-bind="click: listUnsetFlags, css: {'disabled': !hasCheckedOrSelectedLines()}">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-none"></i> <i class="icon-none"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_UNSET_FLAG"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_UNSET_FLAG"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="click: listSetAllSeen, css: {'disable': !hasMessages()}"> <li class="e-item" role="presentation" data-bind="click: listSetAllSeen, css: {'disabled': !hasMessages()}">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-none"></i> <i class="icon-none"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_SET_ALL_SEEN"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/MENU_SET_ALL_SEEN"></span>
</a> </a>
</li> </li>
<li class="divider"></li> <li class="divider" role="presentation"></li>
<li class="e-item" data-bind="command: multyForwardCommand"> <li class="e-item" role="presentation" data-bind="command: multyForwardCommand">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-reply-all"></i> <i class="icon-reply-all"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/BUTTON_MULTY_FORWARD"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/BUTTON_MULTY_FORWARD"></span>
</a> </a>
</li> </li>
<li class="divider"></li> <li class="divider" role="presentation"></li>
<li class="e-item" data-bind="command: deleteWithoutMoveCommand"> <li class="e-item" role="presentation" data-bind="command: deleteWithoutMoveCommand">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-trash"></i> <i class="icon-trash"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/BUTTON_DELETE_WITHOUT_MOVE"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/BUTTON_DELETE_WITHOUT_MOVE"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="command: clearCommand"> <li class="e-item" role="presentation" data-bind="command: clearCommand">
<a class="e-link"> <a class="e-link menuitem" href="#" tabindex="-1">
<i class="icon-fire"></i> <i class="icon-fire"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE_LIST/BUTTON_EMPTY_FOLDER"></span> <span class="i18n" data-i18n-text="MESSAGE_LIST/BUTTON_EMPTY_FOLDER"></span>
@ -153,11 +153,6 @@
</div> </div>
<div class="mainDelimiter footerDelimiter"></div> <div class="mainDelimiter footerDelimiter"></div>
<div class="b-footer thm-message-list-bottom-toolbar"> <div class="b-footer thm-message-list-bottom-toolbar">
<!--
<a class="btn buttonReload" data-placement="right" data-bind="command: reloadCommand, tooltip: 'MESSAGE_LIST/BUTTON_RELOAD'">
<i class="icon-spinner" data-bind="css: {'animated': messageListCompleteLoadingThrottle}"></i>
</a>
-->
<span data-bind="visible: 0 < userUsageProc(), tooltip2: quotaTooltip" class="e-quota"> <span data-bind="visible: 0 < userUsageProc(), tooltip2: quotaTooltip" class="e-quota">
<span data-bind="text: userUsageProc"></span>% <span data-bind="text: userUsageProc"></span>%
</span> </span>

View file

@ -2,107 +2,107 @@
<div class="messageView" data-bind="css: {'message-selected': isMessageSelected, 'message-focused': message.focused}"> <div class="messageView" data-bind="css: {'message-selected': isMessageSelected, 'message-focused': message.focused}">
<div class="toolbar g-ui-user-select-none"> <div class="toolbar g-ui-user-select-none">
<div class="messageButtons btn-toolbar"> <div class="messageButtons btn-toolbar">
<div class="btn-group" data-placement="bottom" data-bind="visible: !usePreviewPane(), tooltip: 'MESSAGE/BUTTON_CLOSE'"> <div class="btn-group" data-tooltip-placement="bottom" data-bind="visible: !usePreviewPane(), tooltip: 'MESSAGE/BUTTON_CLOSE'">
<a class="btn buttonClose" data-bind="command: closeMessage"> <a class="btn buttonClose" data-bind="command: closeMessage">
<i class="icon-remove"></i> <i class="icon-remove"></i>
</a> </a>
</div> </div>
<div class="btn-group">&nbsp;</div> <div class="btn-group">&nbsp;</div>
<div class="btn-group" data-placement="bottom" data-bind="visible: isDraftFolder(), tooltip: 'MESSAGE/BUTTON_EDIT'"> <div class="btn-group" data-tooltip-placement="bottom" data-bind="visible: isDraftFolder(), tooltip: 'MESSAGE/BUTTON_EDIT'">
<a class="btn btn-success buttonEdit" data-bind="command: messageEditCommand"> <a class="btn btn-success buttonEdit" data-bind="command: messageEditCommand">
<i class="icon-pencil icon-white"></i> <i class="icon-pencil icon-white"></i>
</a> </a>
</div> </div>
<div class="btn-group" data-bind="visible: !isDraftFolder()"> <div class="btn-group" data-bind="visible: !isDraftFolder()">
<a class="btn btn-dark-disabled-border buttonReply" data-placement="bottom" data-bind="command: replyCommand, tooltip: 'MESSAGE/BUTTON_REPLY'"> <a class="btn btn-dark-disabled-border buttonReply" data-tooltip-placement="bottom" data-bind="command: replyCommand, tooltip: 'MESSAGE/BUTTON_REPLY'">
<i class="icon-reply"></i> <i class="icon-reply"></i>
</a> </a>
<a class="btn btn-dark-disabled-border buttonReplyAll" data-placement="bottom" data-bind="command: replyAllCommand, tooltip: 'MESSAGE/BUTTON_REPLY_ALL'"> <a class="btn btn-dark-disabled-border buttonReplyAll" data-tooltip-placement="bottom" data-bind="command: replyAllCommand, tooltip: 'MESSAGE/BUTTON_REPLY_ALL'">
<i class="icon-reply-all"></i> <i class="icon-reply-all"></i>
</a> </a>
<a class="btn btn-dark-disabled-border buttonForward" data-placement="bottom" data-bind=" command: forwardCommand, tooltip: 'MESSAGE/BUTTON_FORWARD'"> <a class="btn btn-dark-disabled-border buttonForward" data-tooltip-placement="bottom" data-bind=" command: forwardCommand, tooltip: 'MESSAGE/BUTTON_FORWARD'">
<i class="icon-forward"></i> <i class="icon-forward"></i>
</a> </a>
</div> </div>
<div class="btn-group" data-bind="visible: !usePreviewPane()">&nbsp;</div> <div class="btn-group" data-bind="visible: !usePreviewPane()">&nbsp;</div>
<div class="btn-group" data-bind="visible: !usePreviewPane()"> <div class="btn-group" data-bind="visible: !usePreviewPane()">
<a class="btn btn-dark-disabled-border button-archive" data-placement="bottom" data-bind="visible: !isDraftFolder() && !isArchiveFolder() && !isArchiveDisabled(), command: archiveCommand, tooltip: 'MESSAGE/BUTTON_ARCHIVE'"> <a class="btn btn-dark-disabled-border button-archive" data-tooltip-placement="bottom" data-bind="visible: !isDraftFolder() && !isArchiveFolder() && !isArchiveDisabled(), command: archiveCommand, tooltip: 'MESSAGE/BUTTON_ARCHIVE'">
<i class="icon-archive"></i> <i class="icon-archive"></i>
</a> </a>
<a class="btn btn-dark-disabled-border button-spam" data-placement="bottom" data-bind="visible: !isDraftFolder() && !isSentFolder() && !isSpamFolder() && !isSpamDisabled(), command: spamCommand, tooltip: 'MESSAGE/BUTTON_SPAM'"> <a class="btn btn-dark-disabled-border button-spam" data-tooltip-placement="bottom" data-bind="visible: !isDraftFolder() && !isSentFolder() && !isSpamFolder() && !isSpamDisabled(), command: spamCommand, tooltip: 'MESSAGE/BUTTON_SPAM'">
<i class="icon-bug"></i> <i class="icon-bug"></i>
</a> </a>
<a class="btn btn-dark-disabled-border button-delete" data-placement="bottom" data-bind="command: deleteCommand, tooltip: 'MESSAGE/BUTTON_DELETE'"> <a class="btn btn-dark-disabled-border button-delete" data-tooltip-placement="bottom" data-bind="command: deleteCommand, tooltip: 'MESSAGE/BUTTON_DELETE'">
<i class="icon-trash"></i> <i class="icon-trash"></i>
</a> </a>
</div> </div>
<div class="btn-group">&nbsp;</div> <div class="btn-group">&nbsp;</div>
<div class="btn-group"> <div class="btn-group dropdown" data-bind="dropdownOpenStatus: true, openDropdownTrigger: moreDropdownTrigger"">
<a class="btn dropdown-toggle buttonMore" data-placement="bottom" data-toggle="dropdown" data-bind="command: messageVisibilityCommand, tooltip: 'MESSAGE/BUTTON_MORE'"> <a class="btn dropdown-toggle buttonMore" href="#" tabindex="-1" data-toggle="dropdown" data-tooltip-placement="bottom" data-bind="command: messageVisibilityCommand, tooltip: 'MESSAGE/BUTTON_MORE'">
<i class="icon-list"></i> <i class="icon-list"></i>
</a> </a>
<ul class="dropdown-menu g-ui-menu" role="menu"> <ul class="dropdown-menu g-ui-menu" role="menu">
<li class="e-item" data-bind="visible: !isDraftFolder()"> <li class="e-item" role="presentation" data-bind="visible: !isDraftFolder()">
<a class="e-link" data-bind="command: forwardAsAttachmentCommand"> <a class="e-link menuitem" href="#" tabindex="-1" data-bind="command: forwardAsAttachmentCommand">
<i class="icon-reply"></i> <i class="icon-reply"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/BUTTON_FORWARD_AS_ATTACHMENT"></span> <span class="i18n" data-i18n-text="MESSAGE/BUTTON_FORWARD_AS_ATTACHMENT"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="visible: !isDraftFolder()"> <li class="e-item" role="presentation" data-bind="visible: !isDraftFolder()">
<a class="e-link" data-bind="command: editAsNewCommand"> <a class="e-link menuitem" href="#" tabindex="-1" data-bind="command: editAsNewCommand">
<i class="icon-pencil"></i> <i class="icon-pencil"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/BUTTON_EDIT_AS_NEW"></span> <span class="i18n" data-i18n-text="MESSAGE/BUTTON_EDIT_AS_NEW"></span>
</a> </a>
</li> </li>
<li class="divider" data-bind="visible: !isDraftFolder()"></li> <li class="divider" role="presentation" data-bind="visible: !isDraftFolder()"></li>
<li class="e-item" data-bind="visible: usePreviewPane() && !isDraftFolder() && !isArchiveFolder() && !isArchiveDisabled()"> <li class="e-item" role="presentation" data-bind="visible: usePreviewPane() && !isDraftFolder() && !isArchiveFolder() && !isArchiveDisabled()">
<a target="_blank" class="e-link" data-bind="command: archiveCommand"> <a target="_blank" class="e-link menuitem" href="#" tabindex="-1" data-bind="command: archiveCommand">
<i class="icon-archive"></i> <i class="icon-archive"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/BUTTON_ARCHIVE"></span> <span class="i18n" data-i18n-text="MESSAGE/BUTTON_ARCHIVE"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="visible: usePreviewPane() && !isDraftFolder() && !isSentFolder() && !isSpamFolder() && !isSpamDisabled()"> <li class="e-item" role="presentation" data-bind="visible: usePreviewPane() && !isDraftFolder() && !isSentFolder() && !isSpamFolder() && !isSpamDisabled()">
<a target="_blank" class="e-link" data-bind="command: spamCommand"> <a target="_blank" class="e-link menuitem" href="#" tabindex="-1" data-bind="command: spamCommand">
<i class="icon-bug"></i> <i class="icon-bug"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/BUTTON_SPAM"></span> <span class="i18n" data-i18n-text="MESSAGE/BUTTON_SPAM"></span>
</a> </a>
</li> </li>
<li class="e-item" data-bind="visible: usePreviewPane()"> <li class="e-item" role="presentation" data-bind="visible: usePreviewPane()">
<a target="_blank" class="e-link" data-bind="command: deleteCommand"> <a target="_blank" class="e-link menuitem" href="#" tabindex="-1" data-bind="command: deleteCommand">
<i class="icon-trash"></i> <i class="icon-trash"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/BUTTON_DELETE"></span> <span class="i18n" data-i18n-text="MESSAGE/BUTTON_DELETE"></span>
</a> </a>
</li> </li>
<li class="divider" data-bind="visible: usePreviewPane()"></li> <li class="divider" role="presentation" data-bind="visible: usePreviewPane()"></li>
<li class="e-item"> <li class="e-item" role="presentation">
<a target="_blank" class="e-link" data-bind="click: function () { if (message()) { message().printMessage(); }} "> <a target="_blank" class="e-link menuitem" href="#" tabindex="-1" data-bind="click: function () { if (message()) { message().printMessage(); }} ">
<i class="icon-print"></i> <i class="icon-print"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/MENU_PRINT"></span> <span class="i18n" data-i18n-text="MESSAGE/MENU_PRINT"></span>
</a> </a>
</li> </li>
<li class="e-item"> <li class="e-item" role="presentation">
<a target="_blank" class="e-link" data-bind="click: function () { if (message()) { message().viewPopupMessage(); }}"> <a target="_blank" class="e-link menuitem" href="#" tabindex="-1" data-bind="click: function () { if (message()) { message().viewPopupMessage(); }}">
<i class="icon-popup"></i> <i class="icon-popup"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/BUTTON_IN_NEW_WINDOW"></span> <span class="i18n" data-i18n-text="MESSAGE/BUTTON_IN_NEW_WINDOW"></span>
</a> </a>
</li> </li>
<li class="divider"></li> <li class="divider" role="presentation"></li>
<li class="e-item"> <li class="e-item" role="presentation">
<a target="_blank" class="e-link" data-bind="link: viewViewLink()"> <a target="_blank" class="e-link menuitem" href="#" tabindex="-1" data-bind="link: viewViewLink()">
<i class="icon-file-code"></i> <i class="icon-file-code"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/MENU_VIEW_ORIGINAL"></span> <span class="i18n" data-i18n-text="MESSAGE/MENU_VIEW_ORIGINAL"></span>
</a> </a>
</li> </li>
<li class="e-item"> <li class="e-item" role="presentation">
<a target="_blank" class="e-link" data-bind="link: viewDownloadLink()"> <a target="_blank" class="e-link menuitem" href="#" tabindex="-1" data-bind="link: viewDownloadLink()">
<i class="icon-download"></i> <i class="icon-download"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="i18n" data-i18n-text="MESSAGE/MENU_DOWNLOAD_ORIGINAL"></span> <span class="i18n" data-i18n-text="MESSAGE/MENU_DOWNLOAD_ORIGINAL"></span>

View file

@ -31,13 +31,13 @@
<div class="dropdown pull-left"> <div class="dropdown pull-left">
<span class="dropdown-toggle g-ui-dropdown e-identity" <span class="dropdown-toggle g-ui-dropdown e-identity"
id="IdentityLabel" role="button" data-toggle="dropdown" id="IdentityLabel" role="button" data-toggle="dropdown"
data-bind="text: currentIdentityString, dropdown: true, css: {'multiply': 1 < identitiesOptions().length }"> data-bind="text: currentIdentityString, dropdownCloser: true, css: {'multiply': 1 < identitiesOptions().length }">
</span> </span>
<!-- ko if: 1 < identitiesOptions().length --> <!-- ko if: 1 < identitiesOptions().length -->
<ul class="dropdown-menu g-ui-menu" role="menu" aria-labelledby="IdentityLabel"> <ul class="dropdown-menu g-ui-menu" role="menu" aria-labelledby="IdentityLabel">
<!-- ko foreach: identitiesOptions --> <!-- ko foreach: identitiesOptions -->
<li class="e-item"> <li class="e-item">
<a class="e-link" data-bind="click: function (oIdentity) { $root.selectIdentity(oIdentity); return true; }"> <a class="e-link" tabindex="-1" href="#" data-bind="click: function (oIdentity) { $root.selectIdentity(oIdentity); return true; }">
<span data-bind="text: optText"></span> <span data-bind="text: optText"></span>
</a> </a>
</li> </li>
@ -108,7 +108,7 @@
</div> </div>
<div class="pull-right"> <div class="pull-right">
<div class="btn-group pull-right"> <div class="btn-group pull-right">
<a class="btn dropdown-toggle buttonMore" data-placement="bottom" data-toggle="dropdown"> <a class="btn dropdown-toggle buttonMore" data-toggle="dropdown">
<i class="icon-list"></i> <i class="icon-list"></i>
</a> </a>
<ul class="dropdown-menu g-ui-menu" role="menu"> <ul class="dropdown-menu g-ui-menu" role="menu">
@ -120,7 +120,7 @@
</a> </a>
</li> </li>
<li class="divider"></li> <li class="divider"></li>
<li class="e-item" data-bind="visible: allowOpenPGP, click: openOpenPgpPopup, css: {'disable': isHtml()}"> <li class="e-item" data-bind="visible: allowOpenPGP, click: openOpenPgpPopup, css: {'disabled': isHtml()}">
<a class="e-link"> <a class="e-link">
<i class="icon-key"></i> <i class="icon-key"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
@ -131,13 +131,13 @@
</div> </div>
<div class="btn-group pull-right">&nbsp;</div> <div class="btn-group pull-right">&nbsp;</div>
<div class="btn-group pull-right"> <div class="btn-group pull-right">
<a class="btn" data-placement="top" data-bind="visible: addAttachmentEnabled(), initDom: composeUploaderButton, tooltip: 'COMPOSE/ATTACH_FILES'"> <a class="btn" data-tooltip-placement="top" data-bind="visible: addAttachmentEnabled(), initDom: composeUploaderButton, tooltip: 'COMPOSE/ATTACH_FILES'">
<i class="icon-attachment"></i> <i class="icon-attachment"></i>
</a> </a>
<a class="btn" data-placement="top" data-bind="visible: dropboxEnabled, command: dropboxCommand, tooltip: 'COMPOSE/DROPBOX'"> <a class="btn" data-tooltip-placement="top" data-bind="visible: dropboxEnabled, command: dropboxCommand, tooltip: 'COMPOSE/DROPBOX'">
<i class="icon-dropbox"></i> <i class="icon-dropbox"></i>
</a> </a>
<a class="btn" data-placement="top" data-bind="visible: driveEnabled, command: driveCommand, tooltip: 'COMPOSE/GOOGLE_DRIVE'"> <a class="btn" data-tooltip-placement="top" data-bind="visible: driveEnabled, command: driveCommand, tooltip: 'COMPOSE/GOOGLE_DRIVE'">
<i class="icon-google-drive"></i> <i class="icon-google-drive"></i>
</a> </a>
</div> </div>

View file

@ -109,7 +109,7 @@
</div> </div>
<div class="control-group" data-bind="visible: !viewReadOnly() || 0 < viewPropertiesEmails().length"> <div class="control-group" data-bind="visible: !viewReadOnly() || 0 < viewPropertiesEmails().length">
<label class="control-label remove-padding-top fix-width"> <label class="control-label remove-padding-top fix-width">
<i class="icon-at iconsize24" data-placement="left" data-bind="tooltip: 'CONTACTS/LABEL_EMAIL'"></i> <i class="icon-at iconsize24" data-tooltip-placement="left" data-bind="tooltip: 'CONTACTS/LABEL_EMAIL'"></i>
</label> </label>
<div class="controls fix-width"> <div class="controls fix-width">
<div data-bind="foreach: viewPropertiesEmails"> <div data-bind="foreach: viewPropertiesEmails">
@ -123,7 +123,7 @@
</div> </div>
<div class="control-group" data-bind="visible: !viewReadOnly() || 0 < viewPropertiesPhones().length"> <div class="control-group" data-bind="visible: !viewReadOnly() || 0 < viewPropertiesPhones().length">
<label class="control-label remove-padding-top fix-width"> <label class="control-label remove-padding-top fix-width">
<i class="icon-telephone iconsize24" data-placement="left" data-bind="tooltip: 'CONTACTS/LABEL_PHONE'"></i> <i class="icon-telephone iconsize24" data-tooltip-placement="left" data-bind="tooltip: 'CONTACTS/LABEL_PHONE'"></i>
</label> </label>
<div class="controls fix-width"> <div class="controls fix-width">
<div data-bind="foreach: viewPropertiesPhones"> <div data-bind="foreach: viewPropertiesPhones">
@ -144,12 +144,12 @@
</div> </div>
<div class="e-read-only-sign"> <div class="e-read-only-sign">
<i class="icon-lock iconsize24" data-placement="left" data-bind="tooltip: 'CONTACTS/LABEL_READ_ONLY'"></i> <i class="icon-lock iconsize24" data-tooltip-placement="left" data-bind="tooltip: 'CONTACTS/LABEL_READ_ONLY'"></i>
</div> </div>
<div class="e-share-sign" data-bind="visible: contactsSharingIsAllowed"> <div class="e-share-sign" data-bind="visible: contactsSharingIsAllowed">
<div class="btn-group pull-right"> <div class="btn-group pull-right">
<a class="btn dropdown-toggle" data-placement="left" data-toggle="dropdown" data-bind="tooltip: 'CONTACTS/LABEL_SHARE'"> <a class="btn dropdown-toggle" data-tooltip-placement="left" data-toggle="dropdown" data-bind="tooltip: 'CONTACTS/LABEL_SHARE'">
<i data-bind="css: shareIcon"></i> <i data-bind="css: shareIcon"></i>
&nbsp;&nbsp; &nbsp;&nbsp;
<span class="caret"></span> <span class="caret"></span>

View file

@ -7,11 +7,58 @@
</h3> </h3>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<br /> <div class="row" style="margin-left: 0">
Coming soon! <div class="span6">
<br />
<br /> <table class="table table-condensed table-striped">
<br /> <thead><tr><th>Mailbox</th></tr></thead>
<tbody>
<tr><td>Open user dropdown</td><td>`</td></tr>
<tr><td>Compose popup</td><td>W, C</td></tr>
<tr><td>Open message list more dropdown</td><td>Z</td></tr>
<tr><td>Open message view more dropdown</td><td>X</td></tr>
<tr><td>Help</td><td>?, Shift + /</td></tr>
</tbody>
</table>
<table class="table table-condensed table-striped">
<thead><tr><th>Message view (focused)</th></tr></thead>
<tbody>
<tr><td>Toggle fullscreen mode</td><td>Enter</td></tr>
<tr><td>Toggle message blockquotes</td><td>B</td></tr>
<tr><td>Print</td><td>Ctrl + P, Command + P</td></tr>
<tr><td>Exit fullscreen mode</td><td>Esc</td></tr>
<tr><td>Close message (No preview pane layout)</td><td>Esc</td></tr>
<tr><td>Switch focus back to message list</td><td>Tab, Shift + Tab</td></tr>
</tbody>
</table>
</div>
<div class="span6">
<table class="table table-condensed table-striped">
<thead><tr><th>Message list</th></tr></thead>
<tbody>
<tr><td>Check All</td><td>Ctrl + A, Command + A</td></tr>
<tr><td>Delete selected messages</td><td>Delete, Shift + delete</td></tr>
<tr><td>Reply selected message</td><td>R</td></tr>
<tr><td>Reply All selected message</td><td>A</td></tr>
<tr><td>Froward selected message</td><td>F</td></tr>
<tr><td>Froward (multiply) selected messages</td><td>Shift + F</td></tr>
<tr><td>Move selected messages</td><td>M</td></tr>
<tr><td>Read selected messages</td><td>R</td></tr>
<tr><td>UnRead selected messages</td><td>U</td></tr>
<tr><td>Important, star/flag selected messages</td><td>I</td></tr>
<tr><td>Search</td><td>/</td></tr>
<tr><td>Cancel search</td><td>Esc</td></tr>
<tr><td>View message (No preview pane layout)</td><td>Enter</td></tr>
<tr><td>Switch focus to selected message</td><td>Tab, Shift + Tab</td></tr>
</tbody>
</table>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -9,10 +9,10 @@
<div class="btn-group pull-right"> <div class="btn-group pull-right">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
</div>--> </div>-->
<div class="btn-group pull-right"> <div class="btn-group pull-right dropdown" data-bind="dropdownOpenStatus: true, openDropdownTrigger: accountMenuDropdownTrigger">
<a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown" <a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn btn-ellipsis btn-block dropdown-toggle system-dropdown"
data-placement="left" data-toggle="dropdown" data-toggle="dropdown" data-tooltip-placement="left"
data-tooltip-class="tooltip-big" data-bind="tooltip2: emailTitle, hasfocus: accountMenuFocus"> data-tooltip-class="tooltip-big" data-bind="tooltip2: emailTitle">
<i data-bind="css: {'icon-user': !loading(), 'icon-spinner animated': loading()}"></i> <i data-bind="css: {'icon-user': !loading(), 'icon-spinner animated': loading()}"></i>
&nbsp;&nbsp; &nbsp;&nbsp;

View file

@ -637,7 +637,7 @@
border-radius: 8px; border-radius: 8px;
} }
/*! normalize.css 2012-03-11T12:53 UTC - http://github.com/necolas/normalize.css */ /*! normalize.css 2012-03-11T12:53 UTC - http://github.com/necolas/normalize.css */
/* ============================================================================= /* =============================================================================
@ -1142,7 +1142,7 @@ table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
} }
@charset "UTF-8"; @charset "UTF-8";
@font-face { @font-face {
@ -1483,7 +1483,7 @@ table {
.icon-filter:before { .icon-filter:before {
content: "\e063"; content: "\e063";
} }
/** initial setup **/ /** initial setup **/
.nano { .nano {
/* /*
@ -1535,7 +1535,7 @@ table {
-moz-border-radius : 5px; -moz-border-radius : 5px;
-webkit-border-radius : 5px; -webkit-border-radius : 5px;
border-radius : 5px; border-radius : 5px;
z-index: 10000; z-index: 102;
margin : 2px; margin : 2px;
} }
@ -1600,7 +1600,7 @@ table {
.nano > .pane2:hover > .slider2, .nano > .pane2.active > .slider2 { .nano > .pane2:hover > .slider2, .nano > .pane2.active > .slider2 {
background-color: rgba(0, 0, 0, 0.4); background-color: rgba(0, 0, 0, 0.4);
} }
/* Magnific Popup CSS */ /* Magnific Popup CSS */
.mfp-bg { .mfp-bg {
top: 0; top: 0;
@ -1965,7 +1965,7 @@ img.mfp-img {
right: 0; right: 0;
padding-top: 0; } padding-top: 0; }
/* overlay at start */ /* overlay at start */
.mfp-fade.mfp-bg { .mfp-fade.mfp-bg {
@ -2011,7 +2011,7 @@ img.mfp-img {
-moz-transform: translateX(50px); -moz-transform: translateX(50px);
transform: translateX(50px); transform: translateX(50px);
} }
.simple-pace { .simple-pace {
-webkit-pointer-events: none; -webkit-pointer-events: none;
pointer-events: none; pointer-events: none;
@ -2082,7 +2082,7 @@ img.mfp-img {
@keyframes simple-pace-stripe-animation { @keyframes simple-pace-stripe-animation {
0% { transform: none; transform: none; } 0% { transform: none; transform: none; }
100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); }
} }
.inputosaurus-container { .inputosaurus-container {
background-color:#fff; background-color:#fff;
border:1px solid #bcbec0; border:1px solid #bcbec0;
@ -2150,7 +2150,7 @@ img.mfp-img {
box-shadow:none; box-shadow:none;
} }
.inputosaurus-input-hidden { display:none; } .inputosaurus-input-hidden { display:none; }
.flag-wrapper { .flag-wrapper {
width: 24px; width: 24px;
height: 16px; height: 16px;
@ -2194,7 +2194,7 @@ img.mfp-img {
.flag.flag-pt-br {background-position: -192px -11px} .flag.flag-pt-br {background-position: -192px -11px}
.flag.flag-cn, .flag.flag-zh-tw, .flag.flag-zh-cn, .flag.flag-zh-hk {background-position: -208px -22px} .flag.flag-cn, .flag.flag-zh-tw, .flag.flag-zh-cn, .flag.flag-zh-hk {background-position: -208px -22px}
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ /* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
.clearfix { .clearfix {
*zoom: 1; *zoom: 1;
@ -5869,13 +5869,13 @@ html.no-rgba .modal {
background-image: none; background-image: none;
color: #fff; color: #fff;
} }
.g-ui-menu .e-item.disable > .e-link { .g-ui-menu .e-item.disabled > .e-link {
cursor: not-allowed; cursor: not-allowed;
background-color: #fff; background-color: #fff;
background-image: none; background-image: none;
color: grey; color: grey;
} }
.g-ui-menu .e-item.disable [class^="icon-"] { .g-ui-menu .e-item.disabled [class^="icon-"] {
color: grey; color: grey;
} }
.g-ui-table { .g-ui-table {
@ -6417,6 +6417,9 @@ html.rl-no-preview-pane #rl-right .ui-resizable-handle {
.popups .b-ask-content .desc-place { .popups .b-ask-content .desc-place {
font-size: 18px; font-size: 18px;
} }
.popups .b-shortcuts-content.modal {
width: 1025px;
}
.popups .b-shortcuts-content .modal-header { .popups .b-shortcuts-content .modal-header {
background-color: #fff; background-color: #fff;
} }
@ -7850,7 +7853,7 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
opacity: 1; opacity: 1;
filter: alpha(opacity=100); filter: alpha(opacity=100);
} }
.b-compose .b-header-toolbar .btn.disable.button-delete { .b-compose .b-header-toolbar .btn.disabled.button-delete {
visibility: hidden; visibility: hidden;
} }
.b-compose .b-header-toolbar .button-save, .b-compose .b-header-toolbar .button-save,
@ -7858,7 +7861,7 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
.b-compose .b-header-toolbar .saved-text { .b-compose .b-header-toolbar .saved-text {
margin-left: 8px; margin-left: 8px;
} }
.b-compose .b-header-toolbar .disable.button-delete { .b-compose .b-header-toolbar .disabled.button-delete {
margin-left: 0px; margin-left: 0px;
} }
.b-compose .b-header { .b-compose .b-header {
@ -8064,17 +8067,17 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
filter: alpha(opacity=100); filter: alpha(opacity=100);
} }
.b-admin-domains-list-table .e-item .delete-domain, .b-admin-domains-list-table .e-item .delete-domain,
.b-admin-domains-list-table .e-item .disable-domain { .b-admin-domains-list-table .e-item .disabled-domain {
cursor: pointer; cursor: pointer;
opacity: 0.5; opacity: 0.5;
filter: alpha(opacity=50); filter: alpha(opacity=50);
} }
.b-admin-domains-list-table .e-item.disabled .disable-domain { .b-admin-domains-list-table .e-item.disabled .disabled-domain {
opacity: 0.5; opacity: 0.5;
filter: alpha(opacity=50); filter: alpha(opacity=50);
} }
.b-admin-domains-list-table .e-item .delete-domain:hover, .b-admin-domains-list-table .e-item .delete-domain:hover,
.b-admin-domains-list-table .e-item .disable-domain:hover { .b-admin-domains-list-table .e-item .disabled-domain:hover {
opacity: 1; opacity: 1;
filter: alpha(opacity=100); filter: alpha(opacity=100);
} }
@ -8159,7 +8162,7 @@ html.rl-message-fullscreen .messageView .b-content .buttonFull {
.b-admin-plugins-list-table .e-item.disabled .plugin-name { .b-admin-plugins-list-table .e-item.disabled .plugin-name {
color: #bbb; color: #bbb;
} }
.b-admin-plugins-list-table .e-item.disabled .disable-plugin { .b-admin-plugins-list-table .e-item.disabled .disabled-plugin {
opacity: 0.5; opacity: 0.5;
filter: alpha(opacity=50); filter: alpha(opacity=50);
} }

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
/*! RainLoop Webmail Admin Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ /*! RainLoop Webmail Admin Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
(function (window, $, ko, crossroads, hasher, _) { (function (window, $, ko, crossroads, hasher, _) {
'use strict'; 'use strict';
@ -70,14 +70,14 @@ var
$document = $(window.document), $document = $(window.document),
NotificationClass = window.Notification && window.Notification.requestPermission ? window.Notification : null NotificationClass = window.Notification && window.Notification.requestPermission ? window.Notification : null
; ;
/*jshint onevar: false*/ /*jshint onevar: false*/
/** /**
* @type {?AdminApp} * @type {?AdminApp}
*/ */
var RL = null; var RL = null;
/*jshint onevar: true*/ /*jshint onevar: true*/
/** /**
* @type {?} * @type {?}
*/ */
@ -88,6 +88,11 @@ Globals.now = (new Date()).getTime();
*/ */
Globals.momentTrigger = ko.observable(true); Globals.momentTrigger = ko.observable(true);
/**
* @type {?}
*/
Globals.dropdownVisibility = ko.observable(false);
/** /**
* @type {?} * @type {?}
*/ */
@ -221,7 +226,7 @@ if (Globals.bAllowPdfPreview && navigator && navigator.mimeTypes)
return oType && 'application/pdf' === oType.type; return oType && 'application/pdf' === oType.type;
}); });
} }
Consts.Defaults = {}; Consts.Defaults = {};
Consts.Values = {}; Consts.Values = {};
Consts.DataImages = {}; Consts.DataImages = {};
@ -339,7 +344,7 @@ Consts.DataImages.UserDotPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA
* @type {string} * @type {string}
*/ */
Consts.DataImages.TranspPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII='; Consts.DataImages.TranspPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=';
/** /**
* @enum {string} * @enum {string}
*/ */
@ -377,6 +382,7 @@ Enums.KeyState = {
'MessageList': 'message-list', 'MessageList': 'message-list',
'MessageView': 'message-view', 'MessageView': 'message-view',
'Compose': 'compose', 'Compose': 'compose',
'Settings': 'settings',
'Menu': 'menu', 'Menu': 'menu',
'PopupComposeOpenPGP': 'compose-open-pgp', 'PopupComposeOpenPGP': 'compose-open-pgp',
'PopupAsk': 'popup-ask' 'PopupAsk': 'popup-ask'
@ -716,7 +722,7 @@ Enums.Notification = {
'UnknownNotification': 999, 'UnknownNotification': 999,
'UnknownError': 999 'UnknownError': 999
}; };
Utils.trim = $.trim; Utils.trim = $.trim;
Utils.inArray = $.inArray; Utils.inArray = $.inArray;
Utils.isArray = _.isArray; Utils.isArray = _.isArray;
@ -2087,10 +2093,10 @@ Utils.draggeblePlace = function ()
Utils.defautOptionsAfterRender = function (oOption, oItem) Utils.defautOptionsAfterRender = function (oOption, oItem)
{ {
if (oItem && !Utils.isUnd(oItem.disable)) if (oItem && !Utils.isUnd(oItem.disabled))
{ {
ko.applyBindingsToNode(oOption, { ko.applyBindingsToNode(oOption, {
'disable': oItem.disable 'disabled': oItem.disabled
}, oItem); }, oItem);
} }
}; };
@ -2475,7 +2481,7 @@ Utils.restoreKeyFilter = function ()
}; };
} }
}; };
// Base64 encode / decode // Base64 encode / decode
// http://www.webtoolkit.info/ // http://www.webtoolkit.info/
@ -2638,7 +2644,7 @@ Base64 = {
} }
}; };
/*jslint bitwise: false*/ /*jslint bitwise: false*/
ko.bindingHandlers.tooltip = { ko.bindingHandlers.tooltip = {
'init': function (oElement, fValueAccessor) { 'init': function (oElement, fValueAccessor) {
if (!Globals.bMobileDevice) if (!Globals.bMobileDevice)
@ -2647,7 +2653,7 @@ ko.bindingHandlers.tooltip = {
sClass = $(oElement).data('tooltip-class') || '', sClass = $(oElement).data('tooltip-class') || '',
sPlacement = $(oElement).data('tooltip-placement') || 'top' sPlacement = $(oElement).data('tooltip-placement') || 'top'
; ;
$(oElement).tooltip({ $(oElement).tooltip({
'delay': { 'delay': {
'show': 500, 'show': 500,
@ -2685,7 +2691,54 @@ ko.bindingHandlers.tooltip2 = {
} }
}; };
ko.bindingHandlers.dropdown = { ko.__detectDropdownVisibility = _.debounce(function ($el) {
Globals.dropdownVisibility(!!$el.hasClass('open'));
}, 50);
ko.bindingHandlers.dropdownOpenStatus = {
'init': function (oElement) {
var $el = $(oElement);
$el.find('.dropdown-toggle').click(function () {
ko.__detectDropdownVisibility($el);
});
// $el.on('.dropdown-menu .menuitem', 'click', function () {
// $el.removeClass('open');
// ko.__detectDropdownVisibility($el);
// });
// $el.on('.dropdown-menu .menuitem', 'keydown', function (oEvent) {
// if (oEvent && Enums.EventKeyCode.Esc === oEvent.keyCode)
// {
// $el.removeClass('open');
// ko.__detectDropdownVisibility($el);
// }
// });
$html.on('click.dropdown.data-api', function () {
ko.__detectDropdownVisibility($el);
});
}
};
ko.bindingHandlers.openDropdownTrigger = {
'update': function (oElement, fValueAccessor) {
if (ko.utils.unwrapObservable(fValueAccessor()))
{
var $el = $(oElement);
if (!$el.hasClass('open'))
{
$el.find('.dropdown-toggle').dropdown('toggle');
ko.__detectDropdownVisibility($el);
}
fValueAccessor()(false);
}
}
};
ko.bindingHandlers.dropdownCloser = {
'init': function (oElement) { 'init': function (oElement) {
$(oElement).closest('.dropdown').on('click', '.e-item', function () { $(oElement).closest('.dropdown').on('click', '.e-item', function () {
$(oElement).dropdown('toggle'); $(oElement).dropdown('toggle');
@ -3296,7 +3349,7 @@ ko.observable.fn.validateFunc = function (fFunc)
return this; return this;
}; };
/** /**
* @constructor * @constructor
*/ */
@ -3594,7 +3647,7 @@ LinkBuilder.prototype.socialFacebook = function ()
{ {
return this.sServer + 'SocialFacebook' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : ''); return this.sServer + 'SocialFacebook' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : '');
}; };
/** /**
* @type {Object} * @type {Object}
*/ */
@ -3688,7 +3741,7 @@ Plugins.settingsGet = function (sPluginSection, sName)
}; };
/** /**
* @constructor * @constructor
*/ */
@ -3762,7 +3815,7 @@ CookieDriver.prototype.get = function (sKey)
return mResult; return mResult;
}; };
/** /**
* @constructor * @constructor
*/ */
@ -3833,7 +3886,7 @@ LocalStorageDriver.prototype.get = function (sKey)
return mResult; return mResult;
}; };
/** /**
* @constructor * @constructor
*/ */
@ -3876,7 +3929,7 @@ LocalStorage.prototype.get = function (iKey)
{ {
return this.oDriver ? this.oDriver.get('p' + iKey) : null; return this.oDriver ? this.oDriver.get('p' + iKey) : null;
}; };
/** /**
* @constructor * @constructor
*/ */
@ -3889,7 +3942,7 @@ KnoinAbstractBoot.prototype.bootstart = function ()
{ {
}; };
/** /**
* @param {string=} sPosition = '' * @param {string=} sPosition = ''
* @param {string=} sTemplate = '' * @param {string=} sTemplate = ''
@ -3978,7 +4031,7 @@ KnoinAbstractViewModel.prototype.registerPopupEscapeKey = function ()
return true; return true;
}); });
}; };
/** /**
* @param {string} sScreenName * @param {string} sScreenName
* @param {?=} aViewModels = [] * @param {?=} aViewModels = []
@ -4054,7 +4107,7 @@ KnoinAbstractScreen.prototype.__start = function ()
this.oCross = oRoute; this.oCross = oRoute;
} }
}; };
/** /**
* @constructor * @constructor
*/ */
@ -4443,7 +4496,7 @@ Knoin.prototype.bootstart = function ()
}; };
kn = new Knoin(); kn = new Knoin();
/** /**
* @param {string=} sEmail * @param {string=} sEmail
* @param {string=} sName * @param {string=} sName
@ -4807,7 +4860,7 @@ EmailModel.prototype.inputoTagLine = function ()
{ {
return 0 < this.name.length ? this.name + ' (' + this.email + ')' : this.email; return 0 < this.name.length ? this.name + ' (' + this.email + ')' : this.email;
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractViewModel * @extends KnoinAbstractViewModel
@ -5025,7 +5078,7 @@ PopupsDomainViewModel.prototype.clearForm = function ()
this.smtpAuth(true); this.smtpAuth(true);
this.whiteList(''); this.whiteList('');
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractViewModel * @extends KnoinAbstractViewModel
@ -5162,7 +5215,7 @@ PopupsPluginViewModel.prototype.onBuild = function ()
} }
}, this)); }, this));
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractViewModel * @extends KnoinAbstractViewModel
@ -5278,7 +5331,7 @@ PopupsActivateViewModel.prototype.validateSubscriptionKey = function ()
{ {
var sValue = this.key(); var sValue = this.key();
return '' === sValue || !!/^RL[\d]+-[A-Z0-9\-]+Z$/.test(Utils.trim(sValue)); return '' === sValue || !!/^RL[\d]+-[A-Z0-9\-]+Z$/.test(Utils.trim(sValue));
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractViewModel * @extends KnoinAbstractViewModel
@ -5338,7 +5391,7 @@ PopupsLanguagesViewModel.prototype.changeLanguage = function (sLang)
RL.data().mainLanguage(sLang); RL.data().mainLanguage(sLang);
this.cancelCommand(); this.cancelCommand();
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractViewModel * @extends KnoinAbstractViewModel
@ -5446,7 +5499,7 @@ PopupsAskViewModel.prototype.onBuild = function ()
}, this)); }, this));
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractViewModel * @extends KnoinAbstractViewModel
@ -5533,7 +5586,7 @@ AdminLoginViewModel.prototype.onHide = function ()
{ {
this.loginFocus(false); this.loginFocus(false);
}; };
/** /**
* @param {?} oScreen * @param {?} oScreen
* *
@ -5555,7 +5608,7 @@ AdminMenuViewModel.prototype.link = function (sRoute)
{ {
return '#/' + sRoute; return '#/' + sRoute;
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractViewModel * @extends KnoinAbstractViewModel
@ -5577,7 +5630,7 @@ AdminPaneViewModel.prototype.logoutClick = function ()
RL.remote().adminLogout(function () { RL.remote().adminLogout(function () {
RL.loginAndLogoutReload(); RL.loginAndLogoutReload();
}); });
}; };
/** /**
* @constructor * @constructor
*/ */
@ -5677,7 +5730,7 @@ AdminGeneral.prototype.selectLanguage = function ()
{ {
kn.showScreenPopup(PopupsLanguagesViewModel); kn.showScreenPopup(PopupsLanguagesViewModel);
}; };
/** /**
* @constructor * @constructor
*/ */
@ -5729,7 +5782,7 @@ AdminLogin.prototype.onBuild = function ()
}, 50); }, 50);
}; };
/** /**
* @constructor * @constructor
*/ */
@ -5798,7 +5851,7 @@ AdminBranding.prototype.onBuild = function ()
}, 50); }, 50);
}; };
/** /**
* @constructor * @constructor
*/ */
@ -5853,7 +5906,7 @@ function AdminContacts()
return { return {
'id': sValue, 'id': sValue,
'name': getTypeName(sValue) + (bDisabled ? ' (not supported)' : ''), 'name': getTypeName(sValue) + (bDisabled ? ' (not supported)' : ''),
'disable': bDisabled 'disabled': bDisabled
}; };
}); });
@ -6018,7 +6071,7 @@ AdminContacts.prototype.onBuild = function ()
}, 50); }, 50);
}; };
/** /**
* @constructor * @constructor
*/ */
@ -6107,7 +6160,7 @@ AdminDomains.prototype.onDomainListChangeRequest = function ()
{ {
RL.reloadDomainList(); RL.reloadDomainList();
}; };
/** /**
* @constructor * @constructor
*/ */
@ -6202,7 +6255,7 @@ AdminSecurity.prototype.phpInfoLink = function ()
{ {
return RL.link().phpInfo(); return RL.link().phpInfo();
}; };
/** /**
* @constructor * @constructor
*/ */
@ -6318,7 +6371,7 @@ AdminSocial.prototype.onBuild = function ()
}, 50); }, 50);
}; };
/** /**
* @constructor * @constructor
*/ */
@ -6366,7 +6419,7 @@ AdminPlugins.prototype.onBuild = function (oDom)
self.configurePlugin(oPlugin); self.configurePlugin(oPlugin);
} }
}) })
.on('click', '.e-item .disable-plugin', function () { .on('click', '.e-item .disabled-plugin', function () {
var oPlugin = ko.dataFor(this); var oPlugin = ko.dataFor(this);
if (oPlugin) if (oPlugin)
{ {
@ -6415,7 +6468,7 @@ AdminPlugins.prototype.onPluginDisableRequest = function (sResult, oData)
RL.reloadPluginList(); RL.reloadPluginList();
}; };
/** /**
* @constructor * @constructor
*/ */
@ -6513,7 +6566,7 @@ AdminPackages.prototype.installPackage = function (oPackage)
RL.remote().packageInstall(this.requestHelper(oPackage, true), oPackage); RL.remote().packageInstall(this.requestHelper(oPackage, true), oPackage);
} }
}; };
/** /**
* @constructor * @constructor
*/ */
@ -6564,28 +6617,61 @@ AdminLicensing.prototype.licenseExpiredMomentValue = function ()
{ {
var oDate = moment.unix(this.licenseExpired()); var oDate = moment.unix(this.licenseExpired());
return oDate.format('LL') + ' (' + oDate.from(moment()) + ')'; return oDate.format('LL') + ' (' + oDate.from(moment()) + ')';
}; };
/** /**
* @constructor * @constructor
*/ */
function AbstractData() function AbstractData()
{ {
this.keyScope = ko.observable(Enums.KeyState.All); this.keyScopeReal = ko.observable(Enums.KeyState.All);
this.keyScope.subscribe(function (sValue) { this.keyScopeFake = ko.observable(Enums.KeyState.All);
this.keyScope = ko.computed({
'owner': this,
'read': function () {
return this.keyScopeFake();
},
'write': function (sValue) {
if (Enums.KeyState.Compose === sValue) if (Enums.KeyState.Menu !== sValue)
{ {
Utils.disableKeyFilter(); if (Enums.KeyState.Compose === sValue)
} {
else Utils.disableKeyFilter();
{ }
Utils.restoreKeyFilter(); else
} {
Utils.restoreKeyFilter();
}
// window.console.log(sValue); this.keyScopeFake(sValue);
if (Globals.dropdownVisibility())
{
sValue = Enums.KeyState.Menu;
}
}
// window.console.log(sValue + '/' + this.keyScopeFake());
this.keyScopeReal(sValue);
}
});
this.keyScopeReal.subscribe(function (sValue) {
window.console.log(sValue);
key.setScope(sValue); key.setScope(sValue);
}); });
Globals.dropdownVisibility.subscribe(function (bValue) {
if (bValue)
{
this.keyScope(Enums.KeyState.Menu);
}
else if (Enums.KeyState.Menu === key.getScope())
{
this.keyScope(this.keyScopeFake());
}
}, this);
Utils.initDataConstructorBySettings(this); Utils.initDataConstructorBySettings(this);
} }
@ -6655,7 +6741,7 @@ AbstractData.prototype.populateDataOnStart = function()
this.contactsIsAllowed(!!RL.settingsGet('ContactsIsAllowed')); this.contactsIsAllowed(!!RL.settingsGet('ContactsIsAllowed'));
}; };
/** /**
* @constructor * @constructor
* @extends AbstractData * @extends AbstractData
@ -6689,7 +6775,7 @@ _.extend(AdminDataStorage.prototype, AbstractData.prototype);
AdminDataStorage.prototype.populateDataOnStart = function() AdminDataStorage.prototype.populateDataOnStart = function()
{ {
AbstractData.prototype.populateDataOnStart.call(this); AbstractData.prototype.populateDataOnStart.call(this);
}; };
/** /**
* @constructor * @constructor
*/ */
@ -6963,7 +7049,7 @@ AbstractAjaxRemoteStorage.prototype.jsVersion = function (fCallback, sVersion)
'Version': sVersion 'Version': sVersion
}); });
}; };
/** /**
* @constructor * @constructor
* @extends AbstractAjaxRemoteStorage * @extends AbstractAjaxRemoteStorage
@ -7207,7 +7293,7 @@ AdminAjaxRemoteStorage.prototype.adminPing = function (fCallback)
{ {
this.defaultRequest(fCallback, 'AdminPing'); this.defaultRequest(fCallback, 'AdminPing');
}; };
/** /**
* @constructor * @constructor
*/ */
@ -7273,7 +7359,7 @@ AbstractCacheStorage.prototype.setEmailsPicsHashesData = function (oData)
{ {
this.oEmailsPicsHashes = oData; this.oEmailsPicsHashes = oData;
}; };
/** /**
* @constructor * @constructor
* @extends AbstractCacheStorage * @extends AbstractCacheStorage
@ -7284,7 +7370,7 @@ function AdminCacheStorage()
} }
_.extend(AdminCacheStorage.prototype, AbstractCacheStorage.prototype); _.extend(AdminCacheStorage.prototype, AbstractCacheStorage.prototype);
/** /**
* @param {Array} aViewModels * @param {Array} aViewModels
* @constructor * @constructor
@ -7462,7 +7548,7 @@ AbstractSettings.prototype.routes = function ()
['', oRules] ['', oRules]
]; ];
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractScreen * @extends KnoinAbstractScreen
@ -7477,7 +7563,7 @@ _.extend(AdminLoginScreen.prototype, KnoinAbstractScreen.prototype);
AdminLoginScreen.prototype.onShow = function () AdminLoginScreen.prototype.onShow = function ()
{ {
RL.setTitle(''); RL.setTitle('');
}; };
/** /**
* @constructor * @constructor
* @extends AbstractSettings * @extends AbstractSettings
@ -7497,7 +7583,7 @@ AdminSettingsScreen.prototype.onShow = function ()
// AbstractSettings.prototype.onShow.call(this); // AbstractSettings.prototype.onShow.call(this);
RL.setTitle(''); RL.setTitle('');
}; };
/** /**
* @constructor * @constructor
* @extends KnoinAbstractBoot * @extends KnoinAbstractBoot
@ -7817,7 +7903,7 @@ AbstractApp.prototype.bootstart = function ()
ssm.ready(); ssm.ready();
}; };
/** /**
* @constructor * @constructor
* @extends AbstractApp * @extends AbstractApp
@ -8056,7 +8142,7 @@ AdminApp.prototype.bootstart = function ()
* @type {AdminApp} * @type {AdminApp}
*/ */
RL = new AdminApp(); RL = new AdminApp();
$html.addClass(Globals.bMobileDevice ? 'mobile' : 'no-mobile'); $html.addClass(Globals.bMobileDevice ? 'mobile' : 'no-mobile');
$window.keydown(Utils.killCtrlAandS).keyup(Utils.killCtrlAandS); $window.keydown(Utils.killCtrlAandS).keyup(Utils.killCtrlAandS);
@ -8103,9 +8189,9 @@ window['__RLBOOT'] = function (fCall) {
window['__RLBOOT'] = null; window['__RLBOOT'] = null;
}); });
}; };
if (window.SimplePace) { if (window.SimplePace) {
window.SimplePace.add(10); window.SimplePace.add(10);
} }
}(window, jQuery, ko, crossroads, hasher, _)); }(window, jQuery, ko, crossroads, hasher, _));

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2280
vendors/bootstrap/js/bootstrap.js vendored Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2280
vendors/bootstrap/js/bootstrap.orig.js vendored Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -49,7 +49,7 @@
-moz-border-radius : 5px; -moz-border-radius : 5px;
-webkit-border-radius : 5px; -webkit-border-radius : 5px;
border-radius : 5px; border-radius : 5px;
z-index: 10000; z-index: 102;
margin : 2px; margin : 2px;
} }