Skip to content

Commit 251bacf

Browse files
AIP-38 Show bundle version and bundle URL in code tab (apache#47442)
1 parent c440959 commit 251bacf

File tree

4 files changed

+53
-15
lines changed

4 files changed

+53
-15
lines changed

airflow/ui/src/components/DagVersionSelect.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ const DagVersionSelect = ({ disabled = false }: { readonly disabled?: boolean })
8585
onChange={handleStateChange}
8686
placeholder="Dag Version"
8787
value={
88-
selectedVersion === undefined ? undefined : { label: `v${selectedVersion}`, value: selectedVersion }
88+
selectedVersion === undefined
89+
? undefined
90+
: { label: `v${selectedVersion}`, value: selectedVersion.toString() }
8991
}
9092
/>
9193
</Field.Root>

airflow/ui/src/hooks/useSelectedVersion.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
} from "openapi/queries";
2727
import { SearchParamsKeys } from "src/constants/searchParams";
2828

29-
const useSelectedVersion = (): string | undefined => {
29+
const useSelectedVersion = (): number | undefined => {
3030
const [searchParams] = useSearchParams();
3131

3232
const selectedVersionUrl = searchParams.get(SearchParamsKeys.VERSION_NUMBER);
@@ -72,12 +72,12 @@ const useSelectedVersion = (): string | undefined => {
7272
);
7373

7474
const selectedVersionNumber =
75-
selectedVersionUrl ??
75+
(selectedVersionUrl === null ? undefined : parseInt(selectedVersionUrl, 10)) ??
7676
mappedTaskInstanceData?.dag_version?.version_number ??
7777
runData?.dag_versions.at(-1)?.version_number ??
7878
dagData?.latest_dag_version?.version_number;
7979

80-
return selectedVersionNumber?.toString();
80+
return selectedVersionNumber;
8181
};
8282

8383
export default useSelectedVersion;

airflow/ui/src/layouts/Details/Graph/Graph.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,11 @@ export const Graph = () => {
9595
const [dependencies] = useLocalStorage<"all" | "immediate" | "tasks">(`dependencies-${dagId}`, "immediate");
9696

9797
const selectedColor = colorMode === "dark" ? selectedDarkColor : selectedLightColor;
98-
const versionNumber = selectedVersion === undefined ? undefined : parseInt(selectedVersion, 10);
9998

10099
const { data: graphData = { arrange: "LR", edges: [], nodes: [] } } = useStructureServiceStructureData({
101100
dagId,
102101
externalDependencies: dependencies === "immediate",
103-
versionNumber,
102+
versionNumber: selectedVersion,
104103
});
105104

106105
const { data: dagDependencies = { edges: [], nodes: [] } } = useDependenciesServiceGetDependencies(
@@ -122,7 +121,7 @@ export const Graph = () => {
122121
)
123122
: graphData.nodes,
124123
openGroupIds: [...openGroupIds, ...(dependencies === "all" ? [`dag:${dagId}`] : [])],
125-
versionNumber,
124+
versionNumber: selectedVersion,
126125
});
127126

128127
const { data: gridData } = useGridServiceGridData(

airflow/ui/src/pages/Dag/Code/Code.tsx

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
import { Box, Button, Heading, HStack } from "@chakra-ui/react";
19+
import { Box, Button, Heading, HStack, Link } from "@chakra-ui/react";
2020
import { useState } from "react";
2121
import { useParams } from "react-router-dom";
2222
import { createElement, PrismLight as SyntaxHighlighter } from "react-syntax-highlighter";
2323
import python from "react-syntax-highlighter/dist/esm/languages/prism/python";
2424
import { oneLight, oneDark } from "react-syntax-highlighter/dist/esm/styles/prism";
2525

26-
import { useDagServiceGetDagDetails, useDagSourceServiceGetDagSource } from "openapi/queries";
26+
import {
27+
useDagServiceGetDagDetails,
28+
useDagSourceServiceGetDagSource,
29+
useDagVersionServiceGetDagVersion,
30+
} from "openapi/queries";
2731
import DagVersionSelect from "src/components/DagVersionSelect";
2832
import { ErrorAlert } from "src/components/ErrorAlert";
2933
import Time from "src/components/Time";
@@ -47,13 +51,22 @@ export const Code = () => {
4751
dagId: dagId ?? "",
4852
});
4953

54+
const { data: dagVersion } = useDagVersionServiceGetDagVersion(
55+
{
56+
dagId: dagId ?? "",
57+
versionNumber: selectedVersion ?? 1,
58+
},
59+
undefined,
60+
{ enabled: dag !== undefined && selectedVersion !== undefined },
61+
);
62+
5063
const {
5164
data: code,
5265
error: codeError,
5366
isLoading: isCodeLoading,
5467
} = useDagSourceServiceGetDagSource({
5568
dagId: dagId ?? "",
56-
versionNumber: selectedVersion === undefined ? undefined : parseInt(selectedVersion, 10),
69+
versionNumber: selectedVersion,
5770
});
5871

5972
const defaultWrap = Boolean(useConfig("default_wrap"));
@@ -73,11 +86,35 @@ export const Code = () => {
7386
return (
7487
<Box>
7588
<HStack justifyContent="space-between" mt={2}>
76-
{dag?.last_parsed_time !== undefined && (
77-
<Heading as="h4" fontSize="14px" size="md">
78-
Parsed at: <Time datetime={dag.last_parsed_time} />
79-
</Heading>
80-
)}
89+
<HStack gap={5}>
90+
{dag?.last_parsed_time !== undefined && (
91+
<Heading as="h4" fontSize="14px" size="md">
92+
Parsed at: <Time datetime={dag.last_parsed_time} />
93+
</Heading>
94+
)}
95+
96+
{
97+
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain
98+
dagVersion !== undefined && dagVersion.bundle_version !== null ? (
99+
<Heading as="h4" fontSize="14px" size="md" wordBreak="break-word">
100+
Bundle Version:{" "}
101+
{dagVersion.bundle_url === null ? (
102+
dagVersion.bundle_version
103+
) : (
104+
<Link
105+
aria-label="Bundle Url"
106+
color="fg.info"
107+
href={dagVersion.bundle_url}
108+
rel="noopener noreferrer"
109+
target="_blank"
110+
>
111+
{dagVersion.bundle_version}
112+
</Link>
113+
)}
114+
</Heading>
115+
) : undefined
116+
}
117+
</HStack>
81118
<HStack>
82119
<DagVersionSelect />
83120
<Button aria-label={wrap ? "Unwrap" : "Wrap"} bg="bg.panel" onClick={toggleWrap} variant="outline">

0 commit comments

Comments
 (0)