From 64360d2b0dd25e4c4d7a12024536e8677068596c Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Wed, 8 Jan 2025 14:41:12 -0500 Subject: [PATCH 01/16] first pass, missing lots --- components/dialog/dialog.js | 100 +++++++++++++++++++++++++++++++----- 1 file changed, 86 insertions(+), 14 deletions(-) diff --git a/components/dialog/dialog.js b/components/dialog/dialog.js index 8110ec798ec..bd13a3148cf 100644 --- a/components/dialog/dialog.js +++ b/components/dialog/dialog.js @@ -14,14 +14,83 @@ import { styleMap } from 'lit/directives/style-map.js'; const mediaQueryList = window.matchMedia('(max-width: 615px), (max-height: 420px) and (max-width: 900px)'); -/** - * A generic dialog that provides a slot for arbitrary content and a "footer" slot for workflow buttons. Apply the "data-dialog-action" attribute to workflow buttons to automatically close the dialog with the action value. - * @fires d2l-dialog-before-close - Dispatched with the action value before the dialog is closed for any reason, providing an opportunity to prevent the dialog from closing - * @slot - Default slot for content inside dialog - * @slot footer - Slot for footer content such as workflow buttons - */ -class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMixin(DialogMixin(LitElement)))) { +function getComposedChildren(node) { + + if (node?.nodeType !== Node.ELEMENT_NODE) { + return []; + } + + let nodes; + const children = []; + + if (node.tagName === 'SLOT') { + nodes = node.assignedNodes({ flatten: true }); + } else { + if (node.shadowRoot) { + node = node.shadowRoot; + } + nodes = node.children || node.childNodes; + } + + for (let i = 0; i < nodes.length; i++) { + if (nodes[i].nodeType === 1) { + children.push(nodes[i]); + } + } + + return children; + +} + +function nextFrame() { + return new Promise(resolve => { + requestAnimationFrame(() => resolve()); + }); +} + +async function waitForElem(elem, awaitLoadingComplete = true) { + + if (!elem) return; + + const doWait = async() => { + + const update = elem.updateComplete; + if (typeof update === 'object' && Promise.resolve(update) === update) { + await update; + await nextFrame(); + } + if (awaitLoadingComplete && typeof elem.getLoadingComplete === 'function') { + await elem.getLoadingComplete(); + await nextFrame(); + } + + const children = getComposedChildren(elem); + await Promise.all(children.map(e => waitForElem(e, awaitLoadingComplete))); + + }; + + await new Promise((resolve) => { + const observer = new MutationObserver((records) => { + for (const record of records) { + for (const removedNode of record.removedNodes) { + if (removedNode === elem) { + observer.disconnect(); + resolve(); + return; + } + } + } + }); + observer.observe(elem.parentNode, { childList: true }); + doWait() + .then(() => observer.disconnect()) + .then(resolve); + }); + +} + +class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMixin(DialogMixin(LitElement)))) { static get properties() { return { /** @@ -64,7 +133,6 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix :host([critical]) .d2l-dialog-header { padding-bottom: 15px; } - .d2l-dialog-header > div > d2l-button-icon { flex: none; margin: -4px -15px 0 15px; @@ -74,13 +142,11 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix margin-left: -15px; margin-right: 15px; } - .d2l-dialog-content > div { /* required to properly calculate preferred height when there are bottom margins at the end of the slotted content */ border-bottom: 1px solid transparent; } - .d2l-dialog-content-loading { text-align: center; } @@ -146,11 +212,11 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix `; } - const heightOverride = {} ; + const heightOverride = {}; let topOverride = null; if (mediaQueryList.matches) { if (this._ifrauContextInfo) { - // in iframes, use calculated available height from dialog mixin minus padding + heightOverride.minHeight = `${this._ifrauContextInfo.availableHeight - 42}px`; heightOverride.top = `${this._top + this._margin.top + 42}px`; const iframeTop = this._ifrauContextInfo.top < 0 @@ -207,6 +273,14 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix if (this.asyncState === asyncStates.complete) { this.resize(); } + this.waitForChildrenLoading().then(() => { + this.resize(); + }); + } + + async waitForChildrenLoading() { + const children = getComposedChildren(this); + await Promise.all(children.map(child => waitForElem(child))); } _abort() { @@ -222,7 +296,5 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix this._autoSize = !mediaQueryList.matches; this.resize(); } - } - customElements.define('d2l-dialog', Dialog); From 7d66e1e149acaafd4e47139db1973fad67a72de1 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Wed, 8 Jan 2025 14:50:49 -0500 Subject: [PATCH 02/16] add subtree skipping to methods --- components/dialog/dialog.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/dialog/dialog.js b/components/dialog/dialog.js index bd13a3148cf..b0c7e210936 100644 --- a/components/dialog/dialog.js +++ b/components/dialog/dialog.js @@ -34,7 +34,9 @@ function getComposedChildren(node) { for (let i = 0; i < nodes.length; i++) { if (nodes[i].nodeType === 1) { - children.push(nodes[i]); + if (!nodes[i].hasAttribute('data-subtree-skip')) { + children.push(nodes[i]); + } } } From 21e591876238278d95acc6156aa7c86171818980 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Thu, 9 Jan 2025 15:12:07 -0500 Subject: [PATCH 03/16] move to helpers, add predicate --- components/dialog/dialog.js | 105 +++++--------------------------- helpers/README.md | 3 +- helpers/dom.js | 6 +- helpers/internal/waitForElem.js | 47 ++++++++++++++ package.json | 1 + 5 files changed, 70 insertions(+), 92 deletions(-) create mode 100644 helpers/internal/waitForElem.js diff --git a/components/dialog/dialog.js b/components/dialog/dialog.js index b0c7e210936..37efb380ca1 100644 --- a/components/dialog/dialog.js +++ b/components/dialog/dialog.js @@ -6,92 +6,16 @@ import { css, html, LitElement, nothing } from 'lit'; import { classMap } from 'lit/directives/class-map.js'; import { DialogMixin } from './dialog-mixin.js'; import { dialogStyles } from './dialog-styles.js'; +import { getComposedChildren } from '../../helpers/dom.js'; import { getUniqueId } from '../../helpers/uniqueId.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { LocalizeCoreElement } from '../../helpers/localize-core-element.js'; import { PropertyRequiredMixin } from '../../mixins/property-required/property-required-mixin.js'; import { styleMap } from 'lit/directives/style-map.js'; +import { waitForElem } from '../../helpers/internal/waitForElem.js'; const mediaQueryList = window.matchMedia('(max-width: 615px), (max-height: 420px) and (max-width: 900px)'); -function getComposedChildren(node) { - - if (node?.nodeType !== Node.ELEMENT_NODE) { - return []; - } - - let nodes; - const children = []; - - if (node.tagName === 'SLOT') { - nodes = node.assignedNodes({ flatten: true }); - } else { - if (node.shadowRoot) { - node = node.shadowRoot; - } - nodes = node.children || node.childNodes; - } - - for (let i = 0; i < nodes.length; i++) { - if (nodes[i].nodeType === 1) { - if (!nodes[i].hasAttribute('data-subtree-skip')) { - children.push(nodes[i]); - } - } - } - - return children; - -} - -function nextFrame() { - return new Promise(resolve => { - requestAnimationFrame(() => resolve()); - }); -} - -async function waitForElem(elem, awaitLoadingComplete = true) { - - if (!elem) return; - - const doWait = async() => { - - const update = elem.updateComplete; - if (typeof update === 'object' && Promise.resolve(update) === update) { - await update; - await nextFrame(); - } - - if (awaitLoadingComplete && typeof elem.getLoadingComplete === 'function') { - await elem.getLoadingComplete(); - await nextFrame(); - } - - const children = getComposedChildren(elem); - await Promise.all(children.map(e => waitForElem(e, awaitLoadingComplete))); - - }; - - await new Promise((resolve) => { - const observer = new MutationObserver((records) => { - for (const record of records) { - for (const removedNode of record.removedNodes) { - if (removedNode === elem) { - observer.disconnect(); - resolve(); - return; - } - } - } - }); - observer.observe(elem.parentNode, { childList: true }); - doWait() - .then(() => observer.disconnect()) - .then(resolve); - }); - -} - class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMixin(DialogMixin(LitElement)))) { static get properties() { return { @@ -110,6 +34,10 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix */ describeContent: { type: Boolean, attribute: 'describe-content' }, + /** + * will walk dom tree for children elements as long as predicate(node) evaluates to true for said branch + */ + predicate: { type: Function }, /** * Whether to render the dialog at the maximum height */ @@ -175,6 +103,7 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix this.critical = false; this.describeContent = false; this.fullHeight = false; + this.predicate = () => true; this.width = 600; this._criticalLabelId = getUniqueId(); this._handleResize = this._handleResize.bind(this); @@ -269,26 +198,24 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix ); } - updated(changedProperties) { + async updated(changedProperties) { super.updated(changedProperties); - if (!changedProperties.has('asyncState')) return; - if (this.asyncState === asyncStates.complete) { + + if (changedProperties.has('asyncState') && this.asyncState === asyncStates.complete) { + await this._handleAsyncChildren(); this.resize(); } - this.waitForChildrenLoading().then(() => { - this.resize(); - }); - } - - async waitForChildrenLoading() { - const children = getComposedChildren(this); - await Promise.all(children.map(child => waitForElem(child))); } _abort() { this._close('abort'); } + async _handleAsyncChildren() { + const composedChildren = getComposedChildren(this, this.predicate); + await Promise.all(composedChildren.map(child => waitForElem(child, this.predicate))); + } + _handleFooterSlotChange(e) { const footerContent = e.target.assignedNodes({ flatten: true }); this._hasFooterContent = (footerContent && footerContent.length > 0); diff --git a/helpers/README.md b/helpers/README.md index d885e8aa541..f0982085eab 100644 --- a/helpers/README.md +++ b/helpers/README.md @@ -86,7 +86,8 @@ elemIdListRemoves(node, attrName, value); findComposedAncestor(node, predicate); // gets the composed children (including shadow children & distributed children) -getComposedChildren(element); +// includes a predicate which will add children nodes when predicate(node) is true +getComposedChildren(element, predicate = () => true); // gets the composed parent (including shadow host & insertion points) getComposedParent(node); diff --git a/helpers/dom.js b/helpers/dom.js index ebd2496b01d..44a1b8b5d0a 100644 --- a/helpers/dom.js +++ b/helpers/dom.js @@ -79,7 +79,7 @@ export function getBoundingAncestor(node) { }); } -export function getComposedChildren(node) { +export function getComposedChildren(node, predicate = () => true) { if (!node) { return null; @@ -104,7 +104,9 @@ export function getComposedChildren(node) { for (let i = 0; i < nodes.length; i++) { if (nodes[i].nodeType === 1) { - children.push(nodes[i]); + if (predicate(nodes[i])) { + children.push(nodes[i]); + } } } diff --git a/helpers/internal/waitForElem.js b/helpers/internal/waitForElem.js new file mode 100644 index 00000000000..9ca30efab0e --- /dev/null +++ b/helpers/internal/waitForElem.js @@ -0,0 +1,47 @@ +import { getComposedChildren } from '../dom.js'; + +export async function waitForElem(elem, predicate = () => true) { + + if (!elem) return; + + const doWait = async() => { + + const update = elem.updateComplete; + if (typeof update === 'object' && Promise.resolve(update) === update) { + await update; + await new Promise(resolve => { + requestAnimationFrame(() => resolve()); + }); + } + + if (typeof elem.getLoadingComplete === 'function') { + await elem.getLoadingComplete(); + await new Promise(resolve => { + requestAnimationFrame(() => resolve()); + }); + } + + const children = getComposedChildren(elem, predicate); + await Promise.all(children.map(e => waitForElem(e, predicate))); + + }; + + await new Promise((resolve) => { + const observer = new MutationObserver((records) => { + for (const record of records) { + for (const removedNode of record.removedNodes) { + if (removedNode === elem) { + observer.disconnect(); + resolve(); + return; + } + } + } + }); + observer.observe(elem.parentNode, { childList: true }); + doWait() + .then(() => observer.disconnect()) + .then(resolve); + }); + +} diff --git a/package.json b/package.json index 471c460a965..5aee47a0fec 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "/directives", "/generated", "/helpers", + "!/helpers/internal", "/lang", "/mixins", "/templates", From fd198796861762405d740a5a1e87b48ced520180 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Fri, 10 Jan 2025 09:07:41 -0500 Subject: [PATCH 04/16] wrap resize with a 0 setTimeout --- components/dialog/dialog.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/dialog/dialog.js b/components/dialog/dialog.js index 37efb380ca1..e89229b40a9 100644 --- a/components/dialog/dialog.js +++ b/components/dialog/dialog.js @@ -203,7 +203,9 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix if (changedProperties.has('asyncState') && this.asyncState === asyncStates.complete) { await this._handleAsyncChildren(); - this.resize(); + setTimeout(() => { + this.resize(); + }, 0); } } From acb31d7023f8ae59483d49a26b7716abbf089632 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Mon, 13 Jan 2025 09:43:33 -0500 Subject: [PATCH 05/16] fix comments, update method name, remove file approach from package --- components/dialog/dialog.js | 28 ++++++++++++++-------------- package.json | 1 - 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/components/dialog/dialog.js b/components/dialog/dialog.js index e89229b40a9..bbfc49dd26b 100644 --- a/components/dialog/dialog.js +++ b/components/dialog/dialog.js @@ -16,6 +16,12 @@ import { waitForElem } from '../../helpers/internal/waitForElem.js'; const mediaQueryList = window.matchMedia('(max-width: 615px), (max-height: 420px) and (max-width: 900px)'); +/** + * A generic dialog that provides a slot for arbitrary content and a "footer" slot for workflow buttons. Apply the "data-dialog-action" attribute to workflow buttons to automatically close the dialog with the action value. + * @fires d2l-dialog-before-close - Dispatched with the action value before the dialog is closed for any reason, providing an opportunity to prevent the dialog from closing + * @slot - Default slot for content inside dialog + * @slot footer - Slot for footer content such as workflow buttons + */ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMixin(DialogMixin(LitElement)))) { static get properties() { return { @@ -34,10 +40,6 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix */ describeContent: { type: Boolean, attribute: 'describe-content' }, - /** - * will walk dom tree for children elements as long as predicate(node) evaluates to true for said branch - */ - predicate: { type: Function }, /** * Whether to render the dialog at the maximum height */ @@ -147,7 +149,7 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix let topOverride = null; if (mediaQueryList.matches) { if (this._ifrauContextInfo) { - + // in iframes, use calculated available height from dialog mixin minus padding heightOverride.minHeight = `${this._ifrauContextInfo.availableHeight - 42}px`; heightOverride.top = `${this._top + this._margin.top + 42}px`; const iframeTop = this._ifrauContextInfo.top < 0 @@ -202,10 +204,8 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix super.updated(changedProperties); if (changedProperties.has('asyncState') && this.asyncState === asyncStates.complete) { - await this._handleAsyncChildren(); - setTimeout(() => { - this.resize(); - }, 0); + await this._waitForUpdateComplete(); + setTimeout(() => this.resize()); } } @@ -213,11 +213,6 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix this._close('abort'); } - async _handleAsyncChildren() { - const composedChildren = getComposedChildren(this, this.predicate); - await Promise.all(composedChildren.map(child => waitForElem(child, this.predicate))); - } - _handleFooterSlotChange(e) { const footerContent = e.target.assignedNodes({ flatten: true }); this._hasFooterContent = (footerContent && footerContent.length > 0); @@ -227,5 +222,10 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix this._autoSize = !mediaQueryList.matches; this.resize(); } + + async _waitForUpdateComplete() { + const composedChildren = getComposedChildren(this, this.predicate); + await Promise.all(composedChildren.map(child => waitForElem(child, this.predicate))); + } } customElements.define('d2l-dialog', Dialog); diff --git a/package.json b/package.json index 5aee47a0fec..471c460a965 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "/directives", "/generated", "/helpers", - "!/helpers/internal", "/lang", "/mixins", "/templates", From 01b916c85ac7489aea2dcab3aef17043c55e4083 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Mon, 13 Jan 2025 09:49:29 -0500 Subject: [PATCH 06/16] remove predicate from public --- components/dialog/dialog.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/dialog/dialog.js b/components/dialog/dialog.js index bbfc49dd26b..289cae54867 100644 --- a/components/dialog/dialog.js +++ b/components/dialog/dialog.js @@ -105,7 +105,6 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix this.critical = false; this.describeContent = false; this.fullHeight = false; - this.predicate = () => true; this.width = 600; this._criticalLabelId = getUniqueId(); this._handleResize = this._handleResize.bind(this); @@ -224,8 +223,9 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix } async _waitForUpdateComplete() { - const composedChildren = getComposedChildren(this, this.predicate); - await Promise.all(composedChildren.map(child => waitForElem(child, this.predicate))); + const predicate = () => true; + const composedChildren = getComposedChildren(this, predicate); + await Promise.all(composedChildren.map(child => waitForElem(child, predicate))); } } customElements.define('d2l-dialog', Dialog); From 6efab62b703322a97efb3381b7d1c0927fbf91b3 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Mon, 13 Jan 2025 10:09:24 -0500 Subject: [PATCH 07/16] remove mutationObserver from waitForElem --- helpers/internal/waitForElem.js | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/helpers/internal/waitForElem.js b/helpers/internal/waitForElem.js index 9ca30efab0e..c462efbcbbb 100644 --- a/helpers/internal/waitForElem.js +++ b/helpers/internal/waitForElem.js @@ -2,7 +2,7 @@ import { getComposedChildren } from '../dom.js'; export async function waitForElem(elem, predicate = () => true) { - if (!elem) return; + if (!elem || !elem.parentNode) return; const doWait = async() => { @@ -23,25 +23,7 @@ export async function waitForElem(elem, predicate = () => true) { const children = getComposedChildren(elem, predicate); await Promise.all(children.map(e => waitForElem(e, predicate))); - }; - await new Promise((resolve) => { - const observer = new MutationObserver((records) => { - for (const record of records) { - for (const removedNode of record.removedNodes) { - if (removedNode === elem) { - observer.disconnect(); - resolve(); - return; - } - } - } - }); - observer.observe(elem.parentNode, { childList: true }); - doWait() - .then(() => observer.disconnect()) - .then(resolve); - }); - + await doWait(); } From 7257fa02840580207202e378b23b7b47af2ad4c8 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Tue, 14 Jan 2025 15:09:15 -0500 Subject: [PATCH 08/16] add mutationObserver back so child node additions are tracked better --- helpers/internal/waitForElem.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/helpers/internal/waitForElem.js b/helpers/internal/waitForElem.js index c462efbcbbb..9ca30efab0e 100644 --- a/helpers/internal/waitForElem.js +++ b/helpers/internal/waitForElem.js @@ -2,7 +2,7 @@ import { getComposedChildren } from '../dom.js'; export async function waitForElem(elem, predicate = () => true) { - if (!elem || !elem.parentNode) return; + if (!elem) return; const doWait = async() => { @@ -23,7 +23,25 @@ export async function waitForElem(elem, predicate = () => true) { const children = getComposedChildren(elem, predicate); await Promise.all(children.map(e => waitForElem(e, predicate))); + }; - await doWait(); + await new Promise((resolve) => { + const observer = new MutationObserver((records) => { + for (const record of records) { + for (const removedNode of record.removedNodes) { + if (removedNode === elem) { + observer.disconnect(); + resolve(); + return; + } + } + } + }); + observer.observe(elem.parentNode, { childList: true }); + doWait() + .then(() => observer.disconnect()) + .then(resolve); + }); + } From 656d369f2d5777d197cc74193dbcdfbc34b27ef2 Mon Sep 17 00:00:00 2001 From: KearseTrevor Date: Tue, 14 Jan 2025 15:28:30 -0500 Subject: [PATCH 09/16] wip getLoadingComplete test for dialog --- components/dialog/test/dialog.test.js | 43 ++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/components/dialog/test/dialog.test.js b/components/dialog/test/dialog.test.js index 20ffc069255..8b1ba605a9f 100644 --- a/components/dialog/test/dialog.test.js +++ b/components/dialog/test/dialog.test.js @@ -1,8 +1,9 @@ import '../dialog.js'; import { expect, fixture, oneEvent, runConstructor } from '@brightspace-ui/testing'; +import { html, LitElement } from 'lit'; import { createMessage } from '../../../mixins/property-required/property-required-mixin.js'; import { getComposedActiveElement } from '../../../helpers/focus.js'; -import { html } from 'lit'; +import { spy } from 'sinon'; describe('d2l-dialog', () => { @@ -80,4 +81,44 @@ describe('d2l-dialog', () => { }); + class DelayedElement extends LitElement { + render() { + return html`
`; + } + + async getLoadingComplete() { + const newChild = document.createElement('div'); + newChild.className = 'added-child'; + newChild.textContent = 'New addition to the family!'; + this.shadowRoot.appendChild(newChild); + await new Promise(r => setTimeout(r, 100)); + } + } + customElements.define('delayed-elem', DelayedElement); + + describe('getLoadingComplete', () => { + + it('should wait for child component\'s getLoadingComplete before resizing', async() => { + + const el = await fixture(html` + + + + `); + + const delayedComponent = el.querySelector('delayed-elem'); + const mixinProto = Object.getPrototypeOf(el).__proto__; + const resizeSpy = spy(mixinProto, 'resize'); + + el.opened = true; + await oneEvent(el, 'd2l-dialog-open'); + el.asyncState = 'complete'; + + expect(resizeSpy.called).to.be.false; + await delayedComponent.getLoadingComplete(); + expect(resizeSpy.calledOnce).to.be.true; + }); + + }); + }); From d5f96063c37859366a0b71b5d1cb4836b256031b Mon Sep 17 00:00:00 2001 From: Dave Lockhart Date: Tue, 14 Jan 2025 16:15:00 -0500 Subject: [PATCH 10/16] make async demo implement LoadingCompleteMixin --- components/dialog/demo/dialog-async-content.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/components/dialog/demo/dialog-async-content.js b/components/dialog/demo/dialog-async-content.js index 70ab706fd7a..3317cd60689 100644 --- a/components/dialog/demo/dialog-async-content.js +++ b/components/dialog/demo/dialog-async-content.js @@ -3,8 +3,9 @@ import '../../list/list-item.js'; import '../../list/list-item-content.js'; import { html, LitElement } from 'lit'; import { InitialStateError, runAsync } from '../../../directives/run-async/run-async.js'; +import { LoadingCompleteMixin } from '../../../mixins/loading-complete/loading-complete-mixin.js'; -class DialogAsyncContent extends LitElement { +class DialogAsyncContent extends LoadingCompleteMixin(LitElement) { static get properties() { return { @@ -32,21 +33,21 @@ class DialogAsyncContent extends LitElement { resolve(html` - +
Introductory Earth Sciences
This course explores the geological process of the Earth's interior and surface. These include volcanism, earthquakes, mountains...
- +
Engineering Materials for Energy Systems
This course explores the geological processes of the Earth's interior and surface. These include volcanism, earthquakes, mountain...
- +
Geomorphology and GIS
This course explores the geological processes of the Earth's interior and surface. These include volcanism, earthquakes, mountain...
@@ -58,6 +59,14 @@ class DialogAsyncContent extends LitElement { }); } + #handleImageLoad() { + const images = this.shadowRoot.querySelectorAll('img'); + for (const image of images) { + if (!image.complete) return; + } + this.resolveLoadingComplete(); + } + } customElements.define('d2l-dialog-demo-async-content', DialogAsyncContent); From 2411fb9f568836d321a787c551b8b79eff7e890b Mon Sep 17 00:00:00 2001 From: Dave Lockhart Date: Tue, 14 Jan 2025 17:42:44 -0500 Subject: [PATCH 11/16] wait for loading-complete from dialog mixin --- components/dialog/dialog-mixin.js | 11 +++++- components/dialog/dialog.js | 23 ++++++------ components/dialog/test/dialog.test.js | 43 +--------------------- helpers/internal/waitForElem.js | 52 ++++++++------------------- 4 files changed, 36 insertions(+), 93 deletions(-) diff --git a/components/dialog/dialog-mixin.js b/components/dialog/dialog-mixin.js index 2d6353e501c..94d02a2a997 100644 --- a/components/dialog/dialog-mixin.js +++ b/components/dialog/dialog-mixin.js @@ -2,7 +2,7 @@ import '../focus-trap/focus-trap.js'; import '../../helpers/viewport-size.js'; import { allowBodyScroll, preventBodyScroll } from '../backdrop/backdrop.js'; import { clearDismissible, setDismissible } from '../../helpers/dismissible.js'; -import { findComposedAncestor, isComposedAncestor } from '../../helpers/dom.js'; +import { findComposedAncestor, getComposedChildren, isComposedAncestor } from '../../helpers/dom.js'; import { getComposedActiveElement, getFirstFocusableDescendant, getNextFocusable, isFocusable } from '../../helpers/focus.js'; import { classMap } from 'lit/directives/class-map.js'; import { getUniqueId } from '../../helpers/uniqueId.js'; @@ -11,6 +11,7 @@ import { ifDefined } from 'lit/directives/if-defined.js'; import { RtlMixin } from '../../mixins/rtl/rtl-mixin.js'; import { styleMap } from 'lit/directives/style-map.js'; import { tryGetIfrauBackdropService } from '../../helpers/ifrauBackdropService.js'; +import { waitForElem } from '../../helpers/internal/waitForElem.js'; window.D2L = window.D2L || {}; window.D2L.DialogMixin = window.D2L.DialogMixin || {}; @@ -452,6 +453,8 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) { if (reduceMotion) await new Promise(resolve => requestAnimationFrame(resolve)); else await animPromise; + await this.#waitForUpdateComplete(); + await this._updateSize(); /** Dispatched when the dialog is opened */ this.dispatchEvent(new CustomEvent( 'd2l-dialog-open', { bubbles: true, composed: true } @@ -580,4 +583,10 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) { }); }); } + + async #waitForUpdateComplete() { + const predicate = () => true; + const composedChildren = getComposedChildren(this, predicate); + await Promise.all(composedChildren.map(child => waitForElem(child, predicate))); + } }; diff --git a/components/dialog/dialog.js b/components/dialog/dialog.js index 289cae54867..8110ec798ec 100644 --- a/components/dialog/dialog.js +++ b/components/dialog/dialog.js @@ -6,13 +6,11 @@ import { css, html, LitElement, nothing } from 'lit'; import { classMap } from 'lit/directives/class-map.js'; import { DialogMixin } from './dialog-mixin.js'; import { dialogStyles } from './dialog-styles.js'; -import { getComposedChildren } from '../../helpers/dom.js'; import { getUniqueId } from '../../helpers/uniqueId.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { LocalizeCoreElement } from '../../helpers/localize-core-element.js'; import { PropertyRequiredMixin } from '../../mixins/property-required/property-required-mixin.js'; import { styleMap } from 'lit/directives/style-map.js'; -import { waitForElem } from '../../helpers/internal/waitForElem.js'; const mediaQueryList = window.matchMedia('(max-width: 615px), (max-height: 420px) and (max-width: 900px)'); @@ -23,6 +21,7 @@ const mediaQueryList = window.matchMedia('(max-width: 615px), (max-height: 420px * @slot footer - Slot for footer content such as workflow buttons */ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMixin(DialogMixin(LitElement)))) { + static get properties() { return { /** @@ -65,6 +64,7 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix :host([critical]) .d2l-dialog-header { padding-bottom: 15px; } + .d2l-dialog-header > div > d2l-button-icon { flex: none; margin: -4px -15px 0 15px; @@ -74,11 +74,13 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix margin-left: -15px; margin-right: 15px; } + .d2l-dialog-content > div { /* required to properly calculate preferred height when there are bottom margins at the end of the slotted content */ border-bottom: 1px solid transparent; } + .d2l-dialog-content-loading { text-align: center; } @@ -144,7 +146,7 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix `; } - const heightOverride = {}; + const heightOverride = {} ; let topOverride = null; if (mediaQueryList.matches) { if (this._ifrauContextInfo) { @@ -199,12 +201,11 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix ); } - async updated(changedProperties) { + updated(changedProperties) { super.updated(changedProperties); - - if (changedProperties.has('asyncState') && this.asyncState === asyncStates.complete) { - await this._waitForUpdateComplete(); - setTimeout(() => this.resize()); + if (!changedProperties.has('asyncState')) return; + if (this.asyncState === asyncStates.complete) { + this.resize(); } } @@ -222,10 +223,6 @@ class Dialog extends PropertyRequiredMixin(LocalizeCoreElement(AsyncContainerMix this.resize(); } - async _waitForUpdateComplete() { - const predicate = () => true; - const composedChildren = getComposedChildren(this, predicate); - await Promise.all(composedChildren.map(child => waitForElem(child, predicate))); - } } + customElements.define('d2l-dialog', Dialog); diff --git a/components/dialog/test/dialog.test.js b/components/dialog/test/dialog.test.js index 8b1ba605a9f..20ffc069255 100644 --- a/components/dialog/test/dialog.test.js +++ b/components/dialog/test/dialog.test.js @@ -1,9 +1,8 @@ import '../dialog.js'; import { expect, fixture, oneEvent, runConstructor } from '@brightspace-ui/testing'; -import { html, LitElement } from 'lit'; import { createMessage } from '../../../mixins/property-required/property-required-mixin.js'; import { getComposedActiveElement } from '../../../helpers/focus.js'; -import { spy } from 'sinon'; +import { html } from 'lit'; describe('d2l-dialog', () => { @@ -81,44 +80,4 @@ describe('d2l-dialog', () => { }); - class DelayedElement extends LitElement { - render() { - return html`
`; - } - - async getLoadingComplete() { - const newChild = document.createElement('div'); - newChild.className = 'added-child'; - newChild.textContent = 'New addition to the family!'; - this.shadowRoot.appendChild(newChild); - await new Promise(r => setTimeout(r, 100)); - } - } - customElements.define('delayed-elem', DelayedElement); - - describe('getLoadingComplete', () => { - - it('should wait for child component\'s getLoadingComplete before resizing', async() => { - - const el = await fixture(html` - - - - `); - - const delayedComponent = el.querySelector('delayed-elem'); - const mixinProto = Object.getPrototypeOf(el).__proto__; - const resizeSpy = spy(mixinProto, 'resize'); - - el.opened = true; - await oneEvent(el, 'd2l-dialog-open'); - el.asyncState = 'complete'; - - expect(resizeSpy.called).to.be.false; - await delayedComponent.getLoadingComplete(); - expect(resizeSpy.calledOnce).to.be.true; - }); - - }); - }); diff --git a/helpers/internal/waitForElem.js b/helpers/internal/waitForElem.js index 9ca30efab0e..81a3b320f33 100644 --- a/helpers/internal/waitForElem.js +++ b/helpers/internal/waitForElem.js @@ -4,44 +4,22 @@ export async function waitForElem(elem, predicate = () => true) { if (!elem) return; - const doWait = async() => { - - const update = elem.updateComplete; - if (typeof update === 'object' && Promise.resolve(update) === update) { - await update; - await new Promise(resolve => { - requestAnimationFrame(() => resolve()); - }); - } - - if (typeof elem.getLoadingComplete === 'function') { - await elem.getLoadingComplete(); - await new Promise(resolve => { - requestAnimationFrame(() => resolve()); - }); - } - - const children = getComposedChildren(elem, predicate); - await Promise.all(children.map(e => waitForElem(e, predicate))); - - }; + const update = elem.updateComplete; + if (typeof update === 'object' && Promise.resolve(update) === update) { + await update; + await new Promise(resolve => { + requestAnimationFrame(() => resolve()); + }); + } - await new Promise((resolve) => { - const observer = new MutationObserver((records) => { - for (const record of records) { - for (const removedNode of record.removedNodes) { - if (removedNode === elem) { - observer.disconnect(); - resolve(); - return; - } - } - } + if (typeof elem.getLoadingComplete === 'function') { + await elem.getLoadingComplete(); + await new Promise(resolve => { + requestAnimationFrame(() => resolve()); }); - observer.observe(elem.parentNode, { childList: true }); - doWait() - .then(() => observer.disconnect()) - .then(resolve); - }); + } + + const children = getComposedChildren(elem, predicate); + await Promise.all(children.map(e => waitForElem(e, predicate))); } From 820c357caf1873e3836a262cef0be5267cfd1189 Mon Sep 17 00:00:00 2001 From: Dave Lockhart Date: Tue, 14 Jan 2025 17:31:42 -0500 Subject: [PATCH 12/16] add a vdiff demonstrating delayed content --- components/dialog/test/dialog.vdiff.js | 44 +++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/components/dialog/test/dialog.vdiff.js b/components/dialog/test/dialog.vdiff.js index 8b1a96bdb5d..f392ef1672e 100644 --- a/components/dialog/test/dialog.vdiff.js +++ b/components/dialog/test/dialog.vdiff.js @@ -1,7 +1,9 @@ import '../dialog.js'; -import { expect, fixture, html, nextFrame, sendKeys } from '@brightspace-ui/testing'; +import { defineCE, expect, fixture, html, nextFrame, oneEvent, sendKeys, waitUntil } from '@brightspace-ui/testing'; import { footer, general, long, wrapping } from './dialog-shared-contents.js'; import { interferingStyleWrapper } from '../../typography/test/typography-shared-contents.js'; +import { LitElement } from 'lit'; +import { LoadingCompleteMixin } from '../../../mixins/loading-complete/loading-complete-mixin.js'; function createDialog(opts) { const defaults = { content: html`${general}${footer}`, fullHeight: false, width: 400, critical: false }; @@ -19,6 +21,29 @@ function dispatchFullscreenWithinEvent(elem, state) { )); } +const delayedTag = defineCE( + class extends LoadingCompleteMixin(LitElement) { + static get properties() { + return { + loaded: { type: Boolean } + }; + } + constructor() { + super(); + this.loaded = false; + } + render() { + return this.loaded ? + html`
Loaded
` : + html`
Loading...
`; + } + finishLoading() { + this.loaded = true; + this.resolveLoadingComplete(); + } + } +); + describe('dialog', () => { [/*'native',*/ 'custom'].forEach((type) => { @@ -100,6 +125,23 @@ describe('dialog', () => { await expect(document).to.be.golden(); }); + it('delayed-content', async() => { + const el = await fixture( + `<${delayedTag}>`, + { + awaitLoadingComplete: false + } + ); + setTimeout(async() => { + await waitUntil(() => el.querySelector(delayedTag) !== null); + setTimeout(() => el.querySelector(delayedTag).finishLoading(), 100); + }); + el.opened = true; + await oneEvent(el, 'd2l-dialog-open'); + + await expect(document).to.be.golden(); + }); + }); }); }); From cde5441f118b137ad1695aee58a64e39eaee33f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:45:50 -0500 Subject: [PATCH 13/16] Updating vdiff goldens (#5313) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../dialog/chromium/custom-delayed-content.png | Bin 0 -> 26048 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 components/dialog/test/golden/dialog/chromium/custom-delayed-content.png diff --git a/components/dialog/test/golden/dialog/chromium/custom-delayed-content.png b/components/dialog/test/golden/dialog/chromium/custom-delayed-content.png new file mode 100644 index 0000000000000000000000000000000000000000..c2dacd8a3cd7483b435a8d2bc8fda1e8688dd482 GIT binary patch literal 26048 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 J^oK?8e*w0F4aEQe literal 0 HcmV?d00001 From c3ba44e5f5fcc10ef7ba8a32b8742bf365e8d515 Mon Sep 17 00:00:00 2001 From: Dave Lockhart Date: Tue, 14 Jan 2025 18:05:08 -0500 Subject: [PATCH 14/16] move to mixin vdiffs --- components/dialog/test/dialog.vdiff.js | 44 +----------------- .../chromium/custom-delayed-content.png | Bin 26048 -> 0 bytes 2 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 components/dialog/test/golden/dialog/chromium/custom-delayed-content.png diff --git a/components/dialog/test/dialog.vdiff.js b/components/dialog/test/dialog.vdiff.js index f392ef1672e..8b1a96bdb5d 100644 --- a/components/dialog/test/dialog.vdiff.js +++ b/components/dialog/test/dialog.vdiff.js @@ -1,9 +1,7 @@ import '../dialog.js'; -import { defineCE, expect, fixture, html, nextFrame, oneEvent, sendKeys, waitUntil } from '@brightspace-ui/testing'; +import { expect, fixture, html, nextFrame, sendKeys } from '@brightspace-ui/testing'; import { footer, general, long, wrapping } from './dialog-shared-contents.js'; import { interferingStyleWrapper } from '../../typography/test/typography-shared-contents.js'; -import { LitElement } from 'lit'; -import { LoadingCompleteMixin } from '../../../mixins/loading-complete/loading-complete-mixin.js'; function createDialog(opts) { const defaults = { content: html`${general}${footer}`, fullHeight: false, width: 400, critical: false }; @@ -21,29 +19,6 @@ function dispatchFullscreenWithinEvent(elem, state) { )); } -const delayedTag = defineCE( - class extends LoadingCompleteMixin(LitElement) { - static get properties() { - return { - loaded: { type: Boolean } - }; - } - constructor() { - super(); - this.loaded = false; - } - render() { - return this.loaded ? - html`
Loaded
` : - html`
Loading...
`; - } - finishLoading() { - this.loaded = true; - this.resolveLoadingComplete(); - } - } -); - describe('dialog', () => { [/*'native',*/ 'custom'].forEach((type) => { @@ -125,23 +100,6 @@ describe('dialog', () => { await expect(document).to.be.golden(); }); - it('delayed-content', async() => { - const el = await fixture( - `<${delayedTag}>`, - { - awaitLoadingComplete: false - } - ); - setTimeout(async() => { - await waitUntil(() => el.querySelector(delayedTag) !== null); - setTimeout(() => el.querySelector(delayedTag).finishLoading(), 100); - }); - el.opened = true; - await oneEvent(el, 'd2l-dialog-open'); - - await expect(document).to.be.golden(); - }); - }); }); }); diff --git a/components/dialog/test/golden/dialog/chromium/custom-delayed-content.png b/components/dialog/test/golden/dialog/chromium/custom-delayed-content.png deleted file mode 100644 index c2dacd8a3cd7483b435a8d2bc8fda1e8688dd482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26048 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 J^oK?8e*w0F4aEQe From 42eee97945f20b7fc167b795a649bb5f3e34a917 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:59:38 -0500 Subject: [PATCH 15/16] Updating vdiff goldens (#5317) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../chromium/custom-delayed-content.png | Bin 26048 -> 25453 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/components/dialog/test/golden/dialog-mixin/chromium/custom-delayed-content.png b/components/dialog/test/golden/dialog-mixin/chromium/custom-delayed-content.png index c2dacd8a3cd7483b435a8d2bc8fda1e8688dd482..b40ee9c23925c25d4236614cb5b2c1533119d628 100644 GIT binary patch literal 25453 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
HKUP%^;Ej0J}0W!~Y{c^x^aov)d_` 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 J^oK?8e*w0F4aEQe From bdddaa151f3b25143d77261b62c63e1c6a3e83a7 Mon Sep 17 00:00:00 2001 From: Trevor Kearse Date: Wed, 15 Jan 2025 15:28:24 -0500 Subject: [PATCH 16/16] add ff conditional (#5318) --- components/dialog/dialog-mixin.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/dialog/dialog-mixin.js b/components/dialog/dialog-mixin.js index 94d02a2a997..a9a4f8c7486 100644 --- a/components/dialog/dialog-mixin.js +++ b/components/dialog/dialog-mixin.js @@ -453,7 +453,10 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) { if (reduceMotion) await new Promise(resolve => requestAnimationFrame(resolve)); else await animPromise; - await this.#waitForUpdateComplete(); + const flag = window.D2L?.LP?.Web?.UI?.Flags.Flag('GAUD-7397-dialog-resize-updateComplete', true) ?? true; + if (flag) { + await this.#waitForUpdateComplete(); + } await this._updateSize(); /** Dispatched when the dialog is opened */ this.dispatchEvent(new CustomEvent(