@@ -4,6 +4,7 @@ import CloseIcon from './CloseIcon.jsx'
4
4
import DownIcon from './DownIcon.jsx'
5
5
import Options from './Options'
6
6
import './styles.css'
7
+ import useComponentVisible from './useComponentVisible.jsx'
7
8
8
9
MultiSelect . defaultProps = {
9
10
clearable : true ,
@@ -14,6 +15,7 @@ MultiSelect.defaultProps = {
14
15
defaultValue : '' ,
15
16
disableChip : false ,
16
17
name : '' ,
18
+ style : { } ,
17
19
disabled : false ,
18
20
limit : null ,
19
21
emptyDataLabel : 'No Data Found' ,
@@ -45,19 +47,24 @@ function MultiSelect({
45
47
placeholder,
46
48
disableChip,
47
49
name,
50
+ style,
48
51
attr,
49
52
largeData,
50
53
disabled,
51
54
limit,
52
55
emptyDataLabel,
53
56
customValue
54
57
} ) {
55
- const [ menuOpen , setMenuOpen ] = useState ( false )
58
+ // const [menuOpen, setMenuOpen] = useState(false)
56
59
const [ value , setValue ] = useState ( [ ] )
57
60
const [ options , setOptions ] = useState ( userOptions || [ ] )
58
61
const [ search , setSearch ] = useState ( null )
59
62
const inputFld = useRef ( null )
60
- let stopPropagation = true
63
+ const {
64
+ ref,
65
+ isComponentVisible : menuOpen ,
66
+ setIsComponentVisible : setMenuOpen
67
+ } = useComponentVisible ( false )
61
68
62
69
const preparDefaultValue = ( defaultValue ) => {
63
70
let defaultValArr = defaultValue
@@ -157,91 +164,6 @@ function MultiSelect({
157
164
}
158
165
}
159
166
160
- const openMenu = ( ) => {
161
- setMenuOpen ( true )
162
- }
163
-
164
- const closeMenu = ( ) => {
165
- setMenuOpen ( false )
166
- }
167
-
168
- const inputRefFocus = ( e , focus ) => {
169
- let parentNode = null
170
- let inputNode = null
171
- if ( e . target . hasAttribute ( 'data-msl' ) ) {
172
- parentNode = e . target
173
- } else if ( e . target . parentNode . hasAttribute ( 'data-msl' ) ) {
174
- parentNode = e . target . parentNode
175
- } else if ( e . target . parentNode . parentNode . hasAttribute ( 'data-msl' ) ) {
176
- parentNode = e . target . parentNode . parentNode
177
- } else if (
178
- e . target . parentNode . parentNode . parentNode . hasAttribute ( 'data-msl' )
179
- ) {
180
- parentNode = e . target . parentNode . parentNode . parentNode
181
- } else if (
182
- e . target . parentNode . parentNode . parentNode . parentNode . hasAttribute (
183
- 'data-msl'
184
- )
185
- ) {
186
- parentNode = e . target . parentNode . parentNode . parentNode . parentNode
187
- }
188
- if ( parentNode !== null ) {
189
- inputNode = parentNode . querySelector ( '.msl-input' )
190
- }
191
-
192
- if ( inputNode !== null ) {
193
- focus ? inputNode . focus ( ) : inputNode . blur ( )
194
- }
195
- }
196
-
197
- const handleMenuBtn = ( e ) => {
198
- stopPropagation = false
199
- if ( menuOpen ) {
200
- document . removeEventListener ( 'click' , handleMenu )
201
- inputRefFocus ( e , false )
202
- closeMenu ( )
203
- } else {
204
- inputRefFocus ( e , true )
205
- openMenu ( )
206
- document . addEventListener ( 'click' , handleMenu )
207
- }
208
- }
209
-
210
- const handleMenu = ( e ) => {
211
- if ( ! openable ( e ) ) {
212
- document . removeEventListener ( 'click' , handleMenu )
213
- closeMenu ( )
214
- } else {
215
- openMenu ( )
216
- }
217
- }
218
-
219
- const openable = ( e ) => {
220
- if ( e . target . hasAttribute ( 'data-msl' ) ) {
221
- return true
222
- }
223
- return false
224
- }
225
-
226
- const handleOutsideClick = ( e ) => {
227
- if ( openable ( e ) ) {
228
- if ( ! menuOpen ) {
229
- document . addEventListener ( 'click' , handleOutsideClick )
230
- }
231
- inputRefFocus ( e , true )
232
- openMenu ( )
233
- } else {
234
- closeMenu ( )
235
- document . removeEventListener ( 'click' , handleOutsideClick )
236
- }
237
- }
238
-
239
- const handleClickInput = ( e ) => {
240
- if ( stopPropagation ) {
241
- handleOutsideClick ( e )
242
- }
243
- }
244
-
245
167
const checkValueExist = ( value , arr ) => {
246
168
const bool = arr . some ( ( itm ) => itm . value === value . value )
247
169
return bool
@@ -354,11 +276,31 @@ function MultiSelect({
354
276
setSearch ( null )
355
277
}
356
278
}
279
+
280
+ const checkIsDropdownHandle = ( target ) => {
281
+ if (
282
+ target . hasAttribute ( 'dropdown-handle' ) ||
283
+ target . parentNode . hasAttribute ( 'dropdown-handle' ) ||
284
+ target . parentNode . parentNode . hasAttribute ( 'dropdown-handle' )
285
+ ) {
286
+ return true
287
+ }
288
+ }
289
+
290
+ const openMenu = ( { target } ) => {
291
+ if ( checkIsDropdownHandle ( target ) ) {
292
+ setMenuOpen ( ! menuOpen )
293
+ } else {
294
+ setMenuOpen ( true )
295
+ }
296
+ }
297
+
357
298
return (
358
299
< div
300
+ ref = { ref }
359
301
{ ...attr }
360
- onClick = { handleClickInput }
361
- style = { { width } }
302
+ onClick = { openMenu }
303
+ style = { { ... style , width } }
362
304
className = { `msl-wrp msl-vars ${ className } ${
363
305
disabled ? 'msl-disabled' : ''
364
306
} `}
@@ -369,8 +311,13 @@ function MultiSelect({
369
311
data-msl
370
312
className = 'msl-input-wrp'
371
313
style = { {
372
- marginRight :
373
- clearable && downArrow ? 60 : downArrow || clearable ? 40 : 5
314
+ width : `calc(100% - ${
315
+ clearable && downArrow
316
+ ? '60px'
317
+ : downArrow || clearable
318
+ ? '40px'
319
+ : '5px'
320
+ } `
374
321
} }
375
322
>
376
323
{ ! singleSelect &&
@@ -469,7 +416,8 @@ function MultiSelect({
469
416
< div
470
417
role = 'button'
471
418
aria-label = 'toggle-menu'
472
- onClick = { handleMenuBtn }
419
+ dropdown-handle = 'true'
420
+ // onClick={() => setMenuOpen(!menuOpen)}
473
421
className = 'msl-btn msl-arrow-btn msl-flx'
474
422
style = { { ...( menuOpen && { transform : 'rotate(180deg)' } ) } }
475
423
>
0 commit comments