mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 15:45:55 +08:00
Small fixes
This commit is contained in:
parent
d3f8fa4308
commit
0e9cffd657
|
@ -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,
|
||||
|
|
|
@ -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(',') : ''
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<label class="i18n control-label" data-i18n="LOGIN/LABEL_EMAIL"></label>
|
||||
<div class="controls">
|
||||
<label style="margin-top: 5px;" data-bind="visible: !isNew()"><strong data-bind="text: email"></strong></label>
|
||||
<input type="email" class="inputEmail input-large" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
<input type="email" class="inputEmail input-xlarge" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
|
||||
data-bind="visible: isNew, textInput: email, onEnter: addAccountCommand, hasfocus: emailFocus" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,42 +1,42 @@
|
|||
<?php
|
||||
|
||||
if (defined('APP_VERSION'))
|
||||
{
|
||||
$aRequirements = array(
|
||||
'cURL' => 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 '<p style="color: red">';
|
||||
echo '[301] Your PHP version ('.PHP_VERSION.') is lower than the minimal required 5.3.0!';
|
||||
echo '</p>';
|
||||
exit(301);
|
||||
}
|
||||
|
||||
if (in_array(false, $aRequirements))
|
||||
{
|
||||
echo '<p>';
|
||||
echo '[302] The following PHP extensions are not available in your PHP configuration!';
|
||||
echo '</p><ul>';
|
||||
|
||||
foreach ($aRequirements as $sKey => $bValue)
|
||||
{
|
||||
if (!$bValue)
|
||||
{
|
||||
echo '<li>'.$sKey.'</li>';
|
||||
}
|
||||
}
|
||||
|
||||
echo '</ul>';
|
||||
exit(302);
|
||||
}
|
||||
}
|
||||
<?php
|
||||
|
||||
if (defined('APP_VERSION'))
|
||||
{
|
||||
$aRequirements = array(
|
||||
'cURL' => 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 '<p style="color: red">';
|
||||
echo '[301] Your PHP version ('.PHP_VERSION.') is lower than the minimal required 5.4.0!';
|
||||
echo '</p>';
|
||||
exit(301);
|
||||
}
|
||||
|
||||
if (in_array(false, $aRequirements))
|
||||
{
|
||||
echo '<p>';
|
||||
echo '[302] The following PHP extensions are not available in your PHP configuration!';
|
||||
echo '</p><ul>';
|
||||
|
||||
foreach ($aRequirements as $sKey => $bValue)
|
||||
{
|
||||
if (!$bValue)
|
||||
{
|
||||
echo '<li>'.$sKey.'</li>';
|
||||
}
|
||||
}
|
||||
|
||||
echo '</ul>';
|
||||
exit(302);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue