Skip to content

Commit

Permalink
Attach Nextcloud files to mail #569
Browse files Browse the repository at this point in the history
  • Loading branch information
the-djmaze committed Oct 21, 2022
1 parent 2ede940 commit 30c2371
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 23 deletions.
37 changes: 32 additions & 5 deletions plugins/nextcloud/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
{
const
NAME = 'Nextcloud',
VERSION = '2.4',
VERSION = '2.6',
RELEASE = '2022-10-19',
CATEGORY = 'Integrations',
DESCRIPTION = 'Integrate with Nextcloud v20+',
Expand All @@ -18,10 +18,15 @@ public function Init() : void
$this->addHook('main.fabrica', 'MainFabrica');
$this->addHook('filter.app-data', 'FilterAppData');

$this->addJs('js/message.js');
$this->addJs('js/webdav.js');

$this->addJs('js/message.js');
$this->addHook('json.attachments', 'DoAttachmentsActions');
$this->addJsonHook('NextcloudSaveMsg', 'NextcloudSaveMsg');
$this->addJsonHook('NextcloudAttachFile', 'NextcloudAttachFile');

$this->addJs('js/composer.js');

$this->addTemplate('templates/PopupsNextcloudFiles.html');
}
}
Expand Down Expand Up @@ -58,6 +63,30 @@ public static function IsLoggedIn()
}
*/

public function NextcloudAttachFile() : array
{
$aResult = [
'success' => false,
'tempName' => ''
];
$sFile = $this->jsonParam('file', '');
$oFiles = \OCP\Files::getStorage('files');
if ($oFiles && $oFiles->is_file($sFile) && $fp = $oFiles->fopen($sFile, 'rb')) {
$oActions = \RainLoop\Api::Actions();
$oAccount = $oActions->getAccountFromToken();
if ($oAccount) {
$sSavedName = 'nextcloud-file-' . \sha1($sFile . \microtime());
if (!$oActions->FilesProvider()->PutFile($oAccount, $sSavedName, $fp)) {
$aResult['error'] = 'failed';
} else {
$aResult['tempName'] = $sSavedName;
$aResult['success'] = true;
}
}
}
return $this->jsonResponse(__FUNCTION__, $aResult);
}

