diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index 821470add..37fd9856f 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -205,6 +205,11 @@ module.exports = { return resp; }, - // saveFile_meta: true, - // async saveFile({folid, file, data, folder, format}) + saveFile_meta: true, + async saveFile({ folid, cntid, fileName, data, contentFolder, format }) { + const resp = await putCloudContent(folid, cntid, data, fileName, 'file', contentFolder, format); + socket.emitChanged('cloud-content-changed'); + socket.emit('cloud-content-updated'); + return resp; + }, }; diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index 6e845b212..da67425b8 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -284,9 +284,13 @@ async function getCloudContent(folid, cntid) { const encryptor = simpleEncryptor.createEncryptor(signinHolder.encryptionKey); - const { content, name, type, apiErrorMessage } = await callCloudApiGet(`content/${folid}/${cntid}`, signinHolder, { - 'x-kehid': signinHolder.kehid, - }); + const { content, name, type, contentFolder, contentType, apiErrorMessage } = await callCloudApiGet( + `content/${folid}/${cntid}`, + signinHolder, + { + 'x-kehid': signinHolder.kehid, + } + ); if (apiErrorMessage) { return { apiErrorMessage }; @@ -296,10 +300,16 @@ async function getCloudContent(folid, cntid) { content: encryptor.decrypt(content), name, type, + contentFolder, + contentType, }; } -async function putCloudContent(folid, cntid, content, name, type) { +/** + * + * @returns Promise<{ cntid: string } | { apiErrorMessage: string }> + */ +async function putCloudContent(folid, cntid, content, name, type, contentFolder = null, contentType = null) { const signinHolder = await getCloudSigninHolder(); if (!signinHolder) { throw new Error('No signed in'); @@ -316,6 +326,8 @@ async function putCloudContent(folid, cntid, content, name, type) { type, kehid: signinHolder.kehid, content: encryptor.encrypt(content), + contentFolder, + contentType, }, signinHolder ); diff --git a/packages/web/src/appobj/CloudContentAppObject.svelte b/packages/web/src/appobj/CloudContentAppObject.svelte index aaff32814..819949e6e 100644 --- a/packages/web/src/appobj/CloudContentAppObject.svelte +++ b/packages/web/src/appobj/CloudContentAppObject.svelte @@ -17,6 +17,7 @@ import openNewTab from '../utility/openNewTab'; import { showModal } from '../modals/modalTools'; import ConfirmModal from '../modals/ConfirmModal.svelte'; + import SavedFileAppObject from './SavedFileAppObject.svelte'; export let data; export let passProps; @@ -102,6 +103,19 @@ on:dblclick on:expand /> +{:else if data.type == 'file'} + {:else} diff --git a/packages/web/src/forms/FormCloudFolderSelect.svelte b/packages/web/src/forms/FormCloudFolderSelect.svelte index a6c215743..28d5bf08f 100644 --- a/packages/web/src/forms/FormCloudFolderSelect.svelte +++ b/packages/web/src/forms/FormCloudFolderSelect.svelte @@ -6,14 +6,22 @@ export let name; export let requiredRoleVariants = ['read', 'write', 'admin']; + export let prependFolders = []; + const cloudContentList = useCloudContentList(); - $: folderOptions = ($cloudContentList || []) - .filter(folder => requiredRoleVariants.find(role => folder.role == role)) - .map(folder => ({ + $: folderOptions = [ + ...prependFolders.map(folder => ({ value: folder.folid, label: folder.name, - })); + })), + ...($cloudContentList || []) + .filter(folder => requiredRoleVariants.find(role => folder.role == role)) + .map(folder => ({ + value: folder.folid, + label: folder.name, + })), + ]; diff --git a/packages/web/src/modals/SaveFileModal.svelte b/packages/web/src/modals/SaveFileModal.svelte index 16b9d7dd2..4665880fa 100644 --- a/packages/web/src/modals/SaveFileModal.svelte +++ b/packages/web/src/modals/SaveFileModal.svelte @@ -23,20 +23,42 @@ export let filePath; export let onSave = undefined; - const values = writable({ name }); + const values = writable({ name, cloudFolder: '__local' }); const electron = getElectron(); const handleSubmit = async e => { - const { name } = e.detail; - await apiCall('files/save', { folder, file: name, data, format }); - closeCurrentModal(); - if (onSave) { - onSave(name, { - savedFile: name, - savedFolder: folder, - savedFilePath: null, + const { name, cloudFolder } = e.detail; + if (cloudFolder === '__local') { + await apiCall('files/save', { folder, file: name, data, format }); + closeCurrentModal(); + if (onSave) { + onSave(name, { + savedFile: name, + savedFolder: folder, + savedFilePath: null, + }); + } + } else { + const resp = await apiCall('cloud/save-file', { + folid: cloudFolder, + fileName: name, + data, + contentFolder: folder, + format, }); + if (resp.cntid) { + closeCurrentModal(); + if (onSave) { + onSave(name, { + savedFile: name, + savedFolder: folder, + savedFilePath: null, + savedCloudFolderId: cloudFolder, + savedCloudContentId: resp.cntid, + }); + } + } } }; @@ -56,28 +78,6 @@ }); } }; - - const handleSaveToCloud = async folid => { - const resp = await apiCall('cloud/save-file', { - folid, - fileName: $values.name, - data, - contentFolder: folder, - format, - }); - if (resp.cntid) { - closeCurrentModal(); - if (onSave) { - onSave(name, { - savedFile: name, - savedFolder: folder, - savedFilePath: null, - savedCloudFolderId: folid, - savedCloudContentId: resp.cntid, - }); - } - } - }; @@ -86,10 +86,16 @@ {#if $cloudSigninTokenHolder} {/if} diff --git a/packages/web/src/widgets/PrivateCloudWidget.svelte b/packages/web/src/widgets/PrivateCloudWidget.svelte index 6527af042..8fdb35f5d 100644 --- a/packages/web/src/widgets/PrivateCloudWidget.svelte +++ b/packages/web/src/widgets/PrivateCloudWidget.svelte @@ -34,8 +34,7 @@ import ConfirmModal from '../modals/ConfirmModal.svelte'; import { showSnackbarInfo } from '../utility/snackbar'; - let publicFilter = ''; - let cloudFilter = ''; + let filter = ''; let domSqlObjectList = null; const cloudContentList = useCloudContentList(); @@ -205,8 +204,8 @@ skip={!$cloudSigninTokenHolder} > - - + + data.folid} mapGroupTitle={folid => `${contentGroupMap[folid]?.name} - ${contentGroupMap[folid]?.role}`} - filter={publicFilter} + {filter} subItemsComponent={() => SubCloudItemsList} expandIconFunc={plusExpandIcon} isExpandable={data => diff --git a/packages/web/src/widgets/PublicCloudWidget.svelte b/packages/web/src/widgets/PublicCloudWidget.svelte index e0383c94a..9b137f2fb 100644 --- a/packages/web/src/widgets/PublicCloudWidget.svelte +++ b/packages/web/src/widgets/PublicCloudWidget.svelte @@ -18,7 +18,7 @@ import FontIcon from '../icons/FontIcon.svelte'; import { apiCall } from '../utility/api'; import _ from 'lodash'; - let publicFilter = ''; + let filter = ''; const publicFiles = usePublicCloudFiles(); @@ -31,8 +31,8 @@ - - + + data.folder || undefined} - filter={publicFilter} + {filter} />