Prevent parameter errors in sendMessage()/saveMessage() due to too many parameters.

Instead provide an object.
sendMessage param 'SentFolder' and saveMessage param 'DraftFolder' now both 'SaveFolder'
This commit is contained in:
djmaze 2020-08-17 21:32:57 +02:00
parent 6f49e9b80f
commit 7670d2073d
7 changed files with 185 additions and 306 deletions

View file

@ -54,10 +54,17 @@ class AbstractAjaxPromises extends AbstractBasicPromises {
}; };
params.XToken = Settings.appSettingsGet('token'); params.XToken = Settings.appSettingsGet('token');
// init.body = JSON.stringify(params); // init.body = JSON.stringify(params);
const formData = new FormData(); const formData = new FormData(),
Object.keys(params).forEach(key => { buildFormData = (formData, data, parentKey) => {
formData.append(key, params[key]) if (data && typeof data === 'object' && !(data instanceof Date || data instanceof File)) {
}); Object.keys(data).forEach(key =>
buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key)
);
} else {
formData.set(parentKey, data == null ? '' : data);
}
};
buildFormData(formData, params);
init.body = (new URLSearchParams(formData)).toString(); init.body = (new URLSearchParams(formData)).toString();
} }

View file

@ -22,9 +22,7 @@ class UserAjaxUserPromises extends AbstractAjaxPromises {
this.setTrigger(fTrigger, true); this.setTrigger(fTrigger, true);
clearTimeout(this.foldersTimeout); clearTimeout(this.foldersTimeout);
this.foldersTimeout = setTimeout(() => { this.foldersTimeout = setTimeout(() => this.foldersReload(fTrigger), 500);
this.foldersReload(fTrigger);
}, 500);
} }
folderDelete(sFolderFullNameRaw, fTrigger) { folderDelete(sFolderFullNameRaw, fTrigger) {

View file

@ -155,11 +155,11 @@ class AbstractAjaxRemote {
const formData = new FormData(), const formData = new FormData(),
buildFormData = (formData, data, parentKey) => { buildFormData = (formData, data, parentKey) => {
if (data && typeof data === 'object' && !(data instanceof Date || data instanceof File)) { if (data && typeof data === 'object' && !(data instanceof Date || data instanceof File)) {
Object.entries(data).forEach(([key,value]) => { Object.keys(data).forEach(key =>
buildFormData(formData, value, parentKey ? `${parentKey}[${key}]` : key); buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key)
}); );
} else { } else {
formData.append(parentKey, data == null ? '' : data); formData.set(parentKey, data == null ? '' : data);
} }
}; };
buildFormData(formData, params); buildFormData(formData, params);

View file

@ -14,8 +14,8 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
*/ */
adminLogin(fCallback, sLogin, sPassword) { adminLogin(fCallback, sLogin, sPassword) {
this.defaultRequest(fCallback, 'AdminLogin', { this.defaultRequest(fCallback, 'AdminLogin', {
'Login': sLogin, Login: sLogin,
'Password': sPassword Password: sPassword
}); });
} }
@ -53,7 +53,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
*/ */
domainList(fCallback, bIncludeAliases = true) { domainList(fCallback, bIncludeAliases = true) {
this.defaultRequest(fCallback, 'AdminDomainList', { this.defaultRequest(fCallback, 'AdminDomainList', {
'IncludeAliases': bIncludeAliases ? '1' : '0' IncludeAliases: bIncludeAliases ? 1 : 0
}); });
} }
@ -94,9 +94,9 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'AdminPackageInstall', 'AdminPackageInstall',
{ {
'Id': oPackage.id, Id: oPackage.id,
'Type': oPackage.type, Type: oPackage.type,
'File': oPackage.file File: oPackage.file
}, },
60000 60000
); );
@ -108,7 +108,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
*/ */
packageDelete(fCallback, oPackage) { packageDelete(fCallback, oPackage) {
this.defaultRequest(fCallback, 'AdminPackageDelete', { this.defaultRequest(fCallback, 'AdminPackageDelete', {
'Id': oPackage.id Id: oPackage.id
}); });
} }
@ -118,7 +118,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
*/ */
domain(fCallback, sName) { domain(fCallback, sName) {
this.defaultRequest(fCallback, 'AdminDomainLoad', { this.defaultRequest(fCallback, 'AdminDomainLoad', {
'Name': sName Name: sName
}); });
} }
@ -128,7 +128,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
*/ */
plugin(fCallback, sName) { plugin(fCallback, sName) {
this.defaultRequest(fCallback, 'AdminPluginLoad', { this.defaultRequest(fCallback, 'AdminPluginLoad', {
'Name': sName Name: sName
}); });
} }
@ -138,7 +138,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
*/ */
domainDelete(fCallback, sName) { domainDelete(fCallback, sName) {
this.defaultRequest(fCallback, 'AdminDomainDelete', { this.defaultRequest(fCallback, 'AdminDomainDelete', {
'Name': sName Name: sName
}); });
} }
@ -150,7 +150,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
domainDisable(fCallback, sName, bDisabled) { domainDisable(fCallback, sName, bDisabled) {
return this.defaultRequest(fCallback, 'AdminDomainDisable', { return this.defaultRequest(fCallback, 'AdminDomainDisable', {
Name: sName, Name: sName,
Disabled: bDisabled ? '1' : '0' Disabled: bDisabled ? 1 : 0
}); });
} }
@ -168,7 +168,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
*/ */
licensing(fCallback, bForce) { licensing(fCallback, bForce) {
return this.defaultRequest(fCallback, 'AdminLicensing', { return this.defaultRequest(fCallback, 'AdminLicensing', {
Force: bForce ? '1' : '0' Force: bForce ? 1 : 0
}); });
} }
@ -192,7 +192,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
pluginDisable(fCallback, sName, bDisabled) { pluginDisable(fCallback, sName, bDisabled) {
return this.defaultRequest(fCallback, 'AdminPluginDisable', { return this.defaultRequest(fCallback, 'AdminPluginDisable', {
Name: sName, Name: sName,
Disabled: bDisabled ? '1' : '0' Disabled: bDisabled ? 1 : 0
}); });
} }
@ -225,28 +225,28 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
sWhiteList sWhiteList
) { ) {
this.defaultRequest(fCallback, 'AdminDomainSave', { this.defaultRequest(fCallback, 'AdminDomainSave', {
'Create': bCreate ? '1' : '0', Create: bCreate ? 1 : 0,
'Name': sName, Name: sName,
'IncHost': sIncHost, IncHost: sIncHost,
'IncPort': iIncPort, IncPort: iIncPort,
'IncSecure': sIncSecure, IncSecure: sIncSecure,
'IncShortLogin': bIncShortLogin ? '1' : '0', IncShortLogin: bIncShortLogin ? 1 : 0,
'UseSieve': bUseSieve ? '1' : '0', UseSieve: bUseSieve ? 1 : 0,
'SieveAllowRaw': sSieveAllowRaw ? '1' : '0', SieveAllowRaw: sSieveAllowRaw ? 1 : 0,
'SieveHost': sSieveHost, SieveHost: sSieveHost,
'SievePort': iSievePort, SievePort: iSievePort,
'SieveSecure': sSieveSecure, SieveSecure: sSieveSecure,
'OutHost': sOutHost, OutHost: sOutHost,
'OutPort': iOutPort, OutPort: iOutPort,
'OutSecure': sOutSecure, OutSecure: sOutSecure,
'OutShortLogin': bOutShortLogin ? '1' : '0', OutShortLogin: bOutShortLogin ? 1 : 0,
'OutAuth': bOutAuth ? '1' : '0', OutAuth: bOutAuth ? 1 : 0,
'OutUsePhpMail': bOutPhpMail ? '1' : '0', OutUsePhpMail: bOutPhpMail ? 1 : 0,
'WhiteList': sWhiteList WhiteList: sWhiteList
}); });
} }
@ -267,19 +267,19 @@ class RemoteAdminAjax extends AbstractAjaxRemote {
bOutPhpMail bOutPhpMail
) { ) {
this.defaultRequest(fCallback, 'AdminDomainTest', { this.defaultRequest(fCallback, 'AdminDomainTest', {
'Name': sName, Name: sName,
'IncHost': sIncHost, IncHost: sIncHost,
'IncPort': iIncPort, IncPort: iIncPort,
'IncSecure': sIncSecure, IncSecure: sIncSecure,
'UseSieve': bUseSieve ? '1' : '0', UseSieve: bUseSieve ? 1 : 0,
'SieveHost': sSieveHost, SieveHost: sSieveHost,
'SievePort': iSievePort, SievePort: iSievePort,
'SieveSecure': sSieveSecure, SieveSecure: sSieveSecure,
'OutHost': sOutHost, OutHost: sOutHost,
'OutPort': iOutPort, OutPort: iOutPort,
'OutSecure': sOutSecure, OutSecure: sOutSecure,
'OutAuth': bOutAuth ? '1' : '0', OutAuth: bOutAuth ? 1 : 0,
'OutUsePhpMail': bOutPhpMail ? '1' : '0' OutUsePhpMail: bOutPhpMail ? 1 : 0
}); });
} }

