diff --git a/packages/api/src/controllers/files.js b/packages/api/src/controllers/files.js index 2a6f4ee06..c69e36642 100644 --- a/packages/api/src/controllers/files.js +++ b/packages/api/src/controllers/files.js @@ -3,14 +3,16 @@ const path = require('path'); const { filesdir } = require('../utility/directories'); const socket = require('../utility/socket'); -function serialize(folder, data) { - if (folder == 'sql') return data; - return JSON.stringify(data); +function serialize(format, data) { + if (format == 'text') return data; + if (format == 'json') return JSON.stringify(data); + throw new Error(`Invalid format: ${format}`); } -function deserialize(folder, text) { - if (folder == 'sql') return text; - return JSON.parse(text); +function deserialize(format, text) { + if (format == 'text') return text; + if (format == 'json') return JSON.parse(text); + throw new Error(`Invalid format: ${format}`); } module.exports = { @@ -18,7 +20,7 @@ module.exports = { async list({ folder }) { const dir = path.join(filesdir(), folder); if (!(await fs.exists(dir))) return []; - const files = (await fs.readdir(dir)).map((name) => ({ name })); + const files = (await fs.readdir(dir)).map((file) => ({ folder, file })); return files; }, @@ -29,18 +31,18 @@ module.exports = { }, load_meta: 'post', - async load({ folder, file }) { + async load({ folder, file, format }) { const text = await fs.readFile(path.join(filesdir(), folder, file), { encoding: 'utf-8' }); - return deserialize(folder, text); + return deserialize(format, text); }, save_meta: 'post', - async save({ folder, file, data }) { + async save({ folder, file, data, format }) { const dir = path.join(filesdir(), folder); if (!(await fs.exists(dir))) { await fs.mkdir(dir); } - await fs.writeFile(path.join(dir, file), serialize(folder, data)); + await fs.writeFile(path.join(dir, file), serialize(format, data)); socket.emitChanged(`files-changed-${folder}`); }, }; diff --git a/packages/web/src/appobj/SavedSqlFileAppObject.js b/packages/web/src/appobj/SavedSqlFileAppObject.js index 92017844b..891badf29 100644 --- a/packages/web/src/appobj/SavedSqlFileAppObject.js +++ b/packages/web/src/appobj/SavedSqlFileAppObject.js @@ -17,21 +17,21 @@ function Menu({ data }) { } function SavedSqlFileAppObject({ data, commonProps }) { - const { name } = data; + const { file } = data; const newQuery = useNewQuery(); const onClick = async () => { - const resp = await axios.post('files/load', { folder: 'sql', file: name }); + const resp = await axios.post('files/load', { folder: 'sql', file, format: 'text' }); newQuery({ - title: name, + title: file, // @ts-ignore initialScript: resp.data, }); }; - return ; + return ; } -SavedSqlFileAppObject.extractKey = (data) => data.name; +SavedSqlFileAppObject.extractKey = (data) => data.file; export default SavedSqlFileAppObject; diff --git a/packages/web/src/modals/SaveSqlFileModal.js b/packages/web/src/modals/SaveFileModal.js similarity index 78% rename from packages/web/src/modals/SaveSqlFileModal.js rename to packages/web/src/modals/SaveFileModal.js index e680cd5d4..572ad3e97 100644 --- a/packages/web/src/modals/SaveSqlFileModal.js +++ b/packages/web/src/modals/SaveFileModal.js @@ -9,16 +9,16 @@ import ModalContent from './ModalContent'; import ModalFooter from './ModalFooter'; // import FormikForm from '../utility/FormikForm'; -export default function SaveSqlFileModal({ storageKey, modalState, name, onSave = undefined }) { +export default function SaveFileModal({ getData, folder, format, modalState, name, onSave = undefined }) { const handleSubmit = async (values) => { const { name } = values; - await axios.post('files/save', { folder: 'sql', file: name, data: localStorage.getItem(storageKey) }); + await axios.post('files/save', { folder, file: name, data: getData(), format }); modalState.close(); if (onSave) onSave(name); }; return ( - Save SQL file + Save file
diff --git a/packages/web/src/tabs/FreeTableTab.js b/packages/web/src/tabs/FreeTableTab.js index deadf88f1..d6af083d1 100644 --- a/packages/web/src/tabs/FreeTableTab.js +++ b/packages/web/src/tabs/FreeTableTab.js @@ -17,7 +17,7 @@ export default function FreeDataTab({ archiveFolder, archiveFile, tabVisible, to const [config, setConfig] = useGridConfig(tabid); const [modelState, dispatchModel] = useUndoReducer(createFreeTableModel()); const storageKey = `tabdata_freetable_${tabid}`; - const saveSqlFileModalState = useModalState(); + const saveFileModalState = useModalState(); const setOpenedTabs = useSetOpenedTabs(); const [isLoading, setIsLoading] = React.useState(false); const [errorMessage, setErrorMessage] = React.useState(null); @@ -79,10 +79,10 @@ export default function FreeDataTab({ archiveFolder, archiveFile, tabVisible, to dispatchModel={dispatchModel} tabVisible={tabVisible} toolbarPortalRef={toolbarPortalRef} - onSave={() => saveSqlFileModalState.open()} + onSave={() => saveFileModalState.open()} /> { @@ -242,15 +242,17 @@ export default function QueryTab({ busy={busy} cancel={handleCancel} format={handleFormatCode} - save={saveSqlFileModalState.open} + save={saveFileModalState.open} isConnected={!!sessionId} kill={handleKill} />, toolbarPortalRef.current )} - localStorage.getItem(localStorageKey)} + format="text" + folder="sql" name={openedTabs.find((x) => x.tabid == tabid).title} onSave={(name) => changeTab(tabid, setOpenedTabs, (tab) => ({ ...tab, title: name }))} />