diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index c2cc1af2d..890f438d4 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -58,7 +58,7 @@ module.exports = { putContent_meta: true, async putContent({ folid, cntid, content, name, type }) { - const resp = await putCloudContent(folid, cntid, content, name, type); + const resp = await putCloudContent(folid, cntid, content, name, type, {}); socket.emitChanged('cloud-content-changed'); socket.emit('cloud-content-updated'); return resp; @@ -129,7 +129,11 @@ module.exports = { undefined, JSON.stringify(connToSend), getConnectionLabel(conn), - 'connection' + 'connection', + { + connectionColor: conn.connectionColor, + connectionEngine: conn.engine, + } ); return resp; }, @@ -157,7 +161,11 @@ module.exports = { cntid, JSON.stringify(recryptedConn), getConnectionLabel(recryptedConn), - 'connection' + 'connection', + { + connectionColor: connection.connectionColor, + connectionEngine: connection.engine, + } ); if (resp.apiErrorMessage) { @@ -188,7 +196,10 @@ module.exports = { ...conn, displayName: getConnectionLabel(conn) + ' - copy', }; - const respPut = await putCloudContent(folid, undefined, JSON.stringify(conn2), conn2.displayName, 'connection'); + const respPut = await putCloudContent(folid, undefined, JSON.stringify(conn2), conn2.displayName, 'connection', { + connectionColor: conn.connectionColor, + connectionEngine: conn.engine, + }); return respPut; }, @@ -224,7 +235,7 @@ module.exports = { saveFile_meta: true, async saveFile({ folid, cntid, fileName, data, contentFolder, format }) { - const resp = await putCloudContent(folid, cntid, data, fileName, 'file', contentFolder, format); + const resp = await putCloudContent(folid, cntid, data, fileName, 'file', { contentFolder, contentType: 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 329a55fc0..7b8de4ec6 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -86,6 +86,16 @@ async function loadCloudFiles() { } } +async function getCloudUsedEngines() { + try { + const resp = await callCloudApiGet('content-engines'); + return resp || []; + } catch (err) { + logger.error(extractErrorLogData(err), 'Error getting cloud content list'); + return []; + } +} + async function collectCloudFilesSearchTags() { const res = []; if (platformInfo.isElectron) { @@ -120,11 +130,14 @@ async function collectCloudFilesSearchTags() { const engines = await connections.getUsedEngines(); const engineTags = engines.map(engine => engine.split('@')[0]); res.push(...engineTags); + const cloudEngines = await getCloudUsedEngines(); + const cloudEngineTags = cloudEngines.map(engine => engine.split('@')[0]); + res.push(...cloudEngineTags); // team-premium and trials will return the same cloud files as premium - no need to check res.push(isProApp() ? 'premium' : 'community'); - return res; + return _.uniq(res); } async function getCloudSigninHolder() { @@ -293,7 +306,7 @@ async function getCloudContent(folid, cntid) { const encryptor = simpleEncryptor.createEncryptor(signinHolder.encryptionKey); - const { content, name, type, contentFolder, contentType, apiErrorMessage } = await callCloudApiGet( + const { content, name, type, contentAttributes, apiErrorMessage } = await callCloudApiGet( `content/${folid}/${cntid}`, signinHolder, { @@ -309,8 +322,7 @@ async function getCloudContent(folid, cntid) { content: encryptor.decrypt(content), name, type, - contentFolder, - contentType, + contentAttributes, }; } @@ -318,7 +330,7 @@ async function getCloudContent(folid, cntid) { * * @returns Promise<{ cntid: string } | { apiErrorMessage: string }> */ -async function putCloudContent(folid, cntid, content, name, type, contentFolder = null, contentType = null) { +async function putCloudContent(folid, cntid, content, name, type, contentAttributes) { const signinHolder = await getCloudSigninHolder(); if (!signinHolder) { throw new Error('No signed in'); @@ -335,8 +347,7 @@ async function putCloudContent(folid, cntid, content, name, type, contentFolder type, kehid: signinHolder.kehid, content: encryptor.encrypt(content), - contentFolder, - contentType, + contentAttributes, }, signinHolder ); diff --git a/packages/web/src/appobj/CloudContentAppObject.svelte b/packages/web/src/appobj/CloudContentAppObject.svelte index 819949e6e..f1dca191f 100644 --- a/packages/web/src/appobj/CloudContentAppObject.svelte +++ b/packages/web/src/appobj/CloudContentAppObject.svelte @@ -92,7 +92,7 @@ } -{#if data.conid && $cloudConnectionsStore[data.conid]} +{#if data.conid && $cloudConnectionsStore[data.conid] && $cloudConnectionsStore[data.conid]?._id} !getCurrentConfig()?.runAsPortal && !getCurrentConfig()?.storageDatabase && isProApp(), + testEnabled: () => !getCurrentConfig()?.runAsPortal && !getCurrentConfig()?.storageDatabase, onClick: () => { openNewTab({ title: 'New Connection on Cloud', diff --git a/packages/web/src/widgets/PrivateCloudWidget.svelte b/packages/web/src/widgets/PrivateCloudWidget.svelte index 1a53663d5..b6661bfef 100644 --- a/packages/web/src/widgets/PrivateCloudWidget.svelte +++ b/packages/web/src/widgets/PrivateCloudWidget.svelte @@ -33,6 +33,7 @@ import InputTextModal from '../modals/InputTextModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte'; import { showSnackbarInfo } from '../utility/snackbar'; + import { isProApp } from '../utility/proTools'; let filter = ''; let domSqlObjectList = null; @@ -100,7 +101,7 @@ function createAddMenu() { return [ - { + isProApp() && { text: 'New shared folder', onClick: () => { showModal(InputTextModal, { @@ -114,7 +115,7 @@ }); }, }, - { + isProApp() && { text: 'Add existing shared folder', onClick: () => { showModal(InputTextModal, { diff --git a/packages/web/src/widgets/PublicCloudWidget.svelte b/packages/web/src/widgets/PublicCloudWidget.svelte index b7a4edc1d..a14c49d9f 100644 --- a/packages/web/src/widgets/PublicCloudWidget.svelte +++ b/packages/web/src/widgets/PublicCloudWidget.svelte @@ -15,6 +15,8 @@ import FontIcon from '../icons/FontIcon.svelte'; import { refreshPublicCloudFiles } from '../utility/api'; import _ from 'lodash'; + import FormStyledButton from '../buttons/FormStyledButton.svelte'; + import ErrorInfo from '../elements/ErrorInfo.svelte'; let filter = ''; const publicFiles = usePublicCloudFiles(); @@ -45,6 +47,26 @@ groupFunc={data => data.folder || 'Not defined'} {filter} /> + + {#if !$publicFiles?.length} + +
+
+ Only files relevant for your connections, platform and DbGate edition are listed. Please define connections at first. +
+ +
+ {/if} + +