diff --git a/packages/web/src/icons.js b/packages/web/src/icons.js index 14bf7424e..1bdd25533 100644 --- a/packages/web/src/icons.js +++ b/packages/web/src/icons.js @@ -11,6 +11,7 @@ const iconNames = { 'icon tables': 'mdi mdi-table-multiple', 'icon favorite': 'mdi mdi-star', 'icon share': 'mdi mdi-share-variant', + 'icon add': 'mdi mdi-plus-circle', 'icon database': 'mdi mdi-database', 'icon server': 'mdi mdi-server', diff --git a/packages/web/src/widgets/Toolbar.js b/packages/web/src/widgets/Toolbar.js index b1ac0bb65..34d5bef79 100644 --- a/packages/web/src/widgets/Toolbar.js +++ b/packages/web/src/widgets/Toolbar.js @@ -1,8 +1,9 @@ import React from 'react'; import useModalState from '../modals/useModalState'; import ConnectionModal from '../modals/ConnectionModal'; +import { DropDownMenuItem } from '../modals/DropDownMenu'; import styled from 'styled-components'; -import ToolbarButton, { ToolbarButtonExternalImage } from './ToolbarButton'; +import ToolbarButton, { ToolbarButtonExternalImage, ToolbarDropDownButton } from './ToolbarButton'; import useNewQuery, { useNewQueryDesign } from '../query/useNewQuery'; import { useConfig, useFavorites } from '../utility/metadataLoaders'; import { @@ -132,25 +133,14 @@ export default function ToolBar({ toolbarPortalRef }) { {x.title} ))} - {config.runAsPortal == false && ( - - Add connection - - )} - - New Query - - {!!currentDatabase && ( - - Query Designer - - )} - - Free table editor - - - New markdown - + + {config.runAsPortal == false && Connection} + SQL query + {!!currentDatabase && Query designer} + Free table editor + Markdown page + + Import data diff --git a/packages/web/src/widgets/ToolbarButton.js b/packages/web/src/widgets/ToolbarButton.js index bbaf16396..2f0c2941b 100644 --- a/packages/web/src/widgets/ToolbarButton.js +++ b/packages/web/src/widgets/ToolbarButton.js @@ -2,6 +2,7 @@ import React from 'react'; import styled from 'styled-components'; import { FontIcon } from '../icons'; +import { useShowMenu } from '../modals/showMenu'; import dimensions from '../theme/dimensions'; import useTheme from '../theme/useTheme'; @@ -85,3 +86,32 @@ export function ToolbarButtonExternalImage({ image, onClick, disabled = undefine ); } + +export function ToolbarDropDownButton({ children, icon = undefined, text, disabled = undefined, patchY = 2 }) { + const theme = useTheme(); + const showMenu = useShowMenu(); + const buttonRef = React.useRef(null); + + return ( + { + if (disabled) return; + + const rect = buttonRef.current.getBoundingClientRect(); + showMenu(rect.left, rect.bottom, children); + }} + disabled={disabled} + > + + {icon && ( + + + + )} + {text} + + + + ); +} diff --git a/packages/web/src/widgets/WidgetColumnBar.js b/packages/web/src/widgets/WidgetColumnBar.js index 43822a54d..ee13f6096 100644 --- a/packages/web/src/widgets/WidgetColumnBar.js +++ b/packages/web/src/widgets/WidgetColumnBar.js @@ -49,7 +49,7 @@ export default function WidgetColumnBar({ children }) { const toggleCollapsed = (name) => { // skip collapse last uncollapsed item if (!childArray.find((x) => x.props.name != name && !collapsedWidgets.includes(x.props.name))) return; - + if (collapsedWidgets.includes(name)) setCollapsedWidgets(collapsedWidgets.filter((x) => x != name)); else setCollapsedWidgets([...collapsedWidgets, name]); };