mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-30 04:29:21 +03:00
Merge branch 'master' of https://github.com/Murena-SAS/snappymail into dev/sync-nextcloud-addressbook
This commit is contained in:
commit
ae7e00859c
41 changed files with 3127 additions and 347 deletions
|
|
@ -61,9 +61,7 @@ import { AskPopupView } from 'View/Popup/Ask';
|
|||
import {
|
||||
folderInformation,
|
||||
folderInformationMultiply,
|
||||
setRefreshFoldersInterval,
|
||||
messagesMoveHelper,
|
||||
messagesDeleteHelper
|
||||
setRefreshFoldersInterval
|
||||
} from 'Common/Folders';
|
||||
import { loadFolders } from 'Model/FolderCollection';
|
||||
|
||||
|
|
@ -133,13 +131,11 @@ export class AppUser extends AbstractApp {
|
|||
showScreenPopup(AskPopupView, [
|
||||
i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'),
|
||||
() => {
|
||||
messagesDeleteHelper(sFromFolderFullName, oUids);
|
||||
MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids);
|
||||
MessagelistUserStore.moveMessages(sFromFolderFullName, oUids);
|
||||
}
|
||||
]);
|
||||
} else if (oMoveFolder) {
|
||||
messagesMoveHelper(sFromFolderFullName, oMoveFolder.fullName, oUids);
|
||||
MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids, oMoveFolder.fullName);
|
||||
MessagelistUserStore.moveMessages(sFromFolderFullName, oUids, oMoveFolder.fullName);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
import { isArray, arrayLength } from 'Common/Utils';
|
||||
import {
|
||||
setFolderETag,
|
||||
getFolderInboxName,
|
||||
getFolderFromCacheList
|
||||
} from 'Common/Cache';
|
||||
import { SettingsUserStore } from 'Stores/User/Settings';
|
||||
import { FolderUserStore } from 'Stores/User/Folder';
|
||||
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
||||
import { getNotification } from 'Common/Translator';
|
||||
|
||||
import Remote from 'Remote/User/Fetch';
|
||||
|
||||
|
|
@ -197,76 +195,6 @@ folderInformationMultiply = (boot = false) => {
|
|||
}
|
||||
},
|
||||
|
||||
moveOrDeleteResponseHelper = (iError, oData) => {
|
||||
if (iError) {
|
||||
setFolderETag(FolderUserStore.currentFolderFullName(), '');
|
||||
alert(getNotification(iError));
|
||||
} else if (FolderUserStore.currentFolder()) {
|
||||
if (2 === arrayLength(oData.Result)) {
|
||||
setFolderETag(oData.Result[0], oData.Result[1]);
|
||||
} else {
|
||||
setFolderETag(FolderUserStore.currentFolderFullName(), '');
|
||||
}
|
||||
MessagelistUserStore.reload(!MessagelistUserStore.length);
|
||||
}
|
||||
},
|
||||
|
||||
messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => {
|
||||
const
|
||||
sSpamFolder = FolderUserStore.spamFolder(),
|
||||
isSpam = sSpamFolder === toFolderFullName,
|
||||
isHam = !isSpam && sSpamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName;
|
||||
|
||||
Remote.abort('MessageList', 'reload').request('MessageMove',
|
||||
moveOrDeleteResponseHelper,
|
||||
{
|
||||
fromFolder: fromFolderFullName,
|
||||
toFolder: toFolderFullName,
|
||||
uids: [...uidsForMove].join(','),
|
||||
markAsRead: (isSpam || FolderUserStore.trashFolder() === toFolderFullName) ? 1 : 0,
|
||||
learning: isSpam ? 'SPAM' : isHam ? 'HAM' : ''
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
messagesDeleteHelper = (sFromFolderFullName, aUidForRemove) => {
|
||||
Remote.abort('MessageList', 'reload').request('MessageDelete',
|
||||
moveOrDeleteResponseHelper,
|
||||
{
|
||||
folder: sFromFolderFullName,
|
||||
uids: [...aUidForRemove].join(',')
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} sFromFolderFullName
|
||||
* @param {Set} oUids
|
||||
* @param {string} sToFolderFullName
|
||||
* @param {boolean=} bCopy = false
|
||||
*/
|
||||
moveMessagesToFolder = (sFromFolderFullName, oUids, sToFolderFullName, bCopy) => {
|
||||
if (sFromFolderFullName !== sToFolderFullName && oUids?.size) {
|
||||
const oFromFolder = getFolderFromCacheList(sFromFolderFullName),
|
||||
oToFolder = getFolderFromCacheList(sToFolderFullName);
|
||||
|
||||
if (oFromFolder && oToFolder) {
|
||||
bCopy
|
||||
? Remote.request('MessageCopy', null, {
|
||||
fromFolder: oFromFolder.fullName,
|
||||
toFolder: oToFolder.fullName,
|
||||
uids: [...oUids].join(',')
|
||||
})
|
||||
: messagesMoveHelper(oFromFolder.fullName, oToFolder.fullName, oUids);
|
||||
|
||||
MessagelistUserStore.removeMessagesFromList(oFromFolder.fullName, oUids, oToFolder.fullName, bCopy);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
dropFilesInFolder = (sFolderFullName, files) => {
|
||||
let count = files.length;
|
||||
for (const file of files) {
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ const
|
|||
* https://github.com/M66B/FairEmail/blob/master/app/src/main/java/eu/faircode/email/UriHelper.java
|
||||
*/
|
||||
// eslint-disable-next-line max-len
|
||||
stripParams = /^(utm_|ec_|fbclid|mc_eid|mkt_tok|_hsenc|vero_id|oly_enc_id|oly_anon_id|__s|Referrer|mailing|elq|bch|trc|ref|correlation_id|pd_|pf_|email_hash)/i,
|
||||
stripParams = /^(utm_|ec_|fbclid|mc_eid|mkt_tok|_hsenc|vero_id|oly_enc_id|oly_anon_id|__s|Referrer|mailing|elq|bch|trc|ref|correlation_id|pd_|pf_|email_hash)$/i,
|
||||
urlGetParam = (url, name) => new URL(url).searchParams.get(name) || url,
|
||||
base64Url = data => atob(data.replace(/_/g,'/').replace(/-/g,'+')),
|
||||
decode = decodeURIComponent,
|
||||
|
|
@ -99,7 +99,7 @@ const
|
|||
},
|
||||
|
||||
cleanCSS = source =>
|
||||
source.trim().replace(/-(ms|webkit)-[^;]+(;|$)/g, '')
|
||||
source.trim().replace(/(^|;)\s*-(ms|webkit)-[^;]+(;|$)/g, '')
|
||||
.replace(/white-space[^;]+(;|$)/g, '')
|
||||
// Drop Microsoft Office style properties
|
||||
// .replace(/mso-[^:;]+:[^;]+/gi, '')
|
||||
|
|
@ -346,7 +346,7 @@ export const
|
|||
let i = oElement.attributes.length;
|
||||
while (i--) {
|
||||
let sAttrName = oElement.attributes[i].name.toLowerCase();
|
||||
if (!allowedAttributes.includes(sAttrName)) {
|
||||
if (!allowedAttributes.includes(sAttrName) && ('class' !== sAttrName || 'mail-body' !== className)) {
|
||||
delAttribute(sAttrName);
|
||||
aAttrsForRemove.push(sAttrName);
|
||||
}
|
||||
|
|
@ -542,7 +542,7 @@ export const
|
|||
oStyle.removeProperty('color');
|
||||
}
|
||||
|
||||
oStyle.cssText = cleanCSS(oStyle.cssText);
|
||||
oStyle.cssText && (oStyle.cssText = cleanCSS(oStyle.cssText));
|
||||
}
|
||||
|
||||
if (debug && aAttrsForRemove.length) {
|
||||
|
|
|
|||
|
|
@ -65,8 +65,8 @@ export class Selector {
|
|||
this.listChecked.subscribe(items => {
|
||||
if (items.length) {
|
||||
koSelectedItem() ? koSelectedItem(null) : koSelectedItem.valueHasMutated?.();
|
||||
} else if (this.autoSelect()) {
|
||||
koSelectedItem(koFocusedItem());
|
||||
} else {
|
||||
this.autoSelect();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -174,9 +174,7 @@ export class Selector {
|
|||
this.iFocusedNextHelper = 0;
|
||||
}
|
||||
|
||||
if (this.autoSelect() && !isChecked && !koSelectedItem()) {
|
||||
koSelectedItem(koFocusedItem());
|
||||
}
|
||||
!isChecked && !koSelectedItem() && this.autoSelect();
|
||||
}
|
||||
|
||||
aCheckedCache = [];
|
||||
|
|
@ -250,8 +248,10 @@ export class Selector {
|
|||
/**
|
||||
* @returns {boolean}
|
||||
*/
|
||||
autoSelect() {
|
||||
return (this.oCallbacks.AutoSelect || (()=>1))() && this.focusedItem();
|
||||
autoSelect(bForce) {
|
||||
(bForce || (this.oCallbacks.AutoSelect || (()=>1))())
|
||||
&& this.focusedItem()
|
||||
&& this.selectedItem(this.focusedItem());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -327,9 +327,7 @@ export class Selector {
|
|||
|
||||
if (result) {
|
||||
this.focusedItem(result);
|
||||
if ((this.autoSelect() || bForceSelect) && !this.list.hasChecked()) {
|
||||
this.selectedItem(result);
|
||||
}
|
||||
!this.list.hasChecked() && this.autoSelect(bForceSelect);
|
||||
this.scrollToFocused();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
23
dev/External/SquireUI.js
vendored
23
dev/External/SquireUI.js
vendored
|
|
@ -69,6 +69,8 @@ class SquireUI
|
|||
|
||||
clr.value = '';
|
||||
clr.onchange = () => squire.setStyle({[name]:clr.value});
|
||||
// Chrome 110+ https://github.com/the-djmaze/snappymail/issues/1199
|
||||
// clr.oninput = () => squire.setStyle({[name]:clr.value});
|
||||
setTimeout(()=>clr.click(),1);
|
||||
},
|
||||
|
||||
|
|
@ -279,6 +281,27 @@ class SquireUI
|
|||
|
||||
clr.type = 'color';
|
||||
toolbar.append(clr);
|
||||
// Chrome https://github.com/the-djmaze/snappymail/issues/1199
|
||||
let clrid = 'squire-colors',
|
||||
colorlist = doc.getElementById(clrid),
|
||||
add = hex => colorlist.append(new Option(hex));
|
||||
if (!colorlist) {
|
||||
colorlist = createElement('datalist');
|
||||
colorlist.id = clrid;
|
||||
// Color blind safe Tableau 10 by Maureen Stone
|
||||
add('#4E79A7');
|
||||
add('#F28E2B');
|
||||
add('#E15759');
|
||||
add('#76B7B2');
|
||||
add('#59A14F');
|
||||
add('#EDC948');
|
||||
add('#B07AA1');
|
||||
add('#FF9DA7');
|
||||
add('#9C755F');
|
||||
add('#BAB0AC');
|
||||
doc.body.append(colorlist);
|
||||
}
|
||||
clr.setAttribute('list', clrid);
|
||||
|
||||
browseImage.type = 'file';
|
||||
browseImage.accept = 'image/*';
|
||||
|
|
|
|||
6
dev/External/User/ko.js
vendored
6
dev/External/User/ko.js
vendored
|
|
@ -6,7 +6,7 @@ import { doc, elementById, addEventsListeners, dropdowns, leftPanelDisabled } fr
|
|||
import { dropdownsDetectVisibility } from 'Common/UtilsUser';
|
||||
import { EmailAddressesComponent } from 'Component/EmailAddresses';
|
||||
import { ThemeStore } from 'Stores/Theme';
|
||||
import { moveMessagesToFolder, dropFilesInFolder } from 'Common/Folders';
|
||||
import { dropFilesInFolder } from 'Common/Folders';
|
||||
import { setExpandedFolder } from 'Model/FolderCollection';
|
||||
import { FolderUserStore } from 'Stores/User/Folder';
|
||||
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
||||
|
|
@ -63,7 +63,9 @@ const rlContentType = 'snappymail/action',
|
|||
dragDrop = (e, element, folder, dragData) => {
|
||||
dragStop(e, element);
|
||||
if (dragMessages() && 'copyMove' == e.dataTransfer.effectAllowed) {
|
||||
moveMessagesToFolder(FolderUserStore.currentFolderFullName(), dragData.data, folder.fullName, e.ctrlKey);
|
||||
MessagelistUserStore.moveMessages(
|
||||
FolderUserStore.currentFolderFullName(), dragData.data, folder.fullName, e.ctrlKey
|
||||
);
|
||||
} else if (e.dataTransfer.types.includes('Files')) {
|
||||
dropFilesInFolder(folder.fullName, e.dataTransfer.files);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,9 @@ body > * {
|
|||
border: 1px solid rgba(125,128,128,0.5);
|
||||
padding: 0.25em;
|
||||
margin-right: 1em;
|
||||
}
|
||||
#attachments > *::before {
|
||||
content: '📎 ';
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import ko from 'ko';
|
||||
|
||||
import { addObservablesTo, addComputablesTo, addSubscribablesTo } from 'External/ko';
|
||||
import { keyScope, addShortcut, SettingsGet, leftPanelDisabled, toggleLeftPanel, elementById } from 'Common/Globals';
|
||||
import { keyScope, addShortcut, SettingsGet, toggleLeftPanel, elementById } from 'Common/Globals';
|
||||
import { ViewTypePopup, showScreenPopup } from 'Knoin/Knoin';
|
||||
|
||||
import { SaveSettingStatus } from 'Common/Enums';
|
||||
|
|
@ -95,7 +95,6 @@ export class AbstractViewLeft extends AbstractView
|
|||
constructor(templateID)
|
||||
{
|
||||
super(templateID, 'left');
|
||||
this.leftPanelDisabled = leftPanelDisabled;
|
||||
this.toggleLeftPanel = toggleLeftPanel;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -464,7 +464,7 @@ export class MessageModel extends AbstractModel {
|
|||
clone.querySelectorAll('.sm-bq-switcher').forEach(
|
||||
node => node.replaceWith(node.lastElementChild)
|
||||
);
|
||||
return clone.innerHTML;
|
||||
return (clone.querySelector('.mail-body') || clone).innerHTML;
|
||||
}
|
||||
let result = msgHtml(this);
|
||||
return result.html || plainToHtml(this.plain());
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ abort = (sAction, sReason, bClearOnly) => {
|
|||
oRequests[sAction] = null;
|
||||
if (controller) {
|
||||
clearTimeout(controller.timeoutId);
|
||||
bClearOnly || controller.abort(sReason || 'AbortError');
|
||||
bClearOnly || controller.abort(new DOMException(sAction, sReason || 'AbortError'));
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -61,7 +61,6 @@ fetchJSON = (action, sUrl, params, timeout, jsonCallback) => {
|
|||
}).catch(err => {
|
||||
clearTimeout(controller.timeoutId);
|
||||
err.aborted = signal.aborted;
|
||||
err.reason = signal.reason;
|
||||
return Promise.reject(err);
|
||||
});
|
||||
};
|
||||
|
|
@ -165,7 +164,7 @@ export class AbstractFetchRemote
|
|||
.catch(err => {
|
||||
console.error({fetchError:err});
|
||||
fCallback && fCallback(
|
||||
'TimeoutError' == err.reason ? 3 : (err.name == 'AbortError' ? 2 : 1),
|
||||
'TimeoutError' == err.name ? 3 : (err.name == 'AbortError' ? 2 : 1),
|
||||
err
|
||||
);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ let __themeTimer = 0;
|
|||
export const
|
||||
// Also see Styles/_Values.less @maxMobileWidth
|
||||
isMobile = matchMedia('(max-width: 799px)'),
|
||||
// https://github.com/the-djmaze/snappymail/issues/1150
|
||||
// isSmall = matchMedia('(max-width: 1400px)'),
|
||||
|
||||
ThemeStore = {
|
||||
theme: ko.observable(''),
|
||||
|
|
@ -104,6 +106,9 @@ addSubscribablesTo(ThemeStore, {
|
|||
isMobile.onchange = e => {
|
||||
ThemeStore.isMobile(e.matches);
|
||||
$htmlCL.toggle('rl-mobile', e.matches);
|
||||
leftPanelDisabled(e.matches);
|
||||
/*$htmlCL.contains('sm-msgView-side') || */leftPanelDisabled(e.matches);
|
||||
};
|
||||
isMobile.onchange(isMobile);
|
||||
|
||||
//isSmall.onchange = e => $htmlCL.contains('sm-msgView-side') && leftPanelDisabled(e.matches);
|
||||
//isSmall.onchange(isSmall);
|
||||
|
|
|
|||
|
|
@ -166,9 +166,9 @@ MessagelistUserStore.notifyNewMessages = (folder, newMessages) => {
|
|||
}
|
||||
|
||||
MessagelistUserStore.canAutoSelect = () =>
|
||||
!/is:unseen/.test(MessagelistUserStore.mainSearch())
|
||||
&& !disableAutoSelect()
|
||||
!disableAutoSelect()
|
||||
&& SettingsUserStore.usePreviewPane();
|
||||
// && !SettingsUserStore.showNextMessage();
|
||||
|
||||
let prevFolderName;
|
||||
|
||||
|
|
@ -222,7 +222,7 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrentFolderCach
|
|||
fCallback = (iError, oData, bCached) => {
|
||||
let error = '';
|
||||
if (iError) {
|
||||
if ('reload' != oData?.reason) {
|
||||
if ('reload' != oData?.name) {
|
||||
error = getNotification(iError);
|
||||
MessagelistUserStore.loading(false);
|
||||
// if (Notifications.RequestAborted !== iError) {
|
||||
|
|
@ -399,53 +399,92 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => {
|
|||
* @param {string=} toFolderFullName = ''
|
||||
* @param {boolean=} copy = false
|
||||
*/
|
||||
MessagelistUserStore.removeMessagesFromList = (
|
||||
MessagelistUserStore.moveMessages = (
|
||||
fromFolderFullName, oUids, toFolderFullName = '', copy = false
|
||||
) => {
|
||||
const fromFolder = getFolderFromCacheList(fromFolderFullName);
|
||||
|
||||
if (!fromFolder || !oUids?.size) return;
|
||||
|
||||
let unseenCount = 0,
|
||||
setPage = 0,
|
||||
currentMessage = MessageUserStore.message();
|
||||
|
||||
const trashFolder = FolderUserStore.trashFolder(),
|
||||
const toFolder = toFolderFullName ? getFolderFromCacheList(toFolderFullName) : null,
|
||||
trashFolder = FolderUserStore.trashFolder(),
|
||||
spamFolder = FolderUserStore.spamFolder(),
|
||||
fromFolder = getFolderFromCacheList(fromFolderFullName),
|
||||
toFolder = toFolderFullName ? getFolderFromCacheList(toFolderFullName) : null,
|
||||
page = MessagelistUserStore.page(),
|
||||
messages =
|
||||
FolderUserStore.currentFolderFullName() === fromFolderFullName
|
||||
? MessagelistUserStore.filter(item => item && oUids.has(item.uid))
|
||||
: [];
|
||||
: [],
|
||||
moveOrDeleteResponseHelper = (iError, oData) => {
|
||||
if (iError) {
|
||||
setFolderETag(FolderUserStore.currentFolderFullName(), '');
|
||||
alert(getNotification(iError));
|
||||
} else if (FolderUserStore.currentFolder()) {
|
||||
if (2 === arrayLength(oData.Result)) {
|
||||
setFolderETag(oData.Result[0], oData.Result[1]);
|
||||
} else {
|
||||
setFolderETag(FolderUserStore.currentFolderFullName(), '');
|
||||
}
|
||||
|
||||
MessagelistUserStore.count(MessagelistUserStore.count() - oUids.size);
|
||||
if (page > MessagelistUserStore.pageCount()) {
|
||||
setPage = MessagelistUserStore.pageCount();
|
||||
}
|
||||
if (MessagelistUserStore.threadUid()
|
||||
&& MessagelistUserStore.length
|
||||
&& MessagelistUserStore.find(item => item?.deleted() && item.uid == MessagelistUserStore.threadUid())
|
||||
) {
|
||||
const message = MessagelistUserStore.find(item => item && !item.deleted());
|
||||
if (!message) {
|
||||
if (1 < page) {
|
||||
setPage = page - 1;
|
||||
} else {
|
||||
MessagelistUserStore.threadUid(0);
|
||||
setPage = MessagelistUserStore.pageBeforeThread();
|
||||
}
|
||||
} else if (MessagelistUserStore.threadUid() != message.uid) {
|
||||
MessagelistUserStore.threadUid(message.uid);
|
||||
setPage = page;
|
||||
}
|
||||
}
|
||||
if (setPage) {
|
||||
MessagelistUserStore.page(setPage);
|
||||
replaceHash(
|
||||
mailBox(
|
||||
FolderUserStore.currentFolderFullNameHash(),
|
||||
setPage,
|
||||
MessagelistUserStore.listSearch(),
|
||||
MessagelistUserStore.threadUid()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
MessagelistUserStore.reload(!MessagelistUserStore.count());
|
||||
}
|
||||
};
|
||||
|
||||
messages.forEach(item => item?.isUnseen() && ++unseenCount);
|
||||
|
||||
if (fromFolder) {
|
||||
if (!copy) {
|
||||
fromFolder.etag = '';
|
||||
if (!copy) {
|
||||
fromFolder.totalEmails(
|
||||
0 <= fromFolder.totalEmails() - oUids.size ? fromFolder.totalEmails() - oUids.size : 0
|
||||
);
|
||||
|
||||
if (0 < unseenCount) {
|
||||
fromFolder.unreadEmails(Math.max(0, fromFolder.unreadEmails() - unseenCount));
|
||||
}
|
||||
}
|
||||
fromFolder.totalEmails(Math.max(0, fromFolder.totalEmails() - oUids.size));
|
||||
fromFolder.unreadEmails(Math.max(0, fromFolder.unreadEmails() - unseenCount));
|
||||
}
|
||||
|
||||
if (toFolder) {
|
||||
toFolder.etag = '';
|
||||
|
||||
if (trashFolder === toFolder.fullName || spamFolder === toFolder.fullName) {
|
||||
unseenCount = 0;
|
||||
}
|
||||
|
||||
toFolder.totalEmails(toFolder.totalEmails() + oUids.size);
|
||||
if (0 < unseenCount) {
|
||||
if (trashFolder !== toFolder.fullName && spamFolder !== toFolder.fullName) {
|
||||
toFolder.unreadEmails(toFolder.unreadEmails() + unseenCount);
|
||||
}
|
||||
|
||||
toFolder.actionBlink(true);
|
||||
}
|
||||
|
||||
if (messages.length) {
|
||||
disableAutoSelect(true);
|
||||
if (copy) {
|
||||
messages.forEach(item => item.checked(false));
|
||||
} else {
|
||||
|
|
@ -468,49 +507,37 @@ MessagelistUserStore.removeMessagesFromList = (
|
|||
currentMessage = null;
|
||||
MessageUserStore.message(null);
|
||||
}
|
||||
|
||||
item.deleted(true);
|
||||
MessagelistUserStore.remove(item);
|
||||
});
|
||||
|
||||
setTimeout(() => messages.forEach(item => MessagelistUserStore.remove(item)), 350);
|
||||
|
||||
const
|
||||
count = MessagelistUserStore.count() - messages.length,
|
||||
page = MessagelistUserStore.page();
|
||||
MessagelistUserStore.count(count);
|
||||
if (page > MessagelistUserStore.pageCount()) {
|
||||
setPage = MessagelistUserStore.pageCount();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (MessagelistUserStore.threadUid()
|
||||
&& MessagelistUserStore.length
|
||||
&& MessagelistUserStore.find(item => item?.deleted() && item.uid == MessagelistUserStore.threadUid())
|
||||
) {
|
||||
const message = MessagelistUserStore.find(item => item && !item.deleted());
|
||||
if (!message) {
|
||||
if (1 < MessagelistUserStore.page()) {
|
||||
setPage = MessagelistUserStore.page() - 1;
|
||||
if (toFolderFullName) {
|
||||
if (toFolder && fromFolderFullName != toFolderFullName) {
|
||||
const params = {
|
||||
fromFolder: fromFolderFullName,
|
||||
toFolder: toFolderFullName,
|
||||
uids: [...oUids].join(',')
|
||||
};
|
||||
if (copy) {
|
||||
Remote.request('MessageCopy', null, params);
|
||||
} else {
|
||||
MessagelistUserStore.threadUid(0);
|
||||
setPage = MessagelistUserStore.pageBeforeThread();
|
||||
const
|
||||
isSpam = spamFolder === toFolderFullName,
|
||||
isHam = !isSpam && spamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName;
|
||||
params.markAsRead = (isSpam || FolderUserStore.trashFolder() === toFolderFullName) ? 1 : 0;
|
||||
params.learning = isSpam ? 'SPAM' : isHam ? 'HAM' : '';
|
||||
Remote.abort('MessageList', 'reload').request('MessageMove', moveOrDeleteResponseHelper, params);
|
||||
}
|
||||
} else if (MessagelistUserStore.threadUid() != message.uid) {
|
||||
MessagelistUserStore.threadUid(message.uid);
|
||||
setPage = MessagelistUserStore.page();
|
||||
}
|
||||
}
|
||||
|
||||
if (setPage) {
|
||||
MessagelistUserStore.page(setPage);
|
||||
replaceHash(
|
||||
mailBox(
|
||||
FolderUserStore.currentFolderFullNameHash(),
|
||||
setPage,
|
||||
MessagelistUserStore.listSearch(),
|
||||
MessagelistUserStore.threadUid()
|
||||
)
|
||||
} else {
|
||||
Remote.abort('MessageList', 'reload').request('MessageDelete',
|
||||
moveOrDeleteResponseHelper,
|
||||
{
|
||||
folder: fromFolderFullName,
|
||||
uids: [...oUids].join(',')
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -4,6 +4,13 @@ html.list-loading body {
|
|||
cursor: progress;
|
||||
}
|
||||
|
||||
.toggleLeft::before {
|
||||
content: '❮';
|
||||
}
|
||||
html.rl-left-panel-disabled .toggleLeft::before {
|
||||
content: '❯';
|
||||
}
|
||||
|
||||
@media screen and (min-width: @maxMobileWidth + 1px) {
|
||||
#rl-app {
|
||||
background-image: var(--main-bg-image);
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
.b-toolbar {
|
||||
padding: 10px 0 10px @rlLowMargin;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -189,7 +190,7 @@ html.rl-left-panel-disabled {
|
|||
|
||||
/* desktop */
|
||||
@media screen and (min-width: @maxMobileWidth + 1px) {
|
||||
.toggleLeft,
|
||||
#rl-right .toggleLeft,
|
||||
#V-MailMessageList .buttonCompose {
|
||||
display: none !important;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,12 +2,11 @@ import Remote from 'Remote/Admin/Fetch';
|
|||
|
||||
import { AbstractViewRight } from 'Knoin/AbstractViews';
|
||||
|
||||
import { leftPanelDisabled, toggleLeftPanel } from 'Common/Globals';
|
||||
import { toggleLeftPanel } from 'Common/Globals';
|
||||
|
||||
export class PaneSettingsAdminView extends AbstractViewRight {
|
||||
constructor() {
|
||||
super('AdminPane');
|
||||
this.leftPanelDisabled = leftPanelDisabled;
|
||||
this.toggleLeftPanel = toggleLeftPanel;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import { encodeHtml, HtmlEditor, htmlToPlain } from 'Common/Html';
|
|||
import { koArrayWithDestroy, addObservablesTo, addComputablesTo, addSubscribablesTo } from 'External/ko';
|
||||
|
||||
import { UNUSED_OPTION_VALUE } from 'Common/Consts';
|
||||
import { folderInformation, messagesDeleteHelper } from 'Common/Folders';
|
||||
import { folderInformation } from 'Common/Folders';
|
||||
import { serverRequest } from 'Common/Links';
|
||||
import { i18n, getNotification, getUploadErrorDescByCode, timestampToString } from 'Common/Translator';
|
||||
import { setFolderETag } from 'Common/Cache';
|
||||
|
|
@ -586,8 +586,7 @@ export class ComposePopupView extends AbstractViewPopup {
|
|||
const
|
||||
sFromFolderFullName = this.draftsFolder(),
|
||||
oUids = new Set([this.draftUid()]);
|
||||
messagesDeleteHelper(sFromFolderFullName, oUids);
|
||||
MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids);
|
||||
MessagelistUserStore.moveMessages(sFromFolderFullName, oUids);
|
||||
this.close();
|
||||
}
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -20,8 +20,6 @@ import { FolderCreatePopupView } from 'View/Popup/FolderCreate';
|
|||
import { ContactsPopupView } from 'View/Popup/Contacts';
|
||||
import { ComposePopupView } from 'View/Popup/Compose';
|
||||
|
||||
import { moveMessagesToFolder } from 'Common/Folders';
|
||||
|
||||
import { setExpandedFolder, foldersFilter } from 'Model/FolderCollection';
|
||||
|
||||
export class MailFolderList extends AbstractViewLeft {
|
||||
|
|
@ -92,7 +90,7 @@ export class MailFolderList extends AbstractViewLeft {
|
|||
if (folder) {
|
||||
if (moveAction()) {
|
||||
moveAction(false);
|
||||
moveMessagesToFolder(
|
||||
MessagelistUserStore.moveMessages(
|
||||
FolderUserStore.currentFolderFullName(),
|
||||
MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(),
|
||||
folder.fullName,
|
||||
|
|
|
|||
|
|
@ -88,8 +88,6 @@ export class MailMessageList extends AbstractViewRight {
|
|||
this.composeInEdit = ComposePopupView.inEdit;
|
||||
|
||||
this.isMobile = ThemeStore.isMobile; // Obsolete
|
||||
this.leftPanelDisabled = leftPanelDisabled;
|
||||
this.toggleLeftPanel = toggleLeftPanel;
|
||||
|
||||
this.popupVisibility = arePopupsVisible;
|
||||
|
||||
|
|
@ -582,7 +580,11 @@ export class MailMessageList extends AbstractViewRight {
|
|||
|
||||
addEventsListeners(dom, {
|
||||
click: event => {
|
||||
ThemeStore.isMobile() && !eqs(event, '.toggleLeft') && leftPanelDisabled(true);
|
||||
if (eqs(event, '.toggleLeft')) {
|
||||
toggleLeftPanel();
|
||||
} else {
|
||||
ThemeStore.isMobile() && leftPanelDisabled(true);
|
||||
}
|
||||
|
||||
if (eqs(event, '.messageList') && ScopeMessageView === AppUserStore.focusedState()) {
|
||||
AppUserStore.focusedState(ScopeMessageList);
|
||||
|
|
|
|||
|
|
@ -8,9 +8,6 @@ import { AbstractViewRight } from 'Knoin/AbstractViews';
|
|||
export class SettingsPaneUserView extends AbstractViewRight {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.leftPanelDisabled = leftPanelDisabled;
|
||||
this.toggleLeftPanel = toggleLeftPanel;
|
||||
}
|
||||
|
||||
onShow() {
|
||||
|
|
@ -18,8 +15,12 @@ export class SettingsPaneUserView extends AbstractViewRight {
|
|||
}
|
||||
|
||||
onBuild(dom) {
|
||||
dom.addEventListener('click', () =>
|
||||
ThemeStore.isMobile() && !event.target.closestWithin('.toggleLeft', dom) && leftPanelDisabled(true)
|
||||
);
|
||||
dom.addEventListener('click', () => {
|
||||
if (event.target.closestWithin('.toggleLeft', dom)) {
|
||||
toggleLeftPanel();
|
||||
} else {
|
||||
ThemeStore.isMobile() && leftPanelDisabled(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue