Skip to content

Commit 9899958

Browse files
committed
focus prblm fixed and index updated
1 parent aa5fcad commit 9899958

File tree

4 files changed

+292
-313
lines changed

4 files changed

+292
-313
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
},
1111
"main": "dist/index.js",
1212
"module": "dist/index.modern.js",
13-
"source": "src/index.js",
13+
"source": "src/index.jsx",
1414
"engines": {
1515
"node": ">=10"
1616
},

src/index.js renamed to src/index.jsx

Lines changed: 40 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import CloseIcon from './CloseIcon.jsx'
44
import DownIcon from './DownIcon.jsx'
55
import Options from './Options'
66
import './styles.css'
7+
import useComponentVisible from './useComponentVisible.jsx'
78

89
MultiSelect.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

Comments
 (0)