From c73eb768160277f82bb2cb594fc53cd238ba450c Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 17 Apr 2015 17:56:29 +0400 Subject: [PATCH] Release fixes --- dev/Common/HtmlEditor.js | 15 ++------- dev/Remote/User/Ajax.js | 22 ++++++++----- dev/Settings/Admin/Branding.js | 32 +++++++++---------- dev/Stores/Language.js | 7 ++-- dev/View/Popup/Compose.js | 20 ++++++++++++ dev/View/Popup/Languages.js | 9 +++--- package.json | 2 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 12 ++++--- .../Views/Admin/AdminSettingsBranding.html | 2 +- 9 files changed, 67 insertions(+), 54 deletions(-) diff --git a/dev/Common/HtmlEditor.js b/dev/Common/HtmlEditor.js index 842702c51..5653c675d 100644 --- a/dev/Common/HtmlEditor.js +++ b/dev/Common/HtmlEditor.js @@ -261,7 +261,7 @@ } oConfig.enterMode = window.CKEDITOR.ENTER_BR; - oConfig.shiftEnterMode = window.CKEDITOR.ENTER_BR; + oConfig.shiftEnterMode = window.CKEDITOR.ENTER_P; oConfig.language = Globals.oHtmlEditorLangsMap[sLanguage] || 'en'; if (window.CKEDITOR.env) @@ -269,17 +269,6 @@ window.CKEDITOR.env.isCompatible = true; } -// oConfig.allowedContent = { -// $1: { -// elements: window.CKEDITOR.dtd, -// attributes: true, -// styles: true, -// classes: true -// } -// }; -// -// oConfig.disallowedContent = 'script; style; iframe; frame; *[on*]'; - window.CKEDITOR.dtd.$removeEmpty['p'] = 1; self.editor = window.CKEDITOR.appendTo(self.$element[0], oConfig); @@ -330,7 +319,7 @@ { self.fOnReady(); } - + }); } ; diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Ajax.js index 20ee13045..6e77f856e 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Ajax.js @@ -333,19 +333,23 @@ * @param {number=} iLimit = 20 * @param {string=} sSearch = '' * @param {boolean=} bSilent = false + * @param {string=} sThreadUid = '' */ - RemoteUserAjax.prototype.messageList = function (fCallback, sFolderFullNameRaw, iOffset, iLimit, sSearch, bSilent) + RemoteUserAjax.prototype.messageList = function (fCallback, sFolderFullNameRaw, iOffset, iLimit, sSearch, bSilent, sThreadUid) { sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); var - sFolderHash = Cache.getFolderHash(sFolderFullNameRaw) + sFolderHash = Cache.getFolderHash(sFolderFullNameRaw), + bUseThreads = AppStore.threadsAllowed() && SettingsStore.useThreads(), + sInboxUidNext = Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '' ; bSilent = Utils.isUnd(bSilent) ? false : !!bSilent; iOffset = Utils.isUnd(iOffset) ? 0 : Utils.pInt(iOffset); iLimit = Utils.isUnd(iOffset) ? 20 : Utils.pInt(iLimit); sSearch = Utils.pString(sSearch); + sThreadUid = Utils.pString(sThreadUid); if ('' !== sFolderHash && ('' === sSearch || -1 === sSearch.indexOf('is:'))) { @@ -358,9 +362,9 @@ sSearch, AppStore.projectHash(), sFolderHash, - Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '', - AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0', - '' + sInboxUidNext, + bUseThreads ? '1' : '0', + bUseThreads ? sThreadUid : '' ].join(String.fromCharCode(0))), bSilent ? [] : ['MessageList']); } else @@ -370,9 +374,11 @@ 'Offset': iOffset, 'Limit': iLimit, 'Search': sSearch, - 'UidNext': Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '', - 'UseThreads': AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0' - }, '' === sSearch ? Consts.Defaults.DefaultAjaxTimeout : Consts.Defaults.SearchAjaxTimeout, '', bSilent ? [] : ['MessageList']); + 'UidNext': sInboxUidNext, + 'UseThreads': bUseThreads ? '1' : '0', + 'ThreadUid': bUseThreads ? sThreadUid : '' + }, '' === sSearch ? Consts.Defaults.DefaultAjaxTimeout : Consts.Defaults.SearchAjaxTimeout, + '', bSilent ? [] : ['MessageList']); } }; diff --git a/dev/Settings/Admin/Branding.js b/dev/Settings/Admin/Branding.js index 748a68d79..b76661ebe 100644 --- a/dev/Settings/Admin/Branding.js +++ b/dev/Settings/Admin/Branding.js @@ -144,29 +144,27 @@ }, 50); } - else - { - _.delay(function () { - var - f1 = Utils.settingsSaveHelperSimpleFunction(self.title.trigger, self), - f2 = Utils.settingsSaveHelperSimpleFunction(self.loadingDesc.trigger, self) - ; + _.delay(function () { - self.title.subscribe(function (sValue) { - Remote.saveAdminConfig(f1, { - 'Title': Utils.trim(sValue) - }); + var + f1 = Utils.settingsSaveHelperSimpleFunction(self.title.trigger, self), + f2 = Utils.settingsSaveHelperSimpleFunction(self.loadingDesc.trigger, self) + ; + + self.title.subscribe(function (sValue) { + Remote.saveAdminConfig(f1, { + 'Title': Utils.trim(sValue) }); + }); - self.loadingDesc.subscribe(function (sValue) { - Remote.saveAdminConfig(f2, { - 'LoadingDescription': Utils.trim(sValue) - }); + self.loadingDesc.subscribe(function (sValue) { + Remote.saveAdminConfig(f2, { + 'LoadingDescription': Utils.trim(sValue) }); + }); - }, 50); - } + }, 50); }; module.exports = BrandingAdminSettings; diff --git a/dev/Stores/Language.js b/dev/Stores/Language.js index 2659f42a0..4b3b1aa9b 100644 --- a/dev/Stores/Language.js +++ b/dev/Stores/Language.js @@ -22,14 +22,11 @@ this.language = ko.observable('') .extend({'limitedList': this.languages}); - this.userLanguage = ko.observable('') - .extend({'limitedList': this.languages}); - this.languageAdmin = ko.observable('') .extend({'limitedList': this.languagesAdmin}); - this.userLanguageAdmin = ko.observable('') - .extend({'limitedList': this.languagesAdmin}); + this.userLanguage = ko.observable(''); + this.userLanguageAdmin = ko.observable(''); } LanguageStore.prototype.populate = function () diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 68acf1632..b9de52b02 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -1099,6 +1099,26 @@ oText.find('.rlBlockquoteSwitcher').off('.rlBlockquoteSwitcher').remove(); oText.find('[data-html-editor-font-wrapper]').removeAttr('data-html-editor-font-wrapper'); + (function () { + + var oTmp = null, iLimit = 0; + + while (true) + { + iLimit++; + + oTmp = oText.children(); + if (10 > iLimit && oTmp.is('div') && 1 === oTmp.length) + { + oTmp.children().unwrap(); + continue; + } + + break; + } + + }()); + sText = oText.html(); } diff --git a/dev/View/Popup/Languages.js b/dev/View/Popup/Languages.js index cf32623c9..e82bc9cf8 100644 --- a/dev/View/Popup/Languages.js +++ b/dev/View/Popup/Languages.js @@ -24,15 +24,16 @@ var self = this; this.fLang = null; - this.sUserLanguage = ''; + this.userLanguage = ko.observable(''); this.langs = ko.observableArray([]); this.languages = ko.computed(function () { + var sUserLanguage = self.userLanguage(); return _.map(self.langs(), function (sLanguage) { return { 'key': sLanguage, - 'user': sLanguage === self.sUserLanguage, + 'user': sLanguage === sUserLanguage, 'selected': ko.observable(false), 'fullName': Utils.convertLangName(sLanguage) }; @@ -66,7 +67,7 @@ LanguagesPopupView.prototype.onShow = function (fLanguage, aLangs, sUserLanguage) { this.fLang = fLanguage; - this.sUserLanguage = sUserLanguage || ''; + this.userLanguage(sUserLanguage || ''); this.langs(aLangs); }; @@ -74,7 +75,7 @@ LanguagesPopupView.prototype.onHide = function () { this.fLang = null; - this.sUserLanguage = ''; + this.userLanguage(''); this.langs([]); }; diff --git a/package.json b/package.json index 66ced8835..4dba13d46 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.3", - "release": "302", + "release": "304", "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 46e8f5524..0946c1682 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1709,8 +1709,9 @@ class Actions $aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, '', true); $aResult['UserLanguageRaw'] = $this->detectUserLanguage(); - $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], $aResult['Language'], false); - $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], $aResult['LanguageAdmin'], true); + + $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', false, true, true); + $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], '', true, true, true); $aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'Admin' : 'App').'/'. ($bAdmin ? $aResult['LanguageAdmin'] : $aResult['Language']).'/'.$sStaticCache.'/'; @@ -5525,7 +5526,7 @@ class Actions if ($bUseThreads) { - $sThreadUid = ''; // TODO + $sThreadUid = isset($aValues[8]) ? (string) $aValues[8] : ''; } $this->verifyCacheByKey($sRawKey); @@ -8380,10 +8381,11 @@ class Actions * @param string $sDefault = '' * @param bool $bAdmin = false * @param bool $bSearchShortName = false + * @param bool $bAllowEmptyResult = false * * @return string */ - public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bSearchShortName = false) + public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bSearchShortName = false, $bAllowEmptyResult = false) { $sResult = ''; $aLang = $this->GetLanguages($bAdmin); @@ -8409,7 +8411,7 @@ class Actions $sResult = $sDefault; } - if (empty($sResult)) + if (empty($sResult) && !$bAllowEmptyResult) { $sResult = $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en'); $sResult = \in_array($sResult, $aLang) ? $sResult : 'en'; diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html index 378b1cda3..2b1f3f84f 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsBranding.html @@ -144,7 +144,7 @@ -
+