11import { Controller } from "@hotwired/stimulus" ;
2+ import { computePosition , autoUpdate , offset } from "@floating-ui/dom" ;
23
34// Connects to data-controller="ruby-ui--combobox"
45export default class extends Controller {
@@ -8,7 +9,7 @@ export default class extends Controller {
89
910 static targets = [
1011 "input" ,
11- "dialog " ,
12+ "popover " ,
1213 "item" ,
1314 "emptyState" ,
1415 "searchInput" ,
@@ -22,11 +23,15 @@ export default class extends Controller {
2223 this . updateTriggerContent ( )
2324 }
2425
26+ disconnect ( ) {
27+ this . cleanup ( ) ;
28+ }
29+
2530 inputChanged ( e ) {
2631 this . updateTriggerContent ( )
2732
2833 if ( e . target . type == "radio" ) {
29- this . closeDialog ( )
34+ this . closePopover ( )
3035 }
3136 }
3237
@@ -46,26 +51,19 @@ export default class extends Controller {
4651 }
4752 }
4853
49- openDialog ( event ) {
54+ openPopover ( event ) {
5055 event . preventDefault ( )
5156
52- document . body . classList . add ( 'overflow-hidden' )
57+ this . popoverTarget . style . positionAnchor
5358 this . triggerTarget . ariaExpanded = "true"
54- this . dialogTarget . showModal ( )
55- }
56-
57- closeDialog ( ) {
58- document . body . classList . remove ( 'overflow-hidden' )
59- this . triggerTarget . ariaExpanded = "false"
6059 this . selectedItemIndex = null
6160 this . itemTargets . forEach ( item => item . ariaCurrent = "false" )
62- this . dialogTarget . close ( )
61+ this . popoverTarget . showPopover ( )
6362 }
6463
65- handleOutsideClick ( event ) {
66- if ( event . target === this . dialogTarget ) {
67- this . closeDialog ( )
68- }
64+ closePopover ( ) {
65+ this . triggerTarget . ariaExpanded = "false"
66+ this . popoverTarget . hidePopover ( )
6967 }
7068
7169 filterItems ( e ) {
@@ -139,4 +137,17 @@ export default class extends Controller {
139137 wrapSelectedInputIndex ( length ) {
140138 this . selectedItemIndex = ( ( this . selectedItemIndex % length ) + length ) % length
141139 }
140+
141+ updatePopoverPosition ( ) {
142+ this . cleanup = autoUpdate ( this . triggerTarget , this . popoverTarget , ( ) => {
143+ computePosition ( this . triggerTarget , this . popoverTarget , {
144+ middleware : [ offset ( 4 ) ] ,
145+ } ) . then ( ( { x, y } ) => {
146+ Object . assign ( this . popoverTarget . style , {
147+ left : `${ x } px` ,
148+ top : `${ y } px` ,
149+ } ) ;
150+ } ) ;
151+ } ) ;
152+ }
142153}
0 commit comments