Skip to content

Commit 5968279

Browse files
authored
fix: make popover width and height work when set before attach (#10077)
1 parent 68ff48d commit 5968279

File tree

2 files changed

+70
-38
lines changed

2 files changed

+70
-38
lines changed

packages/popover/src/vaadin-popover.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ class Popover extends PopoverPositionMixin(
435435
}
436436

437437
static get observers() {
438-
return ['__sizeChanged(width, height, _overlayElement)', '__updateAriaAttributes(opened, role, target)'];
438+
return ['__updateAriaAttributes(opened, role, target)'];
439439
}
440440

441441
/**
@@ -572,6 +572,11 @@ class Popover extends PopoverPositionMixin(
572572
updated(props) {
573573
super.updated(props);
574574

575+
if (props.has('width') || props.has('height')) {
576+
const { width, height } = this;
577+
requestAnimationFrame(() => this.$.overlay.setBounds({ width, height }, false));
578+
}
579+
575580
if (props.has('accessibleName')) {
576581
if (this.accessibleName) {
577582
this.setAttribute('aria-label', this.accessibleName);
@@ -1019,13 +1024,6 @@ class Popover extends PopoverPositionMixin(
10191024
return Array.isArray(this.trigger) && this.trigger.includes(trigger);
10201025
}
10211026

1022-
/** @private */
1023-
__sizeChanged(width, height, overlay) {
1024-
if (overlay) {
1025-
requestAnimationFrame(() => overlay.setBounds({ width, height }, false));
1026-
}
1027-
}
1028-
10291027
/**
10301028
* Fired when the popover is closed.
10311029
*

packages/popover/test/basic.test.js

Lines changed: 64 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -572,45 +572,79 @@ describe('popover', () => {
572572
});
573573

574574
describe('dimensions', () => {
575-
beforeEach(async () => {
576-
popover.opened = true;
577-
await oneEvent(overlay, 'vaadin-overlay-open');
578-
});
575+
describe('default', () => {
576+
beforeEach(async () => {
577+
popover.opened = true;
578+
await oneEvent(overlay, 'vaadin-overlay-open');
579+
});
579580

580-
it('should update width after opening the popover', async () => {
581-
popover.width = '300px';
582-
await nextRender();
583-
expect(getComputedStyle(overlay.$.overlay).width).to.equal('300px');
584-
});
581+
it('should update width after opening the popover', async () => {
582+
popover.width = '300px';
583+
await nextRender();
584+
expect(getComputedStyle(overlay.$.overlay).width).to.equal('300px');
585+
});
585586

586-
it('should update height after opening the popover', async () => {
587-
popover.height = '500px';
588-
await nextRender();
589-
expect(getComputedStyle(overlay.$.overlay).height).to.equal('500px');
590-
});
587+
it('should update height after opening the popover', async () => {
588+
popover.height = '500px';
589+
await nextRender();
590+
expect(getComputedStyle(overlay.$.overlay).height).to.equal('500px');
591+
});
591592

592-
it('should reset style after setting width to null', async () => {
593-
const originalWidth = getComputedStyle(overlay.$.overlay).width;
593+
it('should reset style after setting width to null', async () => {
594+
const originalWidth = getComputedStyle(overlay.$.overlay).width;
594595

595-
popover.width = '500px';
596-
await nextRender();
597-
expect(getComputedStyle(overlay.$.overlay).width).to.equal('500px');
596+
popover.width = '500px';
597+
await nextRender();
598+
expect(getComputedStyle(overlay.$.overlay).width).to.equal('500px');
598599

599-
popover.width = null;
600-
await nextRender();
601-
expect(getComputedStyle(overlay.$.overlay).width).to.equal(originalWidth);
600+
popover.width = null;
601+
await nextRender();
602+
expect(getComputedStyle(overlay.$.overlay).width).to.equal(originalWidth);
603+
});
604+
605+
it('should reset style after setting height to null', async () => {
606+
const originalHeight = getComputedStyle(overlay.$.overlay).height;
607+
608+
popover.height = '500px';
609+
await nextRender();
610+
expect(getComputedStyle(overlay.$.overlay).height).to.equal('500px');
611+
612+
popover.height = null;
613+
await nextRender();
614+
expect(getComputedStyle(overlay.$.overlay).height).to.equal(originalHeight);
615+
});
602616
});
603617

604-
it('should reset style after setting height to null', async () => {
605-
const originalHeight = getComputedStyle(overlay.$.overlay).height;
618+
describe('set before attach', () => {
619+
beforeEach(() => {
620+
popover = document.createElement('vaadin-popover');
621+
});
606622

607-
popover.height = '500px';
608-
await nextRender();
609-
expect(getComputedStyle(overlay.$.overlay).height).to.equal('500px');
623+
afterEach(() => {
624+
popover.remove();
625+
});
610626

611-
popover.height = null;
612-
await nextRender();
613-
expect(getComputedStyle(overlay.$.overlay).height).to.equal(originalHeight);
627+
it('should apply overlay width when set before attach', async () => {
628+
popover.width = '300px';
629+
document.body.appendChild(popover);
630+
await nextRender();
631+
632+
popover.opened = true;
633+
await oneEvent(popover.$.overlay, 'vaadin-overlay-open');
634+
635+
expect(getComputedStyle(popover.$.overlay.$.overlay).width).to.equal('300px');
636+
});
637+
638+
it('should apply overlay height when set before attach', async () => {
639+
popover.height = '300px';
640+
document.body.appendChild(popover);
641+
await nextRender();
642+
643+
popover.opened = true;
644+
await oneEvent(popover.$.overlay, 'vaadin-overlay-open');
645+
646+
expect(getComputedStyle(popover.$.overlay.$.overlay).height).to.equal('300px');
647+
});
614648
});
615649
});
616650

0 commit comments

Comments
 (0)