Skip to content

Commit cafdcd1

Browse files
Add clear selected items button (#153)
* Add clear selected items button * Add conditional rendering and type to clear selected button * ♻️ cleanup Co-authored-by: harshzalavadiya <[email protected]>
1 parent 33bf38c commit cafdcd1

File tree

5 files changed

+34
-0
lines changed

5 files changed

+34
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export default Example;
8181
| `valueRenderer` | custom dropdown header [docs](#-custom-value-renderer) | `function` | |
8282
| `ItemRenderer` | custom dropdown option [docs](#-custom-item-renderer) | `function` | |
8383
| `ClearIcon` | Custom Clear Icon for Search | `string|function` | |
84+
| `ClearSelectedIcon` | Custom Clear Icon for Selected Items | `string|function` | |
8485

8586
## 🔍 Custom filter logic
8687

src/lib/get-string.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const strings = {
44
selectAll: "Select All",
55
search: "Search",
66
clearSearch: "Clear Search",
7+
clearSelected: "Clear Selected",
78
};
89

910
export default function getString(key: string, overrideStrings?): string {

src/lib/interfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ export interface ISelectProps {
3535
className?: string;
3636
onMenuToggle?;
3737
ClearIcon?: string | Function;
38+
ClearSelectedIcon?: string | Function;
3839
}

src/multi-select/dropdown.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import { css } from "goober";
77
import React, { useEffect, useRef, useState } from "react";
88

9+
import getString from "../lib/get-string";
10+
import Cross from "../select-panel/cross";
911
import Arrow from "./arrow";
1012
import Loading from "./loading";
1113

@@ -19,6 +21,7 @@ interface IDropdownProps {
1921
labelledBy?: string;
2022
onMenuToggle?;
2123
ArrowRenderer?;
24+
ClearSelectedIcon?;
2225
}
2326

2427
const PanelContainer = css({
@@ -65,6 +68,13 @@ const DropdownHeading = css({
6568
},
6669
});
6770

71+
const ClearSelectedButton = css({
72+
cursor: "pointer",
73+
background: "none",
74+
border: 0,
75+
padding: 0,
76+
});
77+
6878
const Dropdown = ({
6979
children,
7080
contentComponent: ContentComponent,
@@ -75,6 +85,7 @@ const Dropdown = ({
7585
labelledBy,
7686
onMenuToggle,
7787
ArrowRenderer,
88+
ClearSelectedIcon,
7889
}: IDropdownProps) => {
7990
const [expanded, setExpanded] = useState(false);
8091
const [hasFocus, setHasFocus] = useState(false);
@@ -125,6 +136,11 @@ const Dropdown = ({
125136
const toggleExpanded = () =>
126137
setExpanded(isLoading || disabled ? false : !expanded);
127138

139+
const handleClearSelected = (e) => {
140+
e.stopPropagation();
141+
contentProps["onChange"]([]);
142+
};
143+
128144
return (
129145
<div
130146
tabIndex={0}
@@ -146,6 +162,19 @@ const Dropdown = ({
146162
>
147163
<div className="dropdown-heading-value">{children}</div>
148164
{isLoading && <Loading />}
165+
{contentProps["value"].length > 0 && (
166+
<button
167+
type="button"
168+
className={`${ClearSelectedButton} clear-selected-button`}
169+
onClick={handleClearSelected}
170+
aria-label={getString(
171+
"clearSelected",
172+
contentProps["overrideStrings"]
173+
)}
174+
>
175+
{ClearSelectedIcon || <Cross />}
176+
</button>
177+
)}
149178
<FinalArrow expanded={expanded} />
150179
</div>
151180
{expanded && (

src/multi-select/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const MultiSelect = ({
4646
labelledBy,
4747
onMenuToggle,
4848
ClearIcon,
49+
ClearSelectedIcon,
4950
}: ISelectProps) => {
5051
const nvalue = value || [];
5152
return (
@@ -72,6 +73,7 @@ const MultiSelect = ({
7273
labelledBy={labelledBy}
7374
onMenuToggle={onMenuToggle}
7475
ArrowRenderer={ArrowRenderer}
76+
ClearSelectedIcon={ClearSelectedIcon}
7577
>
7678
<DropdownHeader
7779
value={nvalue}

0 commit comments

Comments
 (0)