@@ -21,7 +21,7 @@ module(
2121 await render ( hbs `
2222 <Hds::PopoverPrimitive @enableClickEvents={{true}} as |PP|>
2323 <div {{PP.setupPrimitiveContainer}}>
24- <button {{PP.setupPrimitiveToggle}} />
24+ <button {{PP.setupPrimitiveToggle}} type="button" />
2525 <main {{PP.setupPrimitivePopover}} />
2626 </div>
2727 </Hds::PopoverPrimitive>
@@ -38,7 +38,7 @@ module(
3838 await render ( hbs `
3939 <Hds::PopoverPrimitive @enableClickEvents={{true}} as |PP|>
4040 <div {{PP.setupPrimitiveContainer}}>
41- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
41+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
4242 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-content" />
4343 </div>
4444 </Hds::PopoverPrimitive>
@@ -57,7 +57,7 @@ module(
5757 await render ( hbs `
5858 <Hds::PopoverPrimitive @enableSoftEvents={{true}} as |PP|>
5959 <div {{PP.setupPrimitiveContainer}}>
60- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
60+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
6161 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-content" />
6262 </div>
6363 </Hds::PopoverPrimitive>
@@ -82,7 +82,7 @@ module(
8282 await render ( hbs `
8383 <Hds::PopoverPrimitive @enableClickEvents={{true}} as |PP|>
8484 <div {{PP.setupPrimitiveContainer}}>
85- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
85+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
8686 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-content" />
8787 </div>
8888 </Hds::PopoverPrimitive>
@@ -103,6 +103,72 @@ module(
103103 // should go back to hidden
104104 assert . dom ( '#test-popover-primitive-content' ) . isNotVisible ( ) ;
105105 } ) ;
106+ test ( 'it should continue to work when the toggle element is dynamically swapped' , async function ( assert ) {
107+ this . set ( 'isSwapped' , false ) ;
108+
109+ await render ( hbs `
110+ <Hds::PopoverPrimitive @enableClickEvents={{true}} as |PP|>
111+ <div {{PP.setupPrimitiveContainer}}>
112+ {{#if this.isSwapped}}
113+ <button data-test-id="replacement-toggle" type="button" {{PP.setupPrimitiveToggle}}>
114+ Replacement
115+ </button>
116+ {{else}}
117+ <button data-test-id="original-toggle" type="button" {{PP.setupPrimitiveToggle}}>
118+ Original
119+ </button>
120+ {{/if}}
121+ <div data-test-id="popover-content" {{PP.setupPrimitivePopover}}>
122+ Content
123+ </div>
124+ </div>
125+ </Hds::PopoverPrimitive>
126+ ` ) ;
127+
128+ // verify the initial toggle works as expected
129+ assert
130+ . dom ( '[data-test-id="original-toggle"]' )
131+ . exists ( 'The original toggle is rendered' ) ;
132+ assert
133+ . dom ( '[data-test-id="popover-content"]' )
134+ . isNotVisible ( 'The popover is initially hidden' ) ;
135+
136+ await click ( '[data-test-id="original-toggle"]' ) ;
137+ assert
138+ . dom ( '[data-test-id="popover-content"]' )
139+ . isVisible ( 'The popover becomes visible after the first click' ) ;
140+
141+ await click ( '[data-test-id="original-toggle"]' ) ;
142+ assert
143+ . dom ( '[data-test-id="popover-content"]' )
144+ . isNotVisible ( 'The popover is hidden again' ) ;
145+
146+ // swap the toggle element
147+ this . set ( 'isSwapped' , true ) ;
148+ assert
149+ . dom ( '[data-test-id="original-toggle"]' )
150+ . doesNotExist ( 'The original toggle is removed' ) ;
151+ assert
152+ . dom ( '[data-test-id="replacement-toggle"]' )
153+ . exists ( 'The replacement toggle is rendered' ) ;
154+
155+ // verify the *new* toggle now controls the popover
156+ assert
157+ . dom ( '[data-test-id="popover-content"]' )
158+ . isNotVisible ( 'The popover remains hidden after the swap' ) ;
159+
160+ await click ( '[data-test-id="replacement-toggle"]' ) ;
161+ assert
162+ . dom ( '[data-test-id="popover-content"]' )
163+ . isVisible (
164+ 'The popover becomes visible when the new toggle is clicked' ,
165+ ) ;
166+
167+ await click ( '[data-test-id="replacement-toggle"]' ) ;
168+ assert
169+ . dom ( '[data-test-id="popover-content"]' )
170+ . isNotVisible ( 'The popover is hidden again by the new toggle' ) ;
171+ } ) ;
106172 skip ( 'it should toggle the popover visibility on click' , async function ( assert ) {
107173 await render ( hbs `
108174 <Hds::PopoverPrimitive @enableClickEvents={{true}}>
@@ -141,7 +207,7 @@ module(
141207 as |PP|
142208 >
143209 <div {{PP.setupPrimitiveContainer}}>
144- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
210+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
145211 <div {{PP.setupPrimitivePopover}} />
146212 </div>
147213 </Hds::PopoverPrimitive>
@@ -165,7 +231,7 @@ module(
165231 await render ( hbs `
166232 <Hds::PopoverPrimitive as |PP|>
167233 <div {{PP.setupPrimitiveContainer}}>
168- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
234+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
169235 <div {{PP.setupPrimitivePopover}} />
170236 </div>
171237 </Hds::PopoverPrimitive>
@@ -178,7 +244,7 @@ module(
178244 await render ( hbs `
179245 <Hds::PopoverPrimitive @enableClickEvents={{true}} as |PP|>
180246 <div {{PP.setupPrimitiveContainer}}>
181- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
247+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
182248 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-popover" />
183249 </div>
184250 </Hds::PopoverPrimitive>
@@ -191,7 +257,7 @@ module(
191257 await render ( hbs `
192258 <Hds::PopoverPrimitive as |PP|>
193259 <div {{PP.setupPrimitiveContainer}}>
194- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
260+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
195261 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-content" />
196262 </div>
197263 </Hds::PopoverPrimitive>
@@ -204,7 +270,7 @@ module(
204270 await render ( hbs `
205271 <Hds::PopoverPrimitive @enableClickEvents={{true}} @isOpen={{true}} as |PP|>
206272 <div {{PP.setupPrimitiveContainer}}>
207- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
273+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
208274 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-content" />
209275 </div>
210276 </Hds::PopoverPrimitive>
@@ -226,7 +292,7 @@ module(
226292 await render ( hbs `
227293 <Hds::PopoverPrimitive @enableClickEvents={{true}} @isOpen={{true}} as |PP|>
228294 <div {{PP.setupPrimitiveContainer}}>
229- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
295+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
230296 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-content" />
231297 </div>
232298 </Hds::PopoverPrimitive>
@@ -244,7 +310,7 @@ module(
244310 await render ( hbs `
245311 <Hds::PopoverPrimitive @enableClickEvents={{true}} @isOpen={{true}} as |PP|>
246312 <div {{PP.setupPrimitiveContainer}}>
247- <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" />
313+ <button {{PP.setupPrimitiveToggle}} id="test-popover-primitive-toggle" type="button" />
248314 <div {{PP.setupPrimitivePopover}} id="test-popover-primitive-content" />
249315 </div>
250316 </Hds::PopoverPrimitive>
0 commit comments