mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Improved drag&drop of local EML files
This commit is contained in:
parent
a6bf2abaff
commit
d706793e56
3 changed files with 80 additions and 57 deletions
|
|
@ -9,6 +9,8 @@ import { SettingsUserStore } from 'Stores/User/Settings';
|
||||||
import { FolderUserStore } from 'Stores/User/Folder';
|
import { FolderUserStore } from 'Stores/User/Folder';
|
||||||
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
||||||
import { getNotification } from 'Common/Translator';
|
import { getNotification } from 'Common/Translator';
|
||||||
|
import { Settings, } from 'Common/Globals';
|
||||||
|
import { serverRequest } from 'Common/Links';
|
||||||
|
|
||||||
import Remote from 'Remote/User/Fetch';
|
import Remote from 'Remote/User/Fetch';
|
||||||
|
|
||||||
|
|
@ -281,4 +283,31 @@ moveMessagesToFolder = (sFromFolderFullName, oUids, sToFolderFullName, bCopy) =>
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
dropFilesInFolder = (sFolderFullName, files) => {
|
||||||
|
let count = 0,
|
||||||
|
fn = () => 0 == --count
|
||||||
|
&& FolderUserStore.currentFolderFullName() == sFolderFullName
|
||||||
|
&& MessagelistUserStore.reload(true, true);
|
||||||
|
for (const file of files) {
|
||||||
|
if ('message/rfc822' === file.type) {
|
||||||
|
++count;
|
||||||
|
let data = new FormData;
|
||||||
|
data.append('Folder', sFolderFullName);
|
||||||
|
data.append('AppendFile', file);
|
||||||
|
data.XToken = Settings.app('token');
|
||||||
|
fetch(serverRequest('Append'), {
|
||||||
|
method: 'POST',
|
||||||
|
mode: 'same-origin',
|
||||||
|
cache: 'no-cache',
|
||||||
|
redirect: 'error',
|
||||||
|
referrerPolicy: 'no-referrer',
|
||||||
|
credentials: 'same-origin',
|
||||||
|
body: data
|
||||||
|
})
|
||||||
|
.then(fn)
|
||||||
|
.catch(fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
32
dev/External/User/ko.js
vendored
32
dev/External/User/ko.js
vendored
|
|
@ -6,14 +6,11 @@ import { doc, elementById, addEventsListeners, dropdowns } from 'Common/Globals'
|
||||||
import { dropdownsDetectVisibility } from 'Common/UtilsUser';
|
import { dropdownsDetectVisibility } from 'Common/UtilsUser';
|
||||||
import { EmailAddressesComponent } from 'Component/EmailAddresses';
|
import { EmailAddressesComponent } from 'Component/EmailAddresses';
|
||||||
import { ThemeStore } from 'Stores/Theme';
|
import { ThemeStore } from 'Stores/Theme';
|
||||||
import { moveMessagesToFolder } from 'Common/Folders';
|
import { moveMessagesToFolder, dropFilesInFolder } from 'Common/Folders';
|
||||||
import { setExpandedFolder } from 'Model/FolderCollection';
|
import { setExpandedFolder } from 'Model/FolderCollection';
|
||||||
import { FolderUserStore } from 'Stores/User/Folder';
|
import { FolderUserStore } from 'Stores/User/Folder';
|
||||||
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
||||||
|
|
||||||
import { Settings } from 'Common/Globals';
|
|
||||||
import { serverRequest } from 'Common/Links';
|
|
||||||
|
|
||||||
const rlContentType = 'snappymail/action',
|
const rlContentType = 'snappymail/action',
|
||||||
|
|
||||||
// In Chrome we have no access to dataTransfer.getData unless it's the 'drop' event
|
// In Chrome we have no access to dataTransfer.getData unless it's the 'drop' event
|
||||||
|
|
@ -66,32 +63,7 @@ const rlContentType = 'snappymail/action',
|
||||||
if (dragMessages() && 'copyMove' == e.dataTransfer.effectAllowed) {
|
if (dragMessages() && 'copyMove' == e.dataTransfer.effectAllowed) {
|
||||||
moveMessagesToFolder(FolderUserStore.currentFolderFullName(), dragData.data, folder.fullName, e.ctrlKey);
|
moveMessagesToFolder(FolderUserStore.currentFolderFullName(), dragData.data, folder.fullName, e.ctrlKey);
|
||||||
} else if (e.dataTransfer.types.includes('Files')) {
|
} else if (e.dataTransfer.types.includes('Files')) {
|
||||||
let files = 0,
|
dropFilesInFolder(folder.fullName, e.dataTransfer.files);
|
||||||
fn = () => {
|
|
||||||
0 == --files
|
|
||||||
&& FolderUserStore.currentFolderFullName() == folder.fullName
|
|
||||||
&& MessagelistUserStore.reload(true, true);
|
|
||||||
};
|
|
||||||
for (const file of e.dataTransfer.files) {
|
|
||||||
if ('message/rfc822' === file.type) {
|
|
||||||
++files;
|
|
||||||
let data = new FormData;
|
|
||||||
data.append('Folder', folder.fullName);
|
|
||||||
data.append('AppendFile', file);
|
|
||||||
data.XToken = Settings.app('token');
|
|
||||||
fetch(serverRequest('Append'), {
|
|
||||||
method: 'POST',
|
|
||||||
mode: 'same-origin',
|
|
||||||
cache: 'no-cache',
|
|
||||||
redirect: 'error',
|
|
||||||
referrerPolicy: 'no-referrer',
|
|
||||||
credentials: 'same-origin',
|
|
||||||
body: data
|
|
||||||
})
|
|
||||||
.then(fn)
|
|
||||||
.catch(fn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,13 @@ import { computedPaginatorHelper, showMessageComposer, populateMessageBody } fro
|
||||||
import { FileInfo } from 'Common/File';
|
import { FileInfo } from 'Common/File';
|
||||||
import { isFullscreen, toggleFullscreen } from 'Common/Fullscreen';
|
import { isFullscreen, toggleFullscreen } from 'Common/Fullscreen';
|
||||||
|
|
||||||
import { mailBox, serverRequest } from 'Common/Links';
|
import { mailBox } from 'Common/Links';
|
||||||
import { Selector } from 'Common/Selector';
|
import { Selector } from 'Common/Selector';
|
||||||
|
|
||||||
import { i18n } from 'Common/Translator';
|
import { i18n } from 'Common/Translator';
|
||||||
|
|
||||||
|
import { dropFilesInFolder } from 'Common/Folders';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getFolderFromCacheList,
|
getFolderFromCacheList,
|
||||||
MessageFlagsCache
|
MessageFlagsCache
|
||||||
|
|
@ -507,33 +509,53 @@ export class MailMessageList extends AbstractViewRight {
|
||||||
// initUploaderForAppend
|
// initUploaderForAppend
|
||||||
|
|
||||||
if (Settings.app('allowAppendMessage')) {
|
if (Settings.app('allowAppendMessage')) {
|
||||||
const oJua = new Jua({
|
const dropZone = dom.querySelector('.listDragOver'),
|
||||||
action: serverRequest('Append'),
|
validFiles = oEvent => {
|
||||||
name: 'AppendFile',
|
for (const item of oEvent.dataTransfer.items) {
|
||||||
limit: 1,
|
if ('file' === item.kind && 'message/rfc822' === item.type) {
|
||||||
hidden: {
|
return true;
|
||||||
Folder: () => FolderUserStore.currentFolderFullName()
|
}
|
||||||
},
|
|
||||||
dragAndDropElement: dom.querySelector('.listDragOver'),
|
|
||||||
dragAndDropBodyElement: b_content
|
|
||||||
});
|
|
||||||
|
|
||||||
this.dragOver.subscribe(value => value && this.selector.scrollToTop());
|
|
||||||
|
|
||||||
oJua
|
|
||||||
.on('onDragEnter', () => this.dragOverEnter(true))
|
|
||||||
.on('onDragLeave', () => this.dragOverEnter(false))
|
|
||||||
.on('onBodyDragEnter', () => this.dragOver(true))
|
|
||||||
.on('onBodyDragLeave', () => this.dragOver(false))
|
|
||||||
.on('onSelect', (sUid, oData) => {
|
|
||||||
if (sUid && oData && 'message/rfc822' === oData.Type) {
|
|
||||||
MessagelistUserStore.loading(true);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
return false;
|
addEventsListeners(dropZone, {
|
||||||
})
|
dragover: oEvent => {
|
||||||
.on('onComplete', () => MessagelistUserStore.reload(true, true));
|
if (validFiles(oEvent)) {
|
||||||
|
oEvent.dataTransfer.dropEffect = 'copy';
|
||||||
|
oEvent.preventDefault();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
addEventsListeners(b_content, {
|
||||||
|
dragenter: oEvent => {
|
||||||
|
if (validFiles(oEvent)) {
|
||||||
|
if (b_content.contains(oEvent.target)) {
|
||||||
|
this.dragOver(true);
|
||||||
|
}
|
||||||
|
if (oEvent.target == dropZone) {
|
||||||
|
oEvent.dataTransfer.dropEffect = 'copy';
|
||||||
|
this.dragOverEnter(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dragleave: oEvent => {
|
||||||
|
if (oEvent.target == dropZone) {
|
||||||
|
this.dragOverEnter(false);
|
||||||
|
}
|
||||||
|
let related = oEvent.relatedTarget;
|
||||||
|
if (!related || !b_content.contains(related)) {
|
||||||
|
this.dragOver(false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
drop: oEvent => {
|
||||||
|
oEvent.preventDefault();
|
||||||
|
if (oEvent.target == dropZone && validFiles(oEvent)) {
|
||||||
|
MessagelistUserStore.loading(true);
|
||||||
|
dropFilesInFolder(FolderUserStore.currentFolderFullName(), oEvent.dataTransfer.files);
|
||||||
|
}
|
||||||
|
this.dragOverEnter(false);
|
||||||
|
this.dragOver(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// initShortcuts
|
// initShortcuts
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue