From f53dab1baa716e0476c54fef7a9751c808c9a927 Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Wed, 19 Oct 2022 10:15:03 +0200
Subject: [PATCH] Activate simple Nextcloud directory selector popup #96
---
plugins/nextcloud/index.php | 61 +++++++++++---
plugins/nextcloud/js/message.js | 80 +++++++++----------
plugins/nextcloud/js/webdav.js | 45 +++++++++--
plugins/nextcloud/langs/en.ini | 2 +
.../templates/PopupsNextcloudFiles.html | 9 ++-
5 files changed, 131 insertions(+), 66 deletions(-)
diff --git a/plugins/nextcloud/index.php b/plugins/nextcloud/index.php
index 80a0a077c..f96d98cd1 100644
--- a/plugins/nextcloud/index.php
+++ b/plugins/nextcloud/index.php
@@ -19,9 +19,9 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$this->addHook('filter.app-data', 'FilterAppData');
$this->addJs('js/message.js');
+ $this->addJs('js/webdav.js');
$this->addHook('json.attachments', 'DoAttachmentsActions');
$this->addJsonHook('NextcloudSaveMsg', 'NextcloudSaveMsg');
-
$this->addTemplate('templates/PopupsNextcloudFiles.html');
}
}
@@ -60,8 +60,14 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
public function NextcloudSaveMsg() : array
{
+ $sSaveFolder = \ltrim($this->jsonParam('folder', ''), '/');
$aValues = \RainLoop\Utils::DecodeKeyValuesQ($this->jsonParam('msgHash', ''));
- if (!empty($aValues['Folder']) && !empty($aValues['Uid'])) {
+ $aResult = [
+ 'folder' => '',
+ 'filename' => '',
+ 'success' => false
+ ];
+ if ($sSaveFolder && !empty($aValues['Folder']) && !empty($aValues['Uid'])) {
$oActions = \RainLoop\Api::Actions();
$oMailClient = $oActions->MailClient();
if (!$oMailClient->IsLoggined()) {
@@ -69,17 +75,20 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$oAccount->ImapConnectAndLoginHelper($oActions->Plugins(), $oMailClient, $oActions->Config());
}
- $sSaveFolder = $this->Config()->Get('plugin', 'save_folder', '') ?: 'Emails';
+ $sSaveFolder = $sSaveFolder ?: 'Emails';
$oFiles = \OCP\Files::getStorage('files');
- if ($oFiles && \method_exists($oFiles, 'file_put_contents')) {
+ if ($oFiles) {
$oFiles->is_dir($sSaveFolder) || $oFiles->mkdir($sSaveFolder);
}
+ $aResult['folder'] = $sSaveFolder;
+
$sFilename = $sSaveFolder . '/' . ($this->jsonParam('filename', '') ?: \date('YmdHis')) . '.eml';
+ $aResult['folder'] = $sFilename;
$oMailClient->MessageMimeStream(
- function ($rResource) use ($oFiles, $sFilename) {
+ function ($rResource) use ($oFiles, $sFilename, $aResult) {
if (\is_resource($rResource)) {
- $oFiles->file_put_contents($sFilename, $rResource);
+ $aResult['success'] = $oFiles->file_put_contents($sFilename, $rResource);
}
},
(string) $aValues['Folder'],
@@ -88,7 +97,7 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
);
}
- return $this->jsonResponse(__FUNCTION__, true);
+ return $this->jsonResponse(__FUNCTION__, $aResult);
}
public function DoAttachmentsActions(\SnappyMail\AttachmentsAction $data)
@@ -96,7 +105,8 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
if (static::isLoggedIn() && 'nextcloud' === $data->action) {
$oFiles = \OCP\Files::getStorage('files');
if ($oFiles && \method_exists($oFiles, 'file_put_contents')) {
- $sSaveFolder = $this->Config()->Get('plugin', 'save_folder', '') ?: 'Attachments';
+ $sSaveFolder = \ltrim($this->jsonParam('NcFolder', ''), '/');
+ $sSaveFolder = $sSaveFolder ?: $this->Config()->Get('plugin', 'save_folder', '') ?: 'Attachments';
$oFiles->is_dir($sSaveFolder) || $oFiles->mkdir($sSaveFolder);
$data->result = true;
foreach ($data->items as $aItem) {
@@ -105,14 +115,10 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
if (!empty($sSavedFileHash)) {
$fFile = $data->filesProvider->GetFile($data->account, $sSavedFileHash, 'rb');
if (\is_resource($fFile)) {
- $sSavedFileNameFull = \MailSo\Base\Utils::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, function ($sPath) use ($oFiles) {
- return $oFiles->file_exists($sPath);
- });
-
+ $sSavedFileNameFull = static::SmartFileExists($sSaveFolder.'/'.$sSavedFileName, $oFiles);
if (!$oFiles->file_put_contents($sSavedFileNameFull, $fFile)) {
$data->result = false;
}
-
if (\is_resource($fFile)) {
\fclose($fFile);
}
@@ -193,4 +199,33 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
->SetDefaultValue(true)
);
}
+
+ private static function SmartFileExists(string $sFilePath, $oFiles) : string
+ {
+ $sFilePath = \str_replace('\\', '/', \trim($sFilePath));
+
+ if (!$oFiles->file_exists($sFilePath)) {
+ return $sFilePath;
+ }
+
+ $aFileInfo = \pathinfo($sFilePath);
+
+ $iIndex = 0;
+
+ while (true) {
+ ++$iIndex;
+ $sFilePathNew = $aFileInfo['dirname'].'/'.
+ \preg_replace('/\(\d{1,2}\)$/', '', $aFileInfo['filename']).
+ ' ('.$iIndex.')'.
+ (empty($aFileInfo['extension']) ? '' : '.'.$aFileInfo['extension'])
+ ;
+ if (!$oFiles->file_exists($sFilePathNew)) {
+ return $sFilePathNew;
+ }
+ if (10 < $iIndex) {
+ break;
+ }
+ }
+ return $sFilePath;
+ }
}
diff --git a/plugins/nextcloud/js/message.js b/plugins/nextcloud/js/message.js
index e3fa2f2a7..861e81d87 100644
--- a/plugins/nextcloud/js/message.js
+++ b/plugins/nextcloud/js/message.js
@@ -1,12 +1,5 @@
(rl => {
- function browseFiles(path = '/')
- {
- rl.ncFiles.getDirectoryContents(path).then(elemList => {
- console.dir(elemList);
- }).catch(err => console.error(err))
- }
-
addEventListener('rl-view-model.create', e => {
if ('MailMessageView' === e.detail.viewModelTemplateID) {
let view = e.detail;
@@ -19,48 +12,49 @@
.filter(v => v);
if (hashes.length) {
view.saveNextcloudLoading(true);
- rl.fetchJSON('./?/Json/&q[]=/0/', {}, {
- Action: 'AttachmentsActions',
- Do: 'nextcloud',
- Hashes: hashes
- })
- .then(result => {
- view.saveNextcloudLoading(false);
- if (result?.Result) {
- // success
- } else {
- view.saveNextcloudError(true);
+ rl.ncFiles.selectFolder().then(folder => {
+ if (folder) {
+ rl.fetchJSON('./?/Json/&q[]=/0/', {}, {
+ Action: 'AttachmentsActions',
+ Do: 'nextcloud',
+ Hashes: hashes,
+ NcFolder: folder
+ })
+ .then(result => {
+ view.saveNextcloudLoading(false);
+ if (result?.Result) {
+ // success
+ } else {
+ view.saveNextcloudError(true);
+ }
+ })
+ .catch(() => {
+ view.saveNextcloudLoading(false);
+ view.saveNextcloudError(true);
+ });
}
- })
- .catch(() => {
- view.saveNextcloudLoading(false);
- view.saveNextcloudError(true);
});
}
};
view.nextcloudSaveMsg = () => {
- let msg = view.message();
-
- /**
- * TODO: op select screen to show browseFiles result
- * Then the user can select which Nextcloud folder to save to
- */
-// browseFiles();
-
- rl.pluginRemoteRequest(
- (iError, data) => {
- console.dir({
- iError:iError,
- data:data
- });
- },
- 'NextcloudSaveMsg',
- {
- 'msgHash': msg.requestHash,
- 'filename': msg.subject()
- }
- );
+ rl.ncFiles.selectFolder().then(folder => {
+ let msg = view.message();
+ folder && rl.pluginRemoteRequest(
+ (iError, data) => {
+ console.dir({
+ iError:iError,
+ data:data
+ });
+ },
+ 'NextcloudSaveMsg',
+ {
+ 'msgHash': msg.requestHash,
+ 'folder': folder,
+ 'filename': msg.subject()
+ }
+ );
+ });
};
}
});
diff --git a/plugins/nextcloud/js/webdav.js b/plugins/nextcloud/js/webdav.js
index 2ae2d0426..d832222a0 100644
--- a/plugins/nextcloud/js/webdav.js
+++ b/plugins/nextcloud/js/webdav.js
@@ -96,14 +96,39 @@
});
}
- onShow(files, fResolve) {
- this.files(!!files);
- this.fResolve = fResolve;
+ onBuild(dom) {
+ this.tree = dom.querySelector('#sm-nc-files-tree');
+ this.tree.addEventListener('click', event => {
+ let li = event.target.closest('li');
+ if (li.item_name) {
+ this.close();
+ this.fResolve(li.item_name);
+ }
+ });
}
- select() {
- this.close();
- this.fResolve(this.folder());
+ // Happens after showModal()
+ beforeShow(files, fResolve) {
+ this.files(!!files);
+ this.fResolve = fResolve;
+
+ this.tree.innerHTML = '';
+ fetchFiles(propertyRequestBody, '/').then(items => {
+ items.forEach(item => {
+ if (item.isFile) {
+ if (files) {
+ // TODO show files
+ }
+ } else {
+ let li = document.createElement('li'),
+ a = document.createElement('a');
+ li.item_name = item.name;
+ a.append('- ' + item.name.replace(/^\/+/, ''));
+ li.append(a);
+ this.tree.append(li);
+ }
+ });
+ }).catch(err => console.error(err))
}
onClose() {
@@ -111,6 +136,14 @@
this.fResolve();
return false;
}
+/*
+ onShow() {} // Happens after showModal()
+ beforeShow() {} // Happens before showModal()
+ afterShow() {} // Happens after showModal() animation transitionend
+ onHide() {} // Happens before animation transitionend
+ afterHide() {} // Happens after animation transitionend
+ close() {}
+*/
}
rl.ncFiles = new class {
diff --git a/plugins/nextcloud/langs/en.ini b/plugins/nextcloud/langs/en.ini
index 8997c523f..9e79388da 100644
--- a/plugins/nextcloud/langs/en.ini
+++ b/plugins/nextcloud/langs/en.ini
@@ -1,3 +1,5 @@
[NEXTCLOUD]
SAVE_ATTACHMENTS = "Save in Nextcloud"
SAVE_EML = "Save as .eml in Nextcloud"
+SELECT_FOLDER = "Select folder"
+SELECT_FILES = "Select file(s)"
diff --git a/plugins/nextcloud/templates/PopupsNextcloudFiles.html b/plugins/nextcloud/templates/PopupsNextcloudFiles.html
index e0ac608be..f63656034 100644
--- a/plugins/nextcloud/templates/PopupsNextcloudFiles.html
+++ b/plugins/nextcloud/templates/PopupsNextcloudFiles.html
@@ -1,12 +1,13 @@