Added option to save email in Nextcloud for #96 and @Mer0me

https://help.nextcloud.com/t/best-way-to-archive-mails-into-nextcloud-folders/144252
This commit is contained in:
the-djmaze 2022-10-13 14:07:04 +02:00
parent ee03abfd09
commit 1625e722a2
2 changed files with 62 additions and 31 deletions

View file

@ -4,8 +4,8 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
{ {
const const
NAME = 'Nextcloud', NAME = 'Nextcloud',
VERSION = '2.1', VERSION = '2.2',
RELEASE = '2022-10-10', RELEASE = '2022-10-13',
CATEGORY = 'Integrations', CATEGORY = 'Integrations',
DESCRIPTION = 'Integrate with Nextcloud v20+', DESCRIPTION = 'Integrate with Nextcloud v20+',
REQUIRED = '2.18.6'; REQUIRED = '2.18.6';
@ -18,8 +18,9 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$this->addHook('main.fabrica', 'MainFabrica'); $this->addHook('main.fabrica', 'MainFabrica');
$this->addHook('filter.app-data', 'FilterAppData'); $this->addHook('filter.app-data', 'FilterAppData');
$this->addJs('js/message.js');
$this->addHook('json.attachments', 'DoAttachmentsActions'); $this->addHook('json.attachments', 'DoAttachmentsActions');
$this->addJs('js/attachments.js'); $this->addJsonHook('NextcloudSaveMsg', 'NextcloudSaveMsg');
} }
} }
@ -55,6 +56,39 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
} }
*/ */
public function NextcloudSaveMsg() : array
{
$aValues = \RainLoop\Utils::DecodeKeyValuesQ($this->jsonParam('msgHash', ''));
if (!empty($aValues['Folder']) && !empty($aValues['Uid'])) {
$oActions = \RainLoop\Api::Actions();
$oMailClient = $oActions->MailClient();
if (!$oMailClient->IsLoggined()) {
$oAccount = $oActions->getAccountFromToken();
$oAccount->ImapConnectAndLoginHelper($oActions->Plugins(), $oMailClient, $oActions->Config());
}
$sSaveFolder = $this->Config()->Get('plugin', 'save_folder', '') ?: 'Emails';
$oFiles = \OCP\Files::getStorage('files');
if ($oFiles && \method_exists($oFiles, 'file_put_contents')) {
$oFiles->is_dir($sSaveFolder) || $oFiles->mkdir($sSaveFolder);
}
$sFilename = $sSaveFolder . '/' . ($this->jsonParam('filename', '') ?: \date('YmdHis')) . '.eml';
$oMailClient->MessageMimeStream(
function ($rResource) use ($oFiles, $sFilename) {
if (\is_resource($rResource)) {
$oFiles->file_put_contents($sFilename, $rResource);
}
},
(string) $aValues['Folder'],
(int) $aValues['Uid'],
isset($aValues['MimeIndex']) ? (string) $aValues['MimeIndex'] : ''
);
}
return $this->jsonResponse(__FUNCTION__, true);
}
public function DoAttachmentsActions(\SnappyMail\AttachmentsAction $data) public function DoAttachmentsActions(\SnappyMail\AttachmentsAction $data)
{ {
if (static::isLoggedIn() && 'nextcloud' === $data->action) { if (static::isLoggedIn() && 'nextcloud' === $data->action) {

View file

@ -30,45 +30,42 @@
}); });
} }
}; };
view.nextcloudSaveMsg = () => {
let msg = view.message();
rl.pluginRemoteRequest(
(iError, data) => {
console.dir({
iError:iError,
data:data
});
},
'NextcloudSaveMsg',
{
'msgHash': msg.requestHash,
'filename': msg.subject()
}
);
};
} }
}); });
let template = document.getElementById('MailMessageView'); let template = document.getElementById('MailMessageView');
const attachmentsControls = template.content.querySelector('.attachmentsControls'); const attachmentsControls = template.content.querySelector('.attachmentsControls');
if (attachmentsControls) { if (attachmentsControls) {
attachmentsControls.append(Element.fromHTML('<span>' attachmentsControls.append(Element.fromHTML('<span>'
+ '<i class="fontastic iconcolor-red" data-bind="visible: saveNextcloudError">✖</i>' + '<i class="fontastic iconcolor-red" data-bind="visible: saveNextcloudError">✖</i>'
+ '<i class="fontastic" data-bind="visible: !saveNextcloudError(), css: {\'icon-spinner\': saveNextcloudLoading()}">💾</i>' + '<i class="fontastic" data-bind="visible: !saveNextcloudError(), css: {\'icon-spinner\': saveNextcloudLoading()}">💾</i>'
+ '<span class="g-ui-link" data-bind="click: saveNextcloud" data-i18n="NEXTCLOUD/SAVE_ATTACHMENTS">Save Nextcloud</span>' + '<span class="g-ui-link" data-bind="click: saveNextcloud" data-i18n="NEXTCLOUD/SAVE_ATTACHMENTS"></span>'
+ '</span>')); + '</span>'));
} }
const msgMenu = template.content.querySelector('#more-view-dropdown-id + menu');
/** TODO: File browser to attach files in composer */ if (msgMenu) {
/* msgMenu.append(Element.fromHTML('<li role="presentation">'
let cfg = rl.settings.get('Nextcloud'); + '<a href="#" tabindex="-1" data-icon="📥" data-bind="click: nextcloudSaveMsg" data-i18n="NEXTCLOUD/SAVE_EML"></a>'
fetch(cfg.WebDAV . '/files/' . cfg.UID, { + '</li>'));
method: 'PROPFIND', }
mode: 'same-origin',
cache: 'no-cache',
redirect: 'error',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/xml; charset=utf-8',
},
body: '<?xml version="1.0"?>'
+ '<d:propfind xmlns:d="DAV:">'
+ '<d:prop><d:resourcetype/></d:prop>'
+ '</d:propfind>'
})
.then(response => response.text())
.then(text => {
console.dir({response:text});
parser = new DOMParser();
xmlDoc = parser.parseFromString(text, "text/xml");
})
.catch(error => console.error(error));
*/
})(window.rl); })(window.rl);