From 0e9cffd65739e4dcabdd7ce053cb5b169322f370 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 15 Dec 2016 00:56:17 +0300 Subject: [PATCH] Small fixes --- dev/App/User.js | 3 +- dev/Remote/User/Ajax.js | 6 +- dev/Stores/User/Message.js | 23 ++--- dev/View/User/Login.js | 12 ++- dev/View/User/MailBox/MessageList.js | 80 +++++++++++++----- dev/View/User/MailBox/MessageView.js | 5 +- .../app/libraries/MailSo/Mail/MailClient.php | 20 ++++- .../0.0.0/app/libraries/RainLoop/Actions.php | 4 +- .../templates/Views/User/PopupsAccount.html | 2 +- rainloop/v/0.0.0/check.php | 84 +++++++++---------- 10 files changed, 150 insertions(+), 89 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index 69f776747..03852a609 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -819,11 +819,10 @@ class AppUser extends AbstractApp /** * @param {string} sFolderFullNameRaw - * @param {string|bool} mUid * @param {number} iSetAction * @param {Array=} messages = null */ - messageListAction(sFolderFullNameRaw, mUid, iSetAction, messages) { + messageListAction(sFolderFullNameRaw, iSetAction, messages) { let folder = null, diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Ajax.js index 94da9b347..b1a0dd382 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Ajax.js @@ -499,11 +499,13 @@ class RemoteUserAjax extends AbstractAjaxRemote * @param {?Function} fCallback * @param {string} sFolderFullNameRaw * @param {boolean} bSetSeen + * @param {Array} aThreadUids = null */ - messageSetSeenToAll(fCallback, sFolderFullNameRaw, bSetSeen) { + messageSetSeenToAll(fCallback, sFolderFullNameRaw, bSetSeen, aThreadUids = null) { this.defaultRequest(fCallback, 'MessageSetSeenToAll', { 'Folder': sFolderFullNameRaw, - 'SetAction': bSetSeen ? '1' : '0' + 'SetAction': bSetSeen ? '1' : '0', + 'ThreadUids': aThreadUids ? aThreadUids.join(',') : '' }); } diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index cc014b05a..ddb406d6e 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -149,8 +149,10 @@ class MessageUserStore this.messageListCheckedOrSelected = ko.computed(() => { const checked = this.messageListChecked(), - selectedMessage = this.selectorMessageSelected(); - return _.union(checked, selectedMessage ? [selectedMessage] : []); + selectedMessage = this.selectorMessageSelected(), + focusedMessage = this.selectorMessageFocused(); + + return _.union(checked, selectedMessage ? [selectedMessage] : [], focusedMessage ? [focusedMessage] : []); }); this.messageListCheckedOrSelectedUidsWithSubMails = ko.computed(() => { @@ -304,7 +306,7 @@ class MessageUserStore * @param {string} fromFolderFullNameRaw * @param {Array} uidForRemove * @param {string=} toFolderFullNameRaw = '' - * @param {boolean=} bCocopypy = false + * @param {boolean=} copy = false */ removeMessagesFromList(fromFolderFullNameRaw, uidForRemove, toFolderFullNameRaw = '', copy = false) { @@ -485,13 +487,14 @@ class MessageUserStore } /** - * @param {Object} oMessageTextBody + * @param {Object} messageTextBody + * @param {Object} message */ - initOpenPgpControls(oMessageTextBody, oMessage) { - if (oMessageTextBody && oMessageTextBody.find) + initOpenPgpControls(messageTextBody, message) { + if (messageTextBody && messageTextBody.find) { - oMessageTextBody.find('.b-plain-openpgp:not(.inited)').each(function() { - PgpStore.initMessageBodyControls($(this), oMessage); // eslint-disable-line no-invalid-this + messageTextBody.find('.b-plain-openpgp:not(.inited)').each(function() { + PgpStore.initMessageBodyControls($(this), message); // eslint-disable-line no-invalid-this }); } } @@ -665,7 +668,7 @@ class MessageUserStore if (message.unseen() || message.hasUnseenSubMessage()) { getApp().messageListAction( - message.folderFullNameRaw, message.uid, MessageSetAction.SetSeen, [message]); + message.folderFullNameRaw, MessageSetAction.SetSeen, [message]); } if (isNew) @@ -771,7 +774,7 @@ class MessageUserStore } /** - * @param {Array} aList + * @param {Array} list * @returns {string} */ calculateMessageListHash(list) { diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index 698932de1..7e179fb90 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -171,27 +171,31 @@ class LoginUserView extends AbstractViewNext } } + windowOpenFeatures(wh) { + return `left=200,top=100,width=${wh},height=${wh},menubar=no,status=no,resizable=yes,scrollbars=yes`; + } + @command((self) => !self.submitRequest() && self.facebookLoginEnabled()) facebookCommand() { - window.open(socialFacebook(), 'Facebook', 'left=200,top=100,width=500,height=500,menubar=no,status=no,resizable=yes,scrollbars=yes'); + window.open(socialFacebook(), 'Facebook', this.windowOpenFeatures(500)); return true; } @command((self) => !self.submitRequest() && self.googleLoginEnabled()) googleCommand() { - window.open(socialGoogle(), 'Google', 'left=200,top=100,width=550,height=550,menubar=no,status=no,resizable=yes,scrollbars=yes'); + window.open(socialGoogle(), 'Google', this.windowOpenFeatures(550)); return true; } @command((self) => !self.submitRequest() && self.googleFastLoginEnabled()) googleFastCommand() { - window.open(socialGoogle(true), 'Google', 'left=200,top=100,width=550,height=550,menubar=no,status=no,resizable=yes,scrollbars=yes'); + window.open(socialGoogle(true), 'Google', this.windowOpenFeatures(550)); return true; } @command((self) => !self.submitRequest() && self.twitterLoginEnabled()) twitterCommand() { - window.open(socialTwitter(), 'Twitter', 'left=200,top=100,width=500,height=500,menubar=no,status=no,resizable=yes,scrollbars=yes'); + window.open(socialTwitter(), 'Twitter', this.windowOpenFeatures(500)); return true; } diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index a82de9112..c2f3a5124 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -513,23 +513,26 @@ class MessageListMailBoxUserView extends AbstractViewNext /** * @param {string} sFolderFullNameRaw - * @param {string|bool} mUid * @param {number} iSetAction * @param {Array=} aMessages = null * @returns {void} */ - setAction(sFolderFullNameRaw, mUid, iSetAction, aMessages) { - getApp().messageListAction(sFolderFullNameRaw, mUid, iSetAction, aMessages); + setAction(sFolderFullNameRaw, iSetAction, aMessages) { + getApp().messageListAction(sFolderFullNameRaw, iSetAction, aMessages); } /** * @param {string} sFolderFullNameRaw * @param {number} iSetAction + * @param {string} sThreadUid = '' * @returns {void} */ - setActionForAll(sFolderFullNameRaw, iSetAction) { + setActionForAll(sFolderFullNameRaw, iSetAction, sThreadUid = '') { if ('' !== sFolderFullNameRaw) { + let cnt = 0; + const uids = []; + let folder = getFolderFromCacheList(sFolderFullNameRaw); if (folder) { @@ -540,27 +543,64 @@ class MessageListMailBoxUserView extends AbstractViewNext if (folder) { _.each(MessageStore.messageList(), (message) => { + if (message.unseen()) + { + cnt++; + } + message.unseen(false); + uids.push(message.uid); }); - folder.messageCountUnread(0); + if (sThreadUid) + { + folder.messageCountUnread(folder.messageCountUnread() - cnt); + if (0 > folder.messageCountUnread()) + { + folder.messageCountUnread(0); + } + } + else + { + folder.messageCountUnread(0); + } + clearMessageFlagsFromCacheByFolder(sFolderFullNameRaw); } - Remote.messageSetSeenToAll(noop, sFolderFullNameRaw, true); + Remote.messageSetSeenToAll(noop, sFolderFullNameRaw, true, sThreadUid ? uids : null); break; case MessageSetAction.UnsetSeen: folder = getFolderFromCacheList(sFolderFullNameRaw); if (folder) { _.each(MessageStore.messageList(), (message) => { + if (!message.unseen()) + { + cnt++; + } + message.unseen(true); + uids.push(message.uid); }); - folder.messageCountUnread(folder.messageCountAll()); + if (sThreadUid) + { + folder.messageCountUnread(folder.messageCountUnread() + cnt); + if (folder.messageCountAll() < folder.messageCountUnread()) + { + folder.messageCountUnread(folder.messageCountAll()); + } + } + else + { + folder.messageCountUnread(folder.messageCountAll()); + } + clearMessageFlagsFromCacheByFolder(sFolderFullNameRaw); } - Remote.messageSetSeenToAll(noop, sFolderFullNameRaw, false); + + Remote.messageSetSeenToAll(noop, sFolderFullNameRaw, false, sThreadUid ? uids : null); break; // no default } @@ -571,26 +611,26 @@ class MessageListMailBoxUserView extends AbstractViewNext } listSetSeen() { - this.setAction(FolderStore.currentFolderFullNameRaw(), true, + this.setAction(FolderStore.currentFolderFullNameRaw(), MessageSetAction.SetSeen, MessageStore.messageListCheckedOrSelected()); } listSetAllSeen() { - this.setActionForAll(FolderStore.currentFolderFullNameRaw(), MessageSetAction.SetSeen); + this.setActionForAll(FolderStore.currentFolderFullNameRaw(), MessageSetAction.SetSeen, this.messageListEndThreadUid()); } listUnsetSeen() { - this.setAction(FolderStore.currentFolderFullNameRaw(), true, + this.setAction(FolderStore.currentFolderFullNameRaw(), MessageSetAction.UnsetSeen, MessageStore.messageListCheckedOrSelected()); } listSetFlags() { - this.setAction(FolderStore.currentFolderFullNameRaw(), true, + this.setAction(FolderStore.currentFolderFullNameRaw(), MessageSetAction.SetFlag, MessageStore.messageListCheckedOrSelected()); } listUnsetFlags() { - this.setAction(FolderStore.currentFolderFullNameRaw(), true, + this.setAction(FolderStore.currentFolderFullNameRaw(), MessageSetAction.UnsetFlag, MessageStore.messageListCheckedOrSelected()); } @@ -601,12 +641,12 @@ class MessageListMailBoxUserView extends AbstractViewNext const checkedUids = _.map(checked, (message) => message.uid); if (0 < checkedUids.length && -1 < inArray(currentMessage.uid, checkedUids)) { - this.setAction(currentMessage.folderFullNameRaw, true, currentMessage.flagged() ? + this.setAction(currentMessage.folderFullNameRaw, currentMessage.flagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag, checked); } else { - this.setAction(currentMessage.folderFullNameRaw, true, currentMessage.flagged() ? + this.setAction(currentMessage.folderFullNameRaw, currentMessage.flagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag, [currentMessage]); } } @@ -619,12 +659,12 @@ class MessageListMailBoxUserView extends AbstractViewNext if (isUnd(bFlag)) { const flagged = _.filter(checked, (message) => message.flagged()); - this.setAction(checked[0].folderFullNameRaw, true, + this.setAction(checked[0].folderFullNameRaw, checked.length === flagged.length ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag, checked); } else { - this.setAction(checked[0].folderFullNameRaw, true, + this.setAction(checked[0].folderFullNameRaw, !bFlag ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag, checked); } } @@ -637,12 +677,12 @@ class MessageListMailBoxUserView extends AbstractViewNext if (isUnd(seen)) { const unseen = _.filter(checked, (message) => message.unseen()); - this.setAction(checked[0].folderFullNameRaw, true, + this.setAction(checked[0].folderFullNameRaw, 0 < unseen.length ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen, checked); } else { - this.setAction(checked[0].folderFullNameRaw, true, + this.setAction(checked[0].folderFullNameRaw, seen ? MessageSetAction.SetSeen : MessageSetAction.UnsetSeen, checked); } } @@ -676,7 +716,7 @@ class MessageListMailBoxUserView extends AbstractViewNext clearListIsVisible() { return '' === this.messageListSearchDesc() && '' === this.messageListError() && - '' === MessageStore.messageListEndThreadUid() && + '' === this.messageListEndThreadUid() && 0 < this.messageList().length && (this.isSpamFolder() || this.isTrashFolder()); } diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 3f5d97a69..97c97f5e3 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -687,7 +687,7 @@ class MessageViewMailBoxUserView extends AbstractViewNext const message = self.message(); if (message) { - getApp().messageListAction(message.folderFullNameRaw, message.uid, + getApp().messageListAction(message.folderFullNameRaw, message.flagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag, [message]); } }) @@ -695,8 +695,7 @@ class MessageViewMailBoxUserView extends AbstractViewNext const message = ko.dataFor(this); // eslint-disable-line no-invalid-this if (message && message.folder && message.uid) { - getApp().messageListAction( - message.folder, message.uid, + getApp().messageListAction(message.folder, message.flagged() ? MessageSetAction.UnsetFlag : MessageSetAction.SetFlag, [message]); } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 3d387515e..9b81a66d2 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -225,13 +225,14 @@ class MailClient * @param string $sMessageFlag * @param bool $bSetAction = true * @param bool $sSkipUnsupportedFlag = false + * @param array $aCustomUids = null * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception * @throws \MailSo\Mail\Exceptions\Exception */ - public function MessageSetFlagToAll($sFolderName, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false) + public function MessageSetFlagToAll($sFolderName, $sMessageFlag, $bSetAction = true, $sSkipUnsupportedFlag = false, $aCustomUids = null) { $this->oImapClient->FolderSelect($sFolderName); @@ -251,7 +252,17 @@ class MailClient : \MailSo\Imap\Enumerations\StoreAction::REMOVE_FLAGS_SILENT ; - $this->oImapClient->MessageStoreFlag('1:*', false, array($sMessageFlag), $sStoreAction); + if (is_array($aCustomUids)) + { + if (0 < count($aCustomUids)) + { + $this->oImapClient->MessageStoreFlag(implode(',', $aCustomUids), true, array($sMessageFlag), $sStoreAction); + } + } + else + { + $this->oImapClient->MessageStoreFlag('1:*', false, array($sMessageFlag), $sStoreAction); + } } } @@ -312,14 +323,15 @@ class MailClient /** * @param string $sFolderName * @param bool $bSetAction = true + * @param array $aCustomUids = null * * @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception */ - public function MessageSetSeenToAll($sFolderName, $bSetAction = true) + public function MessageSetSeenToAll($sFolderName, $bSetAction = true, $aCustomUids = null) { - $this->MessageSetFlagToAll($sFolderName, \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true); + $this->MessageSetFlagToAll($sFolderName, \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction, true, $aCustomUids); } /** 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 342c921f7..01caf0a92 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -7211,10 +7211,12 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack $sFolder = $this->GetActionParam('Folder', ''); $bSetAction = '1' === (string) $this->GetActionParam('SetAction', '0'); + $sThreadUids = \trim($this->GetActionParam('ThreadUids', '')); try { - $this->MailClient()->MessageSetSeenToAll($sFolder, $bSetAction); + $this->MailClient()->MessageSetSeenToAll($sFolder, $bSetAction, + !empty($sThreadUids) ? explode(',', $sThreadUids) : null); } catch (\Exception $oException) { diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsAccount.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsAccount.html index 75eddac75..8cc8c3876 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/PopupsAccount.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsAccount.html @@ -23,7 +23,7 @@
-
diff --git a/rainloop/v/0.0.0/check.php b/rainloop/v/0.0.0/check.php index 6deb2bd3e..b389b8128 100644 --- a/rainloop/v/0.0.0/check.php +++ b/rainloop/v/0.0.0/check.php @@ -1,42 +1,42 @@ - function_exists('curl_init'), - 'iconv' => function_exists('iconv'), - 'json' => function_exists('json_decode'), - 'DateTime' => class_exists('DateTime') && class_exists('DateTimeZone'), - 'libxml' => function_exists('libxml_use_internal_errors'), - 'dom' => class_exists('DOMDocument'), - 'Zlib' => function_exists('gzopen') || function_exists('gzopen64'), - 'PCRE' => function_exists('preg_replace'), - 'SPL' => function_exists('spl_autoload_register') - ); - - if (version_compare(PHP_VERSION, '5.3.0', '<')) - { - echo '

'; - echo '[301] Your PHP version ('.PHP_VERSION.') is lower than the minimal required 5.3.0!'; - echo '

'; - exit(301); - } - - if (in_array(false, $aRequirements)) - { - echo '

'; - echo '[302] The following PHP extensions are not available in your PHP configuration!'; - echo '

'; - exit(302); - } - } + function_exists('curl_init'), + 'iconv' => function_exists('iconv'), + 'json' => function_exists('json_decode'), + 'DateTime' => class_exists('DateTime') && class_exists('DateTimeZone'), + 'libxml' => function_exists('libxml_use_internal_errors'), + 'dom' => class_exists('DOMDocument'), + 'Zlib' => function_exists('gzopen') || function_exists('gzopen64'), + 'PCRE' => function_exists('preg_replace'), + 'SPL' => function_exists('spl_autoload_register') + ); + + if (version_compare(PHP_VERSION, '5.4.0', '<')) + { + echo '

'; + echo '[301] Your PHP version ('.PHP_VERSION.') is lower than the minimal required 5.4.0!'; + echo '

'; + exit(301); + } + + if (in_array(false, $aRequirements)) + { + echo '

'; + echo '[302] The following PHP extensions are not available in your PHP configuration!'; + echo '

'; + exit(302); + } + }