modal refactor

This commit is contained in:
Jan Prochazka
2020-06-04 20:40:24 +02:00
parent 35edad85c4
commit f03a8c258a
8 changed files with 54 additions and 14 deletions

View File

@@ -11,6 +11,7 @@ import {
} from './utility/globalState'; } from './utility/globalState';
import { SocketProvider } from './utility/SocketProvider'; import { SocketProvider } from './utility/SocketProvider';
import ConnectionsPinger from './utility/ConnectionsPinger'; import ConnectionsPinger from './utility/ConnectionsPinger';
import { ModalLayerProvider } from './modals/showModal';
function App() { function App() {
return ( return (
@@ -22,7 +23,9 @@ function App() {
<OpenedConnectionsProvider> <OpenedConnectionsProvider>
<LeftPanelWidthProvider> <LeftPanelWidthProvider>
<ConnectionsPinger> <ConnectionsPinger>
<ModalLayerProvider>
<Screen /> <Screen />
</ModalLayerProvider>
</ConnectionsPinger> </ConnectionsPinger>
</LeftPanelWidthProvider> </LeftPanelWidthProvider>
</OpenedConnectionsProvider> </OpenedConnectionsProvider>

View File

@@ -11,6 +11,7 @@ import WidgetContainer from './widgets/WidgetContainer';
import ToolBar from './widgets/Toolbar'; import ToolBar from './widgets/Toolbar';
import StatusBar from './widgets/StatusBar'; import StatusBar from './widgets/StatusBar';
import { useSplitterDrag, HorizontalSplitHandle } from './widgets/Splitter'; import { useSplitterDrag, HorizontalSplitHandle } from './widgets/Splitter';
import { ModalLayer } from './modals/showModal';
const BodyDiv = styled.div` const BodyDiv = styled.div`
position: fixed; position: fixed;
@@ -132,6 +133,7 @@ export default function Screen() {
<StausBarContainer> <StausBarContainer>
<StatusBar /> <StatusBar />
</StausBarContainer> </StausBarContainer>
<ModalLayer />
</> </>
); );
} }

View File

@@ -2,15 +2,14 @@ import _ from 'lodash';
import React from 'react'; import React from 'react';
import { getEngineIcon } from '../icons'; import { getEngineIcon } from '../icons';
import { DropDownMenuItem } from '../modals/DropDownMenu'; import { DropDownMenuItem } from '../modals/DropDownMenu';
import showModal from '../modals/showModal'; import useShowModal from '../modals/showModal';
import ConnectionModal from '../modals/ConnectionModal'; import ConnectionModal from '../modals/ConnectionModal';
import axios from '../utility/axios'; import axios from '../utility/axios';
import { filterName } from '@dbgate/datalib'; import { filterName } from '@dbgate/datalib';
import ConfirmModal from '../modals/ConfirmModal'; import ConfirmModal from '../modals/ConfirmModal';
import { useConfig } from '../utility/metadataLoaders'; import { useConfig } from '../utility/metadataLoaders';
function Menu({ data, setOpenedConnections, openedConnections }) { function Menu({ data, setOpenedConnections, openedConnections, config, showModal }) {
const config = useConfig();
const handleEdit = () => { const handleEdit = () => {
showModal((modalState) => <ConnectionModal modalState={modalState} connection={data} />); showModal((modalState) => <ConnectionModal modalState={modalState} connection={data} />);
}; };

View File

@@ -5,7 +5,7 @@ import styled from 'styled-components';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import { parseFilter, createMultiLineFilter } from '@dbgate/filterparser'; import { parseFilter, createMultiLineFilter } from '@dbgate/filterparser';
import InlineButton from '../widgets/InlineButton'; import InlineButton from '../widgets/InlineButton';
import showModal from '../modals/showModal'; import useShowModal from '../modals/showModal';
import FilterMultipleValuesModal from '../modals/FilterMultipleValuesModal'; import FilterMultipleValuesModal from '../modals/FilterMultipleValuesModal';
import SetFilterModal from '../modals/SetFilterModal'; import SetFilterModal from '../modals/SetFilterModal';
// import { $ } from '../../Utility/jquery'; // import { $ } from '../../Utility/jquery';
@@ -167,6 +167,7 @@ function DropDownContent({ filterType, setFilter, filterMultipleValues, openFilt
} }
export default function DataFilterControl({ isReadOnly = false, filterType, filter, setFilter }) { export default function DataFilterControl({ isReadOnly = false, filterType, filter, setFilter }) {
const showModal = useShowModal();
const [filterState, setFilterState] = React.useState('empty'); const [filterState, setFilterState] = React.useState('empty');
const setFilterText = (filter) => { const setFilterText = (filter) => {
setFilter(filter); setFilter(filter);

View File

@@ -40,7 +40,7 @@ import DataGridContextMenu from './DataGridContextMenu';
import useSocket from '../utility/SocketProvider'; import useSocket from '../utility/SocketProvider';
import LoadingInfo from '../widgets/LoadingInfo'; import LoadingInfo from '../widgets/LoadingInfo';
import ErrorInfo from '../widgets/ErrorInfo'; import ErrorInfo from '../widgets/ErrorInfo';
import showModal from '../modals/showModal'; import useShowModal from '../modals/showModal';
import ErrorMessageModal from '../modals/ErrorMessageModal'; import ErrorMessageModal from '../modals/ErrorMessageModal';
import ImportExportModal from '../modals/ImportExportModal'; import ImportExportModal from '../modals/ImportExportModal';
@@ -249,6 +249,8 @@ export default function DataGridCore(props) {
[selectedCells] [selectedCells]
); );
const showModal = useShowModal();
const handleLoadRowCount = async () => { const handleLoadRowCount = async () => {
const rowCount = await loadRowCount(props); const rowCount = await loadRowCount(props);
setLoadProps((oldLoadProps) => ({ setLoadProps((oldLoadProps) => ({

View File

@@ -2,16 +2,43 @@ import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import useModalState from './useModalState'; import useModalState from './useModalState';
function ShowModalComponent({ renderModal, container }) { function ShowModalComponent({ renderModal, onClose }) {
const modalState = useModalState(true); const modalState = useModalState(true);
if (!modalState.isOpen) { if (!modalState.isOpen) {
container.remove(); onClose();
} }
return renderModal(modalState); return renderModal(modalState);
} }
export default function showModal(renderModal) { const Context = React.createContext(null);
const container = document.createElement('div');
document.body.appendChild(container); export function ModalLayerProvider({ children }) {
ReactDOM.render(<ShowModalComponent renderModal={renderModal} container={container} />, container); const [modals, setModals] = React.useState([]);
return <Context.Provider value={[modals, setModals]}>{children}</Context.Provider>;
}
export function ModalLayer() {
const [modals, setModals] = React.useContext(Context);
return (
<div>
{modals.map((modal, index) => (
<ShowModalComponent
key={index}
renderModal={modal}
onClose={() => setModals((x) => x.filter((y) => y != modal))}
/>
))}
</div>
);
}
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(<ShowModalComponent renderModal={renderModal} container={container} />, container);
} }

View File

@@ -5,7 +5,7 @@ import useDimensions from '../utility/useDimensions';
import analyseQuerySources from './analyseQuerySources'; import analyseQuerySources from './analyseQuerySources';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import useCodeCompletion from './useCodeCompletion'; import useCodeCompletion from './useCodeCompletion';
import showModal from '../modals/showModal'; import useShowModal from '../modals/showModal';
import InsertJoinModal from '../modals/InsertJoinModal'; import InsertJoinModal from '../modals/InsertJoinModal';
import { getDatabaseInfo } from '../utility/metadataLoaders'; import { getDatabaseInfo } from '../utility/metadataLoaders';
@@ -57,6 +57,7 @@ export default function SqlEditor({
const ownEditorRef = React.useRef(null); const ownEditorRef = React.useRef(null);
const currentEditorRef = editorRef || ownEditorRef; const currentEditorRef = editorRef || ownEditorRef;
const showModal = useShowModal();
useCodeCompletion({ useCodeCompletion({
conid, conid,

View File

@@ -1,9 +1,10 @@
import _ from 'lodash'; import _ from 'lodash';
import React from 'react'; import React from 'react';
import useStorage from './useStorage'; import useStorage from './useStorage';
import { useConnectionInfo } from './metadataLoaders'; import { useConnectionInfo, useConfig } from './metadataLoaders';
import usePrevious from './usePrevious'; import usePrevious from './usePrevious';
import useNewQuery from '../query/useNewQuery'; import useNewQuery from '../query/useNewQuery';
import useShowModal from '../modals/showModal';
function createGlobalState(defaultValue) { function createGlobalState(defaultValue) {
const Context = React.createContext(null); const Context = React.createContext(null);
@@ -86,6 +87,8 @@ export function useAppObjectParams() {
const setSavedSqlFiles = useSetSavedSqlFiles(); const setSavedSqlFiles = useSetSavedSqlFiles();
const openedConnections = useOpenedConnections(); const openedConnections = useOpenedConnections();
const setOpenedConnections = useSetOpenedConnections(); const setOpenedConnections = useSetOpenedConnections();
const showModal = useShowModal();
const config = useConfig();
return { return {
setOpenedTabs, setOpenedTabs,
@@ -95,6 +98,8 @@ export function useAppObjectParams() {
setSavedSqlFiles, setSavedSqlFiles,
openedConnections, openedConnections,
setOpenedConnections, setOpenedConnections,
config,
showModal,
}; };
} }