Skip to content

Commit c944efd

Browse files
fix(ui5-popover): fix auto close when opener is outside the viewport (#4847)
Fixes #4716
1 parent 979bca2 commit c944efd

File tree

4 files changed

+34
-9
lines changed

4 files changed

+34
-9
lines changed

packages/main/src/Popover.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,13 @@ class Popover extends Popup {
390390
&& openerRect.right === 0;
391391
}
392392

393+
isOpenerOutsideViewport(openerRect) {
394+
return openerRect.bottom < 0
395+
|| openerRect.top > window.innerHeight
396+
|| openerRect.right < 0
397+
|| openerRect.left > window.innerWidth;
398+
}
399+
393400
/**
394401
* @override
395402
*/
@@ -429,7 +436,7 @@ class Popover extends Popup {
429436

430437
const stretching = this.horizontalAlign === PopoverHorizontalAlign.Stretch;
431438

432-
if (this._preventRepositionAndClose) {
439+
if (this._preventRepositionAndClose || this.isOpenerOutsideViewport(this._openerRect)) {
433440
return this.close();
434441
}
435442

packages/main/test/specs/DatePicker.spec.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,7 @@ describe("Date Picker Tests", () => {
851851

852852
const root = await datepicker.getRoot();
853853
await root.keys("Escape");
854+
await browser.$("#dp33").scrollIntoView();
854855
await datepicker.openPicker();
855856

856857
const displayedDay = await datepicker.getDisplayedDay(15);

packages/main/test/specs/DateTimePicker.spec.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,48 @@
11
const assert = require("chai").assert;
22
const PORT = require("./_port.js");
33

4-
const openPickerById = (id, options) => {
4+
const openPickerById = async (id, options) => {
5+
await browser.$(`#${id}`).scrollIntoView();
6+
57
return browser.executeAsync((id, options, done) => {
68
done(document.querySelector(`#${id}`).openPicker(options));
79
}, id, options);
8-
}
10+
};
911

1012
const closePickerById = id => {
1113
return browser.executeAsync((id, done) => {
1214
done(document.querySelector(`#${id}`).closePicker());
1315
}, id);
14-
}
16+
};
1517

1618
const isPickerOpen = id => {
1719
return browser.executeAsync((id, done) => {
1820
done(document.querySelector(`#${id}`).isOpen());
1921
}, id);
20-
}
22+
};
2123

2224
const getPicker = async id => {
2325
const staticAreaItemClassName = await browser.getStaticAreaItemClassName(`#${id}`);
2426
return browser.$(`.${staticAreaItemClassName}`).shadow$("ui5-responsive-popover");
25-
}
27+
};
2628

2729
const getSubmitButton = async id => {
2830
const picker = await getPicker(id);
2931
return picker.$("#ok");
30-
}
32+
};
3133

3234
const getCancelButton = async id => {
3335
const picker = await getPicker(id);
3436
return picker.$("#cancel");
35-
}
37+
};
3638

3739
const getTimeSlidersCount = async id => {
3840
const picker = await getPicker(id);
3941

4042
return await browser.executeAsync( (picker, done) => {
4143
done(picker.querySelector("ui5-time-selection").shadowRoot.querySelectorAll("ui5-wheelslider").length);
4244
}, picker);
43-
}
45+
};
4446

4547
describe("DateTimePicker general interaction", () => {
4648
before(async () => {

packages/main/test/specs/Popover.spec.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,21 @@ describe("Popover general interaction", () => {
6363
assert.notOk(await popover.isDisplayedInViewport(), "Popover is closed.");
6464
});
6565

66+
it("tests if popover auto closes when opener goes out of the viewport", async () => {
67+
const btnOpenPopover = await browser.$("#btnOpenWithAttr");
68+
const btnAccNameRef = await browser.$("#btnAccNameRef");
69+
70+
await btnOpenPopover.click();
71+
72+
const popover = await browser.$("#popoverAttr");
73+
assert.ok(await popover.isDisplayedInViewport(), "Popover is opened.");
74+
75+
await btnAccNameRef.scrollIntoView();
76+
assert.notOk(await popover.isDisplayedInViewport(), "Popover is closed.");
77+
78+
await browser.$("#btn").scrollIntoView();
79+
});
80+
6681
it("tests popover does not close with opener", async () => {
6782
const popover = await browser.$("#quickViewCard");
6883
const btnOpenPopover = await browser.$("#btnQuickViewCardOpener");

0 commit comments

Comments
 (0)