diff --git a/packages/calcite-components/src/components/dropdown-group/dropdown-group.e2e.ts b/packages/calcite-components/src/components/dropdown-group/dropdown-group.e2e.ts index 0add1eba961..1cc55f19187 100644 --- a/packages/calcite-components/src/components/dropdown-group/dropdown-group.e2e.ts +++ b/packages/calcite-components/src/components/dropdown-group/dropdown-group.e2e.ts @@ -76,6 +76,23 @@ describe("calcite-dropdown-group", () => { } }); + it("does not throw if removed right after append", async () => { + async function runTest(): Promise { + const page = await newE2EPage(); + // group needs to load early for error to occur + await page.setContent(html``); + + await page.evaluate(() => { + const dropdownGroup = document.createElement("calcite-dropdown-group"); + document.body.append(dropdownGroup); + dropdownGroup.remove(); + }); + await page.waitForChanges(); + } + + await expect(runTest()).resolves.toBeUndefined(); + }); + describe("theme", () => { const tokens: ComponentTestTokens = { "--calcite-dropdown-group-border-color": [ diff --git a/packages/calcite-components/src/components/dropdown-group/dropdown-group.tsx b/packages/calcite-components/src/components/dropdown-group/dropdown-group.tsx index 2c1eafd2252..4ec84992499 100644 --- a/packages/calcite-components/src/components/dropdown-group/dropdown-group.tsx +++ b/packages/calcite-components/src/components/dropdown-group/dropdown-group.tsx @@ -27,9 +27,6 @@ export class DropdownGroup extends LitElement { // #region Private Properties - /** position of group within a dropdown */ - private groupPosition: number; - private mutationObserver = createObserver("mutation", () => this.updateItems()); /** the requested group */ @@ -45,6 +42,13 @@ export class DropdownGroup extends LitElement { /** Specifies and displays a group title. */ @property({ reflect: true }) groupTitle: string; + /** + * The position of the group in the dropdown menu. + * + * @internal + */ + @property() position: number = -1; + /** * Specifies the size of the component inherited from the parent `calcite-dropdown`, defaults to `m`. * @@ -87,10 +91,6 @@ export class DropdownGroup extends LitElement { this.mutationObserver?.observe(this.el, { childList: true }); } - load(): void { - this.groupPosition = this.getGroupPosition(); - } - override willUpdate(changes: PropertyValues): void { /* TODO: [MIGRATION] First time Lit calls willUpdate(), changes will include not just properties provided by the user, but also any default values your component set. To account for this semantics change, the checks for (this.hasUpdated || value != defaultValue) was added in this method @@ -123,13 +123,6 @@ export class DropdownGroup extends LitElement { ); } - private getGroupPosition(): number { - return Array.prototype.indexOf.call( - this.el.parentElement.querySelectorAll("calcite-dropdown-group"), - this.el, - ); - } - // #endregion // #region Rendering @@ -142,7 +135,7 @@ export class DropdownGroup extends LitElement { ) : null; const dropdownSeparator = - this.groupPosition > 0 ?