diff --git a/packages/fiori/src/UserMenu.ts b/packages/fiori/src/UserMenu.ts index 56e3c104036c..9c5322bf7e08 100644 --- a/packages/fiori/src/UserMenu.ts +++ b/packages/fiori/src/UserMenu.ts @@ -157,7 +157,7 @@ class UserMenu extends UI5Element { * @default undefined */ @property({ converter: DOMReferenceConverter }) - opener?: HTMLElement | string; + opener?: HTMLElement | string | null; /** * Defines if the User Menu shows the Manage Account option. diff --git a/packages/main/src/ColorPalettePopover.ts b/packages/main/src/ColorPalettePopover.ts index 5628f83c252e..8bffa427aaa2 100644 --- a/packages/main/src/ColorPalettePopover.ts +++ b/packages/main/src/ColorPalettePopover.ts @@ -132,7 +132,7 @@ class ColorPalettePopover extends UI5Element { * @since 1.21.0 */ @property({ converter: DOMReferenceConverter }) - opener?: HTMLElement | string; + opener?: HTMLElement | string | null; /** * Defines the content of the component. diff --git a/packages/main/src/Menu.ts b/packages/main/src/Menu.ts index 4baaae79e36a..45f5df7db550 100644 --- a/packages/main/src/Menu.ts +++ b/packages/main/src/Menu.ts @@ -235,7 +235,7 @@ class Menu extends UI5Element { * @since 1.10.0 */ @property({ converter: DOMReferenceConverter }) - opener?: HTMLElement | string; + opener?: HTMLElement | string | null; /** * Defines the items of this component. diff --git a/packages/main/src/Popover.ts b/packages/main/src/Popover.ts index f88ae9f94158..0c954f90ac50 100644 --- a/packages/main/src/Popover.ts +++ b/packages/main/src/Popover.ts @@ -190,7 +190,7 @@ class Popover extends Popup { @slot({ type: HTMLElement }) footer!: Array; - _opener?: HTMLElement | string; + _opener?: HTMLElement | string | null | undefined; _openerRect?: DOMRect; _preventRepositionAndClose?: boolean; _top?: number; @@ -216,7 +216,7 @@ class Popover extends Popup { * @since 1.2.0 */ @property({ converter: DOMReferenceConverter }) - set opener(value: HTMLElement | string) { + set opener(value: HTMLElement | string | null) { if (this._opener === value) { return; } @@ -228,7 +228,7 @@ class Popover extends Popup { } } - get opener(): HTMLElement | string | undefined { + get opener(): HTMLElement | string | null | undefined { return this._opener; } @@ -243,7 +243,7 @@ class Popover extends Popup { return; } - if (this.isOpenerOutsideViewport(opener.getBoundingClientRect())) { + if (!opener || this.isOpenerOutsideViewport(opener.getBoundingClientRect())) { await renderFinished(); this.open = false; this.fireDecoratorEvent("close"); @@ -290,8 +290,8 @@ class Popover extends Popup { removeOpenedPopover(this); } - getOpenerHTMLElement(opener: HTMLElement | string | undefined): HTMLElement | null | undefined { - if (opener === undefined) { + getOpenerHTMLElement(opener: HTMLElement | string | null | undefined): HTMLElement | null | undefined { + if (opener === undefined || opener === null) { return opener; } @@ -375,6 +375,14 @@ class Popover extends Popup { const opener = this.getOpenerHTMLElement(this.opener); + if (!opener) { + Object.assign(this.style, { + top: `0px`, + left: `0px`, + }); + return; + } + if (opener && instanceOfUI5Element(opener) && !opener.getDomRef()) { return; } @@ -393,7 +401,7 @@ class Popover extends Popup { if (this.open) { // update opener rect if it was changed during the popover being opened - this._openerRect = opener!.getBoundingClientRect(); + this._openerRect = opener.getBoundingClientRect(); } if (this._oldPlacement && this.shouldCloseDueToNoOpener(this._openerRect!) && this.isFocusWithin()) { diff --git a/packages/main/src/Tokenizer.ts b/packages/main/src/Tokenizer.ts index 9cad4b2c9e98..0a8f631d3ed7 100644 --- a/packages/main/src/Tokenizer.ts +++ b/packages/main/src/Tokenizer.ts @@ -282,7 +282,7 @@ class Tokenizer extends UI5Element { @property({ converter: DOMReferenceConverter, }) - opener?: HTMLElement; + opener?: HTMLElement | string | null; /** * Sets the min-width of the nMore Popover. @@ -1032,7 +1032,7 @@ class Tokenizer extends UI5Element { return this.getSlottedNodes("tokens"); } - get morePopoverOpener(): HTMLElement { + get morePopoverOpener(): HTMLElement | string | null { // return this.opener ? this : this.opener; if (this.opener) { return this.opener; diff --git a/packages/main/test/pages/PopoverOpenerNull.html b/packages/main/test/pages/PopoverOpenerNull.html new file mode 100644 index 000000000000..edf11737c51b --- /dev/null +++ b/packages/main/test/pages/PopoverOpenerNull.html @@ -0,0 +1,33 @@ + + + + + + + + Popover opener null + + + + + + + Open Popover + Popover + Popover open + +