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

pierrejeambrun 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 8fc77215ce4 AIP-38 TI and DagRun note rendering in headers (#45829)
8fc77215ce4 is described below

commit 8fc77215ce4caa71a55af07a8e8c2e8e84fc6838
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Wed Jan 22 00:46:20 2025 +0100

    AIP-38 TI and DagRun note rendering in headers (#45829)
---
 ...entationModal.tsx => DisplayMarkdownButton.tsx} | 29 ++++++++++++++--------
 airflow/ui/src/pages/Dag/Header.tsx                | 13 +++++++---
 airflow/ui/src/pages/Run/Header.tsx                | 24 ++++++++++--------
 airflow/ui/src/pages/Task/Header.tsx               | 12 +++++++--
 airflow/ui/src/pages/TaskInstance/Header.tsx       | 26 +++++++++++--------
 5 files changed, 67 insertions(+), 37 deletions(-)

diff --git a/airflow/ui/src/components/DocumentationModal.tsx 
b/airflow/ui/src/components/DisplayMarkdownButton.tsx
similarity index 72%
rename from airflow/ui/src/components/DocumentationModal.tsx
rename to airflow/ui/src/components/DisplayMarkdownButton.tsx
index 95ca9b83210..e844f25da64 100644
--- a/airflow/ui/src/components/DocumentationModal.tsx
+++ b/airflow/ui/src/components/DisplayMarkdownButton.tsx
@@ -16,31 +16,40 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Heading } from "@chakra-ui/react";
-import { useState } from "react";
-import { FiBookOpen } from "react-icons/fi";
+import { Box, Heading, VStack } from "@chakra-ui/react";
+import { type ReactElement, useState } from "react";
 
 import { Button, Dialog } from "src/components/ui";
 
 import ReactMarkdown from "./ReactMarkdown";
 
