From 5553e3cd8d61f4ea3a84fbbb8ee2b90f2a9b27d9 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 24 Nov 2025 17:34:40 +0100 Subject: [PATCH] SYNC: Handle error when saving to team files --- packages/web/src/commands/stdCommands.ts | 22 +++++++---- packages/web/src/modals/SaveFileModal.svelte | 39 +++++++++++++------- packages/web/src/tabs/DiagramTab.svelte | 1 + packages/web/src/utility/saveTabFile.ts | 3 +- 4 files changed, 44 insertions(+), 21 deletions(-) diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index 073fa7683..1b6db8bdc 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -115,7 +115,7 @@ registerCommand({ toolbar: true, icon: 'icon new-connection', toolbarName: __t('command.new.connection', { defaultMessage: 'Add connection' }), - category: __t('command.new', { defaultMessage: 'New'}), + category: __t('command.new', { defaultMessage: 'New' }), toolbarOrder: 1, name: __t('command.new.connection', { defaultMessage: 'Connection' }), testEnabled: () => !getCurrentConfig()?.runAsPortal && !getCurrentConfig()?.storageDatabase, @@ -561,7 +561,10 @@ registerCommand({ testEnabled: () => true, onClick: () => { showModal(ConfirmModal, { - message: _t('command.file.resetLayoutConfirm', { defaultMessage: 'Really reset layout data? All opened tabs, settings and layout data will be lost. Connections and saved files will be preserved. After this, restart DbGate for applying changes.' }), + message: _t('command.file.resetLayoutConfirm', { + defaultMessage: + 'Really reset layout data? All opened tabs, settings and layout data will be lost. Connections and saved files will be preserved. After this, restart DbGate for applying changes.', + }), onConfirm: async () => { await apiCall('config/delete-settings'); localStorage.clear(); @@ -665,7 +668,9 @@ registerCommand({ 'currentArchive', ]; for (const key of keys) removeLocalStorage(key); - showSnackbarSuccess(_t('command.view.restart', { defaultMessage: 'Restart DbGate (or reload on web) for applying changes' })); + showSnackbarSuccess( + _t('command.view.restart', { defaultMessage: 'Restart DbGate (or reload on web) for applying changes' }) + ); }, }); @@ -799,7 +804,9 @@ registerCommand({ registerCommand({ id: 'file.exit', category: __t('command.file', { defaultMessage: 'File' }), - name: isMac() ? __t('command.file.quit', { defaultMessage: 'Quit' }) : __t('command.file.exit', { defaultMessage: 'Exit' }), + name: isMac() + ? __t('command.file.quit', { defaultMessage: 'Quit' }) + : __t('command.file.exit', { defaultMessage: 'Exit' }), // keyText: isMac() ? 'Command+Q' : null, testEnabled: () => getElectron() != null, onClick: () => getElectron().send('quit-app'), @@ -862,6 +869,7 @@ export function registerFileCommands({ undoRedo = false, executeAdditionalCondition = null, copyPaste = false, + defaultTeamFolder = false, }) { if (save) { registerCommand({ @@ -874,7 +882,7 @@ export function registerFileCommands({ toolbar: true, isRelatedToTab: true, testEnabled: () => getCurrentEditor() != null, - onClick: () => saveTabFile(getCurrentEditor(), 'save', folder, format, fileExtension), + onClick: () => saveTabFile(getCurrentEditor(), 'save', folder, format, fileExtension, defaultTeamFolder), }); registerCommand({ id: idPrefix + '.saveAs', @@ -882,14 +890,14 @@ export function registerFileCommands({ category, name: __t('command.saveAs', { defaultMessage: 'Save As' }), testEnabled: () => getCurrentEditor() != null, - onClick: () => saveTabFile(getCurrentEditor(), 'save-as', folder, format, fileExtension), + onClick: () => saveTabFile(getCurrentEditor(), 'save-as', folder, format, fileExtension, defaultTeamFolder), }); registerCommand({ id: idPrefix + '.saveToDisk', category, name: __t('command.saveToDisk', { defaultMessage: 'Save to disk' }), testEnabled: () => getCurrentEditor() != null && getElectron() != null, - onClick: () => saveTabFile(getCurrentEditor(), 'save-to-disk', folder, format, fileExtension), + onClick: () => saveTabFile(getCurrentEditor(), 'save-to-disk', folder, format, fileExtension, defaultTeamFolder), }); } diff --git a/packages/web/src/modals/SaveFileModal.svelte b/packages/web/src/modals/SaveFileModal.svelte index 062f63298..a069d57f9 100644 --- a/packages/web/src/modals/SaveFileModal.svelte +++ b/packages/web/src/modals/SaveFileModal.svelte @@ -14,6 +14,8 @@ import { closeCurrentModal, showModal } from './modalTools'; import FormCloudFolderSelect from '../forms/FormCloudFolderSelect.svelte'; import FormCheckboxField from '../forms/FormCheckboxField.svelte'; + import { useConfig } from '../utility/metadataLoaders'; + import { showSnackbarError } from '../utility/snackbar'; export let data; export let name; @@ -24,26 +26,37 @@ export let onSave = undefined; export let folid; export let skipLocal = false; + export let defaultTeamFolder = false; // export let cntid; - const values = writable({ name, cloudFolder: folid ?? '__local' }); + const configValue = useConfig(); + + const values = writable({ + name, + cloudFolder: folid ?? '__local', + saveToTeamFolder: !!(getCurrentConfig()?.storageDatabase && defaultTeamFolder), + }); const electron = getElectron(); const handleSubmit = async e => { const { name, cloudFolder } = e.detail; if ($values['saveToTeamFolder']) { - const { teamFileId } = await apiCall('team-files/create-new', { fileType: folder, file: name, data }); - closeCurrentModal(); - if (onSave) { - onSave(name, { - savedFile: name, - savedFolder: folder, - savedFilePath: null, - savedCloudFolderId: null, - savedCloudContentId: null, - savedTeamFileId: teamFileId, - }); + const resp = await apiCall('team-files/create-new', { fileType: folder, file: name, data }); + if (resp.apiErrorMessage) { + showSnackbarError(resp.apiErrorMessage); + } else if (resp.teamFileId) { + closeCurrentModal(); + if (onSave) { + onSave(name, { + savedFile: name, + savedFolder: folder, + savedFilePath: null, + savedCloudFolderId: null, + savedCloudContentId: null, + savedTeamFileId: resp.teamFileId, + }); + } } } else if (cloudFolder === '__local') { await apiCall('files/save', { folder, file: name, data, format }); @@ -124,7 +137,7 @@ ]} /> {/if} - {#if getCurrentConfig().storageDatabase} + {#if $configValue?.storageDatabase} {/if} diff --git a/packages/web/src/tabs/DiagramTab.svelte b/packages/web/src/tabs/DiagramTab.svelte index 73657781a..734fa81a2 100644 --- a/packages/web/src/tabs/DiagramTab.svelte +++ b/packages/web/src/tabs/DiagramTab.svelte @@ -8,6 +8,7 @@ folder: 'diagrams', format: 'json', fileExtension: 'diagram', + defaultTeamFolder: true, undoRedo: true, }); diff --git a/packages/web/src/utility/saveTabFile.ts b/packages/web/src/utility/saveTabFile.ts index c47c66173..66946ec6b 100644 --- a/packages/web/src/utility/saveTabFile.ts +++ b/packages/web/src/utility/saveTabFile.ts @@ -11,7 +11,7 @@ import getElectron from './getElectron'; // return derived(editorStore, editor => editor != null); // } -export default async function saveTabFile(editor, saveMode, folder, format, fileExtension) { +export default async function saveTabFile(editor, saveMode, folder, format, fileExtension, defaultTeamFolder) { const tabs = get(openedTabs); const tabid = editor.activator.tabid; const data = editor.getData(); @@ -94,6 +94,7 @@ export default async function saveTabFile(editor, saveMode, folder, format, file filePath: savedFilePath, onSave, folid: savedCloudFolderId, + defaultTeamFolder, // cntid: savedCloudContentId, }); }