diff --git a/packages/web/src/App.js b/packages/web/src/App.js index 0af43db1d..352bfbf80 100644 --- a/packages/web/src/App.js +++ b/packages/web/src/App.js @@ -11,6 +11,7 @@ import { } from './utility/globalState'; import { SocketProvider } from './utility/SocketProvider'; import ConnectionsPinger from './utility/ConnectionsPinger'; +import { ModalLayerProvider } from './modals/showModal'; function App() { return ( @@ -22,7 +23,9 @@ function App() { - + + + diff --git a/packages/web/src/Screen.js b/packages/web/src/Screen.js index 0e8908c74..86149a3f3 100644 --- a/packages/web/src/Screen.js +++ b/packages/web/src/Screen.js @@ -11,6 +11,7 @@ import WidgetContainer from './widgets/WidgetContainer'; import ToolBar from './widgets/Toolbar'; import StatusBar from './widgets/StatusBar'; import { useSplitterDrag, HorizontalSplitHandle } from './widgets/Splitter'; +import { ModalLayer } from './modals/showModal'; const BodyDiv = styled.div` position: fixed; @@ -132,6 +133,7 @@ export default function Screen() { + ); } diff --git a/packages/web/src/appobj/connectionAppObject.js b/packages/web/src/appobj/connectionAppObject.js index c8172a321..ecb3107f9 100644 --- a/packages/web/src/appobj/connectionAppObject.js +++ b/packages/web/src/appobj/connectionAppObject.js @@ -2,15 +2,14 @@ import _ from 'lodash'; import React from 'react'; import { getEngineIcon } from '../icons'; import { DropDownMenuItem } from '../modals/DropDownMenu'; -import showModal from '../modals/showModal'; +import useShowModal from '../modals/showModal'; import ConnectionModal from '../modals/ConnectionModal'; import axios from '../utility/axios'; import { filterName } from '@dbgate/datalib'; import ConfirmModal from '../modals/ConfirmModal'; import { useConfig } from '../utility/metadataLoaders'; -function Menu({ data, setOpenedConnections, openedConnections }) { - const config = useConfig(); +function Menu({ data, setOpenedConnections, openedConnections, config, showModal }) { const handleEdit = () => { showModal((modalState) => ); }; diff --git a/packages/web/src/datagrid/DataFilterControl.js b/packages/web/src/datagrid/DataFilterControl.js index 39356c2fe..11e1381fc 100644 --- a/packages/web/src/datagrid/DataFilterControl.js +++ b/packages/web/src/datagrid/DataFilterControl.js @@ -5,7 +5,7 @@ import styled from 'styled-components'; import keycodes from '../utility/keycodes'; import { parseFilter, createMultiLineFilter } from '@dbgate/filterparser'; import InlineButton from '../widgets/InlineButton'; -import showModal from '../modals/showModal'; +import useShowModal from '../modals/showModal'; import FilterMultipleValuesModal from '../modals/FilterMultipleValuesModal'; import SetFilterModal from '../modals/SetFilterModal'; // import { $ } from '../../Utility/jquery'; @@ -167,6 +167,7 @@ function DropDownContent({ filterType, setFilter, filterMultipleValues, openFilt } export default function DataFilterControl({ isReadOnly = false, filterType, filter, setFilter }) { + const showModal = useShowModal(); const [filterState, setFilterState] = React.useState('empty'); const setFilterText = (filter) => { setFilter(filter); diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index bf54a8da0..fc91e5aa1 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -40,7 +40,7 @@ import DataGridContextMenu from './DataGridContextMenu'; import useSocket from '../utility/SocketProvider'; import LoadingInfo from '../widgets/LoadingInfo'; import ErrorInfo from '../widgets/ErrorInfo'; -import showModal from '../modals/showModal'; +import useShowModal from '../modals/showModal'; import ErrorMessageModal from '../modals/ErrorMessageModal'; import ImportExportModal from '../modals/ImportExportModal'; @@ -249,6 +249,8 @@ export default function DataGridCore(props) { [selectedCells] ); + const showModal = useShowModal(); + const handleLoadRowCount = async () => { const rowCount = await loadRowCount(props); setLoadProps((oldLoadProps) => ({ diff --git a/packages/web/src/modals/showModal.js b/packages/web/src/modals/showModal.js index 81d27a6b4..1340cc582 100644 --- a/packages/web/src/modals/showModal.js +++ b/packages/web/src/modals/showModal.js @@ -2,16 +2,43 @@ import React from 'react'; import ReactDOM from 'react-dom'; import useModalState from './useModalState'; -function ShowModalComponent({ renderModal, container }) { +function ShowModalComponent({ renderModal, onClose }) { const modalState = useModalState(true); if (!modalState.isOpen) { - container.remove(); + onClose(); } return renderModal(modalState); } -export default function showModal(renderModal) { - const container = document.createElement('div'); - document.body.appendChild(container); - ReactDOM.render(, container); +const Context = React.createContext(null); + +export function ModalLayerProvider({ children }) { + const [modals, setModals] = React.useState([]); + return {children}; +} + +export function ModalLayer() { + const [modals, setModals] = React.useContext(Context); + return ( +
+ {modals.map((modal, index) => ( + setModals((x) => x.filter((y) => y != modal))} + /> + ))} +
+ ); +} + +export default function useShowModal() { + const [modals, setModals] = React.useContext(Context); + const showModal = (renderModal) => { + setModals([...modals, renderModal]); + }; + return showModal; + // const container = document.createElement('div'); + // document.body.appendChild(container); + // ReactDOM.render(, container); } diff --git a/packages/web/src/sqleditor/SqlEditor.js b/packages/web/src/sqleditor/SqlEditor.js index fc19b31ba..f8a074bf7 100644 --- a/packages/web/src/sqleditor/SqlEditor.js +++ b/packages/web/src/sqleditor/SqlEditor.js @@ -5,7 +5,7 @@ import useDimensions from '../utility/useDimensions'; import analyseQuerySources from './analyseQuerySources'; import keycodes from '../utility/keycodes'; import useCodeCompletion from './useCodeCompletion'; -import showModal from '../modals/showModal'; +import useShowModal from '../modals/showModal'; import InsertJoinModal from '../modals/InsertJoinModal'; import { getDatabaseInfo } from '../utility/metadataLoaders'; @@ -57,6 +57,7 @@ export default function SqlEditor({ const ownEditorRef = React.useRef(null); const currentEditorRef = editorRef || ownEditorRef; + const showModal = useShowModal(); useCodeCompletion({ conid, diff --git a/packages/web/src/utility/globalState.js b/packages/web/src/utility/globalState.js index e2fd1136c..59a1741e5 100644 --- a/packages/web/src/utility/globalState.js +++ b/packages/web/src/utility/globalState.js @@ -1,9 +1,10 @@ import _ from 'lodash'; import React from 'react'; import useStorage from './useStorage'; -import { useConnectionInfo } from './metadataLoaders'; +import { useConnectionInfo, useConfig } from './metadataLoaders'; import usePrevious from './usePrevious'; import useNewQuery from '../query/useNewQuery'; +import useShowModal from '../modals/showModal'; function createGlobalState(defaultValue) { const Context = React.createContext(null); @@ -86,6 +87,8 @@ export function useAppObjectParams() { const setSavedSqlFiles = useSetSavedSqlFiles(); const openedConnections = useOpenedConnections(); const setOpenedConnections = useSetOpenedConnections(); + const showModal = useShowModal(); + const config = useConfig(); return { setOpenedTabs, @@ -95,6 +98,8 @@ export function useAppObjectParams() { setSavedSqlFiles, openedConnections, setOpenedConnections, + config, + showModal, }; }