@@ -4,6 +4,7 @@ import CloseIcon from './CloseIcon.jsx'
44import DownIcon from './DownIcon.jsx'
55import Options from './Options'
66import './styles.css'
7+ import useComponentVisible from './useComponentVisible.jsx'
78
89MultiSelect . defaultProps = {
910 clearable : true ,
@@ -14,6 +15,7 @@ MultiSelect.defaultProps = {
1415 defaultValue : '' ,
1516 disableChip : false ,
1617 name : '' ,
18+ style : { } ,
1719 disabled : false ,
1820 limit : null ,
1921 emptyDataLabel : 'No Data Found' ,
@@ -45,19 +47,24 @@ function MultiSelect({
4547 placeholder,
4648 disableChip,
4749 name,
50+ style,
4851 attr,
4952 largeData,
5053 disabled,
5154 limit,
5255 emptyDataLabel,
5356 customValue
5457} ) {
55- const [ menuOpen , setMenuOpen ] = useState ( false )
58+ // const [menuOpen, setMenuOpen] = useState(false)
5659 const [ value , setValue ] = useState ( [ ] )
5760 const [ options , setOptions ] = useState ( userOptions || [ ] )
5861 const [ search , setSearch ] = useState ( null )
5962 const inputFld = useRef ( null )
60- let stopPropagation = true
63+ const {
64+ ref,
65+ isComponentVisible : menuOpen ,
66+ setIsComponentVisible : setMenuOpen
67+ } = useComponentVisible ( false )
6168
6269 const preparDefaultValue = ( defaultValue ) => {
6370 let defaultValArr = defaultValue
@@ -157,91 +164,6 @@ function MultiSelect({
157164 }
158165 }
159166
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-
245167 const checkValueExist = ( value , arr ) => {
246168 const bool = arr . some ( ( itm ) => itm . value === value . value )
247169 return bool
@@ -354,11 +276,31 @@ function MultiSelect({
354276 setSearch ( null )
355277 }
356278 }
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+
357298 return (
358299 < div
300+ ref = { ref }
359301 { ...attr }
360- onClick = { handleClickInput }
361- style = { { width } }
302+ onClick = { openMenu }
303+ style = { { ... style , width } }
362304 className = { `msl-wrp msl-vars ${ className } ${
363305 disabled ? 'msl-disabled' : ''
364306 } `}
@@ -369,8 +311,13 @@ function MultiSelect({
369311 data-msl
370312 className = 'msl-input-wrp'
371313 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+ } `
374321 } }
375322 >
376323 { ! singleSelect &&
@@ -469,7 +416,8 @@ function MultiSelect({
469416 < div
470417 role = 'button'
471418 aria-label = 'toggle-menu'
472- onClick = { handleMenuBtn }
419+ dropdown-handle = 'true'
420+ // onClick={() => setMenuOpen(!menuOpen)}
473421 className = 'msl-btn msl-arrow-btn msl-flx'
474422 style = { { ...( menuOpen && { transform : 'rotate(180deg)' } ) } }
475423 >
0 commit comments