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()];