Skip to content

Commit 858a870

Browse files
fix(ui5-popover): fix arrow positioning (#11275)
* fix(ui5-popover): fix arrow positioning
1 parent 30fe06a commit 858a870

File tree

3 files changed

+70
-12
lines changed

3 files changed

+70
-12
lines changed

packages/main/cypress/specs/Popover.cy.tsx

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,40 @@ import Toolbar from "../../src/Toolbar.js";
33
import Popover from "../../src/Popover.js";
44
import Button from "../../src/Button.js";
55

6+
describe("Rendering", () => {
7+
it("tests arrow positioning", () => {
8+
cy.mount(
9+
<>
10+
<div id="icon1" tabindex="0" style="width: 10px; height: 10px; background:red;"></div>
11+
<Popover id="popup"
12+
opener="icon1"
13+
headerText="Newsletter subscription"
14+
placement="End"
15+
verticalAlign="Top">
16+
<Button id="btnClosePopover">Close</Button>
17+
</Popover>
18+
</>
19+
);
20+
21+
// act
22+
cy.get("#popup")
23+
.invoke("prop", "open", "true");
24+
25+
cy.get("#popup")
26+
.ui5PopoverOpened();
27+
28+
cy.get("#popup")
29+
.shadow()
30+
.find(".ui5-popover-arrow")
31+
.should("be.visible");
32+
33+
cy.get("#popup")
34+
.shadow()
35+
.find(".ui5-popover-arrow")
36+
.should("have.css", "transform", "matrix(1, 0, 0, 1, 0, -42)");
37+
});
38+
});
39+
640
describe("Popover opener", () => {
741
it("tests 'opener' set as string of abstract element's ID ", () => {
842
cy.mount(
@@ -110,7 +144,7 @@ describe("Popover opener", () => {
110144
});
111145

112146
cy.get("#popover")
113-
.should("be.visible");
147+
.ui5PopoverOpened();
114148

115149
cy.get("@showOutsideViewport")
116150
.should("have.been.calledOnce");
@@ -129,7 +163,7 @@ describe("Popover interaction", () => {
129163
</>
130164
);
131165

132-
cy.get("#pop").should("be.visible");
166+
cy.get("#pop").ui5PopoverOpened();
133167

134168
// act
135169
cy.get("body").realClick();
@@ -148,13 +182,13 @@ describe("Popover interaction", () => {
148182
</>
149183
);
150184

151-
cy.get("#pop").should("be.visible");
185+
cy.get("#pop").ui5PopoverOpened();
152186

153187
// act
154188
cy.get("#opener").realClick();
155189

156190
// assert
157-
cy.get("#pop").should("be.visible");
191+
cy.get("#pop").ui5PopoverOpened();
158192
});
159193

160194
it("tests clicking on the opener if both the popover and the opener are located in a shadow root", () => {
@@ -197,13 +231,13 @@ describe("Popover interaction", () => {
197231
);
198232

199233
// assert
200-
cy.get("#openerShadowRooTest").shadow().find("[ui5-popover]").should("be.visible");
234+
cy.get("#openerShadowRooTest").shadow().find("[ui5-popover]").ui5PopoverOpened();
201235

202236
// act
203237
cy.get("#openerShadowRooTest").shadow().find("button").realClick();
204238

205239
// assert
206-
cy.get("#openerShadowRooTest").shadow().find("[ui5-popover]").should("be.visible");
240+
cy.get("#openerShadowRooTest").shadow().find("[ui5-popover]").ui5PopoverOpened();
207241
});
208242

209243
it("tests clicking outside the popover when 'mousedown' event propagation is stopped", () => {
@@ -217,7 +251,7 @@ describe("Popover interaction", () => {
217251
</>
218252
);
219253

220-
cy.get("#pop").should("be.visible");
254+
cy.get("#pop").ui5PopoverOpened();
221255
cy.get("#btn").then(btn => {
222256
btn.get(0).addEventListener("mousedown", event => {
223257
event.stopPropagation();
@@ -334,7 +368,7 @@ describe("Events", () => {
334368
.invoke("prop", "open", true);
335369

336370
cy.get("#popoverId")
337-
.should("be.visible");
371+
.ui5PopoverOpened();
338372
});
339373

340374
it("before-close", () => {
@@ -356,7 +390,7 @@ describe("Events", () => {
356390
.invoke("prop", "open", true);
357391

358392
cy.get("#popoverId")
359-
.should("be.visible");
393+
.ui5PopoverOpened();
360394

361395
const preventDefault = (e : Event) => {
362396
e.preventDefault();
@@ -370,7 +404,7 @@ describe("Events", () => {
370404
.invoke("prop", "open", false);
371405

372406
cy.get("#popoverId")
373-
.should("be.visible");
407+
.ui5PopoverOpened();
374408

375409
cy.get("#popoverId").then($popover => {
376410
$popover.get(0).removeEventListener("before-close", preventDefault);

packages/main/src/Popover.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,14 +647,14 @@ class Popover extends Popup {
647647

648648
// Restricts the arrow's translate value along each dimension,
649649
// so that the arrow does not clip over the popover's rounded borders.
650-
const safeRangeForArrowY = popoverSize.height / 2 - borderRadius - ARROW_SIZE / 2;
650+
const safeRangeForArrowY = popoverSize.height / 2 - borderRadius - ARROW_SIZE / 2 - 2;
651651
arrowTranslateY = clamp(
652652
arrowTranslateY,
653653
-safeRangeForArrowY,
654654
safeRangeForArrowY,
655655
);
656656

657-
const safeRangeForArrowX = popoverSize.width / 2 - borderRadius - ARROW_SIZE / 2;
657+
const safeRangeForArrowX = popoverSize.width / 2 - borderRadius - ARROW_SIZE / 2 - 2;
658658
arrowTranslateX = clamp(
659659
arrowTranslateX,
660660
-safeRangeForArrowX,

packages/main/test/pages/Popover.html

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,26 @@
9999
<br>
100100
<br>
101101

102+
<ui5-icon id="icon1" name="home" mode="Interactive"></ui5-icon>
103+
104+
<ui5-popover id="popoverAlignedToIcon"
105+
opener="icon1"
106+
header-text="Newsletter subscription"
107+
placement="End"
108+
vertical-align="Top">
109+
<div class="popover-content">
110+
<ui5-label for="emailInput" required show-colon>Email</ui5-label>
111+
<ui5-input id="emailInput" style="min-width: 150px;" placeholder="Enter Email"></ui5-input>
112+
<ui5-label>Note: If you open the page in mobile, a dialog would be displayed.</ui5-label>
113+
</div>
114+
<div slot="footer" class="popover-footer">
115+
<ui5-button id="closePopoverButton" design="Emphasized">Subscribe</ui5-button>
116+
</div>
117+
</ui5-popover>
118+
119+
<br>
120+
<br>
121+
102122
<ui5-select>
103123
<ui5-option>Hello</ui5-option>
104124
<ui5-option>World</ui5-option>
@@ -941,6 +961,10 @@ <h3>Popover in ShadowRoot, Opener set as ID in window.document</h3>
941961
respPopover4.open = !respPopover4.open;
942962
});
943963

964+
icon1.addEventListener("click", () => {
965+
popoverAlignedToIcon.open = true;
966+
});
967+
944968
class OpenerTestShadowRootId extends HTMLElement {
945969
constructor() {
946970
super();

0 commit comments

Comments
 (0)