diff --git a/packages/api/src/controllers/files.js b/packages/api/src/controllers/files.js index 35399c7d2..e87bcde3e 100644 --- a/packages/api/src/controllers/files.js +++ b/packages/api/src/controllers/files.js @@ -31,6 +31,12 @@ module.exports = { socket.emitChanged(`files-changed-${folder}`); }, + rename_meta: 'post', + async rename({ folder, file, newFile }) { + await fs.rename(path.join(filesdir(), folder, file), path.join(filesdir(), folder, newFile)); + socket.emitChanged(`files-changed-${folder}`); + }, + load_meta: 'post', async load({ folder, file, format }) { const text = await fs.readFile(path.join(filesdir(), folder, file), { encoding: 'utf-8' }); diff --git a/packages/web/src/appobj/SavedFileAppObject.js b/packages/web/src/appobj/SavedFileAppObject.js index f45e94bfc..3ee42ecdf 100644 --- a/packages/web/src/appobj/SavedFileAppObject.js +++ b/packages/web/src/appobj/SavedFileAppObject.js @@ -8,14 +8,31 @@ import { openNewTab } from '../utility/common'; import { useCurrentDatabase, useSetOpenedTabs } from '../utility/globalState'; import ScriptWriter from '../impexp/ScriptWriter'; import { extractPackageName } from 'dbgate-tools'; +import useShowModal from '../modals/showModal'; +import InputTextModal from '../modals/InputTextModal'; function Menu({ data, menuExt = null }) { + const showModal = useShowModal(); const handleDelete = () => { axios.post('files/delete', data); }; + const handleRename = () => { + showModal((modalState) => ( + { + axios.post('files/rename', { ...data, newFile }); + }} + /> + )); + }; return ( <> Delete + Rename {menuExt} ); diff --git a/packages/web/src/modals/InputTextModal.js b/packages/web/src/modals/InputTextModal.js new file mode 100644 index 000000000..cd5b23245 --- /dev/null +++ b/packages/web/src/modals/InputTextModal.js @@ -0,0 +1,29 @@ +import React from 'react'; +import ModalBase from './ModalBase'; +import { FormTextField, FormSubmit, FormButton } from '../utility/forms'; +import ModalHeader from './ModalHeader'; +import ModalContent from './ModalContent'; +import ModalFooter from './ModalFooter'; +import { FormProvider } from '../utility/FormProvider'; + +export default function InputTextModal({ header, label, value, modalState, onConfirm }) { + const handleSubmit = async (values) => { + const { value } = values; + modalState.close(); + onConfirm(value); + }; + return ( + + {header} + + + + + + modalState.close()} /> + + + + + ); +}