mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-26 12:06:00 +00:00
datagrid toolbar using portals
This commit is contained in:
@@ -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>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
6
packages/web/src/datagrid/DataGridToolbar.js
Normal file
6
packages/web/src/datagrid/DataGridToolbar.js
Normal 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>;
|
||||||
|
}
|
||||||
@@ -7,4 +7,5 @@ export interface DataGridProps {
|
|||||||
tabVisible?: boolean;
|
tabVisible?: boolean;
|
||||||
changeSetState: { value: ChangeSet };
|
changeSetState: { value: ChangeSet };
|
||||||
dispatchChangeSet: Function;
|
dispatchChangeSet: Function;
|
||||||
|
toolbarPortalRef: any;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
|
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;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user