-const DocumentationModal = ({ docMd, docType }: { readonly docMd: string; 
readonly docType: string }) => {
+const DisplayMarkdownButton = ({
+  header,
+  icon,
+  mdContent,
+  text,
+}: {
+  readonly header: string;
+  readonly icon?: ReactElement;
+  readonly mdContent: string;
+  readonly text: string;
+}) => {
   const [isDocsOpen, setIsDocsOpen] = useState(false);
 
   return (
     <Box>
       <Button onClick={() => setIsDocsOpen(true)} variant="outline">
-        <FiBookOpen height={5} width={5} />
-        {docType} Docs
+        {icon}
+        {text}
       </Button>
       <Dialog.Root onOpenChange={() => setIsDocsOpen(false)} open={isDocsOpen} 
size="md">
         <Dialog.Content backdrop>
           <Dialog.Header bg="blue.muted">
-            <Heading size="xl">{docType} Documentation</Heading>
+            <Heading size="xl">{header}</Heading>
             <Dialog.CloseTrigger closeButtonProps={{ size: "xl" }} />
           </Dialog.Header>
-          <Dialog.Body display="flex">
-            <ReactMarkdown>{docMd}</ReactMarkdown>
+          <Dialog.Body alignItems="flex-start" as={VStack} gap="0">
+            <ReactMarkdown>{mdContent}</ReactMarkdown>
           </Dialog.Body>
         </Dialog.Content>
       </Dialog.Root>
@@ -48,4 +57,4 @@ const DocumentationModal = ({ docMd, docType }: { readonly 
docMd: string; readon
   );
 };
 
-export default DocumentationModal;
+export default DisplayMarkdownButton;
diff --git a/airflow/ui/src/pages/Dag/Header.tsx 
b/airflow/ui/src/pages/Dag/Header.tsx
index 36954a734c7..0c01513adb4 100644
--- a/airflow/ui/src/pages/Dag/Header.tsx
+++ b/airflow/ui/src/pages/Dag/Header.tsx
@@ -17,12 +17,12 @@
  * under the License.
  */
 import { Box, Flex, Heading, HStack, SimpleGrid, Text } from 
"@chakra-ui/react";
-import { FiCalendar } from "react-icons/fi";
+import { FiBookOpen, FiCalendar } from "react-icons/fi";
 
 import type { DAGDetailsResponse, DAGRunResponse } from 
"openapi/requests/types.gen";
 import { DagIcon } from "src/assets/DagIcon";
 import DagRunInfo from "src/components/DagRunInfo";
-import DocumentationModal from "src/components/DocumentationModal";
+import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
 import ParseDag from "src/components/ParseDag";
 import { Stat } from "src/components/Stat";
 import { TogglePause } from "src/components/TogglePause";
@@ -53,7 +53,14 @@ export const Header = ({
         <Flex>
           {dag ? (
             <HStack>
-              {dag.doc_md === null ? undefined : <DocumentationModal 
docMd={dag.doc_md} docType="Dag" />}
+              {dag.doc_md === null ? undefined : (
+                <DisplayMarkdownButton
+                  header="Dag Documentation"
+                  icon={<FiBookOpen />}
+                  mdContent={dag.doc_md}
+                  text="Dag Docs"
+                />
+              )}
               <ParseDag dagId={dag.dag_id} fileToken={dag.file_token} />
               <TriggerDAGButton dag={dag} />
             </HStack>
diff --git a/airflow/ui/src/pages/Run/Header.tsx 
b/airflow/ui/src/pages/Run/Header.tsx
index ec48591a0d7..4d2c899c31f 100644
--- a/airflow/ui/src/pages/Run/Header.tsx
+++ b/airflow/ui/src/pages/Run/Header.tsx
@@ -17,11 +17,11 @@
  * under the License.
  */
 import { Box, Flex, Heading, HStack, SimpleGrid, Text } from 
"@chakra-ui/react";
-import { FiBarChart } from "react-icons/fi";
-import { MdOutlineModeComment } from "react-icons/md";
+import { FiBarChart, FiMessageSquare } from "react-icons/fi";
 
 import type { DAGRunResponse } from "openapi/requests/types.gen";
 import { ClearRunButton } from "src/components/Clear";
+import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
 import { RunTypeIcon } from "src/components/RunTypeIcon";
 import { Stat } from "src/components/Stat";
 import Time from "src/components/Time";
@@ -42,16 +42,18 @@ export const Header = ({ dagRun }: { readonly dagRun: 
DAGRunResponse }) => (
           <div />
         </Flex>
       </HStack>
-      <ClearRunButton dagRun={dagRun} />
+      <HStack>
+        {dagRun.note === null || dagRun.note.length === 0 ? undefined : (
+          <DisplayMarkdownButton
+            header="Dag Run Note"
+            icon={<FiMessageSquare color="black" />}
+            mdContent={dagRun.note}
+            text="Note"
+          />
+        )}
+        <ClearRunButton dagRun={dagRun} />
+      </HStack>
     </Flex>
-    {dagRun.note === null || dagRun.note.length === 0 ? undefined : (
-      <Flex alignItems="flex-start" justifyContent="space-between" mr={16}>
-        <MdOutlineModeComment size="3rem" />
-        <Text fontSize="sm" ml={3}>
-          {dagRun.note}
-        </Text>
-      </Flex>
-    )}
     <SimpleGrid columns={4} gap={4}>
       <Stat label="Run Type">
         <HStack>
diff --git a/airflow/ui/src/pages/Task/Header.tsx 
b/airflow/ui/src/pages/Task/Header.tsx
index 89e12d0f19f..e0c4ee419ff 100644
--- a/airflow/ui/src/pages/Task/Header.tsx
+++ b/airflow/ui/src/pages/Task/Header.tsx
@@ -17,10 +17,11 @@
  * under the License.
  */
 import { Box, Flex, Heading, HStack, SimpleGrid, Text } from 
"@chakra-ui/react";
+import { FiBookOpen } from "react-icons/fi";
 
 import type { TaskResponse } from "openapi/requests/types.gen";
 import { TaskIcon } from "src/assets/TaskIcon";
-import DocumentationModal from "src/components/DocumentationModal";
+import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
 import { Stat } from "src/components/Stat";
 
 export const Header = ({ task }: { readonly task: TaskResponse }) => (
@@ -37,7 +38,14 @@ export const Header = ({ task }: { readonly task: 
TaskResponse }) => (
           <div />
         </Flex>
       </HStack>
-      {task.doc_md === null ? undefined : <DocumentationModal 
docMd={task.doc_md} docType="Task" />}
+      {task.doc_md === null ? undefined : (
+        <DisplayMarkdownButton
+          header="Task Documentation"
+          icon={<FiBookOpen />}
+          mdContent={task.doc_md}
+          text="Task Docs"
+        />
+      )}
     </Flex>
     <SimpleGrid columns={4} gap={4}>
       <Stat label="Operator">
diff --git a/airflow/ui/src/pages/TaskInstance/Header.tsx 
b/airflow/ui/src/pages/TaskInstance/Header.tsx
index f661c29cd41..a12c1454ae1 100644
--- a/airflow/ui/src/pages/TaskInstance/Header.tsx
+++ b/airflow/ui/src/pages/TaskInstance/Header.tsx
@@ -16,11 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Flex, Heading, HStack, SimpleGrid, Text } from 
"@chakra-ui/react";
-import { MdOutlineModeComment, MdOutlineTask } from "react-icons/md";
+import { Box, Flex, Heading, HStack, SimpleGrid } from "@chakra-ui/react";
+import { FiMessageSquare } from "react-icons/fi";
+import { MdOutlineTask } from "react-icons/md";
 
 import type { TaskInstanceResponse } from "openapi/requests/types.gen";
 import { ClearTaskInstanceButton } from "src/components/Clear";
+import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
 import { Stat } from "src/components/Stat";
 import Time from "src/components/Time";
 import { Status } from "src/components/ui";
@@ -40,16 +42,18 @@ export const Header = ({ taskInstance }: { readonly 
taskInstance: TaskInstanceRe
           <div />
         </Flex>
       </HStack>
-      <ClearTaskInstanceButton taskInstance={taskInstance} />
+      <HStack>
+        {taskInstance.note === null || taskInstance.note.length === 0 ? 
undefined : (
+          <DisplayMarkdownButton
+            header="Task Instance Note"
+            icon={<FiMessageSquare color="black" />}
+            mdContent={taskInstance.note}
+            text="Note"
+          />
+        )}
+        <ClearTaskInstanceButton taskInstance={taskInstance} />
+      </HStack>
     </Flex>
-    {taskInstance.note === null || taskInstance.note.length === 0 ? undefined 
: (
-      <Flex alignItems="flex-start" justifyContent="space-between" mr={16}>
-        <MdOutlineModeComment size="3rem" />
-        <Text fontSize="sm" ml={3}>
-          {taskInstance.note}
-        </Text>
-      </Flex>
-    )}
     <SimpleGrid columns={6} gap={4} my={2}>
       <Stat label="Operator">{taskInstance.operator}</Stat>
       {taskInstance.map_index > -1 ? (

Reply via email to