1
1
"use client" ;
2
2
import React from "react" ;
3
3
import styles from "./MultiSelectSearch.module.css" ;
4
- import { Icon } from "../Icon/Icon" ;
5
4
import { classnames } from "../../utils/utils" ;
6
- import { Button } from "../../index" ;
5
+ import { Button , Icon } from "../../index" ;
7
6
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" ;
8
7
import {
9
8
faCaretDown ,
@@ -12,19 +11,17 @@ import {
12
11
} from "@fortawesome/pro-solid-svg-icons" ;
13
12
import { isNode } from "../../utils/type_guards" ;
14
13
15
- type Option = {
14
+ export type MultiSelectSearchOption = {
16
15
label : string ;
17
16
value : string ;
18
17
} ;
19
18
type Props = {
20
- options : Option [ ] ;
21
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
- value : Option [ ] ;
23
- onChange : ( v : Option [ ] ) => void ;
19
+ options : MultiSelectSearchOption [ ] ;
20
+ value : MultiSelectSearchOption [ ] ;
21
+ onChange : ( v : MultiSelectSearchOption [ ] ) => void ;
24
22
onBlur : ( ) => void ;
25
23
// TODO: Implement disabled state
26
24
disabled ?: boolean ;
27
- name : string ;
28
25
placeholder ?: string ;
29
26
color ?: "red" | "green" ;
30
27
} ;
@@ -35,22 +32,21 @@ type Props = {
35
32
*/
36
33
export const MultiSelectSearch = React . forwardRef < HTMLInputElement , Props > (
37
34
function MultiSelectSearch ( props , ref ) {
38
- const { name, options, value, onChange, onBlur, placeholder, color } =
39
- props ;
35
+ const { options, value, onChange, onBlur, placeholder, color } = props ;
40
36
const menuRef = React . useRef < HTMLDivElement | null > ( null ) ;
41
37
const inputRef = React . useRef < HTMLInputElement | null > ( null ) ;
42
38
43
39
const [ isVisible , setIsVisible ] = React . useState ( false ) ;
44
40
const [ search , setSearch ] = React . useState ( "" ) ;
45
41
const [ filteredOptions , setFilteredOptions ] = React . useState ( options ) ;
46
42
47
- function add ( incomingOption : Option ) {
43
+ function add ( incomingOption : MultiSelectSearchOption ) {
48
44
if ( ! value . some ( ( option ) => option . value === incomingOption . value ) ) {
49
45
onChange ( [ ...value , incomingOption ] ) ;
50
46
}
51
47
}
52
48
53
- function remove ( incomingOption : Option ) {
49
+ function remove ( incomingOption : MultiSelectSearchOption ) {
54
50
onChange ( value . filter ( ( option ) => option . value !== incomingOption . value ) ) ;
55
51
}
56
52
@@ -89,7 +85,7 @@ export const MultiSelectSearch = React.forwardRef<HTMLInputElement, Props>(
89
85
90
86
return (
91
87
< div className = { styles . root } ref = { ref } >
92
- < div className = { styles . value } >
88
+ < div className = { styles . selected } >
93
89
{ value . map ( ( option ) => {
94
90
return (
95
91
< Button . Root
@@ -109,16 +105,15 @@ export const MultiSelectSearch = React.forwardRef<HTMLInputElement, Props>(
109
105
< div
110
106
className = { styles . search }
111
107
onFocus = { ( e ) => {
112
- e . stopPropagation ( ) ;
113
108
inputRef . current && inputRef . current . focus ( ) ;
109
+ e . stopPropagation ( ) ;
114
110
} }
115
111
role = "button"
116
112
tabIndex = { 0 }
117
113
ref = { menuRef }
118
114
>
119
115
< div className = { styles . inputContainer } data-color = { color } >
120
116
< input
121
- name = { name }
122
117
className = { styles . input }
123
118
value = { search }
124
119
data-color = { color }
@@ -129,10 +124,10 @@ export const MultiSelectSearch = React.forwardRef<HTMLInputElement, Props>(
129
124
/>
130
125
< button
131
126
onClick = { ( e ) => {
132
- e . stopPropagation ( ) ;
133
127
setSearch ( "" ) ;
128
+ e . stopPropagation ( ) ;
134
129
} }
135
- className = { styles . removeAllButton }
130
+ className = { styles . clearSearch }
136
131
>
137
132
< Icon inline >
138
133
< FontAwesomeIcon icon = { faCircleXmark } />
@@ -141,10 +136,10 @@ export const MultiSelectSearch = React.forwardRef<HTMLInputElement, Props>(
141
136
< div className = { styles . inputButtonDivider } > </ div >
142
137
< button
143
138
onClick = { ( e ) => {
144
- e . stopPropagation ( ) ;
145
139
setIsVisible ( ! isVisible ) ;
140
+ e . stopPropagation ( ) ;
146
141
} }
147
- className = { styles . openMenuButton }
142
+ className = { styles . showMenuButton }
148
143
>
149
144
< Icon inline >
150
145
< FontAwesomeIcon icon = { faCaretDown } />
@@ -162,8 +157,8 @@ export const MultiSelectSearch = React.forwardRef<HTMLInputElement, Props>(
162
157
< MultiSelectItem
163
158
key = { option . value }
164
159
onClick = { ( e ) => {
165
- e . stopPropagation ( ) ;
166
160
add ( option ) ;
161
+ e . stopPropagation ( ) ;
167
162
} }
168
163
option = { option }
169
164
/>
@@ -180,7 +175,7 @@ MultiSelectSearch.displayName = "MultiSelectSearch";
180
175
181
176
const MultiSelectItem = ( props : {
182
177
onClick : ( e : React . MouseEvent | React . KeyboardEvent ) => void ;
183
- option : Option ;
178
+ option : MultiSelectSearchOption ;
184
179
} ) => {
185
180
return (
186
181
< div
0 commit comments