Skip to content

Commit 2cd551d

Browse files
authored
fix: searchbox cta warnings in form (#1368)
1 parent 0b7a355 commit 2cd551d

5 files changed

Lines changed: 69 additions & 5 deletions

File tree

src/components/CustomSelect/CustomSelectDropdown/__snapshots__/CustomSelectDropdown.test.tsx.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`CustomSelectDropdown renders 1`] = `
44
<div>
@@ -32,6 +32,7 @@ exports[`CustomSelectDropdown renders 1`] = `
3232
/>
3333
<button
3434
class="p-search-box__button"
35+
type="submit"
3536
>
3637
<i
3738
class="p-icon--search"

src/components/MultiSelect/MultiSelect.test.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,3 +432,36 @@ it("can add additional classes to help", () => {
432432
"additional-help-text-class",
433433
);
434434
});
435+
436+
it("can add custom classNames to dropdown (search variant)", async () => {
437+
render(
438+
<MultiSelect
439+
variant="search"
440+
items={items}
441+
dropdownClassName="custom-dropdown-class"
442+
inputClassName="custom-input-class"
443+
footerClassName="custom-footer-class"
444+
/>,
445+
);
446+
const input = screen.getByRole("combobox");
447+
expect(input.closest(".multi-select__input")).toHaveClass(
448+
"custom-input-class",
449+
);
450+
451+
await userEvent.click(input);
452+
expect(document.querySelector(".multi-select__dropdown")).toHaveClass(
453+
"custom-dropdown-class",
454+
);
455+
expect(document.querySelector(".multi-select__footer")).toHaveClass(
456+
"custom-footer-class",
457+
);
458+
});
459+
460+
it("can change search button type to 'button'", async () => {
461+
render(
462+
<MultiSelect variant="search" items={items} searchButtonType="button" />,
463+
);
464+
await userEvent.click(screen.getByRole("combobox"));
465+
const searchButton = screen.getByRole("button", { name: /search/i });
466+
expect(searchButton).toHaveAttribute("type", "button");
467+
});

src/components/MultiSelect/MultiSelect.tsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ export type MultiSelectProps = {
3131
renderItem?: (item: MultiSelectItem) => ReactNode;
3232
dropdownHeader?: ReactNode;
3333
dropdownFooter?: ReactNode;
34+
footerClassName?: string;
35+
inputClassName?: string;
36+
dropdownClassName?: string;
3437
emptyState?: ReactNode;
3538
emptyMessage?: string;
3639
showDropdownFooter?: boolean;
@@ -42,6 +45,7 @@ export type MultiSelectProps = {
4245
onSearchChange?: (value: string) => void;
4346
onOpen?: () => void;
4447
onClose?: () => void;
48+
searchButtonType?: "submit" | "button";
4549
};
4650

4751
type ValueSet = Set<MultiSelectItem["value"]>;
@@ -59,6 +63,8 @@ type MultiSelectDropdownProps = {
5963
onDeselectItem?: (item: MultiSelectItem) => void;
6064
onSelectItem?: (item: MultiSelectItem) => void;
6165
footer?: ReactNode;
66+
footerClassName?: string;
67+
dropdownClassName?: string;
6268
emptyState?: ReactNode;
6369
emptyMessage?: string;
6470
groupFn?: GroupFn;
@@ -105,6 +111,8 @@ export const MultiSelectDropdown: React.FC<MultiSelectDropdownProps> = ({
105111
onDeselectItem,
106112
isOpen,
107113
footer,
114+
dropdownClassName,
115+
footerClassName,
108116
emptyState,
109117
emptyMessage,
110118
sortFn = sortAlphabetically,
@@ -155,7 +163,11 @@ export const MultiSelectDropdown: React.FC<MultiSelectDropdownProps> = ({
155163

156164
return (
157165
<FadeInDown isVisible={isOpen}>
158-
<div className="multi-select__dropdown" role="listbox" {...props}>
166+
<div
167+
className={classNames("multi-select__dropdown", dropdownClassName)}
168+
role="listbox"
169+
{...props}
170+
>
159171
{header ? header : null}
160172
{hasItems
161173
? groupedItems.map(({ group, items }) => (
@@ -193,7 +205,11 @@ export const MultiSelectDropdown: React.FC<MultiSelectDropdownProps> = ({
193205
(emptyMessage ? (
194206
<p className="multi-select__empty-state">{emptyMessage}</p>
195207
) : null))}
196-
{footer ? <div className="multi-select__footer">{footer}</div> : null}
208+
{footer ? (
209+
<div className={classNames("multi-select__footer", footerClassName)}>
210+
{footer}
211+
</div>
212+
) : null}
197213
</div>
198214
</FadeInDown>
199215
);
@@ -219,8 +235,12 @@ export const MultiSelect: React.FC<MultiSelectProps> = ({
219235
disabledItems = [],
220236
dropdownHeader,
221237
dropdownFooter,
238+
footerClassName,
239+
dropdownClassName,
240+
inputClassName,
222241
emptyState,
223242
emptyMessage,
243+
searchButtonType = "submit",
224244
showDropdownFooter = true,
225245
variant = "search",
226246
scrollOverflow = false,
@@ -355,7 +375,8 @@ export const MultiSelect: React.FC<MultiSelectProps> = ({
355375
required={required}
356376
type="text"
357377
value={filter}
358-
className="multi-select__input"
378+
searchButtonType={searchButtonType}
379+
className={classNames("multi-select__input", inputClassName)}
359380
/>
360381
) : (
361382
<button
@@ -414,6 +435,8 @@ export const MultiSelect: React.FC<MultiSelectProps> = ({
414435
onSelectItem={onSelectItem}
415436
onDeselectItem={onDeselectItem}
416437
footer={footer}
438+
footerClassName={footerClassName}
439+
dropdownClassName={dropdownClassName}
417440
emptyState={emptyState}
418441
emptyMessage={emptyMessage}
419442
sortFn={isSortedAlphabetically ? sortAlphabetically : () => 0}

src/components/SearchBox/SearchBox.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ export type Props = PropsWithSpread<
4444
* A search input placeholder message.
4545
*/
4646
placeholder?: string;
47+
/**
48+
* Whether the search button should be a button or submit type.
49+
*/
50+
searchButtonType?: "submit" | "button";
4751
/**
4852
* Whether the search input should lose focus when searching.
4953
*/
@@ -77,6 +81,7 @@ const SearchBox = React.forwardRef<HTMLInputElement, Props>(
7781
onChange,
7882
onSearch,
7983
onClear,
84+
searchButtonType = "submit",
8085
placeholder = "Search",
8186
shouldBlurOnSearch = true,
8287
shouldRefocusAfterReset,
@@ -159,6 +164,7 @@ const SearchBox = React.forwardRef<HTMLInputElement, Props>(
159164
className="p-search-box__button"
160165
disabled={disabled}
161166
onClick={triggerSearch}
167+
type={searchButtonType}
162168
>
163169
<Icon name="search">{Label.Search}</Icon>
164170
</button>

src/components/SearchBox/__snapshots__/SearchBox.test.tsx.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`SearchBox renders 1`] = `
44
<div
@@ -20,6 +20,7 @@ exports[`SearchBox renders 1`] = `
2020
/>
2121
<button
2222
class="p-search-box__button"
23+
type="submit"
2324
>
2425
<i
2526
class="p-icon--search"

0 commit comments

Comments
 (0)