[Bug] Collection detail: only update dialog state on close event if close event originates from dialog (#1793)
Closes https://github.com/webrecorder/browsertrix/issues/1553 ## Changes Adds a check on `sl-hide` events to ensure that only the events originating from the elements we want to listen to are acted on
This commit is contained in:
		
							parent
							
								
									8b7ec5423d
								
							
						
					
					
						commit
						76cd19d126
					
				| @ -1,7 +1,11 @@ | ||||
| import SlDialog from "@shoelace-style/shoelace/dist/components/dialog/dialog.js"; | ||||
| import dialogStyles from "@shoelace-style/shoelace/dist/components/dialog/dialog.styles.js"; | ||||
| import { css } from "lit"; | ||||
| import { customElement, queryAssignedElements } from "lit/decorators.js"; | ||||
| import { | ||||
|   customElement, | ||||
|   property, | ||||
|   queryAssignedElements, | ||||
| } from "lit/decorators.js"; | ||||
| 
 | ||||
| /** | ||||
|  * <sl-dialog> with custom CSS | ||||
| @ -59,6 +63,28 @@ export class Dialog extends SlDialog { | ||||
|   @queryAssignedElements({ selector: "form", flatten: true }) | ||||
|   readonly formElems!: HTMLFormElement[]; | ||||
| 
 | ||||
|   @property({ type: Boolean }) | ||||
|   reEmitInnerSlHideEvents = false; | ||||
| 
 | ||||
|   // Because both `sl-tooltip` and `sl-dialog` elements use "sl-hide", anything
 | ||||
|   // that listens for "sl-hide" events receives them from tooltips inside the
 | ||||
|   // dialog as well as from the dialog itself, which can lead to mousing out of
 | ||||
|   // a tooltip causing the dialog to close (if it's used as a fully-controlled
 | ||||
|   // component). This prevents that by catching any "sl-hide" events, and
 | ||||
|   // optionally re-emitting them as "sl-inner-hide" events
 | ||||
|   protected createRenderRoot() { | ||||
|     const root = super.createRenderRoot(); | ||||
|     root.addEventListener("sl-hide", (event: Event) => { | ||||
|       if (!(event.target instanceof Dialog)) { | ||||
|         event.stopPropagation(); | ||||
|         if (this.reEmitInnerSlHideEvents) { | ||||
|           this.dispatchEvent(new CustomEvent("sl-inner-hide", { ...event })); | ||||
|         } | ||||
|       } | ||||
|     }); | ||||
|     return root; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Submit form using external buttons to bypass | ||||
|    * incorrect `getRootNode` in Chrome. | ||||
|  | ||||
| @ -176,8 +176,8 @@ export class CollectionDetail extends LiteElement { | ||||
|       <div class="my-7">${this.renderDescription()}</div> | ||||
| 
 | ||||
|       <btrix-dialog | ||||
|         label=${msg("Delete Collection?")} | ||||
|         ?open=${this.openDialogName === "delete"} | ||||
|         .label=${msg("Delete Collection?")} | ||||
|         .open=${this.openDialogName === "delete"} | ||||
|         @sl-hide=${() => (this.openDialogName = undefined)} | ||||
|       > | ||||
|         ${msg( | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user