Skip to content
This repository was archived by the owner on Mar 31, 2026. It is now read-only.

Commit fc37a8d

Browse files
committed
feature: accordion logs close when format layout
1 parent deb814f commit fc37a8d

5 files changed

Lines changed: 56 additions & 20 deletions

File tree

packages/demo/pages/ui/+Page.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ export default function UI() {
119119

120120
const getTokenByclient = useCallback(async () => {
121121
const TOKEN =
122-
"Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg5QzAwNzc1RTlGNDhEQUZGN0QzQzZGMjBBNkZDQTdDN0FDMzNDQjIiLCJ4NXQiOiJpY0FIZGVuMGphXzMwOGJ5Q21fS2ZIckRQTEkiLCJ0eXAiOiJhdCtqd3QifQ.eyJpc3MiOiJodHRwczovL2F1dGgtc3RhdGlvbi1kZXYtc3RhZ2luZy5hZXZhdGFyLmFpLyIsImV4cCI6MTc2MTExNDQ1MCwiaWF0IjoxNzYwOTQxNjUxLCJhdWQiOiJBZXZhdGFyIiwic2NvcGUiOiJBZXZhdGFyIG9mZmxpbmVfYWNjZXNzIiwianRpIjoiNzVlNTAzNzQtMDAwYS00OWUzLWFlZDYtOGM0N2IwN2YzYzFjIiwic3ViIjoiNTdiYWIyMjAtOTVkZS1kNDYxLTFlODMtM2ExY2VlOGYwYzIzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWZ2b2ppIiwiZW1haWwiOiJhZnZvamlAc25hcG1haWwuY2MiLCJyb2xlIjpbImJhc2ljVXNlciIsIjgwNmQzY2M2LTI2OTMtYTg0NS05Y2FhLTNhMWNlZThmNDY2ZV9Pd25lciIsIjVhN2VkOTI0LTM4NWYtMDA2YS04OWU2LTNhMWNlZThmNDU1NV9Pd25lciJdLCJwaG9uZV9udW1iZXJfdmVyaWZpZWQiOiJGYWxzZSIsImVtYWlsX3ZlcmlmaWVkIjoiRmFsc2UiLCJ1bmlxdWVfbmFtZSI6ImFmdm9qaSIsInNlY3VyaXR5X3N0YW1wIjoiR1NCNE4ySUIyTElBWk5CRzUyM0tGNVo0T0YyUUo3WDIiLCJvaV9wcnN0IjoiQWV2YXRhckF1dGhTZXJ2ZXIiLCJvaV9hdV9pZCI6ImFlNzQ5Yzk4LTg0YzgtODFmMy1lZTkzLTNhMWNlZThmMGUxMiIsImNsaWVudF9pZCI6IkFldmF0YXJBdXRoU2VydmVyIiwib2lfdGtuX2lkIjoiZGY1MTBmMWQtZWQ2ZS1kZmE5LTZlOTYtM2ExZDEyN2EwZjE1In0.LQp9Exri0cOToeXWrf8_eRl7CwBw0bCk1Wt5ypfIF-G6V7dG96I7jvaSRGub_a1EtQAz3yOZvqGyt9Qq-vayyzNITnFm05a2Ry4fkjCM_n7LS1HwDo3CRkkLkv0CsDKhL2-XI-2dmDXw9CX552UyUVC3ouqNY1VOsVATX1h29ZqozxInWHzm2MIN_KqOBDrWe36M1j5jaT0ZcHRxgIB7rr3PCw-IxrIsaUJUidVL1vuMiqRFmdtfse8F1tveeZLl6LP9UnrEsbjYnhAdguNEudUETmt4_NxYfO6zOKGJnhxvAWFE34Q7BmVuGULg2RURgDOTsUyEemmC3QNz62POZw";
122+
"Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg5QzAwNzc1RTlGNDhEQUZGN0QzQzZGMjBBNkZDQTdDN0FDMzNDQjIiLCJ4NXQiOiJpY0FIZGVuMGphXzMwOGJ5Q21fS2ZIckRQTEkiLCJ0eXAiOiJhdCtqd3QifQ.eyJpc3MiOiJodHRwczovL2F1dGgtc3RhdGlvbi1kZXYtc3RhZ2luZy5hZXZhdGFyLmFpLyIsImV4cCI6MTc2MTgwNTk2MywiaWF0IjoxNzYxNjMzMTY0LCJhdWQiOiJBZXZhdGFyIiwic2NvcGUiOiJBZXZhdGFyIG9mZmxpbmVfYWNjZXNzIiwianRpIjoiNzA2N2VkZWYtMGIwZi00MDNlLTkyNTQtNDBlZTBjNjJiMTdjIiwic3ViIjoiNTdiYWIyMjAtOTVkZS1kNDYxLTFlODMtM2ExY2VlOGYwYzIzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWZ2b2ppIiwiZW1haWwiOiJhZnZvamlAc25hcG1haWwuY2MiLCJyb2xlIjpbImJhc2ljVXNlciIsIjgwNmQzY2M2LTI2OTMtYTg0NS05Y2FhLTNhMWNlZThmNDY2ZV9Pd25lciIsIjVhN2VkOTI0LTM4NWYtMDA2YS04OWU2LTNhMWNlZThmNDU1NV9Pd25lciJdLCJwaG9uZV9udW1iZXJfdmVyaWZpZWQiOiJGYWxzZSIsImVtYWlsX3ZlcmlmaWVkIjoiRmFsc2UiLCJ1bmlxdWVfbmFtZSI6ImFmdm9qaSIsInNlY3VyaXR5X3N0YW1wIjoiR1NCNE4ySUIyTElBWk5CRzUyM0tGNVo0T0YyUUo3WDIiLCJvaV9wcnN0IjoiQWV2YXRhckF1dGhTZXJ2ZXIiLCJvaV9hdV9pZCI6ImFlNzQ5Yzk4LTg0YzgtODFmMy1lZTkzLTNhMWNlZThmMGUxMiIsImNsaWVudF9pZCI6IkFldmF0YXJBdXRoU2VydmVyIiwib2lfdGtuX2lkIjoiNmRiNTQ2ZjQtZWE0My0wZDQyLTI5N2MtM2ExZDNiYjFiNGM3In0.Oe866mgfN96JSxM45iMa62dNosvYECMPSllj1cFPoC0DOxgNXZH9dFi77_fmAQAZgelHLFXHu8qy2NHEq-kKW22tQcbAvGxSQhnWgjAZ1xlWUTAp3kRybVJNNOlFm5G2EvLzTcTE9NhDf5Vm0_PQ3IgEFWxOdNwSM_11zCLLzesJeu6Yaz5ikFR2OVICbLPoYjSP0mK04edjFX0WVeZ-u19b-yfXXD4io3m2P-zztLL2McD42RLWR58qtEcEK-5qne5va6RU16qJyUjOWI1rtTzaVKPdJ_IkQaLRANSw6ch8VxNVO1mxyhzjdz4P6SWsXrhnoR7HQAnNA3phtim6bw";
123123
aevatarAI.fetchRequest.setHeaders({
124124
Authorization: TOKEN,
125125
});
@@ -268,12 +268,6 @@ export default function UI() {
268268
setStage(undefined);
269269
}}
270270
editWorkflow={editWorkflow}
271-
onDuplicateWorkflow={async (workflow) => {
272-
setStage(undefined);
273-
await sleep(1000);
274-
setEditWorkflow(workflow);
275-
onShowWorkflow();
276-
}}
277271
/>
278272
</FullScreen>
279273
)}

