save file refactor

This commit is contained in:
Jan Prochazka
2020-12-03 12:26:40 +01:00
parent 0a3a1c9468
commit 22b2a62209
5 changed files with 32 additions and 28 deletions

View File

@@ -3,14 +3,16 @@ const path = require('path');
const { filesdir } = require('../utility/directories'); const { filesdir } = require('../utility/directories');
const socket = require('../utility/socket'); const socket = require('../utility/socket');
function serialize(folder, data) { function serialize(format, data) {
if (folder == 'sql') return data; if (format == 'text') return data;
return JSON.stringify(data); if (format == 'json') return JSON.stringify(data);
throw new Error(`Invalid format: ${format}`);
} }
function deserialize(folder, text) { function deserialize(format, text) {
if (folder == 'sql') return text; if (format == 'text') return text;
return JSON.parse(text); if (format == 'json') return JSON.parse(text);
throw new Error(`Invalid format: ${format}`);
} }
module.exports = { module.exports = {
@@ -18,7 +20,7 @@ module.exports = {
async list({ folder }) { async list({ folder }) {
const dir = path.join(filesdir(), folder); const dir = path.join(filesdir(), folder);
if (!(await fs.exists(dir))) return []; 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; return files;
}, },
@@ -29,18 +31,18 @@ module.exports = {
}, },
load_meta: 'post', 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' }); const text = await fs.readFile(path.join(filesdir(), folder, file), { encoding: 'utf-8' });
return deserialize(folder, text); return deserialize(format, text);
}, },
save_meta: 'post', save_meta: 'post',
async save({ folder, file, data }) { async save({ folder, file, data, format }) {
const dir = path.join(filesdir(), folder); const dir = path.join(filesdir(), folder);
if (!(await fs.exists(dir))) { if (!(await fs.exists(dir))) {
await fs.mkdir(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}`); socket.emitChanged(`files-changed-${folder}`);
}, },
}; };

View File

@@ -17,21 +17,21 @@ function Menu({ data }) {
} }
function SavedSqlFileAppObject({ data, commonProps }) { function SavedSqlFileAppObject({ data, commonProps }) {
const { name } = data; const { file } = data;
const newQuery = useNewQuery(); const newQuery = useNewQuery();
const onClick = async () => { 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({ newQuery({
title: name, title: file,
// @ts-ignore // @ts-ignore
initialScript: resp.data, initialScript: resp.data,
}); });
}; };
return <AppObjectCore {...commonProps} data={data} title={name} icon="img sql-file" onClick={onClick} Menu={Menu} />; return <AppObjectCore {...commonProps} data={data} title={file} icon="img sql-file" onClick={onClick} Menu={Menu} />;
} }
SavedSqlFileAppObject.extractKey = (data) => data.name; SavedSqlFileAppObject.extractKey = (data) => data.file;
export default SavedSqlFileAppObject; export default SavedSqlFileAppObject;

View File

@@ -9,16 +9,16 @@ import ModalContent from './ModalContent';
import ModalFooter from './ModalFooter'; import ModalFooter from './ModalFooter';
// import FormikForm from '../utility/FormikForm'; // 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 handleSubmit = async (values) => {
const { name } = 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(); modalState.close();
if (onSave) onSave(name); if (onSave) onSave(name);
}; };
return ( return (
<ModalBase modalState={modalState}> <ModalBase modalState={modalState}>
<ModalHeader modalState={modalState}>Save SQL file</ModalHeader> <ModalHeader modalState={modalState}>Save file</ModalHeader>
<Formik onSubmit={handleSubmit} initialValues={{ name }}> <Formik onSubmit={handleSubmit} initialValues={{ name }}>
<Form> <Form>
<ModalContent> <ModalContent>

View File

@@ -17,7 +17,7 @@ export default function FreeDataTab({ archiveFolder, archiveFile, tabVisible, to
const [config, setConfig] = useGridConfig(tabid); const [config, setConfig] = useGridConfig(tabid);
const [modelState, dispatchModel] = useUndoReducer(createFreeTableModel()); const [modelState, dispatchModel] = useUndoReducer(createFreeTableModel());
const storageKey = `tabdata_freetable_${tabid}`; const storageKey = `tabdata_freetable_${tabid}`;
const saveSqlFileModalState = useModalState(); const saveFileModalState = useModalState();
const setOpenedTabs = useSetOpenedTabs(); const setOpenedTabs = useSetOpenedTabs();
const [isLoading, setIsLoading] = React.useState(false); const [isLoading, setIsLoading] = React.useState(false);
const [errorMessage, setErrorMessage] = React.useState(null); const [errorMessage, setErrorMessage] = React.useState(null);
@@ -79,10 +79,10 @@ export default function FreeDataTab({ archiveFolder, archiveFile, tabVisible, to
dispatchModel={dispatchModel} dispatchModel={dispatchModel}
tabVisible={tabVisible} tabVisible={tabVisible}
toolbarPortalRef={toolbarPortalRef} toolbarPortalRef={toolbarPortalRef}
onSave={() => saveSqlFileModalState.open()} onSave={() => saveFileModalState.open()}
/> />
<SaveArchiveModal <SaveArchiveModal
modalState={saveSqlFileModalState} modalState={saveFileModalState}
folder={archiveFolder} folder={archiveFolder}
file={archiveFile} file={archiveFile}
onSave={handleSave} onSave={handleSave}

View File

@@ -14,7 +14,7 @@ import { VerticalSplitter } from '../widgets/Splitter';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import { changeTab } from '../utility/common'; import { changeTab } from '../utility/common';
import useSocket from '../utility/SocketProvider'; import useSocket from '../utility/SocketProvider';
import SaveSqlFileModal from '../modals/SaveSqlFileModal'; import SaveFileModal from '../modals/SaveFileModal';
import useModalState from '../modals/useModalState'; import useModalState from '../modals/useModalState';
import sqlFormatter from 'sql-formatter'; import sqlFormatter from 'sql-formatter';
import useExtensions from '../utility/useExtensions'; import useExtensions from '../utility/useExtensions';
@@ -84,7 +84,7 @@ export default function QueryTab({
const openedTabs = useOpenedTabs(); const openedTabs = useOpenedTabs();
const socket = useSocket(); const socket = useSocket();
const [busy, setBusy] = React.useState(false); const [busy, setBusy] = React.useState(false);
const saveSqlFileModalState = useModalState(); const saveFileModalState = useModalState();
const sqlFromTemplate = useSqlTemplate(sqlTemplate, { conid, database, ...other }); const sqlFromTemplate = useSqlTemplate(sqlTemplate, { conid, database, ...other });
React.useEffect(() => { React.useEffect(() => {
@@ -242,15 +242,17 @@ export default function QueryTab({
busy={busy} busy={busy}
cancel={handleCancel} cancel={handleCancel}
format={handleFormatCode} format={handleFormatCode}
save={saveSqlFileModalState.open} save={saveFileModalState.open}
isConnected={!!sessionId} isConnected={!!sessionId}
kill={handleKill} kill={handleKill}
/>, />,
toolbarPortalRef.current toolbarPortalRef.current
)} )}
<SaveSqlFileModal <SaveFileModal
modalState={saveSqlFileModalState} modalState={saveFileModalState}
storageKey={localStorageKey} getData={() => localStorage.getItem(localStorageKey)}
format="text"
folder="sql"
name={openedTabs.find((x) => x.tabid == tabid).title} name={openedTabs.find((x) => x.tabid == tabid).title}
onSave={(name) => changeTab(tabid, setOpenedTabs, (tab) => ({ ...tab, title: name }))} onSave={(name) => changeTab(tabid, setOpenedTabs, (tab) => ({ ...tab, title: name }))}
/> />