This is an automated email from the ASF dual-hosted git repository.

tai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new e89e60d  style: update +NEW button to use Button component, add 
dropdownItems prop to Button (#10422)
e89e60d is described below

commit e89e60df766de19e8effc79e8376ed0682c06ccc
Author: Moriah Kreeger <moar.r...@gmail.com>
AuthorDate: Tue Jul 28 14:29:52 2020 -0700

    style: update +NEW button to use Button component, add dropdownItems prop 
to Button (#10422)
---
 superset-frontend/src/components/Button/index.tsx  | 47 ++++++++++++++----
 superset-frontend/src/components/Menu/NewMenu.tsx  | 56 +++++++++++-----------
 .../stylesheets/less/cosmo/bootswatch.less         |  5 --
 3 files changed, 64 insertions(+), 44 deletions(-)

diff --git a/superset-frontend/src/components/Button/index.tsx 
b/superset-frontend/src/components/Button/index.tsx
index 6861fc5..24028d0 100644
--- a/superset-frontend/src/components/Button/index.tsx
+++ b/superset-frontend/src/components/Button/index.tsx
@@ -22,11 +22,18 @@ import {
   Button as BootstrapButton,
   Tooltip,
   OverlayTrigger,
+  MenuItem,
 } from 'react-bootstrap';
 import styled from '@superset-ui/style';
 
 export type OnClickHandler = React.MouseEventHandler<BootstrapButton>;
 
+export interface DropdownItemProps {
+  label: string;
+  url: string;
+  icon?: string;
+}
+
 export interface ButtonProps {
   className?: string;
   tooltip?: string;
@@ -38,6 +45,7 @@ export interface ButtonProps {
   bsSize?: BootstrapButton.ButtonProps['bsSize'];
   style?: BootstrapButton.ButtonProps['style'];
   children?: React.ReactNode;
+  dropdownItems?: DropdownItemProps[];
 }
 
 const BUTTON_WRAPPER_STYLE = { display: 'inline-block', cursor: 'not-allowed' 
};
@@ -82,23 +90,41 @@ export default function Button(props: ButtonProps) {
   };
   const tooltip = props.tooltip;
   const placement = props.placement;
+  const dropdownItems = props.dropdownItems;
   delete buttonProps.tooltip;
   delete buttonProps.placement;
 
+  if (tooltip && props.disabled) {
+    // Working around the fact that tooltips don't get triggered when buttons 
are disabled
+    // https://github.com/react-bootstrap/react-bootstrap/issues/1588
+    buttonProps.style = { pointerEvents: 'none' };
+  }
+
   let button = (
     <SupersetButton {...buttonProps}>{props.children}</SupersetButton>
   );
+
+  if (dropdownItems) {
+    button = (
+      <div style={BUTTON_WRAPPER_STYLE}>
+        <SupersetButton {...buttonProps} data-toggle="dropdown">
+          {props.children}
+        </SupersetButton>
+        <ul className="dropdown-menu">
+          {dropdownItems.map(
+            (dropdownItem: DropdownItemProps, index1: number) => (
+              <MenuItem key={`${dropdownItem.label}`} href={dropdownItem.url}>
+                <i className={`fa ${dropdownItem.icon}`} />
+                &nbsp; {dropdownItem.label}
+              </MenuItem>
+            ),
+          )}
+        </ul>
+      </div>
+    );
+  }
+
   if (tooltip) {
-    if (props.disabled) {
-      // Working around the fact that tooltips don't get triggered when 
buttons are disabled
-      // https://github.com/react-bootstrap/react-bootstrap/issues/1588
-      buttonProps.style = { pointerEvents: 'none' };
-      button = (
-        <div style={BUTTON_WRAPPER_STYLE}>
-          <SupersetButton {...buttonProps}>{props.children}</SupersetButton>
-        </div>
-      );
-    }
     return (
       <OverlayTrigger
         placement={placement}
@@ -110,5 +136,6 @@ export default function Button(props: ButtonProps) {
       </OverlayTrigger>
     );
   }
+
   return button;
 }
diff --git a/superset-frontend/src/components/Menu/NewMenu.tsx 
b/superset-frontend/src/components/Menu/NewMenu.tsx
index 1973652..055ca2e 100644
--- a/superset-frontend/src/components/Menu/NewMenu.tsx
+++ b/superset-frontend/src/components/Menu/NewMenu.tsx
@@ -17,44 +17,42 @@
  * under the License.
  */
 import React from 'react';
+import styled from '@superset-ui/style';
 import { t } from '@superset-ui/translation';
+import Button, { DropdownItemProps } from '../Button';
 
-const buttonStyle = {
-  marginTop: '12px',
-  marginRight: '30px',
-};
+const StyledButton = styled(Button)`
+  margin-top: 12px;
+  margin-right: 30px;
+`;
+
+const dropdownItems: DropdownItemProps[] = [
+  {
+    label: t('SQL Query'),
+    url: '/superset/sqllab',
+    icon: 'fa-fw fa-search',
+  },
+  {
+    label: t('Chart'),
+    url: '/chart/add',
+    icon: 'fa-fw fa-bar-chart',
+  },
+  {
+    label: t('Dashboard'),
+    url: '/dashboard/new',
+    icon: 'fa-fw fa-dashboard',
+  },
+];
 
 export default function NewMenu() {
   return (
     <li className="dropdown">
-      <button
-        type="button"
-        style={buttonStyle}
-        data-toggle="dropdown"
+      <StyledButton
         className="dropdown-toggle btn btn-sm btn-primary"
+        dropdownItems={dropdownItems}
       >
         <i className="fa fa-plus" /> New
-      </button>
-      <ul className="dropdown-menu">
-        <li>
-          <a href="/superset/sqllab">
-            <span className="fa fa-fw fa-search" />
-            {t('SQL Query')}
-          </a>
-        </li>
-        <li>
-          <a href="/chart/add">
-            <span className="fa fa-fw fa-bar-chart" />
-            {t('Chart')}
-          </a>
-        </li>
-        <li>
-          <a href="/dashboard/new/">
-            <span className="fa fa-fw fa-dashboard" />
-            {t('Dashboard')}
-          </a>
-        </li>
-      </ul>
+      </StyledButton>
     </li>
   );
 }
diff --git a/superset-frontend/stylesheets/less/cosmo/bootswatch.less 
b/superset-frontend/stylesheets/less/cosmo/bootswatch.less
index 057fa7e..f65e95a 100644
--- a/superset-frontend/stylesheets/less/cosmo/bootswatch.less
+++ b/superset-frontend/stylesheets/less/cosmo/bootswatch.less
@@ -70,11 +70,6 @@
   text-transform: uppercase;
 }
 
-.btn-default:hover {
-  color: @gray-dark;
-  background-color: @gray-bg;
-}
-
 .nav-tabs {
   .dropdown-toggle.btn,
   .btn-group.open .dropdown-toggle.btn {

Reply via email to