Skip to content

Commit 2abe726

Browse files
fix(MessageBar): Allow additional props on AttachMenu (#718)
Pass props down from MessageBar to AttachMenu so users can disable input, etc.
1 parent b7d13b3 commit 2abe726

3 files changed

Lines changed: 90 additions & 5 deletions

File tree

packages/module/src/AttachMenu/AttachMenu.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import {
1111
DropdownProps,
1212
Dropdown,
1313
DropdownToggleProps,
14-
PopperOptions
14+
PopperOptions,
15+
MenuSearchInputProps,
16+
SearchInputProps,
17+
MenuSearchProps
1518
} from '@patternfly/react-core';
1619

1720
export interface AttachMenuProps extends DropdownProps {
@@ -35,6 +38,12 @@ export interface AttachMenuProps extends DropdownProps {
3538
searchInputAriaLabel?: string;
3639
/** Toggle to be rendered */
3740
toggle: DropdownToggleProps | ((toggleRef: React.RefObject<any>) => React.ReactNode);
41+
/** Additional props passed to MenuSearch component */
42+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
43+
/** Additional props passed to MenuSearchInput component */
44+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
45+
/** Additional props passed to SearchInput component */
46+
searchInputProps?: SearchInputProps;
3847
}
3948

4049
export const AttachMenu: FunctionComponent<AttachMenuProps> = ({
@@ -49,6 +58,9 @@ export const AttachMenu: FunctionComponent<AttachMenuProps> = ({
4958
searchInputPlaceholder,
5059
searchInputAriaLabel = 'Filter menu items',
5160
toggle,
61+
menuSearchProps,
62+
menuSearchInputProps,
63+
searchInputProps,
5264
...props
5365
}: AttachMenuProps) => (
5466
<Dropdown
@@ -61,12 +73,13 @@ export const AttachMenu: FunctionComponent<AttachMenuProps> = ({
6173
onSelect={onSelect}
6274
{...props}
6375
>
64-
<MenuSearch>
65-
<MenuSearchInput>
76+
<MenuSearch {...menuSearchProps}>
77+
<MenuSearchInput {...menuSearchInputProps}>
6678
<SearchInput
6779
aria-label={searchInputAriaLabel}
6880
onChange={(_event, value) => handleTextInputChange(value)}
6981
placeholder={searchInputPlaceholder}
82+
{...searchInputProps}
7083
/>
7184
</MenuSearchInput>
7285
</MenuSearch>

packages/module/src/MessageBar/MessageBar.test.tsx

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import '@testing-library/jest-dom';
2-
import { DropdownGroup, DropdownItem, DropdownList } from '@patternfly/react-core';
2+
import {
3+
DropdownGroup,
4+
DropdownItem,
5+
DropdownList,
6+
MenuSearchInputProps,
7+
MenuSearchProps
8+
} from '@patternfly/react-core';
39
import { BellIcon, CalendarAltIcon, ClipboardIcon, CodeIcon } from '@patternfly/react-icons';
410
import { render, screen } from '@testing-library/react';
511
import userEvent from '@testing-library/user-event';
@@ -218,6 +224,57 @@ describe('Message bar', () => {
218224
await userEvent.click(attachButton);
219225
expect(attachToggleClickSpy).toHaveBeenCalledTimes(1);
220226
});
227+
it('can pass searchInputProps to search input in AttachMenu', () => {
228+
render(
229+
<MessageBar
230+
onSendMessage={jest.fn}
231+
value="test"
232+
attachMenuProps={{
233+
isAttachMenuOpen: true,
234+
setIsAttachMenuOpen: jest.fn(),
235+
onAttachMenuToggleClick: jest.fn(),
236+
onAttachMenuInputChange: jest.fn(),
237+
attachMenuItems: ATTACH_MENU_ITEMS,
238+
searchInputProps: { isDisabled: true }
239+
}}
240+
/>
241+
);
242+
expect(screen.getByRole('textbox', { name: /Filter menu items/i })).toBeDisabled();
243+
});
244+
it('can pass menuSearchProps to search input in AttachMenu', () => {
245+
render(
246+
<MessageBar
247+
onSendMessage={jest.fn}
248+
value="test"
249+
attachMenuProps={{
250+
isAttachMenuOpen: true,
251+
setIsAttachMenuOpen: jest.fn(),
252+
onAttachMenuToggleClick: jest.fn(),
253+
onAttachMenuInputChange: jest.fn(),
254+
attachMenuItems: ATTACH_MENU_ITEMS,
255+
menuSearchProps: { 'data-testid': 'menu-search' } as MenuSearchProps
256+
}}
257+
/>
258+
);
259+
expect(screen.getByTestId('menu-search')).toBeTruthy();
260+
});
261+
it('can pass menuSearchInputProps to search input in AttachMenu', () => {
262+
render(
263+
<MessageBar
264+
onSendMessage={jest.fn}
265+
value="test"
266+
attachMenuProps={{
267+
isAttachMenuOpen: true,
268+
setIsAttachMenuOpen: jest.fn(),
269+
onAttachMenuToggleClick: jest.fn(),
270+
onAttachMenuInputChange: jest.fn(),
271+
attachMenuItems: ATTACH_MENU_ITEMS,
272+
menuSearchInputProps: { 'data-testid': 'menu-search-input' } as MenuSearchInputProps
273+
}}
274+
/>
275+
);
276+
expect(screen.getByTestId('menu-search-input')).toBeTruthy();
277+
});
221278
it('can hide attach button', () => {
222279
render(<MessageBar onSendMessage={jest.fn} hasAttachButton={false} />);
223280
expect(screen.queryByRole('button', { name: 'Attach' })).toBeFalsy();

packages/module/src/MessageBar/MessageBar.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
import type { ChangeEvent, FunctionComponent, KeyboardEvent as ReactKeyboardEvent, Ref } from 'react';
22
import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
33
import { Accept, DropEvent, DropzoneOptions, FileError, FileRejection } from 'react-dropzone';
4-
import { ButtonProps, TextArea, TextAreaProps, TooltipProps } from '@patternfly/react-core';
4+
import {
5+
ButtonProps,
6+
MenuSearchInputProps,
7+
MenuSearchProps,
8+
SearchInputProps,
9+
TextArea,
10+
TextAreaProps,
11+
TooltipProps
12+
} from '@patternfly/react-core';
513

614
// Import Chatbot components
715
import SendButton from './SendButton';
@@ -30,6 +38,12 @@ export interface MessageBarWithAttachMenuProps {
3038
onAttachMenuOnOpenChangeKeys?: string[];
3139
/** Callback to change the open state of the menu. Triggered by clicking outside of the menu. */
3240
onAttachMenuOpenChange?: (isOpen: boolean) => void;
41+
/** Additional props passed to MenuSearch component in attach menu */
42+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
43+
/** Additional props passed to MenuSearchInput component in attach menu */
44+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
45+
/** Additional props passed to SearchInput component in attach menu */
46+
searchInputProps?: SearchInputProps;
3347
}
3448

3549
export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
@@ -449,6 +463,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
449463
{...(attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange })}
450464
popperProps={{ direction: 'up', distance: 8 }}
451465
searchInputPlaceholder={attachMenuProps?.attachMenuInputPlaceholder}
466+
{...attachMenuProps}
452467
/>
453468
);
454469
}

0 commit comments

Comments
 (0)