Skip to content

Commit 0533efd

Browse files
committed
refactor(CDropdown): allow to select the next/previous element by press the up/down arrow
1 parent a3f1915 commit 0533efd

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

packages/coreui-react/src/components/dropdown/CDropdown.tsx

+19-6
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,12 @@ interface ContextProps extends CDropdownProps {
107107
portal: boolean
108108
}
109109

110-
export const getNextActiveElement = (list: HTMLElement[], activeElement: HTMLElement, shouldGetNext: boolean, isCycleAllowed: boolean) => {
110+
export const getNextActiveElement = (
111+
list: HTMLElement[],
112+
activeElement: HTMLElement,
113+
shouldGetNext: boolean,
114+
isCycleAllowed: boolean,
115+
) => {
111116
const listLength = list.length
112117
let index = list.indexOf(activeElement)
113118

@@ -223,20 +228,24 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
223228
}, [visible])
224229

225230
useEffect(() => {
226-
if (_visible && dropdownRef.current && dropdownToggleRef.current && dropdownMenuRef.current) {
231+
if (_visible && dropdownToggleRef.current && dropdownMenuRef.current) {
227232
dropdownToggleRef.current.focus()
228233
popper && initPopper(dropdownToggleRef.current, dropdownMenuRef.current, popperConfig)
229234
window.addEventListener('mouseup', handleMouseUp)
230235
window.addEventListener('keyup', handleKeyup)
231-
dropdownRef.current.addEventListener('keydown', handleKeydown)
236+
dropdownToggleRef.current.addEventListener('keydown', handleKeydown)
237+
dropdownMenuRef.current.addEventListener('keydown', handleKeydown)
232238
onShow && onShow()
233239
}
234240

235241
return () => {
236242
popper && destroyPopper()
237243
window.removeEventListener('mouseup', handleMouseUp)
238244
window.removeEventListener('keyup', handleKeyup)
239-
dropdownRef.current && dropdownRef.current.removeEventListener('keydown', handleKeydown)
245+
dropdownToggleRef.current &&
246+
dropdownToggleRef.current.removeEventListener('keydown', handleKeydown)
247+
dropdownMenuRef.current &&
248+
dropdownMenuRef.current.removeEventListener('keydown', handleKeydown)
240249
onHide && onHide()
241250
}
242251
}, [_visible])
@@ -245,7 +254,12 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
245254
if (_visible && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
246255
const target = event.target as HTMLElement
247256
event.preventDefault()
248-
const items = [].concat(...Element.prototype.querySelectorAll.call(dropdownRef.current, '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'))
257+
const items = [].concat(
258+
...Element.prototype.querySelectorAll.call(
259+
dropdownMenuRef.current,
260+
'.dropdown-item:not(.disabled):not(:disabled)',
261+
),
262+
)
249263
getNextActiveElement(items, target, event.key === 'ArrowDown', true).focus()
250264
}
251265
}
@@ -292,7 +306,6 @@ export const CDropdown = forwardRef<HTMLDivElement | HTMLLIElement, CDropdownPro
292306
'dropup dropup-center': direction === 'dropup-center',
293307
[`${direction}`]:
294308
direction && direction !== 'center' && direction !== 'dropup-center',
295-
show: _visible,
296309
},
297310
className,
298311
)}

packages/coreui-react/src/components/dropdown/CDropdownToggle.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ export const CDropdownToggle: FC<CDropdownToggleProps> = ({
5858
className: classNames(
5959
{
6060
'dropdown-toggle': caret,
61-
'dropdown-toggle-split': split
61+
'dropdown-toggle-split': split,
62+
show: visible,
6263
},
6364
className,
6465
),

0 commit comments

Comments
 (0)