Skip to content

Commit 9f70cc5

Browse files
authored
fix: defer detect layout mode until updates are done (#9889)
* fix: defer detect layout mode until updates are done * chore: add comment on why the calculation is deferred * test: specify litelement in test name
1 parent ac7a950 commit 9f70cc5

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

packages/master-detail-layout/src/vaadin-master-detail-layout.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,8 +523,10 @@ class MasterDetailLayout extends SlotStylesMixin(ResizeMixin(ElementMixin(Themab
523523
* @protected
524524
*/
525525
async _finishTransition() {
526-
// Detect new layout mode after DOM has been updated
527-
this.__detectLayoutMode();
526+
// Detect new layout mode after DOM has been updated.
527+
// The detection is wrapped in queueMicroTask in order to allow custom Lit elements to render before measurement.
528+
// https://github.com/vaadin/web-components/issues/8969
529+
queueMicrotask(() => this.__detectLayoutMode());
528530

529531
if (!this.__transition) {
530532
return Promise.resolve();

packages/master-detail-layout/test/drawer-mode.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { fixtureSync, nextRender, nextResize } from '@vaadin/testing-helpers';
44
import '../src/vaadin-master-detail-layout.js';
55
import './helpers/master-content.js';
66
import './helpers/detail-content.js';
7+
import { html, LitElement } from 'lit';
78

89
window.Vaadin ||= {};
910
window.Vaadin.featureFlags ||= {};
@@ -198,6 +199,35 @@ describe('drawer mode', () => {
198199
const input = detailContent.shadowRoot.querySelector('input');
199200
expect(detailContent.shadowRoot.activeElement).to.equal(input);
200201
});
202+
203+
it('should immediately switch to drawer mode when wide LitElement detail is added at narrow width', async () => {
204+
layout = fixtureSync(`
205+
<vaadin-master-detail-layout>
206+
<div><input/></div>
207+
<div slot="detail"><input/></div>
208+
</vaadin-master-detail-layout>
209+
`);
210+
await nextRender();
211+
212+
await setViewport({ width: 335, height });
213+
await nextResize(layout);
214+
215+
class CustomDetailsElement extends LitElement {
216+
createRenderRoot() {
217+
return this;
218+
}
219+
220+
render() {
221+
return html` <button style="width: 250px">Long button description</button> `;
222+
}
223+
}
224+
customElements.define('custom-details-element', CustomDetailsElement);
225+
226+
const detail = document.createElement('custom-details-element');
227+
await layout._setDetail(detail);
228+
229+
expect(layout.hasAttribute('drawer')).to.be.true;
230+
});
201231
});
202232

203233
describe('vertical', () => {

packages/master-detail-layout/test/view-transitions.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ describe('View transitions', () => {
211211
expect(updateCallbackResolved).to.be.false;
212212

213213
// Finish transition
214-
layout._finishTransition();
214+
await layout._finishTransition();
215215
expect(detectLayoutModeSpy.calledOnce).to.be.true;
216216
await aTimeout(0);
217217
expect(updateCallbackResolved).to.be.true;

0 commit comments

Comments
 (0)