mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-11 00:14:50 +03:00
Added draft code for Nextcloud files/folders selector #96
This commit is contained in:
parent
115f603d20
commit
0910b8f27d
2 changed files with 110 additions and 0 deletions
|
|
@ -1,4 +1,12 @@
|
|||
(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;
|
||||
|
|
@ -33,6 +41,13 @@
|
|||
|
||||
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({
|
||||
|
|
|
|||
95
plugins/nextcloud/js/webdav.js
Normal file
95
plugins/nextcloud/js/webdav.js
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
(rl => {
|
||||
|
||||
const
|
||||
namespace = 'DAV:',
|
||||
|
||||
propertyRequestBody = `<?xml version="1.0"?>
|
||||
<d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">
|
||||
<d:prop>
|
||||
<d:getlastmodified />
|
||||
<d:getetag />
|
||||
<d:getcontenttype />
|
||||
<d:resourcetype />
|
||||
<oc:fileid />
|
||||
<oc:permissions />
|
||||
<oc:size />
|
||||
<d:getcontentlength />
|
||||
<nc:has-preview />
|
||||
<oc:favorite />
|
||||
<oc:comments-unread />
|
||||
<oc:owner-display-name />
|
||||
<oc:share-types />
|
||||
</d:prop>
|
||||
</d:propfind>`,
|
||||
|
||||
xmlParser = new DOMParser(),
|
||||
pathRegex = /.*\/remote.php\/dav\/files\/[^/]+/g,
|
||||
|
||||
getDavElementsByTagName = (parent, localName) => parent.getElementsByTagNameNS(namespace, localName),
|
||||
getDavElementByTagName = (parent, localName) => getDavElementsByTagName(parent, localName)?.item(0),
|
||||
getElementByTagName = (parent, localName) => +parent.getElementsByTagName(localName)?.item(0);
|
||||
|
||||
function fetchFiles(xml, path)
|
||||
{
|
||||
if (!parent.oc_requesttoken) {
|
||||
return Promise.reject(new Error('oc_requesttoken missing'));
|
||||
}
|
||||
let cfg = rl.settings.get('Nextcloud');
|
||||
return fetch(cfg.WebDAV + '/files/' + cfg.UID + path, {
|
||||
method: 'PROPFIND',
|
||||
mode: 'same-origin',
|
||||
cache: 'no-cache',
|
||||
redirect: 'error',
|
||||
credentials: 'same-origin',
|
||||
headers: {
|
||||
'Content-Type': 'application/xml; charset=utf-8',
|
||||
requesttoken: parent.oc_requesttoken
|
||||
},
|
||||
body: xml
|
||||
})
|
||||
.then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response })))
|
||||
.then(text => {
|
||||
const
|
||||
elemList = [],
|
||||
responseList = getDavElementsByTagName(
|
||||
xmlParser.parseFromString(text, 'application/xml').documentElement,
|
||||
'response'
|
||||
);
|
||||
path = path.replace(/\/$/, '');
|
||||
for (let i = 0; i < responseList.length; ++i) {
|
||||
const
|
||||
e = responseList.item(i),
|
||||
elem = {
|
||||
id: parseInt(getElementByTagName(e, 'oc:fileid')?.innerHTML ?? 0),
|
||||
name: decodeURIComponent(getDavElementByTagName(e, 'href').innerHTML)
|
||||
.replace(pathRegex, '').replace(/\/$/, ''),
|
||||
isFile: false,
|
||||
lastmod: getDavElementByTagName(e, 'getlastmodified').innerHTML
|
||||
}
|
||||
if (getDavElementsByTagName(getDavElementByTagName(e, 'resourcetype'), 'collection').length) {
|
||||
// skip current directory
|
||||
if (elem.name === path) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
elem.isFile = true;
|
||||
elem.mime = getDavElementByTagName(e, 'getcontenttype').innerHTML;
|
||||
elem.etag = getDavElementByTagName(e, 'getetag').innerHTML;
|
||||
elem.size = getDavElementByTagName(e, 'getcontentlength')?.innerHTML;
|
||||
if (!elem.size) {
|
||||
elem.size = getElementByTagName(e, 'oc:size')?.innerHTML;
|
||||
}
|
||||
elem.haspreview = getElementByTagName(e, 'nc:has-preview')?.innerHTML === 'true';
|
||||
}
|
||||
elemList.push(elem);
|
||||
}
|
||||
return Promise.resolve(elemList);
|
||||
});
|
||||
}
|
||||
|
||||
rl.ncFiles = new class {
|
||||
async getDirectoryContents(path) {
|
||||
return await fetchFiles(propertyRequestBody, path);
|
||||
}
|
||||
}
|
||||
})(window.rl);
|
||||
Loading…
Add table
Add a link
Reference in a new issue