1414 * limitations under the License.
1515 */
1616
17- import { KeyboardEvent , useEffect , useRef , useState } from 'react'
17+ import { KeyboardEvent , useEffect , useMemo , useRef , useState } from 'react'
1818
1919import { useRegisterShortcut } from '@Common/Hooks'
2020
2121import { ActionMenu , ActionMenuItemType , ActionMenuProps } from '../ActionMenu'
2222import { Icon } from '../Icon'
23+ import { Popover , usePopover } from '../Popover'
2324import FilterSelectPicker from './FilterSelectPicker'
24- import { GroupedFilterSelectPickerProps } from './type'
25+ import { FilterSelectPickerMapSelectPickerVariant , GroupedFilterSelectPickerProps } from './type'
2526
2627import './selectPicker.scss'
2728
@@ -41,6 +42,29 @@ export const GroupedFilterSelectPicker = <T extends string | number>({
4142 // HOOKS
4243 const { registerShortcut, unregisterShortcut } = useRegisterShortcut ( )
4344
45+ const selectedItemConfig = selectedActionMenuItem ? filterSelectPickerPropsMap [ selectedActionMenuItem ] : null
46+ const isPopOverVariant = selectedItemConfig ?. variant === 'popover'
47+
48+ const {
49+ open : isFilterPopoverOpen ,
50+ triggerProps : filterPopoverTriggerProps ,
51+ overlayProps : filterPopoverOverlayProps ,
52+ popoverProps : filterPopoverContentProps ,
53+ openPopover : openFilterPopover ,
54+ closePopover : closeFilterPopover ,
55+ scrollableRef : filterPopoverScrollableRef ,
56+ } = usePopover ( {
57+ id : `${ id } -grouped-filter-popover` ,
58+ position : isPopOverVariant ? selectedItemConfig . popoverConfig ?. position : undefined ,
59+ alignment : isPopOverVariant ? selectedItemConfig . popoverConfig ?. alignment : undefined ,
60+ width : isPopOverVariant ? selectedItemConfig . popoverConfig ?. width : undefined ,
61+ onOpen : ( open ) => {
62+ if ( ! open ) {
63+ setSelectedActionMenuItem ( null )
64+ }
65+ } ,
66+ } )
67+
4468 useEffect ( ( ) => {
4569 const shortcutCallback = ( ) => {
4670 triggerButtonRef . current ?. click ( )
@@ -60,6 +84,12 @@ export const GroupedFilterSelectPicker = <T extends string | number>({
6084 }
6185 } , [ selectedActionMenuItem ] )
6286
87+ useEffect ( ( ) => {
88+ if ( selectedActionMenuItem && isPopOverVariant ) {
89+ openFilterPopover ( )
90+ }
91+ } , [ selectedActionMenuItem ] )
92+
6393 // HANDLERS
6494 const handleMenuItemClick : ActionMenuProps < T > [ 'onClick' ] = ( item ) => {
6595 setSelectedActionMenuItem ( item . id )
@@ -76,18 +106,8 @@ export const GroupedFilterSelectPicker = <T extends string | number>({
76106 }
77107 }
78108
79- return selectedActionMenuItem ? (
80- < div className = "grouped-filter-select-picker w-200" >
81- < FilterSelectPicker
82- { ...filterSelectPickerPropsMap [ selectedActionMenuItem ] }
83- menuIsOpen
84- onMenuClose = { handleMenuClose }
85- onKeyDown = { handleKeyDown }
86- autoFocus
87- />
88- </ div >
89- ) : (
90- < ActionMenu { ...restProps } id = { id } isSearchable onClick = { handleMenuItemClick } >
109+ const filterTriggerButton = useMemo (
110+ ( ) => (
91111 < button
92112 type = "button"
93113 ref = { triggerButtonRef }
@@ -98,6 +118,51 @@ export const GroupedFilterSelectPicker = <T extends string | number>({
98118 < span className = "fs-12 lh-20 fw-6 cn-9" > Filter</ span >
99119 < kbd className = "icon-dim-20 flex bg__primary border__primary br-2 shadow__key fs-12 lh-20 cn-7" > f</ kbd >
100120 </ button >
101- </ ActionMenu >
121+ ) ,
122+ [ isFilterApplied ] ,
102123 )
124+
125+ const renderContent = ( ) => {
126+ if ( selectedActionMenuItem && isPopOverVariant ) {
127+ return (
128+ < Popover
129+ open = { isFilterPopoverOpen }
130+ triggerProps = { { ...filterPopoverTriggerProps , 'aria-haspopup' : 'dialog' } }
131+ overlayProps = { filterPopoverOverlayProps }
132+ popoverProps = { { ...filterPopoverContentProps , role : 'dialog' } }
133+ buttonProps = { null }
134+ triggerElement = { filterTriggerButton }
135+ >
136+ { selectedItemConfig . component ( closeFilterPopover , filterPopoverScrollableRef ) }
137+ </ Popover >
138+ )
139+ }
140+
141+ if ( selectedActionMenuItem ) {
142+ const config = filterSelectPickerPropsMap [ selectedActionMenuItem ]
143+ if ( config . variant !== 'popover' ) {
144+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
145+ const { variant : _variant , ...filterProps } = config as FilterSelectPickerMapSelectPickerVariant
146+ return (
147+ < div className = "grouped-filter-select-picker w-200" >
148+ < FilterSelectPicker
149+ { ...filterProps }
150+ menuIsOpen
151+ onMenuClose = { handleMenuClose }
152+ onKeyDown = { handleKeyDown }
153+ autoFocus
154+ />
155+ </ div >
156+ )
157+ }
158+ }
159+
160+ return (
161+ < ActionMenu { ...restProps } id = { id } isSearchable onClick = { handleMenuItemClick } >
162+ { filterTriggerButton }
163+ </ ActionMenu >
164+ )
165+ }
166+
167+ return < div > { renderContent ( ) } </ div >
103168}
0 commit comments