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]);
};