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}
/>