This is an automated email from the ASF dual-hosted git repository.
bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 707b1ccf137 Clean up graph/grid UI (#69883)
707b1ccf137 is described below
commit 707b1ccf137269d488a8b9f7e7fbc9a32cd7b296
Author: Brent Bovenzi <[email protected]>
AuthorDate: Wed Jul 15 09:58:58 2026 -0400
Clean up graph/grid UI (#69883)
---
.../src/airflow/ui/public/i18n/locales/ar/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/ca/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/de/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/en/dag.json | 3 ---
.../src/airflow/ui/public/i18n/locales/fr/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/he/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/hi/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/hu/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/ko/dag.json | 3 ---
.../src/airflow/ui/public/i18n/locales/pl/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/tr/dag.json | 5 -----
.../src/airflow/ui/public/i18n/locales/zh-CN/dag.json | 5 -----
.../src/airflow/ui/src/components/Graph/TaskNode.tsx | 3 ++-
.../src/airflow/ui/src/components/Graph/elkGraphUtils.ts | 2 +-
airflow-core/src/airflow/ui/src/components/TaskName.tsx | 2 --
.../src/airflow/ui/src/layouts/Details/GridFilters.tsx | 7 ++++++-
.../src/airflow/ui/src/layouts/Details/PanelButtons.tsx | 15 +++------------
.../src/airflow/ui/src/pages/GroupTaskInstance/Header.tsx | 4 ++--
18 files changed, 14 insertions(+), 75 deletions(-)
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ar/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ar/dag.json
index 44d0b882563..6253b5c4a31 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ar/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ar/dag.json
@@ -118,11 +118,6 @@
"viewInExternal": "عرض السجلات في {{name}} (المحاولة {{attempt}})",
"warning": "تحذير"
},
- "navigation": {
- "navigation": "التنقل: {{arrow}}",
- "openGraphFilters": "مرشحات المهام: Ctrl+Shift+F",
- "toggleGroup": "تبديل المجموعة: المسافة"
- },
"notFound": {
"back": "رجوع",
"backToDags": "العودة إلى Dags",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ca/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dag.json
index c90bc964f6d..3cd77f612a7 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ca/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ca/dag.json
@@ -106,11 +106,6 @@
"viewInExternal": "Veure els registres a {{name}} (intent {{attempt}})",
"warning": "ADVERTIMENT"
},
- "navigation": {
- "navigation": "Navegació: Shift+{{arrow}}",
- "openGraphFilters": "Filtres de tasques: Ctrl+Maj+F",
- "toggleGroup": "Alternar grup: Espai"
- },
"notFound": {
"back": "Enrere",
"backToDags": "Tornar als Dags",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/de/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/de/dag.json
index 829a1aaac4d..d48f59856f6 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/de/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/de/dag.json
@@ -106,11 +106,6 @@
"viewInExternal": "Protokoll in {{name}} (Versuch {{attempt}}) ansehen",
"warning": "WARNING"
},
- "navigation": {
- "navigation": "Navigation: Umschalttaste+{{arrow}}",
- "openGraphFilters": "Task-Filter: Strg+Umschalt+F",
- "toggleGroup": "Gruppen umschalten: Leertaste"
- },
"notFound": {
"back": "Zurück",
"backToDags": "Zurück zu Dags",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/en/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/en/dag.json
index ab1e332ebae..907fba9e5ea 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/en/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/en/dag.json
@@ -102,9 +102,6 @@
"viewInExternal": "View logs in {{name}} (attempt {{attempt}})",
"warning": "WARNING"
},
- "navigation": {
- "openGraphFilters": "Task Filters: Ctrl+Shift+F"
- },
"notFound": {
"back": "Go Back",
"backToDags": "Back to Dags",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/fr/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/fr/dag.json
index de7952e0220..b3a970fdf9d 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/fr/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/fr/dag.json
@@ -109,11 +109,6 @@
"viewInExternal": "Voir les journaux dans {{name}} (tentative
{{attempt}})",
"warning": "AVERTISSEMENT"
},
- "navigation": {
- "navigation": "Navigation : {{arrow}}",
- "openGraphFilters": "Filtres de tâches : Ctrl+Maj+F",
- "toggleGroup": "Basculer le groupe : Espace"
- },
"notFound": {
"back": "Retour",
"backToDags": "Retour aux Dags",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/he/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/he/dag.json
index 0214ee91102..29b902030b7 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/he/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/he/dag.json
@@ -109,11 +109,6 @@
"viewInExternal": "צפה ברישומים ב-{{name}} (ניסיון {{attempt}})",
"warning": "WARNING"
},
- "navigation": {
- "navigation": "ניווט: {{arrow}}",
- "openGraphFilters": "פילטרים משימות: Ctrl+Shift+F",
- "toggleGroup": "החלפת קבוצה: רווח"
- },
"notFound": {
"back": "חזור",
"backToDags": "חזור ל-Dags",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json
index cbd6a675e78..8e436ab7a4b 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hi/dag.json
@@ -106,11 +106,6 @@
"viewInExternal": "{{name}} में लॉग्स देखें (प्रयास {{attempt}})",
"warning": "WARNING"
},
- "navigation": {
- "navigation": "नेवीगेशन: Shift+{{arrow}}",
- "openGraphFilters": "Task फ़िल्टर: Ctrl+Shift+F",
- "toggleGroup": "ग्रुप टॉगल करें: Space"
- },
"notFound": {
"back": "वापस जाएं",
"backToDags": "डैग्स पर वापस जाएं",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/hu/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/hu/dag.json
index 62b7a4cb790..a4a8c1cb057 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/hu/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/hu/dag.json
@@ -106,11 +106,6 @@
"viewInExternal": "Naplók megtekintése itt: {{name}} (próbálkozás:
{{attempt}})",
"warning": "FIGYELMEZTETÉS"
},
- "navigation": {
- "navigation": "Navigáció: {{arrow}}",
- "openGraphFilters": "Feladat szűrők: Ctrl+Shift+F",
- "toggleGroup": "Csoport váltása: Szóköz"
- },
"notFound": {
"back": "Vissza",
"backToDags": "Vissza a Dag-ekhez",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json
index 3ce445fa896..9b71c510afd 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/ko/dag.json
@@ -102,9 +102,6 @@
"viewInExternal": "{{name}}에서 로그 보기 (시도 {{attempt}})",
"warning": "경고"
},
- "navigation": {
- "openGraphFilters": "태스크 필터: Ctrl+Shift+F"
- },
"notFound": {
"back": "뒤로",
"backToDags": "Dags로 돌아가기",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/pl/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/pl/dag.json
index a8c500309f3..0f29dda9351 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/pl/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/pl/dag.json
@@ -112,11 +112,6 @@
"viewInExternal": "Zobacz logi w {{name}} (próba {{attempt}})",
"warning": "WARNING"
},
- "navigation": {
- "navigation": "Przewiń: {{arrow}}",
- "openGraphFilters": "Filtry zadań: Ctrl+Shift+F",
- "toggleGroup": "Przełącz grupę: Space"
- },
"notFound": {
"back": "Wróć",
"backToDags": "Powrót do Dagów",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/tr/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/tr/dag.json
index 7770759b5e7..60b91f86bfd 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/tr/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/tr/dag.json
@@ -106,11 +106,6 @@
"viewInExternal": "Günlükleri {{name}} içinde görüntüle (deneme
{{attempt}})",
"warning": "UYARI"
},
- "navigation": {
- "navigation": "Gezin: {{arrow}}",
- "openGraphFilters": "Görev Filtreleri: Ctrl+Shift+F",
- "toggleGroup": "Grubu aç/kapat: Space"
- },
"notFound": {
"back": "Geri Dön",
"backToDags": "Dag'lere Geri Dön",
diff --git a/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dag.json
b/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dag.json
index 25dcfaf83c2..6a0c4613be0 100644
--- a/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dag.json
+++ b/airflow-core/src/airflow/ui/public/i18n/locales/zh-CN/dag.json
@@ -106,11 +106,6 @@
"viewInExternal": "在 {{name}} 中查看日志(重试 {{attempt}})",
"warning": "WARNING"
},
- "navigation": {
- "navigation": "导航: {{arrow}}",
- "openGraphFilters": "任务筛选器: Ctrl+Shift+F",
- "toggleGroup": "展开/收起分组: 空格键"
- },
"notFound": {
"back": "返回",
"backToDags": "返回 Dags",
diff --git a/airflow-core/src/airflow/ui/src/components/Graph/TaskNode.tsx
b/airflow-core/src/airflow/ui/src/components/Graph/TaskNode.tsx
index 5d8affeca30..0efe7dbbb81 100644
--- a/airflow-core/src/airflow/ui/src/components/Graph/TaskNode.tsx
+++ b/airflow-core/src/airflow/ui/src/components/Graph/TaskNode.tsx
@@ -19,6 +19,7 @@
import { Box, Button, Flex, HStack, LinkOverlay, Text } from
"@chakra-ui/react";
import type { NodeProps, Node as NodeType } from "@xyflow/react";
import { useTranslation } from "react-i18next";
+import { AiOutlineGroup } from "react-icons/ai";
import { TaskIcon } from "src/assets/TaskIcon";
import { StateBadge } from "src/components/StateBadge";
@@ -112,7 +113,7 @@ export const TaskNode = ({
width={`${width + (isSelected ? 4 : 0)}px`}
>
<HStack>
- <TaskIcon />
+ {isGroup ? <AiOutlineGroup /> : <TaskIcon />}
<LinkOverlay asChild>
<TaskLink
childCount={thisChildCount}
diff --git a/airflow-core/src/airflow/ui/src/components/Graph/elkGraphUtils.ts
b/airflow-core/src/airflow/ui/src/components/Graph/elkGraphUtils.ts
index 593dec17c9a..6e8548fbed1 100644
--- a/airflow-core/src/airflow/ui/src/components/Graph/elkGraphUtils.ts
+++ b/airflow-core/src/airflow/ui/src/components/Graph/elkGraphUtils.ts
@@ -366,7 +366,7 @@ export const generateElkGraph = ({
}
const label = `${node.label}${node.is_mapped ? "[1000]" :
""}${node.children ? ` + ${node.children.length} tasks` : ""}`;
- let width = getTextWidth(label, font);
+ let width = getTextWidth(label, font) + 16; // 16 for icons
const hasStateBar = Boolean(node.is_mapped) || Boolean(node.children);
let height = hasStateBar ? 90 : 80;
diff --git a/airflow-core/src/airflow/ui/src/components/TaskName.tsx
b/airflow-core/src/airflow/ui/src/components/TaskName.tsx
index 9349cb27a51..1f35b5bfc2e 100644
--- a/airflow-core/src/airflow/ui/src/components/TaskName.tsx
+++ b/airflow-core/src/airflow/ui/src/components/TaskName.tsx
@@ -55,7 +55,6 @@ export const TaskName = ({
fontWeight="bold"
overflow="hidden"
textOverflow="ellipsis"
- title={label}
whiteSpace="nowrap"
{...rest}
>
@@ -71,7 +70,6 @@ export const TaskName = ({
fontWeight="bold"
overflow="hidden"
textOverflow="ellipsis"
- title={label}
whiteSpace="nowrap"
{...rest}
>
diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/GridFilters.tsx
b/airflow-core/src/airflow/ui/src/layouts/Details/GridFilters.tsx
index fe1ea80ab1a..ee30042ef70 100644
--- a/airflow-core/src/airflow/ui/src/layouts/Details/GridFilters.tsx
+++ b/airflow-core/src/airflow/ui/src/layouts/Details/GridFilters.tsx
@@ -31,6 +31,11 @@ export const GridFilters = () => {
const { filterConfigs, handleFiltersChange, initialValues } =
useFiltersHandler(searchParamKeys);
return (
- <FilterBar configs={filterConfigs} initialValues={initialValues}
onFiltersChange={handleFiltersChange} />
+ <FilterBar
+ configs={filterConfigs}
+ initialValues={initialValues}
+ onFiltersChange={handleFiltersChange}
+ showPresetFilters={false}
+ />
);
};
diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx
b/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx
index 5c34dde8bd3..6109d693190 100644
--- a/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx
+++ b/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx
@@ -24,14 +24,13 @@ import {
Portal,
Select,
type SelectValueChangeDetails,
- Text,
VStack,
} from "@chakra-ui/react";
import { useReactFlow } from "@xyflow/react";
import { useEffect, useRef } from "react";
import { useTranslation } from "react-i18next";
import { FiGrid } from "react-icons/fi";
-import { LuChartGantt, LuKeyboard } from "react-icons/lu";
+import { LuChartGantt } from "react-icons/lu";
import { MdOutlineAccountTree, MdSettings } from "react-icons/md";
import type { ImperativePanelGroupHandle } from "react-resizable-panels";
import { useParams } from "react-router-dom";
@@ -40,7 +39,7 @@ import { useLocalStorage } from "usehooks-ts";
import { DagVersionSelect } from "src/components/DagVersionSelect";
import { DirectionDropdown } from "src/components/Graph/DirectionDropdown";
import { GraphTaskFilters } from "src/components/GraphTaskFilters";
-import { IconButton, Tooltip } from "src/components/ui";
+import { IconButton } from "src/components/ui";
import { type ButtonGroupOption, ButtonGroupToggle } from
"src/components/ui/ButtonGroupToggle";
import type { DagView } from "src/constants/dagView";
import { dependenciesKey } from "src/constants/localStorage";
@@ -309,15 +308,7 @@ export const PanelButtons = ({
</Flex>
</Flex>
- {dagView === "graph" ? (
- <Flex justifyContent="flex-end" mt={1}>
- <Flex color="fg.muted" gap={2}>
- <Tooltip
content={<Text>{translate("dag:navigation.openGraphFilters")}</Text>} portalled>
- <LuKeyboard />
- </Tooltip>
- </Flex>
- </Flex>
- ) : (
+ {dagView !== "graph" && (
<Flex justifyContent="space-between" mt={1}>
<GridFilters />
<Flex color="fg.muted" gap={2} justifyContent="flex-end" mt={1}>
diff --git a/airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/Header.tsx
b/airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/Header.tsx
index 513a3452760..8b0e4e557e9 100644
--- a/airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/Header.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/GroupTaskInstance/Header.tsx
@@ -19,7 +19,7 @@
import { Box } from "@chakra-ui/react";
import type { ReactNode } from "react";
import { useTranslation } from "react-i18next";
-import { MdOutlineTask } from "react-icons/md";
+import { AiOutlineGroup } from "react-icons/ai";
import type { LightGridTaskInstanceSummary } from "openapi/requests/types.gen";
import { ClearTaskInstanceButton } from "src/components/Clear";
@@ -61,7 +61,7 @@ export const Header = ({ taskInstance }: { readonly
taskInstance: LightGridTaskI
<MarkTaskGroupAsButton groupTaskInstance={taskInstance}
isHotkeyEnabled />
</>
}
- icon={<MdOutlineTask />}
+ icon={<AiOutlineGroup />}
state={taskInstance.state}
stats={stats}
subTitle={<Time datetime={taskInstance.min_start_date} />}