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 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}`);
},
};

View File

@@ -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 <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;

View File

@@ -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 (
<ModalBase modalState={modalState}>
<ModalHeader modalState={modalState}>Save SQL file</ModalHeader>
<ModalHeader modalState={modalState}>Save file</ModalHeader>
<Formik onSubmit={handleSubmit} initialValues={{ name }}>
<Form>
<ModalContent>

View File

@@ -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()}
/>
<SaveArchiveModal
modalState={saveSqlFileModalState}
modalState={saveFileModalState}
folder={archiveFolder}
file={archiveFile}
onSave={handleSave}

View File

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