diff --git a/packages/compass-assistant/src/compass-assistant-drawer.tsx b/packages/compass-assistant/src/compass-assistant-drawer.tsx index c61af06e546..05831630f89 100644 --- a/packages/compass-assistant/src/compass-assistant-drawer.tsx +++ b/packages/compass-assistant/src/compass-assistant-drawer.tsx @@ -3,11 +3,13 @@ import { Badge, css, DrawerSection, + GuideCue, Icon, IconButton, showConfirmation, spacing, } from '@mongodb-js/compass-components'; +import { type IconButtonPropsWithoutChildren } from '@mongodb-js/compass-components/src/components/toolbar'; import { AssistantChat } from './components/assistant-chat'; import { ASSISTANT_DRAWER_ID, @@ -35,9 +37,10 @@ const assistantTitleTextStyles = css({ * it's within an AssistantProvider. */ export const CompassAssistantDrawer: React.FunctionComponent<{ + appName: string; autoOpen?: boolean; hasNonGenuineConnections?: boolean; -}> = ({ autoOpen, hasNonGenuineConnections = false }) => { +}> = ({ appName, autoOpen, hasNonGenuineConnections = false }) => { const chat = useContext(AssistantContext); const { clearChat } = useContext(AssistantActionsContext); @@ -90,7 +93,28 @@ export const CompassAssistantDrawer: React.FunctionComponent<{ } label="MongoDB Assistant" - glyph="Sparkle" + glyph={({ + buttonProps, + }: { + buttonProps: IconButtonPropsWithoutChildren; + }) => ( + + cueId="assistant-drawer" + title="Introducing MongoDB Assistant" + description={`AI-powered assistant to intelligently guide you through your database tasks. Get expert MongoDB help and streamline your workflow directly within ${appName}`} + buttonText="Got it" + onPrimaryButtonClick={() => {}} + tooltipAlign="left" + tooltipJustify="start" + trigger={({ ref: guideCueRef }) => { + return ( + + + + ); + }} + /> + )} autoOpen={autoOpen} > - {toolbarData?.map((toolbarItem) => ( + {toolbarData?.map((toolbarItem, index) => ( ) => { diff --git a/packages/compass-components/src/components/toolbar/index.ts b/packages/compass-components/src/components/toolbar/index.ts index db8b53d9ee6..35fc67f8662 100644 --- a/packages/compass-components/src/components/toolbar/index.ts +++ b/packages/compass-components/src/components/toolbar/index.ts @@ -4,4 +4,5 @@ export { ToolbarIconButton, type ToolbarIconButtonProps, } from './toolbar-icon-button'; +export { type IconButtonPropsWithoutChildren } from './toolbar-icon-button/toolbar-icon-button.types'; export { DEFAULT_LGID_ROOT, getLgIds, type GetLgIdsReturnType } from './utils'; diff --git a/packages/compass-components/src/components/toolbar/toolbar-icon-button/index.ts b/packages/compass-components/src/components/toolbar/toolbar-icon-button/index.ts index ed80f67b197..405e6e40bf7 100644 --- a/packages/compass-components/src/components/toolbar/toolbar-icon-button/index.ts +++ b/packages/compass-components/src/components/toolbar/toolbar-icon-button/index.ts @@ -1,2 +1,5 @@ export { ToolbarIconButton } from './toolbar-icon-button'; -export { type ToolbarIconButtonProps } from './toolbar-icon-button.types'; +export { + type ToolbarIconButtonProps, + type IconButtonPropsWithoutChildren, +} from './toolbar-icon-button.types'; diff --git a/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.tsx b/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.tsx index a4015541e6c..593ec89050a 100644 --- a/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.tsx +++ b/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.tsx @@ -1,4 +1,4 @@ -import React, { type ComponentPropsWithoutRef, useEffect } from 'react'; +import React, { useEffect } from 'react'; import { useDescendant } from '@leafygreen-ui/descendants'; import Icon from '@leafygreen-ui/icon'; @@ -13,7 +13,19 @@ import { getIconButtonStyles, triggerStyles, } from './toolbar-icon-button.styles'; -import { type ToolbarIconButtonProps } from './toolbar-icon-button.types'; +import { + type IconButtonPropsWithoutChildren, + type ToolbarIconButtonProps, +} from './toolbar-icon-button.types'; + +type IconButtonProps = Omit< + React.ComponentProps, + 'children' +> & { + 'data-testid': string; + 'data-lgid': string; + 'data-active': boolean; +}; export const ToolbarIconButton = React.forwardRef< HTMLButtonElement, @@ -60,6 +72,15 @@ export const ToolbarIconButton = React.forwardRef< if (isFocusable && shouldFocus) ref.current?.focus(); }, [isFocusable, ref, shouldFocus]); + const renderButton = + typeof glyph === 'function' + ? glyph + : ({ buttonProps }: { buttonProps: IconButtonProps }) => ( + + + + ); + return ( - ) => - handleOnIconButtonClick(event, index, onClick) - } - disabled={disabled} - data-testid={`${lgIds.iconButton}-${index}`} - data-lgid={`${lgIds.iconButton}-${index}`} - data-active={active} - ref={ref} - {...(rest as ComponentPropsWithoutRef<'button'>)} - > - - + {renderButton({ + buttonProps: { + 'aria-label': ariaLabel || getNodeTextContent(label), + active: active, + className: getIconButtonStyles({ + theme, + active, + disabled, + className, + }), + tabIndex: isFocusable ? 0 : -1, + onClick: (event: React.MouseEvent) => + handleOnIconButtonClick(event, index, onClick), + disabled: disabled, + 'data-testid': `${lgIds.iconButton}-${index}`, + 'data-lgid': `${lgIds.iconButton}-${index}`, + 'data-active': active, + ref: ref, + ...rest, + } as IconButtonPropsWithoutChildren, + })} } > diff --git a/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.types.ts b/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.types.ts index 89e3803418d..85199516173 100644 --- a/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.types.ts +++ b/packages/compass-components/src/components/toolbar/toolbar-icon-button/toolbar-icon-button.types.ts @@ -1,5 +1,6 @@ import type { GlyphName } from '@leafygreen-ui/icon'; import type { BaseIconButtonProps as IconButtonProps } from '@leafygreen-ui/icon-button'; +import type IconButton from '@leafygreen-ui/icon-button'; type ButtonProps = Omit< IconButtonProps, @@ -13,11 +14,27 @@ type ButtonProps = Omit< | 'onClick' >; +export type IconButtonPropsWithoutChildren = Omit< + React.ComponentProps, + 'children' +> & { + 'data-testid': string; + 'data-lgid': string; + 'data-active': boolean; + 'aria-labelledby': string; +}; + export interface ToolbarIconButtonProps extends ButtonProps { /** * The LG Icon that will render in the button */ - glyph: GlyphName; + glyph: + | GlyphName + | (({ + buttonProps, + }: { + buttonProps: IconButtonPropsWithoutChildren; + }) => React.ReactNode); /** * The text that will render in the tooltip on hover diff --git a/packages/compass-web/src/compass-assistant-drawer.tsx b/packages/compass-web/src/compass-assistant-drawer.tsx index b09ac7683c0..bae915fbe71 100644 --- a/packages/compass-web/src/compass-assistant-drawer.tsx +++ b/packages/compass-web/src/compass-assistant-drawer.tsx @@ -6,7 +6,11 @@ import { CompassAssistantDrawer } from '@mongodb-js/compass-assistant'; // TODO(COMPASS-7830): This is a temporary solution to pass the // hasNonGenuineConnections prop to the CompassAssistantDrawer as otherwise // we end up with a circular dependency. -export function CompassAssistantDrawerWithConnections() { +export function CompassAssistantDrawerWithConnections({ + appName, +}: { + appName: string; +}) { // Check for non-genuine connections const activeConnectionIds = useConnectionIds( (conn) => @@ -15,6 +19,7 @@ export function CompassAssistantDrawerWithConnections() { ); return ( 0} /> ); diff --git a/packages/compass-web/src/entrypoint.tsx b/packages/compass-web/src/entrypoint.tsx index a762d03b774..a734e2f74ac 100644 --- a/packages/compass-web/src/entrypoint.tsx +++ b/packages/compass-web/src/entrypoint.tsx @@ -228,7 +228,7 @@ function CompassWorkspace({ - + ); }} diff --git a/packages/compass/src/app/components/compass-assistant-drawer.tsx b/packages/compass/src/app/components/compass-assistant-drawer.tsx index b09ac7683c0..bae915fbe71 100644 --- a/packages/compass/src/app/components/compass-assistant-drawer.tsx +++ b/packages/compass/src/app/components/compass-assistant-drawer.tsx @@ -6,7 +6,11 @@ import { CompassAssistantDrawer } from '@mongodb-js/compass-assistant'; // TODO(COMPASS-7830): This is a temporary solution to pass the // hasNonGenuineConnections prop to the CompassAssistantDrawer as otherwise // we end up with a circular dependency. -export function CompassAssistantDrawerWithConnections() { +export function CompassAssistantDrawerWithConnections({ + appName, +}: { + appName: string; +}) { // Check for non-genuine connections const activeConnectionIds = useConnectionIds( (conn) => @@ -15,6 +19,7 @@ export function CompassAssistantDrawerWithConnections() { ); return ( 0} /> ); diff --git a/packages/compass/src/app/components/workspace.tsx b/packages/compass/src/app/components/workspace.tsx index e53a87fe1ae..fd534d73401 100644 --- a/packages/compass/src/app/components/workspace.tsx +++ b/packages/compass/src/app/components/workspace.tsx @@ -112,7 +112,7 @@ export default function Workspace({ - + )} >