@@ -198,3 +198,122 @@ describe('Trigger.Shadow', () => {
198
198
errSpy . mockRestore ( ) ;
199
199
} ) ;
200
200
} ) ;
201
+
202
+ describe ( 'Popup.Shadow' , ( ) => {
203
+ beforeEach ( ( ) => {
204
+ resetWarned ( ) ;
205
+ jest . useFakeTimers ( ) ;
206
+ } ) ;
207
+
208
+ afterEach ( ( ) => {
209
+ jest . useRealTimers ( ) ;
210
+ } ) ;
211
+
212
+ class CustomElement extends HTMLElement {
213
+ disconnectedCallback ( ) { }
214
+ connectedCallback ( ) {
215
+ const shadowRoot = this . attachShadow ( {
216
+ mode : 'open' ,
217
+ } ) ;
218
+ const container = document . createElement ( 'div' ) ;
219
+ shadowRoot . appendChild ( container ) ;
220
+ container . classList . add ( 'shadow-container' ) ;
221
+ container . innerHTML = `<div class="shadow-content">Hello World</div>` ;
222
+ }
223
+ }
224
+
225
+ customElements . define ( 'custom-element' , CustomElement ) ;
226
+
227
+ it ( 'should not close the popup when click the shadow content in the popup element' , async ( ) => {
228
+ const container = document . createElement ( 'div' ) ;
229
+ document . body . appendChild ( container ) ;
230
+
231
+ act ( ( ) => {
232
+ createRoot ( container ) . render (
233
+ < >
234
+ < div className = "outer" > outer</ div >
235
+ < Trigger
236
+ action = { [ 'click' ] }
237
+ autoDestroy
238
+ popup = { < custom-element class = "popup" /> }
239
+ >
240
+ < p className = "target" />
241
+ </ Trigger >
242
+ </ > ,
243
+ ) ;
244
+ } ) ;
245
+
246
+ await awaitFakeTimer ( ) ;
247
+
248
+ // Click to show
249
+ fireEvent . click ( document . querySelector ( '.target' ) ) ;
250
+ await awaitFakeTimer ( ) ;
251
+ expect ( document . querySelector ( '.popup' ) ) . toBeTruthy ( ) ;
252
+
253
+ // Click outside to hide
254
+ fireEvent . mouseDown ( document . querySelector ( '.outer' ) ) ;
255
+ await awaitFakeTimer ( ) ;
256
+ expect ( document . querySelector ( '.popup' ) ) . toBeFalsy ( ) ;
257
+
258
+ // Click to show again
259
+ fireEvent . click ( document . querySelector ( '.target' ) ) ;
260
+ await awaitFakeTimer ( ) ;
261
+ expect ( document . querySelector ( '.popup' ) ) . toBeTruthy ( ) ;
262
+
263
+ // Click on popup element should not hide
264
+ fireEvent . mouseDown ( document . querySelector ( '.popup' ) ) ;
265
+ await awaitFakeTimer ( ) ;
266
+ expect ( document . querySelector ( '.popup' ) ) . toBeTruthy ( ) ;
267
+
268
+ // Click on shadow content should not hide
269
+ const popup = document . querySelector ( '.popup' ) ;
270
+ fireEvent . mouseDown ( popup . shadowRoot . querySelector ( '.shadow-content' ) ) ;
271
+ await awaitFakeTimer ( ) ;
272
+ expect ( document . querySelector ( '.popup' ) ) . toBeTruthy ( ) ;
273
+ } ) ;
274
+
275
+ it ( 'should works with custom element trigger' , async ( ) => {
276
+ const container = document . createElement ( 'div' ) ;
277
+ document . body . innerHTML = '' ;
278
+ document . body . appendChild ( container ) ;
279
+
280
+ act ( ( ) => {
281
+ createRoot ( container ) . render (
282
+ < >
283
+ < div className = "outer" > outer</ div >
284
+ < Trigger
285
+ action = { [ 'click' ] }
286
+ autoDestroy
287
+ popup = { < custom-element class = "popup" /> }
288
+ >
289
+ < custom-element class = "target" />
290
+ </ Trigger >
291
+ </ > ,
292
+ ) ;
293
+ } ) ;
294
+
295
+ await awaitFakeTimer ( ) ;
296
+
297
+ // Click to show
298
+ const target = document . querySelector ( '.target' ) ;
299
+ fireEvent . click ( target ) ;
300
+ await awaitFakeTimer ( ) ;
301
+ expect ( document . querySelector ( '.popup' ) ) . toBeTruthy ( ) ;
302
+
303
+ // Click outside to hide
304
+ fireEvent . mouseDown ( document . querySelector ( '.outer' ) ) ;
305
+ await awaitFakeTimer ( ) ;
306
+ expect ( document . querySelector ( '.popup' ) ) . toBeFalsy ( ) ;
307
+
308
+ // Click shadow content to show
309
+ fireEvent . click ( target . shadowRoot . querySelector ( '.shadow-content' ) ) ;
310
+ await awaitFakeTimer ( ) ;
311
+ expect ( document . querySelector ( '.popup' ) ) . toBeTruthy ( ) ;
312
+
313
+ // Click on shadow content should not hide
314
+ const popup = document . querySelector ( '.popup' ) ;
315
+ fireEvent . mouseDown ( popup . shadowRoot . querySelector ( '.shadow-content' ) ) ;
316
+ await awaitFakeTimer ( ) ;
317
+ expect ( document . querySelector ( '.popup' ) ) . toBeTruthy ( ) ;
318
+ } ) ;
319
+ } ) ;
0 commit comments