This is an automated email from the ASF dual-hosted git repository.

vatsrahul1001 pushed a commit to branch v3-4-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v3-4-test by this push:
     new 5c89dbbe626 [v3-4-test] Keep parent DAG folders collapsed after one 
click (#75079) (#75145)
5c89dbbe626 is described below

commit 5c89dbbe626f357b4a09982acb562af64512ca7f
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Oct 20 12:31:23 2026 +0530

    [v3-4-test] Keep parent DAG folders collapsed after one click (#75079) 
(#75145)
    
    (cherry picked from commit c1b25527a41462c73bee8237ff43f981ac8a2313)
    
    Co-authored-by: Himanshu Chawla <[email protected]>
    Co-authored-by: Himanshu Chawla 
<[email protected]>
    Co-authored-by: Rahul Vats <[email protected]>
---
 .../DagsList/DagFolderTree/DagFolderTree.test.tsx  | 58 +++++++++++++++++++++-
 .../pages/DagsList/DagFolderTree/DagFolderTree.tsx |  6 ++-
 2 files changed, 61 insertions(+), 3 deletions(-)

diff --git 
a/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.test.tsx
 
b/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.test.tsx
index 2d2cf2387bb..a6bd748270e 100644
--- 
a/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.test.tsx
+++ 
b/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.test.tsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 import "@testing-library/jest-dom/vitest";
-import { fireEvent, render, screen } from "@testing-library/react";
+import { fireEvent, render, screen, waitFor } from "@testing-library/react";
 import { describe, expect, it, vi } from "vitest";
 
 import type { DagFolderResponse } from "openapi/requests/types.gen";
@@ -48,6 +48,53 @@ const node = (label: string) =>
     (item) => item.querySelector('[data-part="branch-text"], 
[data-part="item-text"]')?.textContent === label,
   );
 
+it.each([
+  {
+    bundleName: "dags-folder",
+    folder: "team_a",
+    folders: SINGLE_BUNDLE,
+    parent: "team_a",
+    selectedBundle: undefined,
+  },
+  {
+    bundleName: "ml",
+    folder: undefined,
+    folders: MULTI_BUNDLE,
+    parent: "ml",
+    selectedBundle: "ml",
+  },
+])(
+  "collapses $parent in one click when a child is selected",
+  async ({ bundleName, folder, folders, parent, selectedBundle }) => {
+    const onSelectFolder = vi.fn();
+    const { rerender } = render(
+      <DagFolderTree
+        folders={folders}
+        onSelectFolder={onSelectFolder}
+        selectedBundle={selectedBundle}
+        selectedFolder="team_a/etl"
+      />,
+      { wrapper: BaseWrapper },
+    );
+
+    expect(node(parent)).toHaveAttribute("aria-expanded", "true");
+    fireEvent.click(screen.getByTitle(parent), { button: 0 });
+    await waitFor(() => expect(onSelectFolder).toHaveBeenLastCalledWith({ 
bundleName, folder }));
+
+    rerender(
+      <DagFolderTree
+        folders={folders}
+        onSelectFolder={onSelectFolder}
+        selectedBundle={bundleName}
+        selectedFolder={folder}
+      />,
+    );
+
+    await waitFor(() => expect(node(parent)).toHaveAttribute("aria-expanded", 
"false"));
+    expect(node(parent)).toHaveAttribute("aria-selected", "true");
+  },
+);
+
 describe("DagFolderTree (single bundle)", () => {
   it("renders the top-level folders and an 'All Dags' entry, without a bundle 
level", () => {
     render(
@@ -306,6 +353,15 @@ describe("DagFolderTree (multiple bundles)", () => {
     expect(selected.map((item) => 
item.getAttribute("data-value"))).toEqual(["folder:ml:team_a/etl"]);
   });
 
+  it("keeps a selected bundle collapsed when the folder parameter is empty", 
() => {
+    render(
+      <DagFolderTree folders={MULTI_BUNDLE} onSelectFolder={vi.fn()} 
selectedBundle="ml" selectedFolder="" />,
+      { wrapper: BaseWrapper },
+    );
+
+    expect(node("ml")).toHaveAttribute("aria-expanded", "false");
+  });
+
   it("marks a bundle as selected when only the bundle is selected", () => {
     render(
       <DagFolderTree
diff --git 
a/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.tsx
 
b/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.tsx
index f3790657dba..5f537b99874 100644
--- 
a/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.tsx
+++ 
b/airflow-core/src/airflow/ui/src/pages/DagsList/DagFolderTree/DagFolderTree.tsx
@@ -94,7 +94,7 @@ const expandedForSelection = (
 ): Array<string> => {
   const values: Array<string> = [];
 
-  if (isMultiBundle && bundleName !== undefined) {
+  if (isMultiBundle && bundleName !== undefined && folder !== undefined && 
folder !== "") {
     values.push(bundleNodeValue(bundleName));
   }
 
@@ -102,7 +102,9 @@ const expandedForSelection = (
     const segments = folder.split("/");
 
     values.push(
-      ...segments.map((_, index) => folderNodeValue(bundleName, 
segments.slice(0, index + 1).join("/"))),
+      ...segments
+        .slice(0, -1)
+        .map((_, index) => folderNodeValue(bundleName, segments.slice(0, index 
+ 1).join("/"))),
     );
   }
 

Reply via email to