packages/ui-react/src/components/AevatarItem4Workflow/AccordionLogs.tsx

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ import Loading from "../../assets/svg/loading.svg?react";
1111
import clsx from "clsx";
1212
import ToCopy from "../Copy";
1313
import { Copy } from "lucide-react";
14+
import { useState, forwardRef, useImperativeHandle } from "react";
15+
16+
export interface AccordionLogsRef {
17+
setOpen: (open: boolean) => void;
18+
}
1419

1520
// Helper function to format object keys for preview
1621
const formatObjectPreview = (
@@ -139,16 +144,28 @@ const renderDataContent = (data: unknown) => {
139144
);
140145
};
141146

142-
export default function AccordionLogs({
143-
agentLogs,
144-
onShowLogsDialog,
145-
}: {
147+
interface AccordionLogsProps {
146148
agentLogs: ExecutionLogItem;
147149
onShowLogsDialog: (e: React.MouseEvent<HTMLDivElement>) => void;
148-
}) {
150+
}
151+
152+
const AccordionLogs = forwardRef<AccordionLogsRef, AccordionLogsProps>(({
153+
agentLogs,
154+
onShowLogsDialog,
155+
}, ref) => {
156+
const [open, setOpen] = useState(false);
157+
158+
useImperativeHandle(ref, () => ({
159+
setOpen,
160+
}), []);
161+
162+
const handleOpenChange = (value: string) => {
163+
setOpen(value === "item-1");
164+
};
165+
149166
return (
150167
<div className="sdk:absolute sdk:top-0 sdk:left-0 sdk:w-full sdk:h-full">
151-
<Accordion type="single" collapsible>
168+
<Accordion type="single" value={open ? "item-1" : ""} onValueChange={handleOpenChange} collapsible>
152169
<AccordionItem value="item-1">
153170
<AccordionTrigger>
154171
<div className="sdk:flex sdk:items-center sdk:gap-[6px]">
@@ -262,4 +279,8 @@ export default function AccordionLogs({
262279
</Accordion>
263280
</div>
264281
);
265-
}
282+
});
283+
284+
AccordionLogs.displayName = "AccordionLogs";
285+
286+
export default AccordionLogs;

packages/ui-react/src/components/AevatarItem4Workflow/AevatarCardInner.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ import type { IAgentInfoDetail } from "@aevatar-react-sdk/services";
22

33
import Hypotenuse from "../../assets/svg/hypotenuse.svg?react";
44
import "./index.css";
5-
import { useCallback, useMemo, useState } from "react";
5+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
66
import { jsonSchemaParse } from "../../utils/jsonSchemaParse";
77
import type { JSONSchemaType } from "../types";
88
import clsx from "clsx";
99
import type { TNodeDataClick } from "../Workflow/types";
1010
import HoverMenu from "./HoverMenu";
1111
import type { ExecutionLogItem } from "@aevatar-react-sdk/types";
12-
import AccordionLogs from "./AccordionLogs";
12+
import AccordionLogs, { type AccordionLogsRef } from "./AccordionLogs";
1313
import { ChevronDown } from "lucide-react";
14+
import { eventBus } from "@aevatar-react-sdk/utils";
1415
export interface IAevatarCardInnerProps {
1516
className?: string;
1617
isNew?: boolean;
@@ -55,7 +56,16 @@ export default function AevatarCardInner({
5556
);
5657

5758
const [showMore, setShowMore] = useState(true);
58-
59+
const accordionLogsRef = useRef<AccordionLogsRef>(null);
60+
useEffect(() => {
61+
const listener = () => {
62+
accordionLogsRef.current?.setOpen(false);
63+
};
64+
eventBus.addListener("formatLayout", listener);
65+
return () => {
66+
eventBus.removeListener("formatLayout", listener);
67+
};
68+
}, []);
5969
return (
6070
<div className="sdk:w-[234px]">
6171
{/* biome-ignore lint/a11y/useKeyWithClickEvents: <explanation> */}
@@ -250,6 +260,7 @@ export default function AevatarCardInner({
250260
<div className="sdk:relative ">
251261
{agentLogs && (
252262
<AccordionLogs
263+
ref={accordionLogsRef}
253264
agentLogs={agentLogs}
254265
onShowLogsDialog={onShowLogsDialog}
255266
/>

packages/ui-react/src/components/Workflow/index.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ import {
4949
import { getPropertiesByDefaultValues } from "../../utils/jsonSchemaParse";
5050
import { applyHorizontalLayout } from "./layoutUtils";
5151
import { LayoutDashboard } from "lucide-react";
52-
import { WORKFLOW_NODE_HEIGHT, WORKFLOW_NODE_WIDTH } from "../../constants/workflow";
52+
import {
53+
WORKFLOW_NODE_HEIGHT,
54+
WORKFLOW_NODE_WIDTH,
55+
} from "../../constants/workflow";
5356

5457
const getId = () => `${uuidv4()}`;
5558

@@ -92,6 +95,7 @@ interface IProps {
9295
extraControlBar?: React.ReactNode;
9396
onUndoAction?: () => void;
9497
onRedoAction?: () => void;
98+
onFormatLayout?: () => void;
9599
}
96100

97101
export interface IWorkflowInstance {
@@ -123,6 +127,7 @@ export const Workflow = forwardRef(
123127
gaevatarTypeList,
124128
onUndoAction,
125129
onRedoAction,
130+
onFormatLayout,
126131
}: IProps,
127132
ref
128133
) => {
@@ -669,7 +674,8 @@ export const Workflow = forwardRef(
669674
setNodes(layoutedNodes);
670675
setEdges(layoutedEdges);
671676
fitView(fitViewOptions);
672-
}, [nodes, edges, setNodes, fitView, setEdges]);
677+
onFormatLayout?.();
678+
}, [nodes, edges, setNodes, fitView, setEdges, onFormatLayout]);
673679

674680
return (
675681
<div

packages/ui-react/src/components/WorkflowConfiguration/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import type {
2424
IWorkflowViewDataParams,
2525
} from "@aevatar-react-sdk/services";
2626
import type { IWorkflowAevatarEditProps } from "../WorkflowAevatarEdit";
27-
import { sleep } from "@aevatar-react-sdk/utils";
27+
import { eventBus, sleep } from "@aevatar-react-sdk/utils";
2828
import { aevatarAI } from "../../utils";
2929
import { useToast } from "../../hooks/use-toast";
3030
import type { INode } from "../Workflow/types";
@@ -746,6 +746,9 @@ IWorkflowConfigurationProps) => {
746746
},
747747
[getWorkflowViewData, onDuplicateWorkflow]
748748
);
749+
const onFormatLayout = useCallback(() => {
750+
eventBus.emit("formatLayout");
751+
}, []);
749752

750753
return (
751754
<>
@@ -830,6 +833,7 @@ IWorkflowConfigurationProps) => {
830833
onRedoAction={() => {
831834
setEditAgentOpen(undefined);
832835
}}
836+
onFormatLayout={onFormatLayout}
833837
/>
834838
<Dialog
835839
open={Boolean(editAgentOpen)}

0 commit comments

Comments
 (0)