diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts index 60598bd4e..cf03650e6 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; +import React, { ReactNode, MouseEventHandler } from 'react'; /** * A function which returns text (or marked-up text) @@ -144,6 +144,26 @@ export interface DashboardEmbedModalExtensions { onHide: () => void; } +export interface ButtonProps { + name: ReactNode; + onClick?: MouseEventHandler; + 'data-test'?: string; + buttonStyle: + | 'primary' + | 'secondary' + | 'dashed' + | 'link' + | 'warning' + | 'success' + | 'tertiary'; +} + +export interface SubMenuProps { + buttons?: Array; + name?: string | ReactNode; + activeChild?: string; +} + export type Extensions = Partial<{ 'alertsreports.header.icon': React.ComponentType; 'embedded.documentation.configuration_details': React.ComponentType; @@ -151,6 +171,7 @@ export type Extensions = Partial<{ 'embedded.documentation.url': string; 'embedded.modal': React.ComponentType; 'dashboard.nav.right': React.ComponentType; + 'home.submenu': React.ComponentType; 'navbar.right-menu.item.icon': React.ComponentType; 'navbar.right': React.ComponentType; 'report-modal.dropdown.item.icon': React.ComponentType; diff --git a/superset-frontend/src/pages/Home/Home.test.tsx b/superset-frontend/src/pages/Home/Home.test.tsx index 8de33f323..9a83e4183 100644 --- a/superset-frontend/src/pages/Home/Home.test.tsx +++ b/superset-frontend/src/pages/Home/Home.test.tsx @@ -255,3 +255,19 @@ test('should render an extension component if one is supplied', () => { screen.getByText('welcome.banner extension component'), ).toBeInTheDocument(); }); + +test('should render a submenu extension component if one is supplied', () => { + const extensionsRegistry = getExtensionsRegistry(); + + extensionsRegistry.set('home.submenu', () => <>submenu extension); + + setupExtensions(); + + render( + + + , + ); + + expect(screen.getByText('submenu extension')).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/pages/Home/index.tsx b/superset-frontend/src/pages/Home/index.tsx index 231411117..e6682ee92 100644 --- a/superset-frontend/src/pages/Home/index.tsx +++ b/superset-frontend/src/pages/Home/index.tsx @@ -186,6 +186,7 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { setItem(LocalStorageKeys.HomepageCollapseState, state); }; + const SubmenuExtension = extensionsRegistry.get('home.submenu'); const WelcomeMessageExtension = extensionsRegistry.get('welcome.message'); const WelcomeTopExtension = extensionsRegistry.get('welcome.banner'); const WelcomeMainExtension = extensionsRegistry.get( @@ -352,7 +353,11 @@ function Welcome({ user, addDangerToast }: WelcomeProps) { return ( <> - + {SubmenuExtension ? ( + + ) : ( + + )} {WelcomeMessageExtension && } {WelcomeTopExtension && }