public function NextcloudSaveMsg() : array
{
$sSaveFolder = \ltrim($this->jsonParam('folder', ''), '/');
Expand Down Expand Up @@ -106,7 +135,7 @@ public function DoAttachmentsActions(\SnappyMail\AttachmentsAction $data)
$oFiles = \OCP\Files::getStorage('files');
if ($oFiles && \method_exists($oFiles, 'file_put_contents')) {
$sSaveFolder = \ltrim($this->jsonParam('NcFolder', ''), '/');
$sSaveFolder = $sSaveFolder ?: $this->Config()->Get('plugin', 'save_folder', '') ?: 'Attachments';
$sSaveFolder = $sSaveFolder ?: 'Attachments';
$oFiles->is_dir($sSaveFolder) || $oFiles->mkdir($sSaveFolder);
$data->result = true;
foreach ($data->items as $aItem) {
Expand Down Expand Up @@ -192,8 +221,6 @@ public function MainFabrica(string $sName, &$mResult)
protected function configMapping() : array
{
return array(
\RainLoop\Plugins\Property::NewInstance('save_folder')->SetLabel('Save Folder')
->SetDefaultValue('Attachments'),
\RainLoop\Plugins\Property::NewInstance('suggestions')->SetLabel('Suggestions')
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
->SetDefaultValue(true)
Expand Down
51 changes: 51 additions & 0 deletions plugins/nextcloud/js/composer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
(rl => {
// if (rl.settings.get('Nextcloud'))

addEventListener('rl-view-model.create', e => {
if ('PopupsCompose' === e.detail.viewModelTemplateID) {
let view = e.detail;
view.nextcloudAttach = () => {
rl.ncFiles.selectFiles().then(files => {
files.forEach(file => {
let id = Jua?.randomId() || file.etag,
attachment = view.addAttachmentHelper(
id.etag,
file.name.replace(/^.*\/([^/]+)$/, '$1'),
file.size
);
attachment
.waiting(false)
.uploading(true)
.complete(false);

rl.pluginRemoteRequest(
(iError, data) => {
attachment
.uploading(false)
.complete(true);
if (iError) {
attachment.error(data?.Result?.error || 'failed');
} else {
attachment.tempName(data.Result.tempName);
}
},
'NextcloudAttachFile',
{
'file': file.name
}
);

});
});
};
}
});

let template = document.getElementById('PopupsCompose');
const uploadBtn = template.content.querySelector('#composeUploadButton');
if (uploadBtn) {
uploadBtn.after(Element.fromHTML('<a class="btn fontastic"'
+ ' data-bind="click: nextcloudAttach" data-i18n="[title]NEXTCLOUD/ATTACH_FILES">◦◯◦</a>'));
}

})(window.rl);
1 change: 1 addition & 0 deletions plugins/nextcloud/js/message.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
(rl => {
// if (rl.settings.get('Nextcloud'))

addEventListener('rl-view-model.create', e => {
if ('MailMessageView' === e.detail.viewModelTemplateID) {
Expand Down
52 changes: 34 additions & 18 deletions plugins/nextcloud/js/webdav.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,35 +109,51 @@
{
if (items.length) {
items.forEach(item => {
if (item.isFile) {
if (view.files()) {
// TODO show files
}
} else {
if (!item.isFile) {
let li = document.createElement('li'),
details = document.createElement('details'),
summary = document.createElement('summary'),
ul = document.createElement('ul'),
btn = document.createElement('button');
btn.item_name = item.name;
ul = document.createElement('ul');
details.addEventListener('toggle', () => {
if (!ul.children.length) {
fetchFiles(propertyRequestBody, item.name).then(items => buildTree(view, ul, items, item.name));
}
ul.children.length
|| fetchFiles(propertyRequestBody, item.name).then(items => buildTree(view, ul, items, item.name));
});
summary.textContent = '📁 ' + item.name.replace(/^.*\/([^/]+)$/, '$1');
btn.name = 'select';
btn.textContent = 'select';
btn.className = 'button-vue';
btn.style.marginLeft = '1em';
summary.append(btn);
summary.textContent = item.name.replace(/^.*\/([^/]+)$/, '$1');
summary.dataset.icon = '📁';
if (!view.files()) {
let btn = document.createElement('button');
btn.item_name = item.name;
btn.name = 'select';
btn.textContent = 'select';
btn.className = 'button-vue';
btn.style.marginLeft = '1em';
summary.append(btn);
}
details.append(summary);
details.append(ul);
// a.append('- ' + item.name.replace(/^\/+/, ''));
li.append(details);
parent.append(li);
}
});
if (view.files()) {
items.forEach(item => {
if (item.isFile) {
// TODO show files
let li = document.createElement('li'),
btn = document.createElement('button');
btn.item = item;
btn.name = 'select';
btn.textContent = 'select';
btn.className = 'button-vue';
btn.style.marginLeft = '1em';
li.textContent = item.name.replace(/^.*\/([^/]+)$/, '$1');
li.dataset.icon = '🗎';
li.append(btn);
parent.append(li);
}
});
}
}
if (!view.files()) {
let li = document.createElement('li'),
Expand Down Expand Up @@ -168,7 +184,7 @@
let el = event.target;
if (el.matches('button')) {
if ('select' == el.name) {
this.select = el.item_name;
this.select = this.files() ? [el.item] : el.item_name;
this.close();
} else if ('create' == el.name) {
let name = el.input.value.replace(/[|\\?*<":>+[]\/&\s]/g, '');
Expand Down
1 change: 1 addition & 0 deletions plugins/nextcloud/langs/en.ini
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ SAVE_ATTACHMENTS = "Save in Nextcloud"
SAVE_EML = "Save as .eml in Nextcloud"
SELECT_FOLDER = "Select folder"
SELECT_FILES = "Select file(s)"
ATTACH_FILES = "Attach Nextcloud files"

0 comments on commit 30c2371

Please sign in to comment.