Skip to content

Commit 291838a

Browse files
committed
Fixes issue with overlapping popovers
1 parent 4f94d87 commit 291838a

File tree

1 file changed

+30
-0
lines changed
  • src/webviews/apps/shared/components/overlays

1 file changed

+30
-0
lines changed

src/webviews/apps/shared/components/overlays/popover.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@ export class GlPopover extends GlElement {
6464
delegatesFocus: true,
6565
};
6666

67+
/** static registry to track all open popovers */
68+
private static readonly openPopovers = new Set<GlPopover>();
69+
70+
private static closeOthers(openingPopover: GlPopover): void {
71+
for (const popover of GlPopover.openPopovers) {
72+
if (
73+
popover === openingPopover ||
74+
// Check if the popover contains the opening popover
75+
Boolean(popover.compareDocumentPosition(openingPopover) & Node.DOCUMENT_POSITION_CONTAINS)
76+
) {
77+
continue;
78+
}
79+
80+
void popover.hide();
81+
}
82+
}
83+
6784
static override styles = [
6885
scrollableBase,
6986
css`
@@ -228,6 +245,10 @@ export class GlPopover extends GlElement {
228245
window.removeEventListener('webview-blur', this.handleWebviewBlur, false);
229246
document.removeEventListener('keydown', this.handleDocumentKeyDown);
230247
document.removeEventListener('mousedown', this.handleWebviewMouseDown);
248+
249+
// Remove this popover from the registry when it's disconnected
250+
GlPopover.openPopovers.delete(this);
251+
231252
super.disconnectedCallback();
232253
}
233254

@@ -286,7 +307,13 @@ export class GlPopover extends GlElement {
286307
}
287308
if (this.open) return undefined;
288309

310+
// Close other popovers before showing this one, unless this popover is a descendant of an open popover
311+
GlPopover.closeOthers(this);
312+
289313
this.open = true;
314+
// Add this popover to the registry when it's opened
315+
GlPopover.openPopovers.add(this);
316+
290317
return waitForEvent(this, 'gl-popover-after-show');
291318
}
292319

@@ -296,6 +323,9 @@ export class GlPopover extends GlElement {
296323
if (!this.open) return undefined;
297324

298325
this.open = false;
326+
// Remove this popover from the registry when it's closed
327+
GlPopover.openPopovers.delete(this);
328+
299329
return waitForEvent(this, 'gl-popover-after-hide');
300330
}
301331

0 commit comments

Comments
 (0)