View file

@ -41,11 +41,11 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'Folders', 'Folders',
{ {
'SentFolder': Settings.settingsGet('SentFolder'), SentFolder: Settings.settingsGet('SentFolder'),
'DraftFolder': Settings.settingsGet('DraftFolder'), DraftFolder: Settings.settingsGet('DraftFolder'),
'SpamFolder': Settings.settingsGet('SpamFolder'), SpamFolder: Settings.settingsGet('SpamFolder'),
'TrashFolder': Settings.settingsGet('TrashFolder'), TrashFolder: Settings.settingsGet('TrashFolder'),
'ArchiveFolder': Settings.settingsGet('ArchiveFolder') ArchiveFolder: Settings.settingsGet('ArchiveFolder')
}, },
null, null,
'', '',
@ -65,13 +65,13 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
login(fCallback, sEmail, sLogin, sPassword, bSignMe, sLanguage, sAdditionalCode, bAdditionalCodeSignMe) { login(fCallback, sEmail, sLogin, sPassword, bSignMe, sLanguage, sAdditionalCode, bAdditionalCodeSignMe) {
this.defaultRequest(fCallback, 'Login', { this.defaultRequest(fCallback, 'Login', {
'Email': sEmail, Email: sEmail,
'Login': sLogin, Login: sLogin,
'Password': sPassword, Password: sPassword,
'Language': sLanguage || '', Language: sLanguage || '',
'AdditionalCode': sAdditionalCode || '', AdditionalCode: sAdditionalCode || '',
'AdditionalCodeSignMe': bAdditionalCodeSignMe ? '1' : '0', AdditionalCodeSignMe: bAdditionalCodeSignMe ? 1 : 0,
'SignMe': bSignMe ? '1' : '0' SignMe: bSignMe ? 1 : 0
}); });
} }
@ -109,7 +109,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
testTwoFactor(fCallback, sCode) { testTwoFactor(fCallback, sCode) {
this.defaultRequest(fCallback, 'TestTwoFactorInfo', { this.defaultRequest(fCallback, 'TestTwoFactorInfo', {
'Code': sCode Code: sCode
}); });
} }
@ -119,7 +119,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
enableTwoFactor(fCallback, bEnable) { enableTwoFactor(fCallback, bEnable) {
this.defaultRequest(fCallback, 'EnableTwoFactor', { this.defaultRequest(fCallback, 'EnableTwoFactor', {
'Enable': bEnable ? '1' : '0' Enable: bEnable ? 1 : 0
}); });
} }
@ -146,10 +146,10 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
saveContactsSyncData(fCallback, bEnable, sUrl, sUser, sPassword) { saveContactsSyncData(fCallback, bEnable, sUrl, sUser, sPassword) {
this.defaultRequest(fCallback, 'SaveContactsSyncData', { this.defaultRequest(fCallback, 'SaveContactsSyncData', {
'Enable': bEnable ? '1' : '0', Enable: bEnable ? 1 : 0,
'Url': sUrl, Url: sUrl,
'User': sUser, User: sUser,
'Password': sPassword Password: sPassword
}); });
} }
@ -161,9 +161,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
accountSetup(fCallback, sEmail, sPassword, bNew = true) { accountSetup(fCallback, sEmail, sPassword, bNew = true) {
this.defaultRequest(fCallback, 'AccountSetup', { this.defaultRequest(fCallback, 'AccountSetup', {
'Email': sEmail, Email: sEmail,
'Password': sPassword, Password: sPassword,
'New': bNew ? '1' : '0' New: bNew ? 1 : 0
}); });
} }
@ -173,7 +173,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
accountDelete(fCallback, sEmailToDelete) { accountDelete(fCallback, sEmailToDelete) {
this.defaultRequest(fCallback, 'AccountDelete', { this.defaultRequest(fCallback, 'AccountDelete', {
'EmailToDelete': sEmailToDelete EmailToDelete: sEmailToDelete
}); });
} }
@ -184,8 +184,8 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
accountsAndIdentitiesSortOrder(fCallback, aAccounts, aIdentities) { accountsAndIdentitiesSortOrder(fCallback, aAccounts, aIdentities) {
this.defaultRequest(fCallback, 'AccountsAndIdentitiesSortOrder', { this.defaultRequest(fCallback, 'AccountsAndIdentitiesSortOrder', {
'Accounts': aAccounts, Accounts: aAccounts,
'Identities': aIdentities Identities: aIdentities
}); });
} }
@ -201,13 +201,13 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
identityUpdate(fCallback, sId, sEmail, sName, sReplyTo, sBcc, sSignature, bSignatureInsertBefore) { identityUpdate(fCallback, sId, sEmail, sName, sReplyTo, sBcc, sSignature, bSignatureInsertBefore) {
this.defaultRequest(fCallback, 'IdentityUpdate', { this.defaultRequest(fCallback, 'IdentityUpdate', {
'Id': sId, Id: sId,
'Email': sEmail, Email: sEmail,
'Name': sName, Name: sName,
'ReplyTo': sReplyTo, ReplyTo: sReplyTo,
'Bcc': sBcc, Bcc: sBcc,
'Signature': sSignature, Signature: sSignature,
'SignatureInsertBefore': bSignatureInsertBefore ? '1' : '0' SignatureInsertBefore: bSignatureInsertBefore ? 1 : 0
}); });
} }
@ -217,7 +217,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
identityDelete(fCallback, sIdToDelete) { identityDelete(fCallback, sIdToDelete) {
this.defaultRequest(fCallback, 'IdentityDelete', { this.defaultRequest(fCallback, 'IdentityDelete', {
'IdToDelete': sIdToDelete IdToDelete: sIdToDelete
}); });
} }
@ -236,9 +236,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
filtersSave(fCallback, filters, raw, isRawIsActive) { filtersSave(fCallback, filters, raw, isRawIsActive) {
this.defaultRequest(fCallback, 'FiltersSave', { this.defaultRequest(fCallback, 'FiltersSave', {
'Raw': raw, Raw: raw,
'RawIsActive': isRawIsActive ? '1' : '0', RawIsActive: isRawIsActive ? 1 : 0,
'Filters': filters.map(item => item.toJson()) Filters: filters.map(item => item.toJson())
}); });
} }
@ -262,7 +262,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
templateGetById(fCallback, sID) { templateGetById(fCallback, sID) {
this.defaultRequest(fCallback, 'TemplateGetByID', { this.defaultRequest(fCallback, 'TemplateGetByID', {
'ID': sID ID: sID
}); });
} }
@ -272,7 +272,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
templateDelete(fCallback, sID) { templateDelete(fCallback, sID) {
this.defaultRequest(fCallback, 'TemplateDelete', { this.defaultRequest(fCallback, 'TemplateDelete', {
'IdToDelete': sID IdToDelete: sID
}); });
} }
@ -284,9 +284,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
templateSetup(fCallback, sID, sName, sBody) { templateSetup(fCallback, sID, sName, sBody) {
this.defaultRequest(fCallback, 'TemplateSetup', { this.defaultRequest(fCallback, 'TemplateSetup', {
'ID': sID, ID: sID,
'Name': sName, Name: sName,
'Body': sBody Body: sBody
}); });
} }
@ -324,7 +324,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
AppStore.projectHash(), AppStore.projectHash(),
folderHash, folderHash,
inboxUidNext, inboxUidNext,
useThreads ? '1' : '0', useThreads ? 1 : 0,
useThreads ? sThreadUid : '' useThreads ? sThreadUid : ''
].join(String.fromCharCode(0)) ].join(String.fromCharCode(0))
), ),
@ -341,7 +341,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
Limit: iLimit, Limit: iLimit,
Search: sSearch, Search: sSearch,
UidNext: inboxUidNext, UidNext: inboxUidNext,
UseThreads: useThreads ? '1' : '0', UseThreads: useThreads ? 1 : 0,
ThreadUid: useThreads ? sThreadUid : '' ThreadUid: useThreads ? sThreadUid : ''
}, },
sSearch ? SEARCH_AJAX_TIMEOUT : DEFAULT_AJAX_TIMEOUT, sSearch ? SEARCH_AJAX_TIMEOUT : DEFAULT_AJAX_TIMEOUT,
@ -359,7 +359,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'MessageUploadAttachments', 'MessageUploadAttachments',
{ {
'Attachments': aDownloads Attachments: aDownloads
}, },
999000 999000
); );
@ -389,7 +389,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
sFolderFullNameRaw, sFolderFullNameRaw,
iUid, iUid,
AppStore.projectHash(), AppStore.projectHash(),
AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0' AppStore.threadsAllowed() && SettingsStore.useThreads() ? 1 : 0
].join(String.fromCharCode(0)) ].join(String.fromCharCode(0))
), ),
['Message'] ['Message']
@ -410,7 +410,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'ComposeUploadExternals', 'ComposeUploadExternals',
{ {
'Externals': aExternals Externals: aExternals
}, },
999000 999000
); );
@ -426,8 +426,8 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'ComposeUploadDrive', 'ComposeUploadDrive',
{ {
'AccessToken': sAccessToken, AccessToken: sAccessToken,
'Url': sUrl Url: sUrl
}, },
999000 999000
); );
@ -465,9 +465,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
if (request) { if (request) {
this.defaultRequest(fCallback, 'FolderInformation', { this.defaultRequest(fCallback, 'FolderInformation', {
'Folder': folder, Folder: folder,
'FlagsUids': Array.isArray(uids) ? uids.join(',') : '', FlagsUids: Array.isArray(uids) ? uids.join(',') : '',
'UidNext': getFolderInboxName() === folder ? getFolderUidNext(folder) : '' UidNext: getFolderInboxName() === folder ? getFolderUidNext(folder) : ''
}); });
} else if (SettingsStore.useThreads()) { } else if (SettingsStore.useThreads()) {
getApp().reloadFlagsCurrentMessageListAndMessageFromCache(); getApp().reloadFlagsCurrentMessageListAndMessageFromCache();
@ -480,7 +480,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
folderInformationMultiply(fCallback, aFolders) { folderInformationMultiply(fCallback, aFolders) {
this.defaultRequest(fCallback, 'FolderInformationMultiply', { this.defaultRequest(fCallback, 'FolderInformationMultiply', {
'Folders': aFolders Folders: aFolders
}); });
} }
@ -499,9 +499,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
messageSetFlagged(fCallback, sFolderFullNameRaw, aUids, bSetFlagged) { messageSetFlagged(fCallback, sFolderFullNameRaw, aUids, bSetFlagged) {
this.defaultRequest(fCallback, 'MessageSetFlagged', { this.defaultRequest(fCallback, 'MessageSetFlagged', {
'Folder': sFolderFullNameRaw, Folder: sFolderFullNameRaw,
'Uids': aUids.join(','), Uids: aUids.join(','),
'SetAction': bSetFlagged ? '1' : '0' SetAction: bSetFlagged ? 1 : 0
}); });
} }
@ -513,9 +513,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
messageSetSeen(fCallback, sFolderFullNameRaw, aUids, bSetSeen) { messageSetSeen(fCallback, sFolderFullNameRaw, aUids, bSetSeen) {
this.defaultRequest(fCallback, 'MessageSetSeen', { this.defaultRequest(fCallback, 'MessageSetSeen', {
'Folder': sFolderFullNameRaw, Folder: sFolderFullNameRaw,
'Uids': aUids.join(','), Uids: aUids.join(','),
'SetAction': bSetSeen ? '1' : '0' SetAction: bSetSeen ? 1 : 0
}); });
} }
@ -527,73 +527,18 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
messageSetSeenToAll(fCallback, sFolderFullNameRaw, bSetSeen, aThreadUids = null) { messageSetSeenToAll(fCallback, sFolderFullNameRaw, bSetSeen, aThreadUids = null) {
this.defaultRequest(fCallback, 'MessageSetSeenToAll', { this.defaultRequest(fCallback, 'MessageSetSeenToAll', {
'Folder': sFolderFullNameRaw, Folder: sFolderFullNameRaw,
'SetAction': bSetSeen ? '1' : '0', SetAction: bSetSeen ? 1 : 0,
'ThreadUids': aThreadUids ? aThreadUids.join(',') : '' ThreadUids: aThreadUids ? aThreadUids.join(',') : ''
}); });
} }
/** /**
* @param {?Function} fCallback * @param {?Function} fCallback
* @param {string} sIdentityID * @param {Object} oData
* @param {string} sMessageFolder
* @param {string} sMessageUid
* @param {string} sDraftFolder
* @param {string} sTo
* @param {string} sCc
* @param {string} sBcc
* @param {string} sReplyTo
* @param {string} sSubject
* @param {boolean} bTextIsHtml
* @param {string} sText
* @param {Array} aAttachments
* @param {(Array|null)} aDraftInfo
* @param {string} sInReplyTo
* @param {string} sReferences
* @param {boolean} bMarkAsImportant
*/ */
saveMessage( saveMessage(fCallback, oData) {
fCallback, this.defaultRequest(fCallback, 'SaveMessage', oData, SAVE_MESSAGE_AJAX_TIMEOUT);
sIdentityID,
sMessageFolder,
sMessageUid,
sDraftFolder,
sTo,
sCc,
sBcc,
sReplyTo,
sSubject,
bTextIsHtml,
sText,
aAttachments,
aDraftInfo,
sInReplyTo,
sReferences,
bMarkAsImportant
) {
this.defaultRequest(
fCallback,
'SaveMessage',
{
'IdentityID': sIdentityID,
'MessageFolder': sMessageFolder,
'MessageUid': sMessageUid,
'DraftFolder': sDraftFolder,
'To': sTo,
'Cc': sCc,
'Bcc': sBcc,
'ReplyTo': sReplyTo,
'Subject': sSubject,
'TextIsHtml': bTextIsHtml ? '1' : '0',
'Text': sText,
'DraftInfo': aDraftInfo,
'InReplyTo': sInReplyTo,
'References': sReferences,
'MarkAsImportant': bMarkAsImportant ? '1' : '0',
'Attachments': aAttachments
},
SAVE_MESSAGE_AJAX_TIMEOUT
);
} }
/** /**
@ -606,81 +551,20 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
sendReadReceiptMessage(fCallback, sMessageFolder, sMessageUid, sReadReceipt, sSubject, sText) { sendReadReceiptMessage(fCallback, sMessageFolder, sMessageUid, sReadReceipt, sSubject, sText) {
this.defaultRequest(fCallback, 'SendReadReceiptMessage', { this.defaultRequest(fCallback, 'SendReadReceiptMessage', {
'MessageFolder': sMessageFolder, MessageFolder: sMessageFolder,
'MessageUid': sMessageUid, MessageUid: sMessageUid,
'ReadReceipt': sReadReceipt, ReadReceipt: sReadReceipt,
'Subject': sSubject, Subject: sSubject,
'Text': sText Text: sText
}); });
} }
/** /**
* @param {?Function} fCallback * @param {?Function} fCallback
* @param {string} sIdentityID * @param {Object} oData
* @param {string} sMessageFolder
* @param {string} sMessageUid
* @param {string} sSentFolder
* @param {string} sTo
* @param {string} sCc
* @param {string} sBcc
* @param {string} sReplyTo
* @param {string} sSubject
* @param {boolean} bTextIsHtml
* @param {string} sText
* @param {Array} aAttachments
* @param {(Array|null)} aDraftInfo
* @param {string} sInReplyTo
* @param {string} sReferences
* @param {boolean} bRequestDsn
* @param {boolean} bRequestReadReceipt
* @param {boolean} bMarkAsImportant
*/ */
sendMessage( sendMessage(fCallback, oData) {
fCallback, this.defaultRequest(fCallback, 'SendMessage', oData, SEND_MESSAGE_AJAX_TIMEOUT);
sIdentityID,
sMessageFolder,
sMessageUid,
sSentFolder,
sTo,
sCc,
sBcc,
sReplyTo,
sSubject,
bTextIsHtml,
sText,
aAttachments,
aDraftInfo,
sInReplyTo,
sReferences,
bRequestDsn,
bRequestReadReceipt,
bMarkAsImportant
) {
this.defaultRequest(
fCallback,
'SendMessage',
{
'IdentityID': sIdentityID,
'MessageFolder': sMessageFolder,
'MessageUid': sMessageUid,
'SentFolder': sSentFolder,
'To': sTo,
'Cc': sCc,
'Bcc': sBcc,
'ReplyTo': sReplyTo,
'Subject': sSubject,
'TextIsHtml': bTextIsHtml ? '1' : '0',
'Text': sText,
'DraftInfo': aDraftInfo,
'InReplyTo': sInReplyTo,
'References': sReferences,
'Dsn': bRequestDsn ? '1' : '0',
'ReadReceiptRequest': bRequestReadReceipt ? '1' : '0',
'MarkAsImportant': bMarkAsImportant ? '1' : '0',
'Attachments': aAttachments
},
SEND_MESSAGE_AJAX_TIMEOUT
);
} }
/** /**
@ -718,7 +602,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
folderClear(fCallback, sFolderFullNameRaw) { folderClear(fCallback, sFolderFullNameRaw) {
this.defaultRequest(fCallback, 'FolderClear', { this.defaultRequest(fCallback, 'FolderClear', {
'Folder': sFolderFullNameRaw Folder: sFolderFullNameRaw
}); });
} }
@ -729,8 +613,8 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
folderSetSubscribe(fCallback, sFolderFullNameRaw, bSubscribe) { folderSetSubscribe(fCallback, sFolderFullNameRaw, bSubscribe) {
this.defaultRequest(fCallback, 'FolderSubscribe', { this.defaultRequest(fCallback, 'FolderSubscribe', {
'Folder': sFolderFullNameRaw, Folder: sFolderFullNameRaw,
'Subscribe': bSubscribe ? '1' : '0' Subscribe: bSubscribe ? 1 : 0
}); });
} }
@ -741,8 +625,8 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
folderSetCheckable(fCallback, sFolderFullNameRaw, bCheckable) { folderSetCheckable(fCallback, sFolderFullNameRaw, bCheckable) {
this.defaultRequest(fCallback, 'FolderCheckable', { this.defaultRequest(fCallback, 'FolderCheckable', {
'Folder': sFolderFullNameRaw, Folder: sFolderFullNameRaw,
'Checkable': bCheckable ? '1' : '0' Checkable: bCheckable ? 1 : 0
}); });
} }
@ -759,11 +643,11 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'MessageMove', 'MessageMove',
{ {
'FromFolder': sFolder, FromFolder: sFolder,
'ToFolder': sToFolder, ToFolder: sToFolder,
'Uids': aUids.join(','), Uids: aUids.join(','),
'MarkAsRead': bMarkAsRead ? '1' : '0', MarkAsRead: bMarkAsRead ? 1 : 0,
'Learning': sLearning || '' Learning: sLearning || ''
}, },
null, null,
'', '',
@ -779,9 +663,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
messagesCopy(fCallback, sFolder, sToFolder, aUids) { messagesCopy(fCallback, sFolder, sToFolder, aUids) {
this.defaultRequest(fCallback, 'MessageCopy', { this.defaultRequest(fCallback, 'MessageCopy', {
'FromFolder': sFolder, FromFolder: sFolder,
'ToFolder': sToFolder, ToFolder: sToFolder,
'Uids': aUids.join(',') Uids: aUids.join(',')
}); });
} }
@ -795,8 +679,8 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'MessageDelete', 'MessageDelete',
{ {
'Folder': sFolder, Folder: sFolder,
'Uids': aUids.join(',') Uids: aUids.join(',')
}, },
null, null,
'', '',
@ -829,9 +713,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'Contacts', 'Contacts',
{ {
'Offset': iOffset, Offset: iOffset,
'Limit': iLimit, Limit: iLimit,
'Search': sSearch Search: sSearch
}, },
null, null,
'', '',
@ -847,9 +731,9 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
contactSave(fCallback, sRequestUid, sUid, aProperties) { contactSave(fCallback, sRequestUid, sUid, aProperties) {
this.defaultRequest(fCallback, 'ContactSave', { this.defaultRequest(fCallback, 'ContactSave', {
'RequestUid': sRequestUid, RequestUid: sRequestUid,
'Uid': sUid.trim(), Uid: sUid.trim(),
'Properties': aProperties Properties: aProperties
}); });
} }
@ -859,7 +743,7 @@ class RemoteUserAjax extends AbstractAjaxRemote {
*/ */
contactsDelete(fCallback, aUids) { contactsDelete(fCallback, aUids) {
this.defaultRequest(fCallback, 'ContactsDelete', { this.defaultRequest(fCallback, 'ContactsDelete', {
'Uids': aUids.join(',') Uids: aUids.join(',')
}); });
} }
@ -873,8 +757,8 @@ class RemoteUserAjax extends AbstractAjaxRemote {
fCallback, fCallback,
'Suggestions', 'Suggestions',
{ {
'Query': sQuery, Query: sQuery,
'Page': iPage Page: iPage
}, },
null, null,
'', '',

View file

@ -337,11 +337,33 @@ class ComposePopupView extends AbstractViewNext {
this.iTimer = 0; this.iTimer = 0;
} }
getMessageRequestParams(sSaveFolder)
{
return {
IdentityID: this.currentIdentity() ? this.currentIdentity().id() : '',
MessageFolder: this.draftFolder(),
MessageUid: this.draftUid(),
SaveFolder: sSaveFolder,
To: this.to(),
Cc: this.cc(),
Bcc: this.bcc(),
ReplyTo: this.replyTo(),
Subject: this.subject(),
TextIsHtml: this.oEditor && this.oEditor.isHtml() ? 1 : 0,
Text: this.oEditor ? this.oEditor.getData(true) : '',
DraftInfo: this.aDraftInfo,
InReplyTo: this.sInReplyTo,
References: this.sReferences,
MarkAsImportant: this.markAsImportant() ? 1 : 0,
Attachments: this.prepearAttachmentsForSendOrSave(),
// Only used at send, not at save:
Dsn: this.requestDsn() ? 1 : 0,
ReadReceiptRequest: this.requestReadReceipt() ? 1 : 0
};
}
@command((self) => self.canBeSentOrSaved()) @command((self) => self.canBeSentOrSaved())
sendCommand() { sendCommand() {
const sTo = this.to().trim(),
sCc = this.cc().trim(),
sBcc = this.bcc().trim();
let sSentFolder = FolderStore.sentFolder(); let sSentFolder = FolderStore.sentFolder();
this.attachmentsInProcessError(false); this.attachmentsInProcessError(false);
@ -356,7 +378,7 @@ class ComposePopupView extends AbstractViewNext {
this.attachmentsPlace(true); this.attachmentsPlace(true);
} }
if (!sTo && !sCc && !sBcc) { if (!this.to().trim() && !this.cc().trim() && !this.bcc().trim()) {
this.emptyToError(true); this.emptyToError(true);
} }
@ -404,24 +426,7 @@ class ComposePopupView extends AbstractViewNext {
Remote.sendMessage( Remote.sendMessage(
this.sendMessageResponse, this.sendMessageResponse,
this.currentIdentity() ? this.currentIdentity().id() : '', this.getMessageRequestParams(sSentFolder)
this.draftFolder(),
this.draftUid(),
sSentFolder,
sTo,
this.cc(),
this.bcc(),
this.replyTo(),
this.subject(),
this.oEditor ? this.oEditor.isHtml() : false,
this.oEditor ? this.oEditor.getData(true) : '',
this.prepearAttachmentsForSendOrSave(),
this.aDraftInfo,
this.sInReplyTo,
this.sReferences,
this.requestDsn(),
this.requestReadReceipt(),
this.markAsImportant()
); );
} }
} }
@ -445,22 +450,7 @@ class ComposePopupView extends AbstractViewNext {
Remote.saveMessage( Remote.saveMessage(
this.saveMessageResponse, this.saveMessageResponse,
this.currentIdentity() ? this.currentIdentity().id() : '', this.getMessageRequestParams(FolderStore.draftFolder())
this.draftFolder(),
this.draftUid(),
FolderStore.draftFolder(),
this.to(),
this.cc(),
this.bcc(),
this.replyTo(),
this.subject(),
this.oEditor ? this.oEditor.isHtml() : false,
this.oEditor ? this.oEditor.getData(true) : '',
this.prepearAttachmentsForSendOrSave(),
this.aDraftInfo,
this.sInReplyTo,
this.sReferences,
this.markAsImportant()
); );
} }

