@@ -13,7 +13,16 @@ const options = [
1313] ;
1414
1515async function openMenu ( wrapper : ReturnType < typeof mount > , method : "mousedown" | "focus-space" | "single-value" = "mousedown" ) {
16+ // Check if menu is already closed, if so proceed normally
17+ // If menu is open, use the dropdown toggle button instead to avoid the new toggle logic
18+ const isMenuOpen = wrapper . findAll ( "div[role='option']" ) . length > 0 ;
19+
1620 if ( method === "mousedown" ) {
21+ if ( isMenuOpen ) {
22+ // Menu is open, close it first then reopen
23+ await wrapper . get ( ".dropdown-icon" ) . trigger ( "click" ) ;
24+ }
25+
1726 await wrapper . get ( "input" ) . trigger ( "mousedown" ) ;
1827 }
1928 else if ( method === "focus-space" ) {
@@ -640,6 +649,37 @@ describe("menu closing behavior", () => {
640649 expect ( wrapper . findAll ( "div[role='option']" ) . length ) . toBe ( 0 ) ;
641650 }
642651 } ) ;
652+
653+ it ( "should toggle menu when clicking input while menu is open and search is empty" , async ( ) => {
654+ const wrapper = mount ( VueSelect , { props : { modelValue : null , options } } ) ;
655+
656+ // First click should open menu
657+ await wrapper . get ( "input" ) . trigger ( "mousedown" ) ;
658+ expect ( wrapper . findAll ( "div[role='option']" ) . length ) . toBe ( options . length ) ;
659+
660+ // Second click should close menu (when search is empty)
661+ await wrapper . get ( "input" ) . trigger ( "mousedown" ) ;
662+ expect ( wrapper . findAll ( "div[role='option']" ) . length ) . toBe ( 0 ) ;
663+
664+ // Third click should open menu again
665+ await wrapper . get ( "input" ) . trigger ( "mousedown" ) ;
666+ expect ( wrapper . findAll ( "div[role='option']" ) . length ) . toBe ( options . length ) ;
667+ } ) ;
668+
669+ it ( "should keep menu open when clicking input while typing" , async ( ) => {
670+ const wrapper = mount ( VueSelect , { props : { modelValue : null , options } } ) ;
671+
672+ // Open menu and start typing
673+ await wrapper . get ( "input" ) . trigger ( "mousedown" ) ;
674+ expect ( wrapper . findAll ( "div[role='option']" ) . length ) . toBe ( options . length ) ;
675+
676+ await inputSearch ( wrapper , "United" ) ;
677+ expect ( wrapper . findAll ( "div[role='option']" ) . length ) . toBe ( 2 ) ;
678+
679+ // Clicking input while typing should keep menu open
680+ await wrapper . get ( "input" ) . trigger ( "mousedown" ) ;
681+ expect ( wrapper . findAll ( "div[role='option']" ) . length ) . toBe ( 2 ) ;
682+ } ) ;
643683} ) ;
644684
645685describe ( "hideSelectedOptions prop" , ( ) => {
0 commit comments