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 9c96500c401 UI: Add Expand/Collapse all to XComs page (#56083)
9c96500c401 is described below

commit 9c96500c4014c4460c97a48a23b342a33ab5eee8
Author: Kavya Katal <[email protected]>
AuthorDate: Wed Oct 1 15:28:54 2025 +0530

    UI: Add Expand/Collapse all to XComs page (#56083)
    
    * UI: Add Expand/Collapse all to XComs page
    
    * Restored few changes
    
    * Fixing lint issue
    
    * Made suggested Changes
---
 .../src/airflow/ui/src/pages/XCom/XCom.tsx         | 30 ++++++++++++++++++----
 .../src/airflow/ui/src/pages/XCom/XComEntry.tsx    |  9 +++++--
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx 
b/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx
index 1609e1961da..68f3fa7f4df 100644
--- a/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/XCom/XCom.tsx
@@ -16,9 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Heading, Link } from "@chakra-ui/react";
+import { Box, Heading, Link, Flex, ButtonGroup, IconButton, useDisclosure } 
from "@chakra-ui/react";
 import type { ColumnDef } from "@tanstack/react-table";
 import { useTranslation } from "react-i18next";
+import { MdCompress, MdExpand } from "react-icons/md";
 import { Link as RouterLink, useParams, useSearchParams } from 
"react-router-dom";
 
 import { useXcomServiceGetXcomEntries } from "openapi/queries";
@@ -41,7 +42,7 @@ const {
   TASK_ID_PATTERN: TASK_ID_PATTERN_PARAM,
 }: SearchParamsKeysType = SearchParamsKeys;
 
-const columns = (translate: (key: string) => string): 
Array<ColumnDef<XComResponse>> => [
+const columns = (translate: (key: string) => string, open: boolean): 
Array<ColumnDef<XComResponse>> => [
   {
     accessorKey: "key",
     enableSorting: false,
@@ -98,6 +99,7 @@ const columns = (translate: (key: string) => string): 
Array<ColumnDef<XComRespon
       <XComEntry
         dagId={original.dag_id}
         mapIndex={original.map_index}
+        open={open}
         runId={original.run_id}
         taskId={original.task_id}
         xcomKey={original.key}
@@ -114,6 +116,7 @@ export const XCom = () => {
   const { setTableURLState, tableURLState } = useTableURLState();
   const { pagination } = tableURLState;
   const [searchParams] = useSearchParams();
+  const { onClose, onOpen, open } = useDisclosure();
 
   const filteredKey = searchParams.get(KEY_PATTERN_PARAM);
   const filteredDagDisplayName = 
searchParams.get(DAG_DISPLAY_NAME_PATTERN_PARAM);
@@ -122,7 +125,6 @@ export const XCom = () => {
   const filteredTaskId = searchParams.get(TASK_ID_PATTERN_PARAM);
 
   const { LOGICAL_DATE_GTE, LOGICAL_DATE_LTE, RUN_AFTER_GTE, RUN_AFTER_LTE } = 
SearchParamsKeys;
-
   const logicalDateGte = searchParams.get(LOGICAL_DATE_GTE);
   const logicalDateLte = searchParams.get(LOGICAL_DATE_LTE);
   const runAfterGte = searchParams.get(RUN_AFTER_GTE);
@@ -158,11 +160,29 @@ export const XCom = () => {
         <Heading size="md">{translate("xcom.title")}</Heading>
       ) : undefined}
 
-      <XComFilters />
+      <Flex alignItems="center" justifyContent="space-between">
+        <XComFilters />
+        <ButtonGroup attached mt="1" size="sm" variant="surface">
+          <IconButton
+            aria-label={translate("auditLog.actions.expandAllExtra")}
+            onClick={onOpen}
+            title={translate("auditLog.actions.expandAllExtra")}
+          >
+            <MdExpand />
+          </IconButton>
+          <IconButton
+            aria-label={translate("auditLog.actions.collapseAllExtra")}
+            onClick={onClose}
+            title={translate("auditLog.actions.collapseAllExtra")}
+          >
+            <MdCompress />
+          </IconButton>
+        </ButtonGroup>
+      </Flex>
 
       <ErrorAlert error={error} />
       <DataTable
-        columns={columns(translate)}
+        columns={columns(translate, open)}
         data={data ? data.xcom_entries : []}
         displayMode="table"
         initialState={tableURLState}
diff --git a/airflow-core/src/airflow/ui/src/pages/XCom/XComEntry.tsx 
b/airflow-core/src/airflow/ui/src/pages/XCom/XComEntry.tsx
index 05fbd4c2c1a..b1829b44625 100644
--- a/airflow-core/src/airflow/ui/src/pages/XCom/XComEntry.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/XCom/XComEntry.tsx
@@ -27,6 +27,7 @@ import { urlRegex } from "src/constants/urlRegex";
 type XComEntryProps = {
   readonly dagId: string;
   readonly mapIndex: number;
+  readonly open?: boolean;
   readonly runId: string;
   readonly taskId: string;
   readonly xcomKey: string;
@@ -62,7 +63,7 @@ const renderTextWithLinks = (text: string) => {
   );
 };
 
-export const XComEntry = ({ dagId, mapIndex, runId, taskId, xcomKey }: 
XComEntryProps) => {
+export const XComEntry = ({ dagId, mapIndex, open = false, runId, taskId, 
xcomKey }: XComEntryProps) => {
   const { data, isLoading } = useXcomServiceGetXcomEntry<XComResponseNative>({
     dagId,
     dagRunId: runId,
@@ -88,7 +89,11 @@ export const XComEntry = ({ dagId, mapIndex, runId, taskId, 
xcomKey }: XComEntry
   ) : (
     <HStack>
       {isObjectOrArray ? (
-        <RenderedJsonField content={xcomValue as object} 
enableClipboard={false} />
+        <RenderedJsonField
+          content={xcomValue as object}
+          enableClipboard={false}
+          jsonProps={{ collapsed: !open }}
+        />
       ) : (
         <Text>{renderTextWithLinks(valueFormatted)}</Text>
       )}

Reply via email to