From 7670d2073d6e57237a7afa42c39c9f2d823a9e24 Mon Sep 17 00:00:00 2001 From: djmaze Date: Mon, 17 Aug 2020 21:32:57 +0200 Subject: [PATCH] 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' --- dev/Promises/AbstractAjax.js | 15 +- dev/Promises/User/Ajax.js | 4 +- dev/Remote/AbstractAjax.js | 8 +- dev/Remote/Admin/Ajax.js | 88 ++--- dev/Remote/User/Ajax.js | 306 ++++++------------ dev/View/Popup/Compose.js | 66 ++-- .../0.0.0/app/libraries/RainLoop/Actions.php | 4 +- 7 files changed, 185 insertions(+), 306 deletions(-) diff --git a/dev/Promises/AbstractAjax.js b/dev/Promises/AbstractAjax.js index 9b405b248..670c3d345 100644 --- a/dev/Promises/AbstractAjax.js +++ b/dev/Promises/AbstractAjax.js @@ -54,10 +54,17 @@ class AbstractAjaxPromises extends AbstractBasicPromises { }; params.XToken = Settings.appSettingsGet('token'); // init.body = JSON.stringify(params); - const formData = new FormData(); - Object.keys(params).forEach(key => { - formData.append(key, params[key]) - }); + const formData = new FormData(), + buildFormData = (formData, data, parentKey) => { + 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(); } diff --git a/dev/Promises/User/Ajax.js b/dev/Promises/User/Ajax.js index 74f2a22da..7c32b8551 100644 --- a/dev/Promises/User/Ajax.js +++ b/dev/Promises/User/Ajax.js @@ -22,9 +22,7 @@ class UserAjaxUserPromises extends AbstractAjaxPromises { this.setTrigger(fTrigger, true); clearTimeout(this.foldersTimeout); - this.foldersTimeout = setTimeout(() => { - this.foldersReload(fTrigger); - }, 500); + this.foldersTimeout = setTimeout(() => this.foldersReload(fTrigger), 500); } folderDelete(sFolderFullNameRaw, fTrigger) { diff --git a/dev/Remote/AbstractAjax.js b/dev/Remote/AbstractAjax.js index 5c6ab17a6..4873d267c 100644 --- a/dev/Remote/AbstractAjax.js +++ b/dev/Remote/AbstractAjax.js @@ -155,11 +155,11 @@ class AbstractAjaxRemote { const formData = new FormData(), buildFormData = (formData, data, parentKey) => { if (data && typeof data === 'object' && !(data instanceof Date || data instanceof File)) { - Object.entries(data).forEach(([key,value]) => { - buildFormData(formData, value, parentKey ? `${parentKey}[${key}]` : key); - }); + Object.keys(data).forEach(key => + buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key) + ); } else { - formData.append(parentKey, data == null ? '' : data); + formData.set(parentKey, data == null ? '' : data); } }; buildFormData(formData, params); diff --git a/dev/Remote/Admin/Ajax.js b/dev/Remote/Admin/Ajax.js index 8fd685366..eea080a94 100644 --- a/dev/Remote/Admin/Ajax.js +++ b/dev/Remote/Admin/Ajax.js @@ -14,8 +14,8 @@ class RemoteAdminAjax extends AbstractAjaxRemote { */ adminLogin(fCallback, sLogin, sPassword) { this.defaultRequest(fCallback, 'AdminLogin', { - 'Login': sLogin, - 'Password': sPassword + Login: sLogin, + Password: sPassword }); } @@ -53,7 +53,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote { */ domainList(fCallback, bIncludeAliases = true) { this.defaultRequest(fCallback, 'AdminDomainList', { - 'IncludeAliases': bIncludeAliases ? '1' : '0' + IncludeAliases: bIncludeAliases ? 1 : 0 }); } @@ -94,9 +94,9 @@ class RemoteAdminAjax extends AbstractAjaxRemote { fCallback, 'AdminPackageInstall', { - 'Id': oPackage.id, - 'Type': oPackage.type, - 'File': oPackage.file + Id: oPackage.id, + Type: oPackage.type, + File: oPackage.file }, 60000 ); @@ -108,7 +108,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote { */ packageDelete(fCallback, oPackage) { this.defaultRequest(fCallback, 'AdminPackageDelete', { - 'Id': oPackage.id + Id: oPackage.id }); } @@ -118,7 +118,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote { */ domain(fCallback, sName) { this.defaultRequest(fCallback, 'AdminDomainLoad', { - 'Name': sName + Name: sName }); } @@ -128,7 +128,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote { */ plugin(fCallback, sName) { this.defaultRequest(fCallback, 'AdminPluginLoad', { - 'Name': sName + Name: sName }); } @@ -138,7 +138,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote { */ domainDelete(fCallback, sName) { this.defaultRequest(fCallback, 'AdminDomainDelete', { - 'Name': sName + Name: sName }); } @@ -150,7 +150,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote { domainDisable(fCallback, sName, bDisabled) { return this.defaultRequest(fCallback, 'AdminDomainDisable', { Name: sName, - Disabled: bDisabled ? '1' : '0' + Disabled: bDisabled ? 1 : 0 }); } @@ -168,7 +168,7 @@ class RemoteAdminAjax extends AbstractAjaxRemote { */ licensing(fCallback, bForce) { 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) { return this.defaultRequest(fCallback, 'AdminPluginDisable', { Name: sName, - Disabled: bDisabled ? '1' : '0' + Disabled: bDisabled ? 1 : 0 }); } @@ -225,28 +225,28 @@ class RemoteAdminAjax extends AbstractAjaxRemote { sWhiteList ) { this.defaultRequest(fCallback, 'AdminDomainSave', { - 'Create': bCreate ? '1' : '0', - 'Name': sName, + Create: bCreate ? 1 : 0, + Name: sName, - 'IncHost': sIncHost, - 'IncPort': iIncPort, - 'IncSecure': sIncSecure, - 'IncShortLogin': bIncShortLogin ? '1' : '0', + IncHost: sIncHost, + IncPort: iIncPort, + IncSecure: sIncSecure, + IncShortLogin: bIncShortLogin ? 1 : 0, - 'UseSieve': bUseSieve ? '1' : '0', - 'SieveAllowRaw': sSieveAllowRaw ? '1' : '0', - 'SieveHost': sSieveHost, - 'SievePort': iSievePort, - 'SieveSecure': sSieveSecure, + UseSieve: bUseSieve ? 1 : 0, + SieveAllowRaw: sSieveAllowRaw ? 1 : 0, + SieveHost: sSieveHost, + SievePort: iSievePort, + SieveSecure: sSieveSecure, - 'OutHost': sOutHost, - 'OutPort': iOutPort, - 'OutSecure': sOutSecure, - 'OutShortLogin': bOutShortLogin ? '1' : '0', - 'OutAuth': bOutAuth ? '1' : '0', - 'OutUsePhpMail': bOutPhpMail ? '1' : '0', + OutHost: sOutHost, + OutPort: iOutPort, + OutSecure: sOutSecure, + OutShortLogin: bOutShortLogin ? 1 : 0, + OutAuth: bOutAuth ? 1 : 0, + OutUsePhpMail: bOutPhpMail ? 1 : 0, - 'WhiteList': sWhiteList + WhiteList: sWhiteList }); } @@ -267,19 +267,19 @@ class RemoteAdminAjax extends AbstractAjaxRemote { bOutPhpMail ) { this.defaultRequest(fCallback, 'AdminDomainTest', { - 'Name': sName, - 'IncHost': sIncHost, - 'IncPort': iIncPort, - 'IncSecure': sIncSecure, - 'UseSieve': bUseSieve ? '1' : '0', - 'SieveHost': sSieveHost, - 'SievePort': iSievePort, - 'SieveSecure': sSieveSecure, - 'OutHost': sOutHost, - 'OutPort': iOutPort, - 'OutSecure': sOutSecure, - 'OutAuth': bOutAuth ? '1' : '0', - 'OutUsePhpMail': bOutPhpMail ? '1' : '0' + Name: sName, + IncHost: sIncHost, + IncPort: iIncPort, + IncSecure: sIncSecure, + UseSieve: bUseSieve ? 1 : 0, + SieveHost: sSieveHost, + SievePort: iSievePort, + SieveSecure: sSieveSecure, + OutHost: sOutHost, + OutPort: iOutPort, + OutSecure: sOutSecure, + OutAuth: bOutAuth ? 1 : 0, + OutUsePhpMail: bOutPhpMail ? 1 : 0 }); } diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Ajax.js index e76bbad0e..26e014c0d 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Ajax.js @@ -41,11 +41,11 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'Folders', { - 'SentFolder': Settings.settingsGet('SentFolder'), - 'DraftFolder': Settings.settingsGet('DraftFolder'), - 'SpamFolder': Settings.settingsGet('SpamFolder'), - 'TrashFolder': Settings.settingsGet('TrashFolder'), - 'ArchiveFolder': Settings.settingsGet('ArchiveFolder') + SentFolder: Settings.settingsGet('SentFolder'), + DraftFolder: Settings.settingsGet('DraftFolder'), + SpamFolder: Settings.settingsGet('SpamFolder'), + TrashFolder: Settings.settingsGet('TrashFolder'), + ArchiveFolder: Settings.settingsGet('ArchiveFolder') }, null, '', @@ -65,13 +65,13 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ login(fCallback, sEmail, sLogin, sPassword, bSignMe, sLanguage, sAdditionalCode, bAdditionalCodeSignMe) { this.defaultRequest(fCallback, 'Login', { - 'Email': sEmail, - 'Login': sLogin, - 'Password': sPassword, - 'Language': sLanguage || '', - 'AdditionalCode': sAdditionalCode || '', - 'AdditionalCodeSignMe': bAdditionalCodeSignMe ? '1' : '0', - 'SignMe': bSignMe ? '1' : '0' + Email: sEmail, + Login: sLogin, + Password: sPassword, + Language: sLanguage || '', + AdditionalCode: sAdditionalCode || '', + AdditionalCodeSignMe: bAdditionalCodeSignMe ? 1 : 0, + SignMe: bSignMe ? 1 : 0 }); } @@ -109,7 +109,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ testTwoFactor(fCallback, sCode) { this.defaultRequest(fCallback, 'TestTwoFactorInfo', { - 'Code': sCode + Code: sCode }); } @@ -119,7 +119,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ enableTwoFactor(fCallback, bEnable) { 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) { this.defaultRequest(fCallback, 'SaveContactsSyncData', { - 'Enable': bEnable ? '1' : '0', - 'Url': sUrl, - 'User': sUser, - 'Password': sPassword + Enable: bEnable ? 1 : 0, + Url: sUrl, + User: sUser, + Password: sPassword }); } @@ -161,9 +161,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ accountSetup(fCallback, sEmail, sPassword, bNew = true) { this.defaultRequest(fCallback, 'AccountSetup', { - 'Email': sEmail, - 'Password': sPassword, - 'New': bNew ? '1' : '0' + Email: sEmail, + Password: sPassword, + New: bNew ? 1 : 0 }); } @@ -173,7 +173,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ accountDelete(fCallback, sEmailToDelete) { this.defaultRequest(fCallback, 'AccountDelete', { - 'EmailToDelete': sEmailToDelete + EmailToDelete: sEmailToDelete }); } @@ -184,8 +184,8 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ accountsAndIdentitiesSortOrder(fCallback, aAccounts, aIdentities) { this.defaultRequest(fCallback, 'AccountsAndIdentitiesSortOrder', { - 'Accounts': aAccounts, - 'Identities': aIdentities + Accounts: aAccounts, + Identities: aIdentities }); } @@ -201,13 +201,13 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ identityUpdate(fCallback, sId, sEmail, sName, sReplyTo, sBcc, sSignature, bSignatureInsertBefore) { this.defaultRequest(fCallback, 'IdentityUpdate', { - 'Id': sId, - 'Email': sEmail, - 'Name': sName, - 'ReplyTo': sReplyTo, - 'Bcc': sBcc, - 'Signature': sSignature, - 'SignatureInsertBefore': bSignatureInsertBefore ? '1' : '0' + Id: sId, + Email: sEmail, + Name: sName, + ReplyTo: sReplyTo, + Bcc: sBcc, + Signature: sSignature, + SignatureInsertBefore: bSignatureInsertBefore ? 1 : 0 }); } @@ -217,7 +217,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ identityDelete(fCallback, sIdToDelete) { this.defaultRequest(fCallback, 'IdentityDelete', { - 'IdToDelete': sIdToDelete + IdToDelete: sIdToDelete }); } @@ -236,9 +236,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ filtersSave(fCallback, filters, raw, isRawIsActive) { this.defaultRequest(fCallback, 'FiltersSave', { - 'Raw': raw, - 'RawIsActive': isRawIsActive ? '1' : '0', - 'Filters': filters.map(item => item.toJson()) + Raw: raw, + RawIsActive: isRawIsActive ? 1 : 0, + Filters: filters.map(item => item.toJson()) }); } @@ -262,7 +262,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ templateGetById(fCallback, sID) { this.defaultRequest(fCallback, 'TemplateGetByID', { - 'ID': sID + ID: sID }); } @@ -272,7 +272,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ templateDelete(fCallback, sID) { this.defaultRequest(fCallback, 'TemplateDelete', { - 'IdToDelete': sID + IdToDelete: sID }); } @@ -284,9 +284,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ templateSetup(fCallback, sID, sName, sBody) { this.defaultRequest(fCallback, 'TemplateSetup', { - 'ID': sID, - 'Name': sName, - 'Body': sBody + ID: sID, + Name: sName, + Body: sBody }); } @@ -324,7 +324,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { AppStore.projectHash(), folderHash, inboxUidNext, - useThreads ? '1' : '0', + useThreads ? 1 : 0, useThreads ? sThreadUid : '' ].join(String.fromCharCode(0)) ), @@ -341,7 +341,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { Limit: iLimit, Search: sSearch, UidNext: inboxUidNext, - UseThreads: useThreads ? '1' : '0', + UseThreads: useThreads ? 1 : 0, ThreadUid: useThreads ? sThreadUid : '' }, sSearch ? SEARCH_AJAX_TIMEOUT : DEFAULT_AJAX_TIMEOUT, @@ -359,7 +359,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'MessageUploadAttachments', { - 'Attachments': aDownloads + Attachments: aDownloads }, 999000 ); @@ -389,7 +389,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { sFolderFullNameRaw, iUid, AppStore.projectHash(), - AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0' + AppStore.threadsAllowed() && SettingsStore.useThreads() ? 1 : 0 ].join(String.fromCharCode(0)) ), ['Message'] @@ -410,7 +410,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'ComposeUploadExternals', { - 'Externals': aExternals + Externals: aExternals }, 999000 ); @@ -426,8 +426,8 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'ComposeUploadDrive', { - 'AccessToken': sAccessToken, - 'Url': sUrl + AccessToken: sAccessToken, + Url: sUrl }, 999000 ); @@ -465,9 +465,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { if (request) { this.defaultRequest(fCallback, 'FolderInformation', { - 'Folder': folder, - 'FlagsUids': Array.isArray(uids) ? uids.join(',') : '', - 'UidNext': getFolderInboxName() === folder ? getFolderUidNext(folder) : '' + Folder: folder, + FlagsUids: Array.isArray(uids) ? uids.join(',') : '', + UidNext: getFolderInboxName() === folder ? getFolderUidNext(folder) : '' }); } else if (SettingsStore.useThreads()) { getApp().reloadFlagsCurrentMessageListAndMessageFromCache(); @@ -480,7 +480,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ folderInformationMultiply(fCallback, aFolders) { this.defaultRequest(fCallback, 'FolderInformationMultiply', { - 'Folders': aFolders + Folders: aFolders }); } @@ -499,9 +499,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ messageSetFlagged(fCallback, sFolderFullNameRaw, aUids, bSetFlagged) { this.defaultRequest(fCallback, 'MessageSetFlagged', { - 'Folder': sFolderFullNameRaw, - 'Uids': aUids.join(','), - 'SetAction': bSetFlagged ? '1' : '0' + Folder: sFolderFullNameRaw, + Uids: aUids.join(','), + SetAction: bSetFlagged ? 1 : 0 }); } @@ -513,9 +513,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ messageSetSeen(fCallback, sFolderFullNameRaw, aUids, bSetSeen) { this.defaultRequest(fCallback, 'MessageSetSeen', { - 'Folder': sFolderFullNameRaw, - 'Uids': aUids.join(','), - 'SetAction': bSetSeen ? '1' : '0' + Folder: sFolderFullNameRaw, + Uids: aUids.join(','), + SetAction: bSetSeen ? 1 : 0 }); } @@ -527,73 +527,18 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ messageSetSeenToAll(fCallback, sFolderFullNameRaw, bSetSeen, aThreadUids = null) { this.defaultRequest(fCallback, 'MessageSetSeenToAll', { - 'Folder': sFolderFullNameRaw, - 'SetAction': bSetSeen ? '1' : '0', - 'ThreadUids': aThreadUids ? aThreadUids.join(',') : '' + Folder: sFolderFullNameRaw, + SetAction: bSetSeen ? 1 : 0, + ThreadUids: aThreadUids ? aThreadUids.join(',') : '' }); } /** * @param {?Function} fCallback - * @param {string} sIdentityID - * @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 + * @param {Object} oData */ - saveMessage( - fCallback, - 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 - ); + saveMessage(fCallback, oData) { + this.defaultRequest(fCallback, 'SaveMessage', oData, SAVE_MESSAGE_AJAX_TIMEOUT); } /** @@ -606,81 +551,20 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ sendReadReceiptMessage(fCallback, sMessageFolder, sMessageUid, sReadReceipt, sSubject, sText) { this.defaultRequest(fCallback, 'SendReadReceiptMessage', { - 'MessageFolder': sMessageFolder, - 'MessageUid': sMessageUid, - 'ReadReceipt': sReadReceipt, - 'Subject': sSubject, - 'Text': sText + MessageFolder: sMessageFolder, + MessageUid: sMessageUid, + ReadReceipt: sReadReceipt, + Subject: sSubject, + Text: sText }); } /** * @param {?Function} fCallback - * @param {string} sIdentityID - * @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 + * @param {Object} oData */ - sendMessage( - fCallback, - 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 - ); + sendMessage(fCallback, oData) { + this.defaultRequest(fCallback, 'SendMessage', oData, SEND_MESSAGE_AJAX_TIMEOUT); } /** @@ -718,7 +602,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ folderClear(fCallback, sFolderFullNameRaw) { this.defaultRequest(fCallback, 'FolderClear', { - 'Folder': sFolderFullNameRaw + Folder: sFolderFullNameRaw }); } @@ -729,8 +613,8 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ folderSetSubscribe(fCallback, sFolderFullNameRaw, bSubscribe) { this.defaultRequest(fCallback, 'FolderSubscribe', { - 'Folder': sFolderFullNameRaw, - 'Subscribe': bSubscribe ? '1' : '0' + Folder: sFolderFullNameRaw, + Subscribe: bSubscribe ? 1 : 0 }); } @@ -741,8 +625,8 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ folderSetCheckable(fCallback, sFolderFullNameRaw, bCheckable) { this.defaultRequest(fCallback, 'FolderCheckable', { - 'Folder': sFolderFullNameRaw, - 'Checkable': bCheckable ? '1' : '0' + Folder: sFolderFullNameRaw, + Checkable: bCheckable ? 1 : 0 }); } @@ -759,11 +643,11 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'MessageMove', { - 'FromFolder': sFolder, - 'ToFolder': sToFolder, - 'Uids': aUids.join(','), - 'MarkAsRead': bMarkAsRead ? '1' : '0', - 'Learning': sLearning || '' + FromFolder: sFolder, + ToFolder: sToFolder, + Uids: aUids.join(','), + MarkAsRead: bMarkAsRead ? 1 : 0, + Learning: sLearning || '' }, null, '', @@ -779,9 +663,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ messagesCopy(fCallback, sFolder, sToFolder, aUids) { this.defaultRequest(fCallback, 'MessageCopy', { - 'FromFolder': sFolder, - 'ToFolder': sToFolder, - 'Uids': aUids.join(',') + FromFolder: sFolder, + ToFolder: sToFolder, + Uids: aUids.join(',') }); } @@ -795,8 +679,8 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'MessageDelete', { - 'Folder': sFolder, - 'Uids': aUids.join(',') + Folder: sFolder, + Uids: aUids.join(',') }, null, '', @@ -829,9 +713,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'Contacts', { - 'Offset': iOffset, - 'Limit': iLimit, - 'Search': sSearch + Offset: iOffset, + Limit: iLimit, + Search: sSearch }, null, '', @@ -847,9 +731,9 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ contactSave(fCallback, sRequestUid, sUid, aProperties) { this.defaultRequest(fCallback, 'ContactSave', { - 'RequestUid': sRequestUid, - 'Uid': sUid.trim(), - 'Properties': aProperties + RequestUid: sRequestUid, + Uid: sUid.trim(), + Properties: aProperties }); } @@ -859,7 +743,7 @@ class RemoteUserAjax extends AbstractAjaxRemote { */ contactsDelete(fCallback, aUids) { this.defaultRequest(fCallback, 'ContactsDelete', { - 'Uids': aUids.join(',') + Uids: aUids.join(',') }); } @@ -873,8 +757,8 @@ class RemoteUserAjax extends AbstractAjaxRemote { fCallback, 'Suggestions', { - 'Query': sQuery, - 'Page': iPage + Query: sQuery, + Page: iPage }, null, '', diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 9d186fee5..164865f24 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -337,11 +337,33 @@ class ComposePopupView extends AbstractViewNext { 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()) sendCommand() { - const sTo = this.to().trim(), - sCc = this.cc().trim(), - sBcc = this.bcc().trim(); let sSentFolder = FolderStore.sentFolder(); this.attachmentsInProcessError(false); @@ -356,7 +378,7 @@ class ComposePopupView extends AbstractViewNext { this.attachmentsPlace(true); } - if (!sTo && !sCc && !sBcc) { + if (!this.to().trim() && !this.cc().trim() && !this.bcc().trim()) { this.emptyToError(true); } @@ -404,24 +426,7 @@ class ComposePopupView extends AbstractViewNext { Remote.sendMessage( this.sendMessageResponse, - this.currentIdentity() ? this.currentIdentity().id() : '', - 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() + this.getMessageRequestParams(sSentFolder) ); } } @@ -445,22 +450,7 @@ class ComposePopupView extends AbstractViewNext { Remote.saveMessage( this.saveMessageResponse, - this.currentIdentity() ? this.currentIdentity().id() : '', - 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() + this.getMessageRequestParams(FolderStore.draftFolder()) ); } 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 a71112fa6..15d255618 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -5107,7 +5107,7 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack $sMessageFolder = $this->GetActionParam('MessageFolder', ''); $sMessageUid = $this->GetActionParam('MessageUid', ''); - $sDraftFolder = $this->GetActionParam('DraftFolder', ''); + $sDraftFolder = $this->GetActionParam('SaveFolder', ''); if (0 === strlen($sDraftFolder)) { throw new Exceptions\ClientException(Notifications::UnknownError); @@ -5333,7 +5333,7 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack $sDraftFolder = $this->GetActionParam('MessageFolder', ''); $sDraftUid = $this->GetActionParam('MessageUid', ''); - $sSentFolder = $this->GetActionParam('SentFolder', ''); + $sSentFolder = $this->GetActionParam('SaveFolder', ''); $aDraftInfo = $this->GetActionParam('DraftInfo', null); $bDsn = '1' === (string) $this->GetActionParam('Dsn', '0');