This is an automated email from the ASF dual-hosted git repository. potiuk pushed a commit to branch dependabot/npm_and_yarn/airflow-core/src/airflow/ui/eslint-5c0cd3bb85 in repository https://gitbox.apache.org/repos/asf/airflow.git
commit a9aa67f3dc4a95ed09fdbb93a96c46bfc3d1a381 Author: Jarek Potiuk <[email protected]> AuthorDate: Mon Oct 5 00:25:42 2026 +0200 Apply eslint-plugin-unicorn 76 prefer-ternary and logical-operator fixes unicorn 76 widened prefer-ternary and prefer-logical-operator-over-ternary, both already enabled as errors in rules/unicorn.js. prefer-ternary is autofixed; the boolean-literal ternaries are rewritten by hand as logical expressions that keep the same result for boolean conditions (e.g. the pool slots validator keeps NaN handling by checking Number.isFinite first). Generated-by: Claude Opus 5 --- airflow-core/src/airflow/ui/rules/i18n.js | 8 ++--- airflow-core/src/airflow/ui/rules/rem.js | 11 +++---- .../src/airflow/ui/src/components/AnsiRenderer.tsx | 6 +--- .../ClearTaskInstanceConfirmationDialog.tsx | 4 +-- .../Clear/TaskInstance/ClearTaskInstanceDialog.tsx | 3 +- .../airflow/ui/src/components/DateTimeInput.tsx | 7 ++--- .../airflow/ui/src/components/DurationChart.tsx | 2 +- .../ui/src/components/FilterBar/FilterBar.tsx | 6 +--- .../FilterBar/filters/DateRangeCalendar.tsx | 10 ++----- .../FilterBar/filters/DateRangeInputs.tsx | 5 +--- .../airflow/ui/src/components/FilterBar/utils.ts | 6 +--- .../components/FlexibleForm/FieldMultiSelect.tsx | 9 ++---- .../src/components/FlexibleForm/FieldSelector.tsx | 14 +++------ .../airflow/ui/src/components/Graph/DagNode.tsx | 2 +- .../ui/src/components/Graph/SegmentedStateBar.tsx | 8 ++--- .../airflow/ui/src/components/Graph/TaskLink.tsx | 6 +--- .../ui/src/components/MonacoEditor/index.tsx | 12 ++------ .../ui/src/components/ReactMarkdownBlocks.tsx | 10 +++---- .../ui/src/components/SqlParserProvider.tsx | 6 +--- .../ui/src/hooks/navigation/useNavigation.ts | 7 ++--- .../src/airflow/ui/src/hooks/useAdvancedSearch.ts | 2 +- .../ui/src/layouts/Details/DagBreadcrumb.tsx | 4 +-- .../ui/src/layouts/Details/DetailsLayout.tsx | 2 +- .../ui/src/layouts/Details/Gantt/GanttTimeline.tsx | 12 ++++---- .../Graph/hooks/useFilteredNodesAndEdges.ts | 5 +--- .../layouts/Details/Graph/useGraphFilteredNodes.ts | 6 +--- .../src/airflow/ui/src/mocks/handlers/dags.ts | 5 +--- .../airflow/ui/src/pages/AssetsList/AssetsList.tsx | 6 +--- .../ui/src/pages/Connections/ConnectionForm.tsx | 3 +- .../pages/Dag/Backfills/BackfillDagRunsModal.tsx | 22 +++++++------- .../ui/src/pages/Dag/Calendar/CalendarCell.tsx | 5 +--- .../ui/src/pages/Dag/Calendar/CalendarTooltip.tsx | 17 +++-------- airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx | 15 ++++------ .../Dashboard/PoolSummary/PoolSummary.test.tsx | 8 ++--- .../pages/Dashboard/PoolSummary/PoolSummary.tsx | 2 +- .../pages/Dashboard/Stats/DagImportErrorsModal.tsx | 3 +- .../src/airflow/ui/src/pages/Deadlines/index.tsx | 3 +- .../pages/HITLTaskInstances/HITLTaskInstances.tsx | 2 +- .../src/airflow/ui/src/pages/LandingPage.tsx | 6 +--- .../src/airflow/ui/src/pages/Pools/PoolForm.tsx | 15 ++++------ .../src/airflow/ui/src/pages/Run/AssetEvents.tsx | 4 +-- .../src/airflow/ui/src/pages/Run/Details.tsx | 2 +- airflow-core/src/airflow/ui/src/pages/Run/Run.tsx | 2 +- .../ui/src/pages/TaskInstance/AssetEvents.tsx | 2 +- .../airflow/ui/src/pages/TaskInstance/Details.tsx | 14 ++++----- .../ui/src/pages/TaskInstance/HITLResponse.tsx | 2 +- .../ui/src/pages/TaskInstance/Logs/logSelection.ts | 16 ++++------ .../src/pages/TaskInstance/Logs/useLogGroups.tsx | 14 +++------ .../ui/src/pages/TaskInstance/Logs/utils.ts | 24 +++++---------- .../ui/src/pages/TaskInstance/TaskInstance.tsx | 6 ++-- .../ui/src/pages/TaskStateStore/TaskStateStore.tsx | 2 +- .../pages/TaskStateStore/TaskStateStoreModal.tsx | 5 +--- .../ui/src/queries/useDagBundleRefetchInterval.ts | 8 +++-- .../ui/src/queries/useDagRunStateCounts.tsx | 3 +- .../src/airflow/ui/src/queries/useDags.tsx | 17 +++++------ .../src/airflow/ui/src/queries/useDeadlines.ts | 2 +- .../src/airflow/ui/src/queries/useLogs.tsx | 7 ++--- .../src/airflow/ui/src/queries/useParamStore.ts | 8 ++--- .../ui/src/queries/useRefreshOnNewDagRuns.ts | 2 +- airflow-core/src/airflow/ui/src/queryClient.ts | 8 ++--- .../ui/src/system-components/Select/ValueText.tsx | 5 +--- .../src/airflow/ui/src/utils/datetimeUtils.ts | 34 ++++++++-------------- .../src/airflow/ui/src/utils/jsonPreview.ts | 16 ++++------ airflow-core/src/airflow/ui/src/utils/links.ts | 18 ++++-------- airflow-core/src/airflow/ui/src/utils/logs.ts | 8 ++--- .../src/airflow/ui/src/utils/pluginAppliesTo.ts | 15 +++------- airflow-core/src/airflow/ui/src/utils/query.ts | 6 ++-- airflow-core/src/airflow/ui/src/utils/tab.ts | 6 +--- .../airflow/ui/tests/e2e/pages/ConnectionsPage.ts | 26 ++++------------- .../src/airflow/ui/tests/e2e/pages/DagsPage.ts | 8 ++--- .../src/airflow/ui/tests/e2e/pages/EventsPage.ts | 6 +--- .../airflow/ui/tests/e2e/specs/dag-tasks.spec.ts | 8 ++--- .../src/airflow/ui/tests/e2e/utils/shared.ts | 6 +--- 73 files changed, 202 insertions(+), 393 deletions(-) diff --git a/airflow-core/src/airflow/ui/rules/i18n.js b/airflow-core/src/airflow/ui/rules/i18n.js index 811dea1d252..bf71a66b65e 100644 --- a/airflow-core/src/airflow/ui/rules/i18n.js +++ b/airflow-core/src/airflow/ui/rules/i18n.js @@ -39,11 +39,9 @@ const getKeys = (obj, prefix = "") => { const newPrefix = prefix ? `${prefix}.${key}` : key; const value = obj[key]; - if (typeof value === "object" && value !== null && !Array.isArray(value)) { - return [newPrefix, ...getKeys(value, newPrefix)]; - } - - return [newPrefix]; + return typeof value === "object" && value !== null && !Array.isArray(value) + ? [newPrefix, ...getKeys(value, newPrefix)] + : [newPrefix]; }); }; diff --git a/airflow-core/src/airflow/ui/rules/rem.js b/airflow-core/src/airflow/ui/rules/rem.js index ab0199f3e87..75198a4e29c 100644 --- a/airflow-core/src/airflow/ui/rules/rem.js +++ b/airflow-core/src/airflow/ui/rules/rem.js @@ -95,16 +95,13 @@ export const remPlugin = { if (attr.value !== null && attr.value.type === AST_NODE_TYPES.Literal) { return fixer.replaceText(attr.value, `{${fixedValue}}`); } + // For JSX expressions with literal values, replace just the literal - if ( - attr.value !== null && + return attr.value !== null && attr.value.type === AST_NODE_TYPES.JSXExpressionContainer && attr.value.expression.type === AST_NODE_TYPES.Literal - ) { - return fixer.replaceText(attr.value.expression, fixedValue); - } - - return null; + ? fixer.replaceText(attr.value.expression, fixedValue) + : null; }, messageId: "noRemInProps", node: attr, diff --git a/airflow-core/src/airflow/ui/src/components/AnsiRenderer.tsx b/airflow-core/src/airflow/ui/src/components/AnsiRenderer.tsx index 554a2b112d8..d4e2c1a9c5d 100644 --- a/airflow-core/src/airflow/ui/src/components/AnsiRenderer.tsx +++ b/airflow-core/src/airflow/ui/src/components/AnsiRenderer.tsx @@ -60,11 +60,7 @@ const createClass = (bundle: AnserJsonEntry): string | undefined => { classNames += `ansi-${bundle.decoration} `; } - if (classNames === "") { - return undefined; - } - - return classNames.slice(0, classNames.length - 1); + return classNames === "" ? undefined : classNames.slice(0, classNames.length - 1); }; // Map RGB values to Chakra UI semantic tokens diff --git a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceConfirmationDialog.tsx b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceConfirmationDialog.tsx index 336ab7ed6be..c3b4a43e57f 100644 --- a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceConfirmationDialog.tsx +++ b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceConfirmationDialog.tsx @@ -69,10 +69,10 @@ const ClearTaskInstanceConfirmationDialog = ({ }, requestBody: { dag_run_id: dagDetails?.dagRunId ?? "", - include_downstream: useExplicitTaskIds ? false : dagDetails?.downstream, + include_downstream: !useExplicitTaskIds && dagDetails?.downstream, include_future: dagDetails?.future, include_past: dagDetails?.past, - include_upstream: useExplicitTaskIds ? false : dagDetails?.upstream, + include_upstream: !useExplicitTaskIds && dagDetails?.upstream, only_failed: dagDetails?.onlyFailed, task_ids: useExplicitTaskIds ? dagDetails.taskIds diff --git a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx index 8d04075adb9..8299596a423 100644 --- a/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx +++ b/airflow-core/src/airflow/ui/src/components/Clear/TaskInstance/ClearTaskInstanceDialog.tsx @@ -84,6 +84,7 @@ const ClearTaskInstanceDialog = (props: Props) => { /* eslint-enable react/destructuring-assignment */ const { t: translate } = useTranslation(); const { onClose, onOpen, open } = useDisclosure(); + const isDialogOpen = openDialog && !open; const [clearTaskInstanceDefaultOptions] = useClearTaskInstanceDefaultOptions(); const [preventRunningTaskDefault] = useClearPreventRunningTaskDefault(); @@ -255,7 +256,7 @@ const ClearTaskInstanceDialog = (props: Props) => { } lazyMount onOpenChange={onCloseDialog} - open={openDialog ? !open : false} + open={isDialogOpen} title={ <> <strong> diff --git a/airflow-core/src/airflow/ui/src/components/DateTimeInput.tsx b/airflow-core/src/airflow/ui/src/components/DateTimeInput.tsx index 767dc8393d6..54516ea816d 100644 --- a/airflow-core/src/airflow/ui/src/components/DateTimeInput.tsx +++ b/airflow-core/src/airflow/ui/src/components/DateTimeInput.tsx @@ -118,11 +118,10 @@ export const DateTimeInput = forwardRef<HTMLDivElement, Props>( if (fieldName === "start" && inputs.date !== "" && !validateDateInput(inputs.date)) { return { field: "start", message: translate("dateRangeFilter.validation.invalidDateFormat") }; } - if (fieldName === "startTime" && inputs.time !== "" && !validateTimeInput(inputs.time)) { - return { field: "startTime", message: translate("dateRangeFilter.validation.invalidTimeFormat") }; - } - return undefined; + return fieldName === "startTime" && inputs.time !== "" && !validateTimeInput(inputs.time) + ? { field: "startTime", message: translate("dateRangeFilter.validation.invalidTimeFormat") } + : undefined; }; const getBorderColor = (fieldName: ValidationError["field"]) => diff --git a/airflow-core/src/airflow/ui/src/components/DurationChart.tsx b/airflow-core/src/airflow/ui/src/components/DurationChart.tsx index 77053be4c6c..df2f60c3c67 100644 --- a/airflow-core/src/airflow/ui/src/components/DurationChart.tsx +++ b/airflow-core/src/airflow/ui/src/components/DurationChart.tsx @@ -185,7 +185,7 @@ export const DurationChart = ({ }} datasetIdKey="id" options={{ - animation: isAutoRefreshing ? false : undefined, + animation: !isAutoRefreshing && undefined, maintainAspectRatio: false, onClick: (_event, elements) => { const [element] = elements; diff --git a/airflow-core/src/airflow/ui/src/components/FilterBar/FilterBar.tsx b/airflow-core/src/airflow/ui/src/components/FilterBar/FilterBar.tsx index 91cae568161..6552e453b8c 100644 --- a/airflow-core/src/airflow/ui/src/components/FilterBar/FilterBar.tsx +++ b/airflow-core/src/airflow/ui/src/components/FilterBar/FilterBar.tsx @@ -113,11 +113,7 @@ export const FilterBar = ({ synchronizedFilters.length === prevFilters.length && synchronizedFilters.every((filter, index) => filter === prevFilters[index]); - if (toAdd.length === 0 && filtersUnchanged) { - return prevFilters; - } - - return [...synchronizedFilters, ...toAdd]; + return toAdd.length === 0 && filtersUnchanged ? prevFilters : [...synchronizedFilters, ...toAdd]; }); // configs is intentionally omitted — it is structurally stable across renders and including // it would risk infinite re-render loops. initialValuesKey captures all relevant URL changes. diff --git a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeCalendar.tsx b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeCalendar.tsx index 994558a334e..8e42fac450e 100644 --- a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeCalendar.tsx +++ b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeCalendar.tsx @@ -70,22 +70,16 @@ export const DateRangeCalendar = ({ if (state.isEnd) { return "brand.muted"; } - if (state.isInRange) { - return "brand.subtle"; - } - return "transparent"; + return state.isInRange ? "brand.subtle" : "transparent"; }; const getTextColor = () => { if (state.isStart || state.isEnd) { return "brand.contrast"; } - if (!state.isCurrentMonth) { - return "fg.muted"; - } - return "fg"; + return state.isCurrentMonth ? "fg" : "fg.muted"; }; return { diff --git a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeInputs.tsx b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeInputs.tsx index 59505ad9472..e9593ad69b1 100644 --- a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeInputs.tsx +++ b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeInputs.tsx @@ -66,11 +66,8 @@ export const DateRangeInputs = ({ if (getFieldError("range") && (fieldName === "start" || fieldName === "end")) { return "danger.solid"; } - if (editingState.selectionTarget === fieldName) { - return "brand.focusRing"; - } - return "border"; + return editingState.selectionTarget === fieldName ? "brand.focusRing" : "border"; }; const clearField = (field: "end" | "start") => { diff --git a/airflow-core/src/airflow/ui/src/components/FilterBar/utils.ts b/airflow-core/src/airflow/ui/src/components/FilterBar/utils.ts index d704bf1caad..5364a5211d6 100644 --- a/airflow-core/src/airflow/ui/src/components/FilterBar/utils.ts +++ b/airflow-core/src/airflow/ui/src/components/FilterBar/utils.ts @@ -59,11 +59,7 @@ export const getDefaultFilterValue = (config: FilterConfig): FilterValue => { return { endDate: undefined, startDate: undefined }; } - if (config.type === "multiselect") { - return []; - } - - return ""; + return config.type === "multiselect" ? [] : ""; }; export const parseFilterDate = (date?: string | null) => diff --git a/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx index 04a901b30bc..714f5c20459 100644 --- a/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx +++ b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldMultiSelect.tsx @@ -25,13 +25,8 @@ import { paramPlaceholder, useParamStore } from "src/queries/useParamStore"; import type { FlexibleFormElementProps } from "."; -const labelLookup = (key: string, valuesDisplay: Record<string, string> | undefined): string => { - if (valuesDisplay && typeof valuesDisplay === "object") { - return valuesDisplay[key] ?? key; - } - - return key; -}; +const labelLookup = (key: string, valuesDisplay: Record<string, string> | undefined): string => + valuesDisplay && typeof valuesDisplay === "object" ? (valuesDisplay[key] ?? key) : key; export const FieldMultiSelect = ({ name, namespace = "default", onUpdate }: FlexibleFormElementProps) => { const { t: translate } = useTranslation("components"); diff --git a/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx index d88016dcf0d..f2341c16247 100644 --- a/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx +++ b/airflow-core/src/airflow/ui/src/components/FlexibleForm/FieldSelector.tsx @@ -38,11 +38,9 @@ const inferType = (param: ParamSpec) => { if (Boolean(param.schema.type)) { // If there are multiple types, we assume that the first one is the correct one that is not "null". // "null" is only used to signal the value is optional. - if (Array.isArray(param.schema.type)) { - return param.schema.type.find((type) => type !== "null") ?? "string"; - } - - return param.schema.type ?? "string"; + return Array.isArray(param.schema.type) + ? (param.schema.type.find((type) => type !== "null") ?? "string") + : (param.schema.type ?? "string"); } // If the type is not defined, we infer it from the value. @@ -51,11 +49,7 @@ const inferType = (param: ParamSpec) => { } // Missing value, return 'null' as typeof(null) = 'dict' - if (param.value === null) { - return "null"; - } - - return typeof param.value; + return param.value === null ? "null" : typeof param.value; }; const isFieldAdvancedArray = (fieldType: string, fieldSchema: ParamSchema) => diff --git a/airflow-core/src/airflow/ui/src/components/Graph/DagNode.tsx b/airflow-core/src/airflow/ui/src/components/Graph/DagNode.tsx index 4a415ce4cf1..73e1a5f9e93 100644 --- a/airflow-core/src/airflow/ui/src/components/Graph/DagNode.tsx +++ b/airflow-core/src/airflow/ui/src/components/Graph/DagNode.tsx @@ -35,7 +35,7 @@ export const DagNode = ({ }: NodeProps<NodeType<CustomNodeProps, "dag">>) => { const refetchInterval = useAutoRefresh({ dagId: label }); const { data: dag } = useDagServiceGetDag({ dagId: label }, undefined, { - refetchInterval: (query) => (query.state.data?.scheduling_state === "draining" ? refetchInterval : false), + refetchInterval: (query) => query.state.data?.scheduling_state === "draining" && refetchInterval, }); const { data: unfinishedRuns } = useDagRunServiceGetDagRuns( { dagId: label, limit: 1, state: ["queued", "running"] }, diff --git a/airflow-core/src/airflow/ui/src/components/Graph/SegmentedStateBar.tsx b/airflow-core/src/airflow/ui/src/components/Graph/SegmentedStateBar.tsx index cf4c8ff43af..8040efb68e4 100644 --- a/airflow-core/src/airflow/ui/src/components/Graph/SegmentedStateBar.tsx +++ b/airflow-core/src/airflow/ui/src/components/Graph/SegmentedStateBar.tsx @@ -32,11 +32,9 @@ export const SegmentedStateBar = ({ childStates, fallbackState, height = "6px" } const entries = sortStateEntries(childStates); if (entries.length === 0) { - if (!fallbackState) { - return undefined; - } - - return <Box bg={`${fallbackState}.solid`} borderRadius="2px" height={height} mt="auto" />; + return fallbackState ? ( + <Box bg={`${fallbackState}.solid`} borderRadius="2px" height={height} mt="auto" /> + ) : undefined; } return ( diff --git a/airflow-core/src/airflow/ui/src/components/Graph/TaskLink.tsx b/airflow-core/src/airflow/ui/src/components/Graph/TaskLink.tsx index 9fd76ee7185..7f45a68f413 100644 --- a/airflow-core/src/airflow/ui/src/components/Graph/TaskLink.tsx +++ b/airflow-core/src/airflow/ui/src/components/Graph/TaskLink.tsx @@ -42,11 +42,7 @@ export const TaskLink = forwardRef<HTMLAnchorElement, Props>( compositeId, ); - if (match) { - return { dagId: match[1], taskId: match[2] }; - } - - return { dagId: undefined, taskId: undefined }; + return match ? { dagId: match[1], taskId: match[2] } : { dagId: undefined, taskId: undefined }; }; const { dagId: extractedDagId, taskId: extractedTaskId } = parseCompositeId(id); diff --git a/airflow-core/src/airflow/ui/src/components/MonacoEditor/index.tsx b/airflow-core/src/airflow/ui/src/components/MonacoEditor/index.tsx index 949146d6524..63fffff5d6b 100644 --- a/airflow-core/src/airflow/ui/src/components/MonacoEditor/index.tsx +++ b/airflow-core/src/airflow/ui/src/components/MonacoEditor/index.tsx @@ -27,21 +27,13 @@ import { useMonacoReady } from "./useMonacoReady"; export const MonacoEditor = (props: EditorProps) => { const isMonacoReady = useMonacoReady(); - if (!isMonacoReady) { - return null; - } - - return <EditorComponent {...props} />; + return isMonacoReady ? <EditorComponent {...props} /> : null; }; export const MonacoDiffEditor = (props: DiffEditorProps) => { const isMonacoReady = useMonacoReady(); - if (!isMonacoReady) { - return null; - } - - return <DiffEditorComponent {...props} />; + return isMonacoReady ? <DiffEditorComponent {...props} /> : null; }; export const DiffEditor = MonacoDiffEditor; diff --git a/airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx b/airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx index d7084d8f953..98eccc4c515 100644 --- a/airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx +++ b/airflow-core/src/airflow/ui/src/components/ReactMarkdownBlocks.tsx @@ -275,9 +275,9 @@ export const MarkdownCodeBlock = ({ return <MarkdownMathBlock style={style} value={value} />; } - if (language === "mermaid") { - return <MarkdownMermaid chart={value} fallbackStyle={style} />; - } - - return <MarkdownPlainCodeBlock language={language} style={style} value={value} />; + return language === "mermaid" ? ( + <MarkdownMermaid chart={value} fallbackStyle={style} /> + ) : ( + <MarkdownPlainCodeBlock language={language} style={style} value={value} /> + ); }; diff --git a/airflow-core/src/airflow/ui/src/components/SqlParserProvider.tsx b/airflow-core/src/airflow/ui/src/components/SqlParserProvider.tsx index e008779a5cd..d42288d3b0c 100644 --- a/airflow-core/src/airflow/ui/src/components/SqlParserProvider.tsx +++ b/airflow-core/src/airflow/ui/src/components/SqlParserProvider.tsx @@ -35,9 +35,5 @@ export const SqlParserProvider = ({ children }: { readonly children: ReactNode } .finally(() => setIsReady(true)); }, []); - if (!isReady) { - return undefined; - } - - return children; + return isReady ? children : undefined; }; diff --git a/airflow-core/src/airflow/ui/src/hooks/navigation/useNavigation.ts b/airflow-core/src/airflow/ui/src/hooks/navigation/useNavigation.ts index eaf8585bdb6..65f74e5666e 100644 --- a/airflow-core/src/airflow/ui/src/hooks/navigation/useNavigation.ts +++ b/airflow-core/src/airflow/ui/src/hooks/navigation/useNavigation.ts @@ -43,11 +43,10 @@ const detectModeFromUrl = (pathname: string): NavigationMode => { if (pathname.includes("/runs/") && !pathname.includes("/tasks/")) { return NavigationModes.RUN; } - if (pathname.includes("/tasks/") && !pathname.includes("/runs/")) { - return NavigationModes.TASK; - } - return NavigationModes.TI; + return pathname.includes("/tasks/") && !pathname.includes("/runs/") + ? NavigationModes.TASK + : NavigationModes.TI; }; const isValidDirection = (direction: NavigationDirection, mode: NavigationMode): boolean => { diff --git a/airflow-core/src/airflow/ui/src/hooks/useAdvancedSearch.ts b/airflow-core/src/airflow/ui/src/hooks/useAdvancedSearch.ts index f3d4a629334..d8aa8d72a96 100644 --- a/airflow-core/src/airflow/ui/src/hooks/useAdvancedSearch.ts +++ b/airflow-core/src/airflow/ui/src/hooks/useAdvancedSearch.ts @@ -37,7 +37,7 @@ export const useAdvancedSearch = (key: string) => { const [storedEnabled, setStoredEnabled] = useLocalStorage<boolean>(advancedSearchKey(key), defaultEnabled); const urlValues = searchParams.getAll(SearchParamsKeys.ADVANCED_SEARCH); - const enabled = urlValues.includes(key) ? true : urlValues.includes(`-${key}`) ? false : storedEnabled; + const enabled = urlValues.includes(key) || (!urlValues.includes(`-${key}`) && storedEnabled); const onToggle = (nextEnabled: boolean) => { setSearchParams((previous) => { diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx index 8f4d2552f7f..ac570efae33 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx +++ b/airflow-core/src/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx @@ -103,7 +103,7 @@ export const DagBreadcrumb = () => { undefined, { enabled: Boolean(runId), - refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false), + refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval, }, ); @@ -127,7 +127,7 @@ export const DagBreadcrumb = () => { undefined, { enabled: Boolean(runId) && Boolean(taskId) && !hasExpandedInstances, - refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false), + refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval, }, ); diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx index 72b8dd476a0..4d9483339fb 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx +++ b/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx @@ -95,7 +95,7 @@ export const DetailsLayout = ({ children, error, isLoading, outletContext, tabs const { dagId = "", runId } = useParams(); const refetchInterval = useAutoRefresh({ dagId }); const { data: dag } = useDagServiceGetDag({ dagId }, undefined, { - refetchInterval: (query) => (query.state.data?.scheduling_state === "draining" ? refetchInterval : false), + refetchInterval: (query) => query.state.data?.scheduling_state === "draining" && refetchInterval, }); // Only asked while the Dag can still be drained; the answer decides whether // pausing needs to offer the drain choice at all. diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx index 06e5924a740..0d617683815 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx +++ b/airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx @@ -289,10 +289,10 @@ export const GanttTimeline = ({ // from the filtered list so the adjacent execution bar keeps rounded corners. const segments = bodyWidthPx > 0 - ? allSegments.filter((segment) => - segment.state !== "scheduled" && segment.state !== "queued" - ? true - : segmentLayout(segment).widthPx >= MIN_SEGMENT_RENDER_PX, + ? allSegments.filter( + (segment) => + (segment.state !== "scheduled" && segment.state !== "queued") || + segmentLayout(segment).widthPx >= MIN_SEGMENT_RENDER_PX, ) : allSegments; const taskId = node.id; @@ -341,9 +341,9 @@ export const GanttTimeline = ({ // Task groups don't have a try number const touchesNext = - tryNumber === undefined ? false : segments[segIndex + 1]?.tryNumber === tryNumber; + tryNumber !== undefined && segments[segIndex + 1]?.tryNumber === tryNumber; const touchesPrev = - tryNumber === undefined ? false : segments[segIndex - 1]?.tryNumber === tryNumber; + tryNumber !== undefined && segments[segIndex - 1]?.tryNumber === tryNumber; return ( <TaskInstanceTooltip diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/Graph/hooks/useFilteredNodesAndEdges.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Graph/hooks/useFilteredNodesAndEdges.ts index d70a04290fb..3a1eb06184a 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/Graph/hooks/useFilteredNodesAndEdges.ts +++ b/airflow-core/src/airflow/ui/src/layouts/Details/Graph/hooks/useFilteredNodesAndEdges.ts @@ -64,11 +64,8 @@ export const useFilteredNodesAndEdges = ({ if (edge.source === node.id) { return [edge.target]; } - if (edge.target === node.id) { - return [edge.source]; - } - return []; + return edge.target === node.id ? [edge.source] : []; }); const connectedTaskIds = connectedIds.filter((id) => nodeTypeMap.get(id) === "task"); diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/Graph/useGraphFilteredNodes.ts b/airflow-core/src/airflow/ui/src/layouts/Details/Graph/useGraphFilteredNodes.ts index 34f26022c58..4fafe005923 100644 --- a/airflow-core/src/airflow/ui/src/layouts/Details/Graph/useGraphFilteredNodes.ts +++ b/airflow-core/src/airflow/ui/src/layouts/Details/Graph/useGraphFilteredNodes.ts @@ -52,11 +52,7 @@ const getTaskDurationSeconds = ( const start = new Date(minStartDate).getTime(); const end = new Date(maxEndDate).getTime(); - if (Number.isNaN(start) || Number.isNaN(end)) { - return undefined; - } - - return (end - start) / 1000; + return Number.isNaN(start) || Number.isNaN(end) ? undefined : (end - start) / 1000; }; const isNodeFiltered = (node: ReactFlowNode<CustomNodeProps>, filters: GraphFilterValues): boolean => { diff --git a/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts index 765a16b5bf1..e7564dec209 100644 --- a/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts +++ b/airflow-core/src/airflow/ui/src/mocks/handlers/dags.ts @@ -122,11 +122,8 @@ const filterDags = ({ paused, timetableTypes }: { paused: string | null; timetab if (paused === "true") { return allDags.filter((dag) => dag.is_paused); } - if (paused === "false") { - return allDags.filter((dag) => !dag.is_paused); - } - return allDags; + return paused === "false" ? allDags.filter((dag) => !dag.is_paused) : allDags; }; export const handlers: Array<HttpHandler> = [ diff --git a/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx b/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx index 2e30e31ec98..4609a2bf8fe 100644 --- a/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx +++ b/airflow-core/src/airflow/ui/src/pages/AssetsList/AssetsList.tsx @@ -68,11 +68,7 @@ const createColumns = (translate: TFunction): Array<ColumnDef<AssetResponse>> => const assetEvent = original.last_asset_event; const timestamp = assetEvent?.timestamp; - if (timestamp === null || timestamp === undefined) { - return undefined; - } - - return <Time datetime={timestamp} />; + return timestamp === null || timestamp === undefined ? undefined : <Time datetime={timestamp} />; }, header: () => translate("lastAssetEvent"), }, diff --git a/airflow-core/src/airflow/ui/src/pages/Connections/ConnectionForm.tsx b/airflow-core/src/airflow/ui/src/pages/Connections/ConnectionForm.tsx index 9ca8faadff7..58f68acfa61 100644 --- a/airflow-core/src/airflow/ui/src/pages/Connections/ConnectionForm.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Connections/ConnectionForm.tsx @@ -169,8 +169,7 @@ const ConnectionForm = ({ )} rules={{ required: translate("connections.form.connectionIdRequired"), - validate: (value) => - value.trim() === "" ? translate("connections.form.connectionIdRequirement") : true, + validate: (value) => value.trim() !== "" || translate("connections.form.connectionIdRequirement"), }} /> diff --git a/airflow-core/src/airflow/ui/src/pages/Dag/Backfills/BackfillDagRunsModal.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Backfills/BackfillDagRunsModal.tsx index 6b007afe29f..5ffea667f24 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dag/Backfills/BackfillDagRunsModal.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dag/Backfills/BackfillDagRunsModal.tsx @@ -93,11 +93,11 @@ const getColumns = ( cell: ({ row }) => { const state = row.original.dag_run_state; - if (state === null || state === undefined) { - return <Text color="fg.muted">—</Text>; - } - - return <StateBadge state={state}>{translate(`states.${state}`)}</StateBadge>; + return state === null || state === undefined ? ( + <Text color="fg.muted">—</Text> + ) : ( + <StateBadge state={state}>{translate(`states.${state}`)}</StateBadge> + ); }, enableSorting: false, header: translate("dagRunState"), @@ -107,11 +107,11 @@ const getColumns = ( cell: ({ row }) => { const reason = row.original.exception_reason; - if (reason === null || reason === "") { - return <Text color="fg.muted">—</Text>; - } - - return <Text>{translateExceptionReason(reason, translate)}</Text>; + return reason === null || reason === "" ? ( + <Text color="fg.muted">—</Text> + ) : ( + <Text>{translateExceptionReason(reason, translate)}</Text> + ); }, enableSorting: false, header: translate("components:backfill.notCreatedReason"), @@ -160,7 +160,7 @@ export const BackfillDagRunsModal = ({ backfillId, dagId, onClose, open }: Backf isLoading: isBackfillLoading, } = useBackfillServiceGetBackfill({ backfillId: backfillId ?? 0 }, undefined, { enabled: open && backfillId !== undefined, - refetchInterval: (query) => (query.state.data?.completed_at === null ? refetchInterval : false), + refetchInterval: (query) => query.state.data?.completed_at === null && refetchInterval, }); const shouldPoll = backfill?.completed_at === null; diff --git a/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarCell.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarCell.tsx index 73d3df9b6b5..b8f41360971 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarCell.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarCell.tsx @@ -66,10 +66,7 @@ export const CalendarCell = ({ ? Object.entries(cellData.counts) .filter( ([key, value]) => - key !== "total" && - key !== "backfill" && - value > 0 && - (viewMode === "failed" ? key === "failed" : true), + key !== "total" && key !== "backfill" && value > 0 && (viewMode !== "failed" || key === "failed"), ) .map(([key]) => key) : []; diff --git a/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarTooltip.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarTooltip.tsx index 8ca36b11109..2af4031460e 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarTooltip.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dag/Calendar/CalendarTooltip.tsx @@ -58,19 +58,10 @@ export const CalendarTooltip = ({ cellData, viewMode = "total" }: Props) => { // In failed mode, only show failed runs; in total mode, show all non-zero states const states = Object.entries(counts) - .filter(([key, value]) => { - if (key === "total" || key === "backfill") { - return false; - } - if (value === 0) { - return false; - } - if (viewMode === "failed") { - return key === "failed"; - } - - return true; - }) + .filter( + ([key, value]) => + key !== "total" && key !== "backfill" && value !== 0 && (viewMode !== "failed" || key === "failed"), + ) .map(([state, count]) => ({ color: stateColorMap[state as keyof typeof stateColorMap] || "gray.500", count, diff --git a/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx b/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx index dc102cb8576..1ddb81b04e8 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dag/Dag.tsx @@ -77,17 +77,12 @@ export const Dag = () => { }, undefined, { - refetchInterval: (query) => { + refetchInterval: (query) => // Auto-refresh when there are active runs or pending runs - if ( - query.state.data?.scheduling_state === "draining" || - (hasPendingRuns ?? (query.state.data && (query.state.data.active_runs_count ?? 0) > 0)) - ) { - return refetchInterval; - } - - return false; - }, + query.state.data?.scheduling_state === "draining" || + (hasPendingRuns ?? (query.state.data && (query.state.data.active_runs_count ?? 0) > 0)) + ? refetchInterval + : false, }, ); diff --git a/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.test.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.test.tsx index 9a3b472dab3..04a7684ccc0 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.test.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.test.tsx @@ -55,11 +55,9 @@ vi.mock("react-i18next", () => ({ return `Deferred not counted in slots: ${options?.count}`; } - if (namespace === "dashboard" && key === "deferredSlotsNotCountedTooltip") { - return mocks.deferredSlotsNotCountedTooltip; - } - - return `${namespace}:${key}`; + return namespace === "dashboard" && key === "deferredSlotsNotCountedTooltip" + ? mocks.deferredSlotsNotCountedTooltip + : `${namespace}:${key}`; }, }), })); diff --git a/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.tsx index d251157e484..865605bea49 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dashboard/PoolSummary/PoolSummary.tsx @@ -46,7 +46,7 @@ export const PoolSummary = () => { refetchInterval: (query) => { const apiError = query.state.error; - return apiError?.status === 403 ? false : refetchInterval; + return apiError?.status !== 403 && refetchInterval; }, }, ); diff --git a/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DagImportErrorsModal.tsx b/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DagImportErrorsModal.tsx index 4fe139d1a6b..7adea18d4fe 100644 --- a/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DagImportErrorsModal.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Dashboard/Stats/DagImportErrorsModal.tsx @@ -102,8 +102,7 @@ export const DagImportErrorsModal = ({ onClose, open }: ImportDAGErrorModalProps // Reparse is a queued request the dag processor picks up on its next // cycle, so once a reparse has been issued the modal polls until it is // closed. autoRefreshInterval mirrors what the dashboard cards use. - refetchInterval: - pollAfterReparse && autoRefreshInterval !== undefined ? autoRefreshInterval * 1000 : false, + refetchInterval: pollAfterReparse && autoRefreshInterval !== undefined && autoRefreshInterval * 1000, }, ); diff --git a/airflow-core/src/airflow/ui/src/pages/Deadlines/index.tsx b/airflow-core/src/airflow/ui/src/pages/Deadlines/index.tsx index 4d7b796dbbf..a851017ceae 100644 --- a/airflow-core/src/airflow/ui/src/pages/Deadlines/index.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Deadlines/index.tsx @@ -137,7 +137,8 @@ export const Deadlines = () => { const deadlineTimeLte = searchParams.get(SearchParamsKeys.DEADLINE_TIME_LTE); const teams = searchParams.getAll(SearchParamsKeys.TEAMS); - const missedFilter = filteredMissed === "true" ? true : filteredMissed === "false" ? false : undefined; + const missedFilter = + filteredMissed === "true" || filteredMissed === "false" ? filteredMissed === "true" : undefined; const { data, error, isFetching, isLoading } = useDeadlinesServiceGetDeadlines({ dagId: filteredDagId !== null && filteredDagId !== "" ? filteredDagId : "~", diff --git a/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx b/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx index 5d5536edb70..15e138b38b1 100644 --- a/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx +++ b/airflow-core/src/airflow/ui/src/pages/HITLTaskInstances/HITLTaskInstances.tsx @@ -319,7 +319,7 @@ export const HITLTaskInstances = ({ ), ); - return hasPendingWithoutResponse ? baseRefetchInterval : false; + return hasPendingWithoutResponse && baseRefetchInterval; }, }, ); diff --git a/airflow-core/src/airflow/ui/src/pages/LandingPage.tsx b/airflow-core/src/airflow/ui/src/pages/LandingPage.tsx index 5d66a1b13ab..27d9481e9dc 100644 --- a/airflow-core/src/airflow/ui/src/pages/LandingPage.tsx +++ b/airflow-core/src/airflow/ui/src/pages/LandingPage.tsx @@ -25,9 +25,5 @@ import { useDefaultLandingPage } from "src/hooks/useUserSettings"; export const LandingPage = () => { const [defaultLandingPage] = useDefaultLandingPage(); - if (defaultLandingPage === "dags") { - return <Navigate replace to="/dags" />; - } - - return <Dashboard />; + return defaultLandingPage === "dags" ? <Navigate replace to="/dags" /> : <Dashboard />; }; diff --git a/airflow-core/src/airflow/ui/src/pages/Pools/PoolForm.tsx b/airflow-core/src/airflow/ui/src/pages/Pools/PoolForm.tsx index faa8eb9dce1..417449c633a 100644 --- a/airflow-core/src/airflow/ui/src/pages/Pools/PoolForm.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Pools/PoolForm.tsx @@ -115,16 +115,11 @@ const PoolForm = ({ error, initialPool, isPending, manageMutate, setError }: Poo </Field.Root> )} rules={{ - validate: (value: number) => { - if (!Number.isFinite(value)) { - return translate("common:validation.mustBeValidNumber"); - } - if (value < POOL_SLOTS_MIN) { - return translate("common:validation.mustBeAtLeast", { min: POOL_SLOTS_MIN }); - } - - return true; - }, + validate: (value: number) => + Number.isFinite(value) + ? value >= POOL_SLOTS_MIN || + translate("common:validation.mustBeAtLeast", { min: POOL_SLOTS_MIN }) + : translate("common:validation.mustBeValidNumber"), }} /> diff --git a/airflow-core/src/airflow/ui/src/pages/Run/AssetEvents.tsx b/airflow-core/src/airflow/ui/src/pages/Run/AssetEvents.tsx index 4c8f6d6a5a3..dbf6d11761d 100644 --- a/airflow-core/src/airflow/ui/src/pages/Run/AssetEvents.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Run/AssetEvents.tsx @@ -35,12 +35,12 @@ export const AssetEvents = () => { dagRunId: runId, }, undefined, - { refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false) }, + { refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval }, ); const { data, isLoading } = useDagRunServiceGetUpstreamAssetEvents({ dagId, dagRunId: runId }, undefined, { enabled: dagRun?.run_type === "asset_triggered", - refetchInterval: () => (isStatePending(dagRun?.state) ? refetchInterval : false), + refetchInterval: () => isStatePending(dagRun?.state) && refetchInterval, }); return <AssetEventsTable data={data} isLoading={isLoading} titleKey="common:sourceAssetEvent" />; diff --git a/airflow-core/src/airflow/ui/src/pages/Run/Details.tsx b/airflow-core/src/airflow/ui/src/pages/Run/Details.tsx index 7a460996e98..4ea8a3204ec 100644 --- a/airflow-core/src/airflow/ui/src/pages/Run/Details.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Run/Details.tsx @@ -47,7 +47,7 @@ export const Details = () => { dagRunId: runId, }, undefined, - { refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false) }, + { refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval }, ); const { data: dagRunStats } = useDagRunServiceGetDagRunStats({ dagId, dagRunId: runId }); diff --git a/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx b/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx index 75c3a415838..62966082512 100644 --- a/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx +++ b/airflow-core/src/airflow/ui/src/pages/Run/Run.tsx @@ -62,7 +62,7 @@ export const Run = () => { }, undefined, { - refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false), + refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval, }, ); diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx index 408edd320d7..5c2c11f79db 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/AssetEvents.tsx @@ -102,7 +102,7 @@ export const AssetEvents = () => { }, undefined, { - refetchInterval: () => (isStatePending(taskInstance?.state) ? refetchInterval : false), + refetchInterval: () => isStatePending(taskInstance?.state) && refetchInterval, }, ); diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Details.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Details.tsx index c35a3462dd7..ceca6f20611 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Details.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Details.tsx @@ -92,7 +92,7 @@ export const Details = () => { }, undefined, { - refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false), + refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval, }, ); @@ -109,11 +109,9 @@ export const Details = () => { return value; } - if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") { - return value.toString(); - } - - return translate("common:none", { defaultValue: "None" }); + return typeof value === "number" || typeof value === "boolean" || typeof value === "bigint" + ? value.toString() + : translate("common:none", { defaultValue: "None" }); }; // Keyed off the selected try's own state, so an earlier failed try keeps its reason while the @@ -150,11 +148,11 @@ export const Details = () => { taskInstance={taskInstance} /> )} - <ExtraLinks refetchInterval={isStatePending(tryInstance?.state) ? refetchInterval : false} /> + <ExtraLinks refetchInterval={isStatePending(tryInstance?.state) && refetchInterval} /> {taskInstance === undefined || ![null, "queued", "scheduled"].includes(taskInstance.state) ? undefined : ( <BlockingDeps - refetchInterval={isStatePending(tryInstance?.state) ? refetchInterval : false} + refetchInterval={isStatePending(tryInstance?.state) && refetchInterval} taskInstance={taskInstance} /> )} diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx index f366057c193..2f5d1ed10d2 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx @@ -52,7 +52,7 @@ export const HITLResponse = () => { undefined, { enabled: !isNaN(parsedMapIndex), - refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false), + refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval, }, ); diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/logSelection.ts b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/logSelection.ts index 8c05efb8283..9d63f491270 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/logSelection.ts +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/logSelection.ts @@ -141,11 +141,9 @@ export const getBottomDragClampTarget = ({ const { lastRow } = boundary; const offset = lastRow.childNodes.length; - if (selection.focusNode === lastRow && selection.focusOffset === offset) { - return undefined; - } - - return { node: lastRow, offset }; + return selection.focusNode === lastRow && selection.focusOffset === offset + ? undefined + : { node: lastRow, offset }; }; /** @@ -160,11 +158,9 @@ export const mergePinnedIndexes = ( ): Array<number> => { const validPins = pinnedIndexes.filter((index) => index >= 0 && index < count); - if (validPins.length === 0) { - return defaultIndexes; - } - - return [...new Set([...validPins, ...defaultIndexes])].sort((first, second) => first - second); + return validPins.length === 0 + ? defaultIndexes + : [...new Set([...validPins, ...defaultIndexes])].sort((first, second) => first - second); }; /** diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/useLogGroups.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/useLogGroups.tsx index 1d0a68bcf65..01348946d1b 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/useLogGroups.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/useLogGroups.tsx @@ -96,11 +96,7 @@ export const useLogGroups = ({ const isGroupAncestryExpanded = (groupId: number): boolean => { const parentId = groupParentMap.get(groupId); - if (parentId === undefined) { - return true; - } - - return expandedGroups.has(parentId) && isGroupAncestryExpanded(parentId); + return parentId === undefined || (expandedGroups.has(parentId) && isGroupAncestryExpanded(parentId)); }; const isEntryVisible = (entry: ParsedLogEntry): boolean => { @@ -108,11 +104,9 @@ export const useLogGroups = ({ return true; } - if (entry.group.type === "header") { - return isGroupAncestryExpanded(entry.group.id); - } - - return expandedGroups.has(entry.group.id) && isGroupAncestryExpanded(entry.group.id); + return entry.group.type === "header" + ? isGroupAncestryExpanded(entry.group.id) + : expandedGroups.has(entry.group.id) && isGroupAncestryExpanded(entry.group.id); }; const items: Array<VisibleItem> = []; diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/utils.ts b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/utils.ts index e3040081940..ae2c97ca9ca 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/utils.ts +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/utils.ts @@ -114,11 +114,8 @@ export const getHighlightColor = ({ if (searchMatchIndices?.has(index)) { return "yellow.subtle"; } - if (hashIndex !== undefined && index === hashIndex) { - return "brand.emphasized"; - } - return "transparent"; + return hashIndex !== undefined && index === hashIndex ? "brand.emphasized" : "transparent"; }; /** @@ -152,11 +149,7 @@ export const splitBySearchQuery = (text: string, query: string): Array<Highlight segments.push({ highlight: false, text: text.slice(lastIndex) }); } - if (segments.length === 0) { - return [{ highlight: false, text }]; - } - - return segments; + return segments.length === 0 ? [{ highlight: false, text }] : segments; }; type VirtualizerInstance = Virtualizer<HTMLDivElement, Element>; @@ -196,10 +189,9 @@ export const scrollToBottom = ({ element, virtualizer }: ScrollToBottomOptions): * Used to pause following new log lines while the user is selecting text, so * auto-scrolling does not move the text out from under the cursor. */ -export const isSelectionWithin = (selection: Selection | null, container: HTMLElement | null): boolean => { - if (!selection || selection.isCollapsed || selection.rangeCount === 0 || !container) { - return false; - } - - return container.contains(selection.anchorNode) || container.contains(selection.focusNode); -}; +export const isSelectionWithin = (selection: Selection | null, container: HTMLElement | null): boolean => + selection !== null && + !selection.isCollapsed && + selection.rangeCount !== 0 && + container !== null && + (container.contains(selection.anchorNode) || container.contains(selection.focusNode)); diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx index df0c52d451a..f155fe9d84f 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx @@ -108,7 +108,7 @@ export const TaskInstance = () => { undefined, { enabled: !isNaN(parsedMapIndex), - refetchInterval: (query) => (isStatePending(query.state.data?.state) ? refetchInterval : false), + refetchInterval: (query) => isStatePending(query.state.data?.state) && refetchInterval, staleTime: 0, }, ); @@ -137,12 +137,12 @@ export const TaskInstance = () => { const { tabs: requiredActionTabs } = useRequiredActionTabs({ dagId, dagRunId: runId, taskId }, newTabs, { autoRedirect: true, - refetchInterval: isStatePending(taskInstance?.state) ? refetchInterval : false, + refetchInterval: isStatePending(taskInstance?.state) && refetchInterval, }); const { tabs: displayTabs } = useHITLReviewTabs({ dagId, dagRunId: runId, taskId }, requiredActionTabs, { mapIndex: parsedMapIndex, - refetchInterval: isStatePending(taskInstance?.state) ? refetchInterval : false, + refetchInterval: isStatePending(taskInstance?.state) && refetchInterval, }); return ( diff --git a/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStore.tsx b/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStore.tsx index b67dbd2aff9..811e2df8a39 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStore.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStore.tsx @@ -134,7 +134,7 @@ export const TaskStateStore = () => { taskId, }, undefined, - { refetchInterval: isStatePending(taskInstance?.state) ? refetchInterval : false }, + { refetchInterval: isStatePending(taskInstance?.state) && refetchInterval }, ); const columns = getColumns({ dagId, mapIndex, runId, taskId, translate }); diff --git a/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStoreModal.tsx b/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStoreModal.tsx index a25af40481d..40608e5ec55 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStoreModal.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskStateStore/TaskStateStoreModal.tsx @@ -125,11 +125,8 @@ export const TaskStateStoreModal = ({ if (expiresAt === "never") { return null; } - if (expiresAt === "custom") { - return dayjs.tz(customExpiresAt, selectedTimezone).toISOString(); - } - return "default"; + return expiresAt === "custom" ? dayjs.tz(customExpiresAt, selectedTimezone).toISOString() : "default"; }; const onSave = () => { diff --git a/airflow-core/src/airflow/ui/src/queries/useDagBundleRefetchInterval.ts b/airflow-core/src/airflow/ui/src/queries/useDagBundleRefetchInterval.ts index 62e9cd38bf3..569eb78f7b0 100644 --- a/airflow-core/src/airflow/ui/src/queries/useDagBundleRefetchInterval.ts +++ b/airflow-core/src/airflow/ui/src/queries/useDagBundleRefetchInterval.ts @@ -32,7 +32,9 @@ const MIN_REFETCH_INTERVAL_MS = 10_000; export const useDagBundleRefetchInterval = (): number | false => { const configuredInterval = useAutoRefresh({}); - return configuredInterval === false || configuredInterval === 0 - ? false - : Math.max(configuredInterval, MIN_REFETCH_INTERVAL_MS); + return ( + configuredInterval !== false && + configuredInterval !== 0 && + Math.max(configuredInterval, MIN_REFETCH_INTERVAL_MS) + ); }; diff --git a/airflow-core/src/airflow/ui/src/queries/useDagRunStateCounts.tsx b/airflow-core/src/airflow/ui/src/queries/useDagRunStateCounts.tsx index 4e51070b4d4..238f54cc563 100644 --- a/airflow-core/src/airflow/ui/src/queries/useDagRunStateCounts.tsx +++ b/airflow-core/src/airflow/ui/src/queries/useDagRunStateCounts.tsx @@ -41,7 +41,6 @@ export const useDagRunStateCounts = ({ return useDagServiceGetDagRunStateCountsUi({ dagIds: sortedDagIds }, undefined, { enabled: sortedDagIds.length > 0, placeholderData: (prev) => prev, - refetchInterval: - refetchInterval === false ? false : hasPendingRun ? refetchInterval : refetchInterval * 10, + refetchInterval: refetchInterval !== false && (hasPendingRun ? refetchInterval : refetchInterval * 10), }); }; diff --git a/airflow-core/src/airflow/ui/src/queries/useDags.tsx b/airflow-core/src/airflow/ui/src/queries/useDags.tsx index df0cd6de996..4ccf18ca4df 100644 --- a/airflow-core/src/airflow/ui/src/queries/useDags.tsx +++ b/airflow-core/src/airflow/ui/src/queries/useDags.tsx @@ -100,15 +100,14 @@ export const useDags = ({ // Filter changes swap the query key, which would otherwise drop the list to skeletons placeholderData: (prev) => prev, refetchInterval: (query) => - refetchInterval === false - ? false - : query.state.data?.dags.some( - (dag) => - dag.scheduling_state === "draining" || - (!dag.is_paused && dag.latest_dag_runs.some((dr) => isStatePending(dr.state))), - ) - ? refetchInterval - : refetchInterval * 10, + refetchInterval !== false && + (query.state.data?.dags.some( + (dag) => + dag.scheduling_state === "draining" || + (!dag.is_paused && dag.latest_dag_runs.some((dr) => isStatePending(dr.state))), + ) + ? refetchInterval + : refetchInterval * 10), }, ); diff --git a/airflow-core/src/airflow/ui/src/queries/useDeadlines.ts b/airflow-core/src/airflow/ui/src/queries/useDeadlines.ts index b0e7e98424e..48b21e752db 100644 --- a/airflow-core/src/airflow/ui/src/queries/useDeadlines.ts +++ b/airflow-core/src/airflow/ui/src/queries/useDeadlines.ts @@ -48,7 +48,7 @@ export const useDeadlines = ({ dagId, enabled, limit, offset = 0 }: UseDeadlines // Stop polling only when every deadline in the full result set is missed const allMissed = data.total_entries > 0 && data.deadlines.every((deadline) => deadline.missed); - return allMissed ? false : refetchInterval; + return !allMissed && refetchInterval; }, }, ); diff --git a/airflow-core/src/airflow/ui/src/queries/useLogs.tsx b/airflow-core/src/airflow/ui/src/queries/useLogs.tsx index 6e102a0f33b..2bf51a65e33 100644 --- a/airflow-core/src/airflow/ui/src/queries/useLogs.tsx +++ b/airflow-core/src/airflow/ui/src/queries/useLogs.tsx @@ -334,10 +334,9 @@ export const useLogs = ( { enabled: Boolean(taskInstance), refetchInterval: (query) => - isStatePending(taskInstance?.state) || - dayjs(query.state.dataUpdatedAt).isBefore(taskInstance?.end_date) - ? refetchInterval - : false, + (isStatePending(taskInstance?.state) || + dayjs(query.state.dataUpdatedAt).isBefore(taskInstance?.end_date)) && + refetchInterval, ...options, }, ); diff --git a/airflow-core/src/airflow/ui/src/queries/useParamStore.ts b/airflow-core/src/airflow/ui/src/queries/useParamStore.ts index 68b182b4ac9..38200ad76b5 100644 --- a/airflow-core/src/airflow/ui/src/queries/useParamStore.ts +++ b/airflow-core/src/airflow/ui/src/queries/useParamStore.ts @@ -120,11 +120,9 @@ const createParamStore = () => 2, ); - if (state.conf === newConf && JSON.stringify(state.paramsDict) === JSON.stringify(newParamsDict)) { - return {}; - } - - return { conf: newConf, paramsDict: newParamsDict }; + return state.conf === newConf && JSON.stringify(state.paramsDict) === JSON.stringify(newParamsDict) + ? {} + : { conf: newConf, paramsDict: newParamsDict }; }), })); diff --git a/airflow-core/src/airflow/ui/src/queries/useRefreshOnNewDagRuns.ts b/airflow-core/src/airflow/ui/src/queries/useRefreshOnNewDagRuns.ts index ac64acf6762..345e5e65812 100644 --- a/airflow-core/src/airflow/ui/src/queries/useRefreshOnNewDagRuns.ts +++ b/airflow-core/src/airflow/ui/src/queries/useRefreshOnNewDagRuns.ts @@ -43,7 +43,7 @@ export const useRefreshOnNewDagRuns = ( const { data: latestDagRun } = useDagServiceGetLatestRunInfo({ dagId }, undefined, { enabled: Boolean(dagId), - refetchInterval: Boolean(dagId) && !hasPendingRuns && !isPaused ? pollIntervalMs : false, + refetchInterval: Boolean(dagId) && !hasPendingRuns && !isPaused && pollIntervalMs, }); useEffect(() => { diff --git a/airflow-core/src/airflow/ui/src/queryClient.ts b/airflow-core/src/airflow/ui/src/queryClient.ts index fbe1638cd1b..1f8aef9929e 100644 --- a/airflow-core/src/airflow/ui/src/queryClient.ts +++ b/airflow-core/src/airflow/ui/src/queryClient.ts @@ -33,11 +33,9 @@ const retryFunction = (failureCount: number, error: unknown) => { const { status } = error as { status?: number }; // Do not retry for client errors (4xx). 429 should be eventually retried though. - if (status !== undefined && status >= 400 && status < 500 && status !== 429) { - return false; - } - - return failureCount < RETRY_COUNT; + return ( + (status === undefined || status < 400 || status >= 500 || status === 429) && failureCount < RETRY_COUNT + ); }; // Track active 403 toast to prevent duplicates when multiple mutations fail diff --git a/airflow-core/src/airflow/ui/src/system-components/Select/ValueText.tsx b/airflow-core/src/airflow/ui/src/system-components/Select/ValueText.tsx index 3466120a180..60bc1b57d70 100644 --- a/airflow-core/src/airflow/ui/src/system-components/Select/ValueText.tsx +++ b/airflow-core/src/airflow/ui/src/system-components/Select/ValueText.tsx @@ -40,11 +40,8 @@ export const ValueText = forwardRef<HTMLSpanElement, ValueTextProps>((props, ref if (children) { return children(items); } - if (items.length === 1) { - return select.collection.stringifyItem(items[0]); - } - return `${items.length} selected`; + return items.length === 1 ? select.collection.stringifyItem(items[0]) : `${items.length} selected`; }} </ChakraSelect.Context> </ChakraSelect.ValueText> diff --git a/airflow-core/src/airflow/ui/src/utils/datetimeUtils.ts b/airflow-core/src/airflow/ui/src/utils/datetimeUtils.ts index 1ed1f8f3b6f..245ec239236 100644 --- a/airflow-core/src/airflow/ui/src/utils/datetimeUtils.ts +++ b/airflow-core/src/airflow/ui/src/utils/datetimeUtils.ts @@ -200,11 +200,9 @@ const formatDuration = ( // Below a millisecond the digits are timestamp resolution and clock skew rather than signal. "<" // is mathematical notation, not prose, so CLDR has no pattern for it and none is needed. - if (seconds > 0 && seconds < 0.001) { - return `<${formatParts([{ unit: "millisecond", value: 1 }], locale, style)}`; - } - - return formatParts(getDurationParts(seconds), locale, style); + return seconds > 0 && seconds < 0.001 + ? `<${formatParts([{ unit: "millisecond", value: 1 }], locale, style)}` + : formatParts(getDurationParts(seconds), locale, style); }; /** @@ -231,16 +229,11 @@ const DURATION_TICK_STEPS_SECONDS = [ 604_800, ]; -export const getDurationTickStep = (maxSeconds: number, maxTicks = 8): number => { - if (!Number.isFinite(maxSeconds) || maxSeconds <= 0) { - return 1; - } - - return ( - DURATION_TICK_STEPS_SECONDS.find((candidate) => maxSeconds / candidate <= maxTicks) ?? - Math.ceil(maxSeconds / maxTicks) - ); -}; +export const getDurationTickStep = (maxSeconds: number, maxTicks = 8): number => + !Number.isFinite(maxSeconds) || maxSeconds <= 0 + ? 1 + : (DURATION_TICK_STEPS_SECONDS.find((candidate) => maxSeconds / candidate <= maxTicks) ?? + Math.ceil(maxSeconds / maxTicks)); /** Elapsed seconds between two timestamps, counting an absent `endDate` as still running. */ export const getElapsedSeconds = (startDate?: string | null, endDate?: string | null): number | undefined => { @@ -261,13 +254,10 @@ export const formatDate = ( date: number | string | null | undefined, timezone: string, format: string = DEFAULT_DATETIME_FORMAT, -) => { - if (date === null || date === undefined || !dayjs(date).isValid()) { - return dayjs().tz(timezone).format(format); - } - - return dayjs(date).tz(timezone).format(format); -}; +) => + date === null || date === undefined || !dayjs(date).isValid() + ? dayjs().tz(timezone).format(format) + : dayjs(date).tz(timezone).format(format); // Ordered largest first so the first unit the difference reaches wins: "45 minutes ago" rather than // "2700 seconds ago". Months and years use the mean Gregorian lengths CLDR assumes for relative diff --git a/airflow-core/src/airflow/ui/src/utils/jsonPreview.ts b/airflow-core/src/airflow/ui/src/utils/jsonPreview.ts index 53ace97a10c..3449bd7fef4 100644 --- a/airflow-core/src/airflow/ui/src/utils/jsonPreview.ts +++ b/airflow-core/src/airflow/ui/src/utils/jsonPreview.ts @@ -60,18 +60,14 @@ export const getJsonPreviewEntries = (content: object): Array<JsonPreviewEntry> // Items nested in an array have no key to identify them, so one badge each would read // `{…} {…} {…}`. Summarise the array as a whole instead. - if (!content.every((item: unknown) => isPrimitive(item))) { - return [{ id: "items", isComplex: true, itemCount: content.length, value: "[…]" }]; - } - - return content.map((item: unknown, index) => ({ id: String(index), ...formatValue(item) })); + return content.every((item: unknown) => isPrimitive(item)) + ? content.map((item: unknown, index) => ({ id: String(index), ...formatValue(item) })) + : [{ id: "items", isComplex: true, itemCount: content.length, value: "[…]" }]; } const entries = Object.entries(content); - if (entries.length === 0) { - return undefined; - } - - return entries.map(([key, value]) => ({ id: key, label: key, ...formatValue(value) })); + return entries.length === 0 + ? undefined + : entries.map(([key, value]) => ({ id: key, label: key, ...formatValue(value) })); }; diff --git a/airflow-core/src/airflow/ui/src/utils/links.ts b/airflow-core/src/airflow/ui/src/utils/links.ts index b2d96e93b2b..73646687daf 100644 --- a/airflow-core/src/airflow/ui/src/utils/links.ts +++ b/airflow-core/src/airflow/ui/src/utils/links.ts @@ -72,13 +72,11 @@ export const getTaskInstanceAdditionalPath = (pathname: string): string => { } // Include paths from children of pathless layout routes (e.g. StoragePage wrapping task-store and xcom) - if ("children" in route && Array.isArray(route.children)) { - return route.children - .filter((child) => "path" in child && typeof child.path === "string") - .map((child) => child.path); - } - - return []; + return "children" in route && Array.isArray(route.children) + ? route.children + .filter((child) => "path" in child && typeof child.path === "string") + .map((child) => child.path) + : []; }); // Look for patterns like /tasks/{taskId}/mapped/{mapIndex}/{sub-route} const mappedRegex = /\/tasks\/[^/]+\/mapped\/[^/]+\/(?<subRoute>.+)$/u; @@ -153,11 +151,7 @@ export const getSafeExternalUrl = (url: string): string | undefined => { return trimmed; } - if (SAFE_EXTERNAL_URL_SCHEMES.has(parsed.protocol)) { - return trimmed; - } - - return undefined; + return SAFE_EXTERNAL_URL_SCHEMES.has(parsed.protocol) ? trimmed : undefined; }; export const buildTaskInstanceUrl = (params: { diff --git a/airflow-core/src/airflow/ui/src/utils/logs.ts b/airflow-core/src/airflow/ui/src/utils/logs.ts index a35348bd771..989f1647b3d 100644 --- a/airflow-core/src/airflow/ui/src/utils/logs.ts +++ b/airflow-core/src/airflow/ui/src/utils/logs.ts @@ -76,9 +76,7 @@ export const parseStreamingLogContent = ( } // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (typeof data === "object" && data !== null) { - return [data] as unknown as TaskInstancesLogResponse["content"]; - } - - return []; + return typeof data === "object" && data !== null + ? ([data] as unknown as TaskInstancesLogResponse["content"]) + : []; }; diff --git a/airflow-core/src/airflow/ui/src/utils/pluginAppliesTo.ts b/airflow-core/src/airflow/ui/src/utils/pluginAppliesTo.ts index 5cad719f258..86fce62e4b3 100644 --- a/airflow-core/src/airflow/ui/src/utils/pluginAppliesTo.ts +++ b/airflow-core/src/airflow/ui/src/utils/pluginAppliesTo.ts @@ -85,13 +85,10 @@ const matchesOperators = ( const matchesOperatorNames = ( criteria: Array<string>, { task, taskInstance }: AppliesToContext, -): boolean | undefined => { - if (taskInstance !== undefined) { - return matchesAnyName(criteria, knownNames(taskInstance.operator_name)); - } - - return matchesAnyName(criteria, knownNames(task?.operator_name)); -}; +): boolean | undefined => + taskInstance === undefined + ? matchesAnyName(criteria, knownNames(task?.operator_name)) + : matchesAnyName(criteria, knownNames(taskInstance.operator_name)); /** * Decide whether a plugin view should be shown for the current route. @@ -127,10 +124,6 @@ export const matchesAppliesTo = (view: PluginView, context: AppliesToContext): b ].filter((verdict) => verdict !== undefined); // No criterion was evaluable (either none configured, or none judgeable here). - if (verdicts.length === 0) { - return true; - } - return verdicts.every(Boolean); }; diff --git a/airflow-core/src/airflow/ui/src/utils/query.ts b/airflow-core/src/airflow/ui/src/utils/query.ts index f0ef2c015db..f364fcab0de 100644 --- a/airflow-core/src/airflow/ui/src/utils/query.ts +++ b/airflow-core/src/airflow/ui/src/utils/query.ts @@ -67,12 +67,12 @@ export const useAutoRefresh = ({ }, ); - const pendingRuns = checkPendingRuns ? (dagRunData?.dag_runs ?? []).length >= 1 : true; + const pendingRuns = !checkPendingRuns || (dagRunData?.dag_runs ?? []).length >= 1; - const paused = Boolean(dagId) ? dag?.is_paused : false; + const paused = Boolean(dagId) && dag?.is_paused; const canRefresh = autoRefreshInterval !== undefined && !paused && pendingRuns; // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion - return (canRefresh ? autoRefreshInterval * 1000 : false) as number | false; + return (canRefresh && autoRefreshInterval * 1000) as number | false; }; diff --git a/airflow-core/src/airflow/ui/src/utils/tab.ts b/airflow-core/src/airflow/ui/src/utils/tab.ts index b9a1f4eb5ac..d0f28d1aff4 100644 --- a/airflow-core/src/airflow/ui/src/utils/tab.ts +++ b/airflow-core/src/airflow/ui/src/utils/tab.ts @@ -50,9 +50,5 @@ export const getTabPath = (matches: Array<RouteMatch>, entities: Array<TabEntity return ""; } - if (tabMatch.handle.tab === TabName.Overview) { - return ""; - } - - return `/${tabMatch.handle.tab}`; + return tabMatch.handle.tab === TabName.Overview ? "" : `/${tabMatch.handle.tab}`; }; diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/ConnectionsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/ConnectionsPage.ts index b107c99da4d..80e0eb1d559 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/ConnectionsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/ConnectionsPage.ts @@ -123,11 +123,7 @@ export class ConnectionsPage extends BasePage { public async connectionExists(connectionId: string): Promise<boolean> { const emptyState = await this.emptyState.isVisible({ timeout: 1000 }).catch(() => false); - if (emptyState) { - return false; - } - - return (await this.findConnectionRow(connectionId)) !== undefined; + return !emptyState && (await this.findConnectionRow(connectionId)) !== undefined; } public async createConnection(details: ConnectionDetails): Promise<void> { @@ -338,11 +334,9 @@ export class ConnectionsPage extends BasePage { return false; } - if (searchTerm === "") { - return ids.length > 0; - } - - return ids.every((id) => id.toLowerCase().includes(searchTerm.toLowerCase())); + return searchTerm === "" + ? ids.length > 0 + : ids.every((id) => id.toLowerCase().includes(searchTerm.toLowerCase())); }, { message: "Search results did not match search term", timeout: 30_000 }, ) @@ -365,11 +359,7 @@ export class ConnectionsPage extends BasePage { private async findConnectionRow(connectionId: string): Promise<Locator | undefined> { const hasSearch = await this.searchInput.isVisible({ timeout: 500 }).catch(() => false); - if (hasSearch) { - return await this.findConnectionRowUsingSearch(connectionId); - } - - return undefined; + return hasSearch ? await this.findConnectionRowUsingSearch(connectionId) : undefined; } private async findConnectionRowUsingSearch(connectionId: string): Promise<Locator | undefined> { @@ -385,11 +375,7 @@ export class ConnectionsPage extends BasePage { const rowExists = await row.isVisible({ timeout: 3000 }).catch(() => false); - if (!rowExists) { - return undefined; - } - - return row; + return rowExists ? row : undefined; } private async waitForConnectionsListLoad(): Promise<void> { diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts index 11dc5b6a50d..510ab7ac3a6 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/DagsPage.ts @@ -239,11 +239,9 @@ export class DagsPage extends BasePage { const cardList = this.page.locator('[data-testid="card-list"]'); const isCardView = await cardList.isVisible(); - if (isCardView) { - return this.page.locator('[data-testid="dag-id"]').count(); - } - - return this.page.getByTestId("table-list").locator(DATA_ROWS).count(); + return isCardView + ? this.page.locator('[data-testid="dag-id"]').count() + : this.page.getByTestId("table-list").locator(DATA_ROWS).count(); } public async getFilterOptions(filter: Locator): Promise<Array<string>> { diff --git a/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts b/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts index 2d1bc1382b2..492966b0fb0 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/pages/EventsPage.ts @@ -81,11 +81,7 @@ export class EventsPage extends BasePage { public async getEventLogRows(): Promise<Array<Locator>> { const count = await this.tableRows.count(); - if (count === 0) { - return []; - } - - return this.tableRows.all(); + return count === 0 ? [] : this.tableRows.all(); } public async getEventTypes(): Promise<Array<string>> { diff --git a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-tasks.spec.ts b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-tasks.spec.ts index 82b86da6e0d..d81a7997f51 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/specs/dag-tasks.spec.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/specs/dag-tasks.spec.ts @@ -74,9 +74,7 @@ test.describe("Dag Tasks Tab", () => { async () => { const texts = await dagsPage.taskRows.allTextContents(); - if (texts.length === 0) return false; - - return texts.every((text) => text.includes(operator)); + return texts.length > 0 && texts.every((text) => text.includes(operator)); }, { timeout: 20_000 }, ) @@ -110,9 +108,7 @@ test.describe("Dag Tasks Tab", () => { async () => { const texts = await dagsPage.taskRows.allTextContents(); - if (texts.length === 0) return false; - - return texts.every((text) => text.includes(rule)); + return texts.length > 0 && texts.every((text) => text.includes(rule)); }, { timeout: 20_000 }, ) diff --git a/airflow-core/src/airflow/ui/tests/e2e/utils/shared.ts b/airflow-core/src/airflow/ui/tests/e2e/utils/shared.ts index 37c44aed131..7094733be88 100644 --- a/airflow-core/src/airflow/ui/tests/e2e/utils/shared.ts +++ b/airflow-core/src/airflow/ui/tests/e2e/utils/shared.ts @@ -26,11 +26,7 @@ import { testConfig } from "playwright.config"; export type RequestLike = APIRequestContext | Page; export function getRequestContext(source: RequestLike): APIRequestContext { - if ("request" in source) { - return source.request; - } - - return source; + return "request" in source ? source.request : source; } export const { baseUrl } = testConfig.connection;