View file

@ -5107,7 +5107,7 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack
$sMessageFolder = $this->GetActionParam('MessageFolder', ''); $sMessageFolder = $this->GetActionParam('MessageFolder', '');
$sMessageUid = $this->GetActionParam('MessageUid', ''); $sMessageUid = $this->GetActionParam('MessageUid', '');
$sDraftFolder = $this->GetActionParam('DraftFolder', ''); $sDraftFolder = $this->GetActionParam('SaveFolder', '');
if (0 === strlen($sDraftFolder)) if (0 === strlen($sDraftFolder))
{ {
throw new Exceptions\ClientException(Notifications::UnknownError); throw new Exceptions\ClientException(Notifications::UnknownError);
@ -5333,7 +5333,7 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack
$sDraftFolder = $this->GetActionParam('MessageFolder', ''); $sDraftFolder = $this->GetActionParam('MessageFolder', '');
$sDraftUid = $this->GetActionParam('MessageUid', ''); $sDraftUid = $this->GetActionParam('MessageUid', '');
$sSentFolder = $this->GetActionParam('SentFolder', ''); $sSentFolder = $this->GetActionParam('SaveFolder', '');
$aDraftInfo = $this->GetActionParam('DraftInfo', null); $aDraftInfo = $this->GetActionParam('DraftInfo', null);
$bDsn = '1' === (string) $this->GetActionParam('Dsn', '0'); $bDsn = '1' === (string) $this->GetActionParam('Dsn', '0');