Skip to content

Commit 5f2f92d

Browse files
fix: update form-layout when its parent becomes visible (#7988) (#7993)
Co-authored-by: Serhii Kulykov <iamkulykov@gmail.com>
1 parent c69ad69 commit 5f2f92d

2 files changed

Lines changed: 57 additions & 2 deletions

File tree

packages/form-layout/src/vaadin-form-layout.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ class FormLayout extends ResizeMixin(ElementMixin(ThemableMixin(PolymerElement))
240240
_labelsOnTop: {
241241
type: Boolean,
242242
},
243+
244+
/** @private */
245+
__isVisible: {
246+
type: Boolean,
247+
},
243248
};
244249
}
245250

@@ -264,6 +269,22 @@ class FormLayout extends ResizeMixin(ElementMixin(ThemableMixin(PolymerElement))
264269
this.addEventListener('animationend', this.__onAnimationEnd);
265270
}
266271

272+
constructor() {
273+
super();
274+
275+
this.__intersectionObserver = new IntersectionObserver(([entry]) => {
276+
if (!entry.isIntersecting) {
277+
// Prevent possible jump when layout becomes visible
278+
this.$.layout.style.opacity = 0;
279+
}
280+
if (!this.__isVisible && entry.isIntersecting) {
281+
this._updateLayout();
282+
this.$.layout.style.opacity = '';
283+
}
284+
this.__isVisible = entry.isIntersecting;
285+
});
286+
}
287+
267288
/** @protected */
268289
connectedCallback() {
269290
super.connectedCallback();
@@ -272,6 +293,7 @@ class FormLayout extends ResizeMixin(ElementMixin(ThemableMixin(PolymerElement))
272293
requestAnimationFrame(() => this._updateLayout());
273294

274295
this._observeChildrenColspanChange();
296+
this.__intersectionObserver.observe(this);
275297
}
276298

277299
/** @protected */
@@ -280,6 +302,7 @@ class FormLayout extends ResizeMixin(ElementMixin(ThemableMixin(PolymerElement))
280302

281303
this.__mutationObserver.disconnect();
282304
this.__childObserver.disconnect();
305+
this.__intersectionObserver.disconnect();
283306
}
284307

285308
/** @private */

packages/form-layout/test/form-layout.test.js

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { expect } from '@vaadin/chai-plugins';
2-
import { aTimeout, fixtureSync, nextRender } from '@vaadin/testing-helpers';
2+
import { aTimeout, fixtureSync, nextFrame, nextRender } from '@vaadin/testing-helpers';
33
import sinon from 'sinon';
44
import '@polymer/polymer/lib/elements/dom-repeat.js';
55
import '@vaadin/text-field/vaadin-text-field.js';
@@ -519,7 +519,10 @@ describe('form layout', () => {
519519
beforeEach(() => {
520520
container = fixtureSync(`
521521
<div hidden>
522-
<vaadin-form-layout></vaadin-form-layout>
522+
<vaadin-form-layout>
523+
<div>Foo</div>
524+
<div>Bar</div>
525+
</vaadin-form-layout>
523526
</div>
524527
`);
525528
layout = container.querySelector('vaadin-form-layout');
@@ -546,6 +549,35 @@ describe('form layout', () => {
546549
ev.animationName = 'foo';
547550
layout.dispatchEvent(ev);
548551
});
552+
553+
it('should update layout when its parent becomes visible', async () => {
554+
layout.responsiveSteps = [{ columns: 1 }];
555+
await nextRender();
556+
557+
container.hidden = false;
558+
559+
// Wait for intersection observer
560+
await nextFrame();
561+
await nextFrame();
562+
563+
expect(parseFloat(getParsedWidth(layout.children[0]).percentage)).to.be.closeTo(100, 0.1);
564+
expect(parseFloat(getParsedWidth(layout.children[1]).percentage)).to.be.closeTo(100, 0.1);
565+
});
566+
567+
it('should change layout opacity when its parent becomes visible', async () => {
568+
// Wait for intersection observer
569+
await nextFrame();
570+
await nextFrame();
571+
expect(layout.$.layout.style.opacity).to.equal('0');
572+
573+
container.hidden = false;
574+
575+
// Wait for intersection observer
576+
await nextFrame();
577+
await nextFrame();
578+
579+
expect(layout.$.layout.style.opacity).to.equal('');
580+
});
549581
});
550582

551583
describe('mutations', () => {

0 commit comments

Comments
 (0)