diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index 9e4483eec..e11f416c8 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -85,6 +85,24 @@ module.exports = { }; }, + renameFolder_meta: true, + async renameFolder({ folid, name }) { + await callCloudApiPost(`folders/rename`, { folid, name }); + socket.emitChanged('cloud-content-changed'); + return { + status: 'ok', + }; + }, + + deleteFolder_meta: true, + async deleteFolder({ folid }) { + await callCloudApiPost(`folders/delete`, { folid }); + socket.emitChanged('cloud-content-changed'); + return { + status: 'ok', + }; + }, + refreshContent_meta: true, async refreshContent() { socket.emitChanged('cloud-content-changed'); diff --git a/packages/web/src/widgets/PrivateCloudWidget.svelte b/packages/web/src/widgets/PrivateCloudWidget.svelte index bf096a1f2..ba81051b2 100644 --- a/packages/web/src/widgets/PrivateCloudWidget.svelte +++ b/packages/web/src/widgets/PrivateCloudWidget.svelte @@ -27,6 +27,10 @@ import SubCloudItemsList from '../appobj/SubCloudItemsList.svelte'; import DatabaseWidgetDetailContent from './DatabaseWidgetDetailContent.svelte'; import { onMount } from 'svelte'; + import DropDownButton from '../buttons/DropDownButton.svelte'; + import { showModal } from '../modals/modalTools'; + import InputTextModal from '../modals/InputTextModal.svelte'; + import ConfirmModal from '../modals/ConfirmModal.svelte'; let publicFilter = ''; let cloudFilter = ''; @@ -74,6 +78,72 @@ loadCloudConnection(currentConid); } }); + + function createAddMenu() { + return [ + { + text: 'New shared folder', + onClick: () => { + showModal(InputTextModal, { + label: 'New folder name', + header: 'New shared folder', + onConfirm: async newFolder => { + apiCall('cloud/create-folder', { + name: newFolder, + }); + }, + }); + }, + }, + { + text: 'Add existing shared folder', + onClick: () => { + showModal(InputTextModal, { + label: 'Your invite link (in form dbgate://folder/xxx)', + header: 'Add existing shared folder', + onConfirm: async newFolder => { + apiCall('cloud/grant-folder', { + inviteLink: newFolder, + }); + }, + }); + }, + }, + ]; + } + + function createGroupContextMenu(folder) { + const handleRename = () => { + showModal(InputTextModal, { + value: contentGroupTitleMap[folder], + label: 'New folder name', + header: 'Rename folder', + onConfirm: async name => { + apiCall('cloud/rename-folder', { + folid: folder, + name, + }); + }, + }); + }; + + const handleDelete = () => { + showModal(ConfirmModal, { + message: `Really delete folder ${contentGroupTitleMap[folder]}? All folder content will be deleted!`, + header: 'Delete folder', + onConfirm: () => { + apiCall('cloud/delete-folder', { + folid: folder, + }); + }, + }); + }; + + return [ + { text: 'Rename', onClick: handleRename }, + { text: 'Delete', onClick: handleDelete }, + ]; + } @@ -88,6 +158,7 @@ + domSqlObjectList.focus(), }} + groupContextMenu={createGroupContextMenu} />