diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js
index 8ea323e90..ac107e1fa 100644
--- a/dev/Common/Selector.js
+++ b/dev/Common/Selector.js
@@ -13,7 +13,7 @@ function Selector(oKoList, oKoSelectedItem,
sItemSelector, sItemSelectedSelector, sItemCheckedSelector, sItemFocusedSelector)
{
this.list = oKoList;
-
+
this.listChecked = ko.computed(function () {
return _.filter(this.list(), function (oItem) {
return oItem.checked();
@@ -23,11 +23,11 @@ function Selector(oKoList, oKoSelectedItem,
this.isListChecked = ko.computed(function () {
return 0 < this.listChecked().length;
}, this);
-
+
this.focusedItem = ko.observable(null);
this.selectedItem = oKoSelectedItem;
this.selectedItemUseCallback = true;
-
+
this.itemSelectedThrottle = _.debounce(_.bind(this.itemSelected, this), 300);
this.listChecked.subscribe(function (aItems) {
@@ -47,7 +47,7 @@ function Selector(oKoList, oKoSelectedItem,
this.selectedItem(this.focusedItem());
}
}, this);
-
+
this.selectedItem.subscribe(function (oItem) {
if (oItem)
@@ -101,12 +101,12 @@ function Selector(oKoList, oKoSelectedItem,
this.oContentVisible = null;
this.oContentScrollable = null;
-
+
this.sItemSelector = sItemSelector;
this.sItemSelectedSelector = sItemSelectedSelector;
this.sItemCheckedSelector = sItemCheckedSelector;
this.sItemFocusedSelector = sItemFocusedSelector;
-
+
this.sLastUid = '';
this.bAutoSelect = true;
this.oCallbacks = {};
@@ -126,7 +126,7 @@ function Selector(oKoList, oKoSelectedItem,
mFocused = null,
mSelected = null
;
-
+
this.list.subscribe(function (aItems) {
var self = this;
@@ -136,7 +136,7 @@ function Selector(oKoList, oKoSelectedItem,
if (oItem)
{
var sUid = self.getItemUid(oItem);
-
+
aCache.push(sUid);
if (oItem.checked())
{
@@ -154,9 +154,9 @@ function Selector(oKoList, oKoSelectedItem,
});
}
}, this, 'beforeChange');
-
+
this.list.subscribe(function (aItems) {
-
+
var
self = this,
oTemp = null,
@@ -167,7 +167,7 @@ function Selector(oKoList, oKoSelectedItem,
bSelected = false,
iLen = 0
;
-
+
this.selectedItemUseCallback = false;
this.focusedItem(null);
@@ -246,7 +246,7 @@ function Selector(oKoList, oKoSelectedItem,
aCheckedCache = [];
mFocused = null;
mSelected = null;
-
+
}, this);
}
@@ -284,13 +284,13 @@ Selector.prototype.init = function (oContentVisible, oContentScrollable, sKeySco
this.oContentScrollable = oContentScrollable;
sKeyScope = sKeyScope || 'all';
-
+
if (this.oContentVisible && this.oContentScrollable)
{
- var
+ var
self = this
;
-
+
$(this.oContentVisible)
.on('selectstart', function (oEvent) {
if (oEvent && oEvent.preventDefault)
@@ -666,7 +666,7 @@ Selector.prototype.actionClick = function (oItem, oEvent)
bClick = true,
sUid = this.getItemUid(oItem)
;
-
+
if (oEvent)
{
if (oEvent.shiftKey && !oEvent.ctrlKey && !oEvent.altKey)
@@ -679,7 +679,7 @@ Selector.prototype.actionClick = function (oItem, oEvent)
oItem.checked(!oItem.checked());
this.eventClickFunction(oItem, oEvent);
-
+
this.focusedItem(oItem);
}
else if (oEvent.ctrlKey && !oEvent.shiftKey && !oEvent.altKey)
@@ -700,6 +700,8 @@ Selector.prototype.actionClick = function (oItem, oEvent)
{
this.focusedItem(oItem);
this.selectedItem(oItem);
+
+ this.scrollToFocused();
}
}
};
diff --git a/dev/Settings/Identities.js b/dev/Settings/Identities.js
index cb2dfca59..55f4a813c 100644
--- a/dev/Settings/Identities.js
+++ b/dev/Settings/Identities.js
@@ -6,9 +6,11 @@
function SettingsIdentities()
{
var oData = RL.data();
-
+
this.editor = null;
-
+ this.defautOptionsAfterRender = Utils.defautOptionsAfterRender;
+
+ this.accountEmail = oData.accountEmail;
this.displayName = oData.displayName;
this.signature = oData.signature;
this.signatureToAll = oData.signatureToAll;
@@ -16,11 +18,47 @@ function SettingsIdentities()
this.signatureDom = ko.observable(null);
+ this.defaultIdentityIDTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
this.displayNameTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
this.replyTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
this.signatureTrigger = ko.observable(Enums.SaveSettingsStep.Idle);
this.identities = oData.identities;
+ this.defaultIdentityID = oData.defaultIdentityID;
+
+ this.identitiesOptions = ko.computed(function () {
+
+ var
+ aList = this.identities(),
+ aResult = []
+ ;
+
+ if (0 < aList.length)
+ {
+ aResult.push({
+ 'id': this.accountEmail.peek(),
+ 'name': this.formattedAccountIdentity(),
+ 'seporator': false
+ });
+
+ aResult.push({
+ 'id': '---',
+ 'name': '---',
+ 'seporator': true,
+ 'disabled': true
+ });
+
+ _.each(aList, function (oItem) {
+ aResult.push({
+ 'id': oItem.id,
+ 'name': oItem.formattedNameForEmail(),
+ 'seporator': false
+ });
+ });
+ }
+
+ return aResult;
+ }, this);
this.processText = ko.computed(function () {
return oData.identitiesLoading() ? Utils.i18n('SETTINGS_IDENTITIES/LOADING_PROCESS') : '';
@@ -47,6 +85,20 @@ function SettingsIdentities()
Utils.addSettingsViewModel(SettingsIdentities, 'SettingsIdentities', 'SETTINGS_LABELS/LABEL_IDENTITIES_NAME', 'identities');
+/**
+ *
+ * @return {string}
+ */
+SettingsIdentities.prototype.formattedAccountIdentity = function ()
+{
+ var
+ sDisplayName = this.displayName.peek(),
+ sEmail = this.accountEmail.peek()
+ ;
+
+ return '' === sDisplayName ? sEmail : '"' + Utils.quoteName(sDisplayName) + '" <' + sEmail + '>';
+};
+
SettingsIdentities.prototype.addNewIdentity = function ()
{
kn.showScreenPopup(PopupsIdentityViewModel);
@@ -65,7 +117,7 @@ SettingsIdentities.prototype.deleteIdentity = function (oIdentityToRemove)
if (oIdentityToRemove && oIdentityToRemove.deleteAccess())
{
this.identityForDeletion(null);
-
+
var
fRemoveFolder = function (oIdentity) {
return oIdentityToRemove === oIdentity;
@@ -75,7 +127,7 @@ SettingsIdentities.prototype.deleteIdentity = function (oIdentityToRemove)
if (oIdentityToRemove)
{
this.identities.remove(fRemoveFolder);
-
+
RL.remote().identityDelete(function () {
RL.accountsAndIdentities();
}, oIdentityToRemove.id);
@@ -121,7 +173,7 @@ SettingsIdentities.prototype.onBuild = function (oDom)
self.editIdentity(oIdentityItem);
}
})
- ;
+ ;
_.delay(function () {
@@ -129,9 +181,16 @@ SettingsIdentities.prototype.onBuild = function (oDom)
oData = RL.data(),
f1 = Utils.settingsSaveHelperSimpleFunction(self.displayNameTrigger, self),
f2 = Utils.settingsSaveHelperSimpleFunction(self.replyTrigger, self),
- f3 = Utils.settingsSaveHelperSimpleFunction(self.signatureTrigger, self)
+ f3 = Utils.settingsSaveHelperSimpleFunction(self.signatureTrigger, self),
+ f4 = Utils.settingsSaveHelperSimpleFunction(self.defaultIdentityIDTrigger, self)
;
+ oData.defaultIdentityID.subscribe(function (sValue) {
+ RL.remote().saveSettings(f4, {
+ 'DefaultIdentityID': sValue
+ });
+ });
+
oData.displayName.subscribe(function (sValue) {
RL.remote().saveSettings(f1, {
'DisplayName': sValue
diff --git a/dev/Storages/WebMailData.js b/dev/Storages/WebMailData.js
index e70db7bfa..d6819c395 100644
--- a/dev/Storages/WebMailData.js
+++ b/dev/Storages/WebMailData.js
@@ -78,6 +78,7 @@ function WebMailDataStorage()
this.accountsLoading = ko.observable(false).extend({'throttle': 100});
// identities
+ this.defaultIdentityID = ko.observable('');
this.identities = ko.observableArray([]);
this.identitiesLoading = ko.observable(false).extend({'throttle': 100});
@@ -476,6 +477,8 @@ WebMailDataStorage.prototype.populateDataOnStart = function()
this.accountOutLogin(RL.settingsGet('OutLogin'));
this.projectHash(RL.settingsGet('ProjectHash'));
+ this.defaultIdentityID(RL.settingsGet('DefaultIdentityID'));
+
this.displayName(RL.settingsGet('DisplayName'));
this.replyTo(RL.settingsGet('ReplyTo'));
this.signature(RL.settingsGet('Signature'));
diff --git a/dev/ViewModels/PopupsComposeViewModel.js b/dev/ViewModels/PopupsComposeViewModel.js
index b0e077403..e907d6542 100644
--- a/dev/ViewModels/PopupsComposeViewModel.js
+++ b/dev/ViewModels/PopupsComposeViewModel.js
@@ -91,7 +91,7 @@ function PopupsComposeViewModel()
this.composeEditorArea = ko.observable(null);
this.identities = RL.data().identities;
-
+ this.defaultIdentityID = RL.data().defaultIdentityID;
this.currentIdentityID = ko.observable('');
this.currentIdentityString = ko.observable('');
@@ -433,7 +433,6 @@ PopupsComposeViewModel.prototype.findIdentityIdByMessage = function (sComposeTyp
switch (sComposeType)
{
case Enums.ComposeType.Empty:
- sResult = RL.data().accountEmail();
break;
case Enums.ComposeType.Reply:
case Enums.ComposeType.ReplyAll:
@@ -446,7 +445,13 @@ PopupsComposeViewModel.prototype.findIdentityIdByMessage = function (sComposeTyp
break;
}
}
- else
+
+ if ('' === sResult)
+ {
+ sResult = this.defaultIdentityID();
+ }
+
+ if ('' === sResult)
{
sResult = RL.data().accountEmail();
}
@@ -694,9 +699,9 @@ PopupsComposeViewModel.prototype.onShow = function (sType, oMessageOrArray, aToE
if (null !== mEmail)
{
oExcludeEmail[mEmail] = true;
- this.currentIdentityID(this.findIdentityIdByMessage(sComposeType, oMessage));
}
+ this.currentIdentityID(this.findIdentityIdByMessage(sComposeType, oMessage));
this.reset();
if (Utils.isNonEmptyArray(aToEmails))
diff --git a/package.json b/package.json
index e322a31f3..0a4f9fa9a 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
{
"name": "RainLoop",
"title": "RainLoop Webmail",
- "version": "1.6.7",
- "release": "141",
+ "version": "1.6.8",
+ "release": "151",
"description": "Simple, modern & fast web-based email client",
"homepage": "http://rainloop.net",
"main": "gulpfile.js",
diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php
index 92332fe47..a71438742 100644
--- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php
+++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php
@@ -1116,7 +1116,7 @@ class Actions
else
{
$oAccount = null;
-
+
$aResult['DevEmail'] = $oConfig->Get('labs', 'dev_email', '');
$aResult['DevPassword'] = $oConfig->Get('labs', 'dev_password', '');
}
@@ -1240,6 +1240,7 @@ class Actions
$aResult['ReplySameFolder'] = false;
$aResult['Layout'] = \RainLoop\Enumerations\Layout::SIDE_PREVIEW;
$aResult['UseCheckboxesInList'] = true;
+ $aResult['DefaultIdentityID'] = '';
$aResult['DisplayName'] = '';
$aResult['ReplyTo'] = '';
$aResult['Signature'] = '';
@@ -1277,6 +1278,7 @@ class Actions
$aResult['UseCheckboxesInList'] = (bool) $oSettings->GetConf('UseCheckboxesInList', $aResult['UseCheckboxesInList']);
$aResult['InterfaceAnimation'] = (string) $oSettings->GetConf('InterfaceAnimation', $aResult['InterfaceAnimation']);
+ $aResult['DefaultIdentityID'] = $oSettings->GetConf('DefaultIdentityID', $oAccount ? $oAccount->Email() : $aResult['DefaultIdentityID']);
$aResult['DisplayName'] = $oSettings->GetConf('DisplayName', $aResult['DisplayName']);
$aResult['ReplyTo'] = $oSettings->GetConf('ReplyTo', $aResult['ReplyTo']);
$aResult['Signature'] = $oSettings->GetConf('Signature', $aResult['Signature']);
@@ -1339,6 +1341,7 @@ class Actions
$aResult['PluginsLink'] = $sPluginsLink;
$aResult['EditorDefaultType'] = 'Html' === $aResult['EditorDefaultType'] ? 'Html' : 'Plain';
+ // IDN
$aResult['Email'] = \MailSo\Base\Utils::IdnToUtf8($aResult['Email']);
$aResult['ParentEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['ParentEmail']);
$aResult['MailToEmail'] = \MailSo\Base\Utils::IdnToUtf8($aResult['MailToEmail']);
@@ -1443,7 +1446,7 @@ class Actions
$sAdditionalCode = '', $bAdditionalCodeSignMe = false)
{
$this->Plugins()->RunHook('filter.login-credentials-first', array(&$sEmail, &$sPassword));
-
+
$sEmail = \MailSo\Base\Utils::StrToLowerIfAscii($sEmail);
if (false === \strpos($sEmail, '@') && 0 < \strlen(\trim($this->Config()->Get('login', 'default_domain', ''))))
{
@@ -3430,6 +3433,7 @@ class Actions
$this->setSettingsFromParams($oSettings, 'ReplySameFolder', 'bool');
$this->setSettingsFromParams($oSettings, 'UseCheckboxesInList', 'bool');
+ $this->setSettingsFromParams($oSettings, 'DefaultIdentityID', 'string');
$this->setSettingsFromParams($oSettings, 'DisplayName', 'string');
$this->setSettingsFromParams($oSettings, 'ReplyTo', 'string');
$this->setSettingsFromParams($oSettings, 'Signature', 'string');
diff --git a/rainloop/v/0.0.0/app/templates/Views/App/SettingsIdentities.html b/rainloop/v/0.0.0/app/templates/Views/App/SettingsIdentities.html
index 1103e8245..cdb86eca1 100644
--- a/rainloop/v/0.0.0/app/templates/Views/App/SettingsIdentities.html
+++ b/rainloop/v/0.0.0/app/templates/Views/App/SettingsIdentities.html
@@ -3,6 +3,16 @@
+