diff --git a/dev/Styles/MessageView.less b/dev/Styles/MessageView.less index acddda481..0d74b1651 100644 --- a/dev/Styles/MessageView.less +++ b/dev/Styles/MessageView.less @@ -382,10 +382,23 @@ html.rl-no-preview-pane { padding: 4px 8px 6px 10px; } + &.hide-more .thread-list-message.more-that { + display: none; + } + .thread-date { font-size: 13px; color: #999; } + + .more-threads { + text-align: center; + padding: 8px; + background-color: #F5F5F5; + color: #555; + text-decoration: underline; + border-bottom: 1px dashed #555; + } } } diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 845610d4c..4d97c63bd 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -213,9 +213,12 @@ this.viewThreadMessages = ko.observableArray([]); this.viewThreadMessages.error = ko.observable(''); + this.viewThreadMessages.showMore = ko.observable(false); + this.viewThreadMessages.limit = 6; - this.viewThreadMessages.subscribe(function () { + this.viewThreadMessages.subscribe(function (aList) { this.viewThreadMessages.error(''); + this.viewThreadMessages.showMore(this.viewThreadMessages.limit >= aList.length); }, this); MessageStore.messageLastThreadUidsData.subscribe(function (oData) { @@ -723,6 +726,10 @@ oEvent.stopPropagation(); } }) + .on('click', '.thread-list .more-threads', function () { + self.viewThreadMessages.showMore(true); + return false; + }) .on('click', '.thread-list .thread-list-message', function () { var oMessage = ko.dataFor(this); if (oMessage && oMessage.folder && oMessage.uid) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php index fd018300b..4294908da 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php @@ -714,7 +714,6 @@ class Http @\header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); @\header('Cache-Control: post-check=0, pre-check=0', false); @\header('Pragma: no-cache'); - @\header('X-RainLoop-Cache: no'); } } @@ -734,7 +733,6 @@ class Http @\header('ETag: '.$sEtag, true); @\header('Last-Modified: '.\gmdate('D, d M Y H:i:s', $iLastModified).' UTC', true); @\header('Expires: '.\gmdate('D, j M Y H:i:s', $iExpires).' UTC', true); - @\header('X-RainLoop-Cache: yes'); } } 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 09d147c63..be951719b 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1649,13 +1649,8 @@ class Actions if ($oConfig->Get('login', 'allow_languages_on_login', true) && $oConfig->Get('login', 'determine_user_language', true)) { - $sLanguage = $this->ValidateLanguage($sLanguage, false); - - $sUserLanguage = $this->detectUserLanguage(); - if (0 < \strlen($sUserLanguage) && $sLanguage !== $sUserLanguage) - { - $sLanguage = $sUserLanguage; - } + $sLanguage = $this->ValidateLanguage( + $this->detectUserLanguage(), $sLanguage, false); } } } @@ -1669,12 +1664,12 @@ class Actions $aResult['Theme'] = $sTheme; $aResult['NewThemeLink'] = $sNewThemeLink; - $aResult['Language'] = $this->ValidateLanguage($sLanguage, false); - $aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, true); + $aResult['Language'] = $this->ValidateLanguage($sLanguage, '', false); + $aResult['LanguageAdmin'] = $this->ValidateLanguage($sLanguageAdmin, '', true); - $sUserLanguage = $this->detectUserLanguage(); - $aResult['UserLanguage'] = $sUserLanguage === $this->ValidateLanguage($sUserLanguage, false) ? $sUserLanguage : ''; - $aResult['UserLanguageAdmin'] = $sUserLanguage === $this->ValidateLanguage($sUserLanguage, true) ? $sUserLanguage : ''; + $aResult['UserLanguageRaw'] = $this->detectUserLanguage(); + $aResult['UserLanguage'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], $aResult['Language'], false); + $aResult['UserLanguageAdmin'] = $this->ValidateLanguage($aResult['UserLanguageRaw'], $aResult['LanguageAdmin'], true); $aResult['LangLink'] = './?/Lang/0/'.($bAdmin ? 'Admin' : 'App').'/'. ($bAdmin ? $aResult['LanguageAdmin'] : $aResult['Language']).'/'.$sStaticCache.'/'; @@ -1716,21 +1711,7 @@ class Actions */ private function detectUserLanguage() { - $sLang = $this->getUserLanguageFromHeader(); - - if (!empty($sLang)) - { - $sLang = \preg_replace('/[^a-zA-Z0-9]+/', '-', $sLang); - if ($sLang !== $this->ValidateLanguage($sLang)) - { - if (2 < strlen($sLang)) - { - $sLang = \substr($sLang, 0, 2); - } - } - } - - return $this->ValidateLanguage($sLang); + return \preg_replace('/[^a-zA-Z0-9]+/', '-', $this->getUserLanguageFromHeader()); } private function loginErrorDelay() @@ -3199,11 +3180,11 @@ class Actions $self = $this; $this->setConfigFromParams($oConfig, 'Language', 'webmail', 'language', 'string', function ($sLanguage) use ($self) { - return $self->ValidateLanguage($sLanguage, false); + return $self->ValidateLanguage($sLanguage, '', false); }); $this->setConfigFromParams($oConfig, 'LanguageAdmin', 'webmail', 'language_admin', 'string', function ($sLanguage) use ($self) { - return $self->ValidateLanguage($sLanguage, true); + return $self->ValidateLanguage($sLanguage, '', true); }); $this->setConfigFromParams($oConfig, 'Theme', 'webmail', 'theme', 'string', function ($sTheme) use ($self) { @@ -8297,14 +8278,46 @@ class Actions /** * @param string $sLanguage + * @param string $sDefault = '' * @param bool $bAdmin = false + * @param bool $bSearchShortName = false * * @return string */ - public function ValidateLanguage($sLanguage, $bAdmin = false) + public function ValidateLanguage($sLanguage, $sDefault = '', $bAdmin = false, $bSearchShortName = false) { - return \in_array($sLanguage, $this->GetLanguages($bAdmin)) ? - $sLanguage : $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en'); + $sResult = ''; + $aLang = $this->GetLanguages($bAdmin); + + if (\is_array($aLang)) + { + if (\in_array($sLanguage, $aLang)) + { + $sResult = $sLanguage; + } + + if ($bSearchShortName && empty($sResult) && 2 < \strlen($sLanguage)) + { + $sLanguage = \substr($sLanguage, 0, 2); + if (\in_array($sLanguage, $aLang)) + { + $sResult = $sLanguage; + } + } + + if (empty($sResult) && !empty($sDefault) && \in_array($sDefault, $aLang)) + { + $sResult = $sDefault; + } + + if (empty($sResult)) + { + $sResult = $this->Config()->Get('webmail', $bAdmin ? 'language_admin' : 'language', 'en'); + $sResult = \in_array($sResult, $aLang) ? $sResult : 'en'; + } + } + + return $sResult; } /** @@ -8832,7 +8845,7 @@ class Actions } } - $sLanguage = $this->ValidateLanguage($sLanguage, $bAdmin); + $sLanguage = $this->ValidateLanguage($sLanguage, '', $bAdmin); $sTheme = $this->ValidateTheme($sTheme); return array($sLanguage, $sTheme); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php index 816d367db..76eb2c773 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php @@ -541,7 +541,7 @@ class ServiceActions if (!empty($this->aPaths[3])) { $bAdmim = 'Admin' === (isset($this->aPaths[2]) ? (string) $this->aPaths[2] : 'App'); - $sLanguage = $this->oActions->ValidateLanguage($this->aPaths[3], $bAdmim); + $sLanguage = $this->oActions->ValidateLanguage($this->aPaths[3], '', $bAdmim); $bCacheEnabled = $this->Config()->Get('labs', 'cache_system_data', true); if (!empty($sLanguage) && $bCacheEnabled) diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminPane.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminPane.html index 391ec38e2..2edd2e437 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminPane.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminPane.html @@ -12,7 +12,7 @@ ()
- +
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index 86dcdbd9f..f53411fbe 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -204,16 +204,20 @@ -