From 6443b672e78af6c41c1fe3f907414d21d24e289c Mon Sep 17 00:00:00 2001 From: Lukas Maurer <lukas.maurer@siemens.com> Date: Tue, 17 Sep 2024 16:10:13 +0200 Subject: [PATCH 1/3] fix(core/dropdown): clean up disconnected dropdowns --- .../dropdown/dropdown-controller.ts | 20 ++++++++++-- .../components/dropdown/test/dropdown.ct.ts | 32 +++++++++++++------ 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/packages/core/src/components/dropdown/dropdown-controller.ts b/packages/core/src/components/dropdown/dropdown-controller.ts index 8f1336f8dfa..2af6d22f1e4 100644 --- a/packages/core/src/components/dropdown/dropdown-controller.ts +++ b/packages/core/src/components/dropdown/dropdown-controller.ts @@ -65,7 +65,23 @@ class DropdownController { } disconnected(dropdown: DropdownInterface) { - this.dropdowns.delete(dropdown.getId()); + const id = dropdown.getId(); + this.removeFromSubmenuIds(id); + this.dropdowns.delete(id); + } + + removeFromSubmenuIds(id: string) { + this.dropdowns.forEach((dropdown) => { + const submenuIds = this.submenuIds[dropdown.getId()]; + if (submenuIds) { + const index = submenuIds.indexOf(id); + if (index > -1) { + submenuIds.splice(index, 1); + } + } + }); + + delete this.submenuIds[id]; } discoverSubmenus() { @@ -89,7 +105,7 @@ class DropdownController { } dismiss(dropdown: DropdownInterface) { - if (dropdown.isPresent() && dropdown.willDismiss()) { + if (dropdown?.isPresent() && dropdown.willDismiss()) { this.dismissChildren(dropdown.getId()); dropdown.dismiss(); delete this.submenuIds[dropdown.getId()]; diff --git a/packages/core/src/components/dropdown/test/dropdown.ct.ts b/packages/core/src/components/dropdown/test/dropdown.ct.ts index 70fc51582f9..8bae36fc263 100644 --- a/packages/core/src/components/dropdown/test/dropdown.ct.ts +++ b/packages/core/src/components/dropdown/test/dropdown.ct.ts @@ -1,12 +1,3 @@ -/* - * SPDX-FileCopyrightText: 2023 Siemens AG - * - * SPDX-License-Identifier: MIT - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - /* * SPDX-FileCopyrightText: 2023 Siemens AG * @@ -634,6 +625,29 @@ test.describe('resolve during element connect', () => { }); }); +test('Child dropdown disconnects', async ({ mount, page }) => { + await mount(`<ix-button id="trigger">Open</ix-icon-button> + <ix-dropdown closeBehavior="outside" trigger="trigger"> + <ix-dropdown-item id="item-1">Item level 1</ix-dropdown-item> + <ix-dropdown-button label="Nested"> + <ix-dropdown-item id="item-1">Item level 2</ix-dropdown-item> + </ix-dropdown-button> + </ix-dropdown>`); + const trigger = page.locator('ix-button').first(); + await trigger.click(); + const dropdown = page.locator('ix-dropdown').first(); + + await expect(dropdown).toBeVisible(); + + await dropdown.evaluate((dd) => { + dd.removeChild(dd.querySelector('ix-dropdown-button')); + }); + + await trigger.click(); + await trigger.click(); + await expect(dropdown).toBeVisible(); +}); + test.describe('A11y', () => { test.describe('Keyboard navigation', () => { test.beforeEach(async ({ page, mount }) => { From e077c10345726e39bce5f276f7c447750d602041 Mon Sep 17 00:00:00 2001 From: Daniel Leroux <daniel.leroux@siemens.com> Date: Thu, 19 Sep 2024 17:05:57 +0200 Subject: [PATCH 2/3] Create tricky-hornets-work.md --- .changeset/tricky-hornets-work.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tricky-hornets-work.md diff --git a/.changeset/tricky-hornets-work.md b/.changeset/tricky-hornets-work.md new file mode 100644 index 00000000000..b4b07aa49be --- /dev/null +++ b/.changeset/tricky-hornets-work.md @@ -0,0 +1,5 @@ +--- +"@siemens/ix": patch +--- + +fix(core/dropdown): clean up disconnected dropdowns From ee0e0b2ac64064709bf81c7d4b800be90425cb07 Mon Sep 17 00:00:00 2001 From: Lukas Maurer <lukas.maurer@siemens.com> Date: Mon, 23 Sep 2024 10:43:21 +0200 Subject: [PATCH 3/3] refactor(core/dropdown): remove unnecessary null check --- packages/core/src/components/dropdown/dropdown-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/components/dropdown/dropdown-controller.ts b/packages/core/src/components/dropdown/dropdown-controller.ts index 2af6d22f1e4..b0d356d102b 100644 --- a/packages/core/src/components/dropdown/dropdown-controller.ts +++ b/packages/core/src/components/dropdown/dropdown-controller.ts @@ -105,7 +105,7 @@ class DropdownController { } dismiss(dropdown: DropdownInterface) { - if (dropdown?.isPresent() && dropdown.willDismiss()) { + if (dropdown.isPresent() && dropdown.willDismiss()) { this.dismissChildren(dropdown.getId()); dropdown.dismiss(); delete this.submenuIds[dropdown.getId()];