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 @@
× -

+

+

-