datagrid toolbar using portals

This commit is contained in:
Jan Prochazka
2020-03-30 21:18:02 +02:00
parent b929352d92
commit 72b2329c2c
7 changed files with 36 additions and 9 deletions

View File

@@ -69,10 +69,11 @@ const StausBar = styled.div`
export default function Screen() { export default function Screen() {
const currentWidget = useCurrentWidget(); const currentWidget = useCurrentWidget();
const leftPanelWidth = currentWidget ? theme.leftPanel.width : 0; const leftPanelWidth = currentWidget ? theme.leftPanel.width : 0;
const toolbarPortalRef = React.useRef();
return ( return (
<> <>
<ToolBarDiv> <ToolBarDiv>
<ToolBar /> <ToolBar toolbarPortalRef={toolbarPortalRef} />
</ToolBarDiv> </ToolBarDiv>
<IconBar> <IconBar>
<WidgetIconPanel /> <WidgetIconPanel />
@@ -86,7 +87,7 @@ export default function Screen() {
<TabsPanel></TabsPanel> <TabsPanel></TabsPanel>
</TabsPanelContainer> </TabsPanelContainer>
<BodyDiv leftPanelWidth={leftPanelWidth}> <BodyDiv leftPanelWidth={leftPanelWidth}>
<TabContent /> <TabContent toolbarPortalRef={toolbarPortalRef} />
</BodyDiv> </BodyDiv>
<StausBar></StausBar> <StausBar></StausBar>
</> </>

View File

@@ -26,7 +26,7 @@ function createTabComponent(selectedTab) {
return null; return null;
} }
export default function TabContent() { export default function TabContent({ toolbarPortalRef }) {
const files = useOpenedTabs(); const files = useOpenedTabs();
const [mountedTabs, setMountedTabs] = React.useState({}); const [mountedTabs, setMountedTabs] = React.useState({});
@@ -52,7 +52,7 @@ export default function TabContent() {
return ( return (
// @ts-ignore // @ts-ignore
<TabContainer key={tabid} tabVisible={tabVisible}> <TabContainer key={tabid} tabVisible={tabVisible}>
<TabComponent {...props} tabVisible={tabVisible} /> <TabComponent {...props} tabVisible={tabVisible} toolbarPortalRef={toolbarPortalRef} />
</TabContainer> </TabContainer>
); );
}); });

View File

@@ -1,6 +1,7 @@
import moment from 'moment'; import moment from 'moment';
import _ from 'lodash'; import _ from 'lodash';
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom';
import useFetch from '../utility/useFetch'; import useFetch from '../utility/useFetch';
import styled from 'styled-components'; import styled from 'styled-components';
import theme from '../theme'; import theme from '../theme';
@@ -39,6 +40,7 @@ import {
import { scriptToSql } from '@dbgate/sqltree'; import { scriptToSql } from '@dbgate/sqltree';
import { sleep } from '../utility/common'; import { sleep } from '../utility/common';
import { copyTextToClipboard } from '../utility/clipboard'; import { copyTextToClipboard } from '../utility/clipboard';
import DataGridToolbar from './DataGridToolbar';
const GridContainer = styled.div` const GridContainer = styled.div`
position: absolute; position: absolute;
@@ -906,6 +908,9 @@ export default function DataGridCore(props) {
engine={display.engine} engine={display.engine}
onConfirm={handleConfirmSql} onConfirm={handleConfirmSql}
/> />
{props.toolbarPortalRef &&
tabVisible &&
ReactDOM.createPortal(<DataGridToolbar reload={reload} />, props.toolbarPortalRef.current)}
</GridContainer> </GridContainer>
); );
} }

View File

@@ -0,0 +1,6 @@
import React from 'react';
import { ToolbarButton } from '../widgets/Toolbar';
export default function DataGridToolbar({ reload }) {
return <ToolbarButton onClick={reload}>Refresh</ToolbarButton>;
}

View File

@@ -7,4 +7,5 @@ export interface DataGridProps {
tabVisible?: boolean; tabVisible?: boolean;
changeSetState: { value: ChangeSet }; changeSetState: { value: ChangeSet };
dispatchChangeSet: Function; dispatchChangeSet: Function;
toolbarPortalRef: any;
} }

View File

@@ -10,7 +10,7 @@ import engines from '@dbgate/engines';
import getTableInfo from '../utility/getTableInfo'; import getTableInfo from '../utility/getTableInfo';
import useUndoReducer from '../utility/useUndoReducer'; import useUndoReducer from '../utility/useUndoReducer';
export default function TableDataTab({ conid, database, schemaName, pureName, tabVisible }) { export default function TableDataTab({ conid, database, schemaName, pureName, tabVisible, toolbarPortalRef }) {
const tableInfo = useTableInfo({ conid, database, schemaName, pureName }); const tableInfo = useTableInfo({ conid, database, schemaName, pureName });
const [config, setConfig] = React.useState(createGridConfig()); const [config, setConfig] = React.useState(createGridConfig());
const [cache, setCache] = React.useState(createGridCache()); const [cache, setCache] = React.useState(createGridCache());
@@ -40,6 +40,7 @@ export default function TableDataTab({ conid, database, schemaName, pureName, ta
tabVisible={tabVisible} tabVisible={tabVisible}
changeSetState={changeSetState} changeSetState={changeSetState}
dispatchChangeSet={dispatchChangeSet} dispatchChangeSet={dispatchChangeSet}
toolbarPortalRef={toolbarPortalRef}
/> />
); );
} }

View File

@@ -1,15 +1,17 @@
import ReactDOM from 'react-dom';
import React from 'react'; import React from 'react';
import useModalState from '../modals/useModalState'; import useModalState from '../modals/useModalState';
import ConnectionModal from '../modals/ConnectionModal'; import ConnectionModal from '../modals/ConnectionModal';
import styled from 'styled-components'; import styled from 'styled-components';
import theme from '../theme'; import theme from '../theme';
import { useOpenedTabs } from '../utility/globalState';
const ToolbarContainer = styled.div` const ToolbarContainer = styled.div`
display: flex; display: flex;
user-select: none; user-select: none;
`; `;
const ToolbarButton = styled.div` export const ToolbarButton = styled.div`
// height: ${theme.toolBar.height - 5}px; // height: ${theme.toolBar.height - 5}px;
// border: 1px solid gray; // border: 1px solid gray;
padding: 5px; padding: 5px;
@@ -22,15 +24,26 @@ const ToolbarButton = styled.div`
&:hover { &:hover {
background-color: #286090; background-color: #286090;
} }
`; `;
export default function ToolBar() { export default function ToolBar({ toolbarPortalRef }) {
const modalState = useModalState(); const modalState = useModalState();
const tabs = useOpenedTabs();
const selectedTab = tabs.find(x => x.selected);
// React.useEffect(() => {
// const node = toolbarPortalRef.current;
// if (node) {
// ReactDOM.unmountComponentAtNode(node);
// while (node.lastElementChild) {
// node.removeChild(node.lastElementChild);
// }
// }
// }, [selectedTab]);
return ( return (
<ToolbarContainer> <ToolbarContainer>
<ConnectionModal modalState={modalState} /> <ConnectionModal modalState={modalState} />
<ToolbarButton onClick={modalState.open}>Add connection</ToolbarButton> <ToolbarButton onClick={modalState.open}>Add connection</ToolbarButton>
<ToolbarContainer ref={toolbarPortalRef}></ToolbarContainer>
</ToolbarContainer> </ToolbarContainer>
); );
} }