diff --git a/packages/web/src/datagrid/ColumnManager.js b/packages/web/src/datagrid/ColumnManager.js index 8797b747c..3dfc93b09 100644 --- a/packages/web/src/datagrid/ColumnManager.js +++ b/packages/web/src/datagrid/ColumnManager.js @@ -4,6 +4,7 @@ import ColumnLabel from './ColumnLabel'; import { filterName } from '@dbgate/datalib'; import { ExpandIcon } from '../icons'; import InlineButton from '../widgets/InlineButton'; +import { ManagerInnerContainer } from './ManagerStyles'; const Wrapper = styled.div``; @@ -86,7 +87,7 @@ export default function ColumnManager(props) { const { display } = props; const [columnFilter, setColumnFilter] = React.useState(''); return ( - + <> display.hideAllColumns()}>Hide display.showAllColumns()}>Show - {display - .getColumns(columnFilter) - .filter((column) => filterName(columnFilter, column.columnName)) - .map((column) => ( - - ))} - + + {display + .getColumns(columnFilter) + .filter((column) => filterName(columnFilter, column.columnName)) + .map((column) => ( + + ))} + + ); } diff --git a/packages/web/src/datagrid/DataGrid.js b/packages/web/src/datagrid/DataGrid.js index 45c2e4d7d..05ecfed58 100644 --- a/packages/web/src/datagrid/DataGrid.js +++ b/packages/web/src/datagrid/DataGrid.js @@ -3,6 +3,17 @@ import styled from 'styled-components'; import DataGridCore from './DataGridCore'; import ColumnManager from './ColumnManager'; +import { + // SearchBoxWrapper, + // WidgetsInnerContainer, + // Input, + ManagerMainContainer, + ManagerOuterContainer1, + ManagerOuterContainer2, + WidgetTitle, +} from './ManagerStyles'; +import ReferenceManager from './ReferenceManager'; + const MainContainer = styled.div` position: absolute; left: 0; @@ -17,6 +28,11 @@ const ColumnManagerContainer = styled.div` overflow-y: scroll; `; +const LeftContainer = styled.div` + background-color: white; + display: flex; +`; + const DataGridContainer = styled.div` position: relative; flex-grow: 1; @@ -26,9 +42,22 @@ const DataGridContainer = styled.div` export default function DataGrid(props) { return ( - + + + + Columns + + + + References + + + + + + {/* - + */} diff --git a/packages/web/src/datagrid/ManagerStyles.js b/packages/web/src/datagrid/ManagerStyles.js new file mode 100644 index 000000000..63907546e --- /dev/null +++ b/packages/web/src/datagrid/ManagerStyles.js @@ -0,0 +1,50 @@ +import styled from 'styled-components'; +import theme from '../theme'; + +// export const SearchBoxWrapper = styled.div` +// display: flex; +// margin-bottom: 5px; +// `; + +export const ManagerMainContainer = styled.div` + position: relative; + display: flex; + flex-flow: column wrap; + flex: 1; + flex-direction: column; + user-select: none; +`; + +export const ManagerOuterContainer = styled.div` + flex: 1 1 0; + overflow: hidden; + position: relative; + flex-direction: column; + display: flex; +`; + +export const ManagerOuterContainer1 = styled(ManagerOuterContainer)` + flex: 0 0 60%; +`; + +export const ManagerOuterContainer2 = styled(ManagerOuterContainer)` + flex: 0 0 40%; +`; + +export const ManagerInnerContainer = styled.div` + flex: 1 1; + overflow-y: scroll; +`; + +export const Input = styled.input` + flex: 1; + min-width: 90px; +`; + +export const WidgetTitle = styled.div` + padding: 5px; + font-weight: bold; + text-transform: uppercase; + background-color: gray; + // background-color: #CEC; +`; diff --git a/packages/web/src/datagrid/ReferenceManager.js b/packages/web/src/datagrid/ReferenceManager.js new file mode 100644 index 000000000..c4579b626 --- /dev/null +++ b/packages/web/src/datagrid/ReferenceManager.js @@ -0,0 +1,78 @@ +import React from 'react'; +import styled from 'styled-components'; +import { ManagerInnerContainer } from './ManagerStyles'; +import { LinkIcon, ReferenceIcon } from '../icons'; + +const SearchBoxWrapper = styled.div` + display: flex; + margin-bottom: 5px; +`; + +const Input = styled.input` + flex: 1; + min-width: 90px; +`; + +const Header = styled.div` + font-weight: bold; +`; + +const LinkContainer = styled.div` + color: #337ab7; + margin: 5px; + &:hover { + text-decoration: underline; + } + cursor: pointer; + display: flex; +`; + +const NameContainer = styled.div` + margin-left: 5px; +`; + +function ManagerRow({ tableName, columns, Icon }) { + return ( + + + + {tableName} ({columns.map((x) => x.columnName).join(', ')}) + + + ); +} + +/** @param props {import('./types').DataGridProps} */ +export default function ReferenceManager(props) { + const [filter, setFilter] = React.useState(''); + const { display } = props; + const { baseTable } = display || {}; + const { foreignKeys } = baseTable || {}; + const { dependencies } = baseTable || {}; + + return ( + <> + + setFilter(e.target.value)} /> + + + {foreignKeys && foreignKeys.length > 0 && ( + <> +
References tables ({foreignKeys.length})
+ {foreignKeys.map((fk) => ( + + ))} + + )} + {dependencies && dependencies.length > 0 && ( + <> +
Dependend tables ({dependencies.length})
+ {dependencies.map((fk) => ( + + ))} + + )} +
+ + ); +} diff --git a/packages/web/src/widgets/DatabaseWidget.js b/packages/web/src/widgets/DatabaseWidget.js index 74697a6be..53b95287f 100644 --- a/packages/web/src/widgets/DatabaseWidget.js +++ b/packages/web/src/widgets/DatabaseWidget.js @@ -7,8 +7,21 @@ import databaseAppObject from '../appobj/databaseAppObject'; import { useSetCurrentDatabase, useCurrentDatabase, useOpenedConnections } from '../utility/globalState'; import InlineButton from './InlineButton'; import databaseObjectAppObject from '../appobj/databaseObjectAppObject'; -import { useSqlObjectList, useDatabaseList, useConnectionList, useServerStatus, useDatabaseStatus } from '../utility/metadataLoaders'; -import { SearchBoxWrapper, InnerContainer, Input, MainContainer, OuterContainer, WidgetTitle } from './WidgetStyles'; +import { + useSqlObjectList, + useDatabaseList, + useConnectionList, + useServerStatus, + useDatabaseStatus, +} from '../utility/metadataLoaders'; +import { + SearchBoxWrapper, + WidgetsInnerContainer, + Input, + WidgetsMainContainer, + WidgetsOuterContainer, + WidgetTitle, +} from './WidgetStyles'; import axios from '../utility/axios'; import LoadingInfo from './LoadingInfo'; @@ -55,14 +68,14 @@ function ConnectionList() { Refresh - + - + ); } @@ -93,7 +106,7 @@ function SqlObjectList({ conid, database }) { /> Refresh - + {status && status.name == 'pending' ? ( ) : ( @@ -104,7 +117,7 @@ function SqlObjectList({ conid, database }) { filter={filter} /> )} - + ); } @@ -122,13 +135,13 @@ function SqlObjectListWrapper() { export default function DatabaseWidget() { return ( - - + + - - + + - - + + ); } diff --git a/packages/web/src/widgets/FilesWidget.js b/packages/web/src/widgets/FilesWidget.js index 6a7532f9f..2cfedc5b3 100644 --- a/packages/web/src/widgets/FilesWidget.js +++ b/packages/web/src/widgets/FilesWidget.js @@ -5,7 +5,14 @@ import _ from 'lodash'; import { AppObjectList } from '../appobj/AppObjectList'; import { useOpenedTabs, useSavedSqlFiles } from '../utility/globalState'; import openedTabAppObject from '../appobj/openedTabAppObject'; -import { SearchBoxWrapper, InnerContainer, Input, MainContainer, OuterContainer, WidgetTitle } from './WidgetStyles'; +import { + SearchBoxWrapper, + WidgetsInnerContainer, + Input, + WidgetsMainContainer, + WidgetsOuterContainer, + WidgetTitle, +} from './WidgetStyles'; import savedSqlFileAppObject from '../appobj/savedSqlFileAppObject'; function OpenedTabsList() { @@ -14,9 +21,9 @@ function OpenedTabsList() { return ( <> Opened tabs - + - + ); } @@ -27,22 +34,22 @@ function SavedSqlFilesList() { return ( <> Saved SQL files - + - + ); } export default function FilesWidget() { return ( - - + + - - + + - - + + ); } diff --git a/packages/web/src/widgets/WidgetStyles.js b/packages/web/src/widgets/WidgetStyles.js index 5744761d6..913bab8d2 100644 --- a/packages/web/src/widgets/WidgetStyles.js +++ b/packages/web/src/widgets/WidgetStyles.js @@ -6,7 +6,7 @@ export const SearchBoxWrapper = styled.div` margin-bottom: 5px; `; -export const MainContainer = styled.div` +export const WidgetsMainContainer = styled.div` position: relative; display: flex; flex-flow: column wrap; @@ -15,7 +15,7 @@ export const MainContainer = styled.div` user-select: none; `; -export const OuterContainer = styled.div` +export const WidgetsOuterContainer = styled.div` flex: 1 1 0; overflow: hidden; width: ${theme.leftPanel.width}px; @@ -24,7 +24,7 @@ export const OuterContainer = styled.div` display: flex; `; -export const InnerContainer = styled.div` +export const WidgetsInnerContainer = styled.div` flex: 1 1; overflow: scroll; width: ${theme.leftPanel.width}px;