Skip to content

Commit bdc1f23

Browse files
authored
fix(popover): size property now works when providing only event (#23532)
resolves #23528
1 parent 6fbd60b commit bdc1f23

File tree

4 files changed

+98
-3
lines changed

4 files changed

+98
-3
lines changed

core/src/components/popover/animations/ios.enter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export const iosEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation =>
1919
const contentEl = root.querySelector('.popover-content') as HTMLElement;
2020
const arrowEl = root.querySelector('.popover-arrow') as HTMLElement | null;
2121

22-
const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, trigger);
22+
const referenceSizeEl = trigger || ev?.detail?.ionShadowTarget || ev?.target;
23+
const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
2324
const { arrowWidth, arrowHeight } = getArrowDimensions(arrowEl);
2425

2526
const defaultPosition = {

core/src/components/popover/animations/md.enter.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ export const mdEnterAnimation = (baseEl: HTMLElement, opts?: any): Animation =>
1818

1919
const root = getElementRoot(baseEl);
2020
const contentEl = root.querySelector('.popover-content') as HTMLElement;
21-
const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, trigger);
21+
22+
const referenceSizeEl = trigger || ev?.detail?.ionShadowTarget || ev?.target;
23+
const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
2224

2325
const defaultPosition = {
2426
top: bodyHeight / 2 - contentHeight / 2,

core/src/components/popover/test/size/e2e.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,54 @@ test('should calculate popover width based on trigger width', async () => {
4949
expect(screenshotCompare).toMatchScreenshot();
5050
}
5151
});
52+
53+
test('should calculate popover width based on event width', async () => {
54+
const page = await newE2EPage({ url: '/src/components/popover/test/size?ionic:_testing=true' });
55+
56+
const screenshotCompares = [];
57+
58+
const trigger = await page.find('#event-trigger');
59+
trigger.click();
60+
61+
await page.waitForSelector('.event-popover');
62+
const popover = await page.find('.event-popover');
63+
await popover.waitForVisible();
64+
65+
const triggerHandler = await page.$('#event-trigger');
66+
const popoverContentHandle = await page.evaluateHandle(`document.querySelector('.event-popover').shadowRoot.querySelector('.popover-content')`);
67+
const triggerBbox = await triggerHandler.boundingBox();
68+
const popoverBbox = await popoverContentHandle.boundingBox();
69+
expect(popoverBbox.width).toEqual(triggerBbox.width);
70+
71+
screenshotCompares.push(await page.compareScreenshot());
72+
73+
for (const screenshotCompare of screenshotCompares) {
74+
expect(screenshotCompare).toMatchScreenshot();
75+
}
76+
});
77+
78+
79+
test('should not calculate popover width with no trigger or event', async () => {
80+
const page = await newE2EPage({ url: '/src/components/popover/test/size?ionic:_testing=true' });
81+
82+
const screenshotCompares = [];
83+
84+
const trigger = await page.find('#no-event-trigger');
85+
trigger.click();
86+
87+
await page.waitForSelector('.no-event-popover');
88+
const popover = await page.find('.no-event-popover');
89+
await popover.waitForVisible();
90+
91+
const triggerHandler = await page.$('#no-event-trigger');
92+
const popoverContentHandle = await page.evaluateHandle(`document.querySelector('.no-event-popover').shadowRoot.querySelector('.popover-content')`);
93+
const triggerBbox = await triggerHandler.boundingBox();
94+
const popoverBbox = await popoverContentHandle.boundingBox();
95+
expect(popoverBbox.width).not.toEqual(triggerBbox.width);
96+
97+
screenshotCompares.push(await page.compareScreenshot());
98+
99+
for (const screenshotCompare of screenshotCompares) {
100+
expect(screenshotCompare).toMatchScreenshot();
101+
}
102+
});

core/src/components/popover/test/size/index.html

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
<link href="../../../../../scripts/testing/styles.css" rel="stylesheet">
99
<script src="../../../../../scripts/testing/scripts.js"></script>
1010
<script type="module" src="../../../../../dist/ionic/ionic.esm.js"></script>
11+
<script type="module">
12+
import { popoverController } from '../../../../dist/ionic/index.esm.js';
13+
window.popoverController = popoverController;
14+
</script>
1115
<style>
1216
.grid {
1317
display: grid;
14-
grid-template-columns: repeat(2, 1fr);
18+
grid-template-columns: repeat(4, 1fr);
1519
grid-row-gap: 20px;
1620
grid-column-gap: 20px;
1721

@@ -66,8 +70,45 @@ <h2>Cover</h2>
6670
</ion-content>
6771
</ion-popover>
6872
</div>
73+
<div class="grid-item">
74+
<h2>With Event</h2>
75+
<ion-button id="event-trigger" onclick="openPopover('event-popover', event)">Trigger</ion-button>
76+
</div>
77+
78+
<div class="grid-item">
79+
<h2>No Event</h2>
80+
<ion-button id="no-event-trigger" onclick="openPopover('no-event-popover')">Trigger</ion-button>
81+
</div>
6982
</div>
7083
</ion-content>
7184
</ion-app>
85+
86+
<script>
87+
class PopoverComponent extends HTMLElement {
88+
constructor() {
89+
super();
90+
}
91+
92+
connectedCallback() {
93+
this.innerHTML = `
94+
<ion-content class="ion-padding">
95+
My really really really really long content
96+
</ion-content>
97+
`;
98+
}
99+
}
100+
101+
customElements.define('popover-component', PopoverComponent);
102+
103+
const openPopover = async (cssClass, ev) => {
104+
const popover = await popoverController.create({
105+
component: 'popover-component',
106+
cssClass,
107+
size: 'cover',
108+
event: ev
109+
});
110+
await popover.present();
111+
}
112+
</script>
72113
</body>
73114
</html>

0 commit comments

Comments
 (0)