diff --git a/src/components/__tests__/GenerationComposer.test.tsx b/src/components/__tests__/GenerationComposer.test.tsx index 64982da0..ce2edb0b 100644 --- a/src/components/__tests__/GenerationComposer.test.tsx +++ b/src/components/__tests__/GenerationComposer.test.tsx @@ -322,6 +322,16 @@ describe("GenerationComposer", () => { expect(screen.getByDisplayValue("visible prompt")).toBeInTheDocument(); }); + it("expands the collapsed composer when clicking the summary content", () => { + useWorkflowStore.setState({ nodes: [imageNode("img-1", true, { inputPrompt: "visible prompt" })] }); + render(); + + fireEvent.click(screen.getByLabelText("Collapse composer")); + fireEvent.click(screen.getByText("visible prompt")); + + expect(screen.getByDisplayValue("visible prompt")).toBeInTheDocument(); + }); + it("uses the video model filter and reruns the selected video node", async () => { useWorkflowStore.setState({ nodes: [videoNode("vid-1", true)] }); render(); diff --git a/src/components/composer/GenerationComposer.tsx b/src/components/composer/GenerationComposer.tsx index 9f299364..f8f054f4 100644 --- a/src/components/composer/GenerationComposer.tsx +++ b/src/components/composer/GenerationComposer.tsx @@ -8,6 +8,7 @@ import { useState, type ChangeEvent, type FocusEvent, + type MouseEvent, type ReactNode, } from "react"; import { useReactFlow } from "@xyflow/react"; @@ -926,6 +927,19 @@ export function GenerationComposer() { setIsComposerCollapsed((current) => !current); }, [flushCurrentDraft, isComposerCollapsed]); + const expandComposer = useCallback(() => { + setIsComposerCollapsed(false); + }, []); + + const handleCollapsedComposerClick = useCallback( + (event: MouseEvent) => { + const target = event.target instanceof Element ? event.target : null; + if (target?.closest("button,a,input,textarea,select,[role='button']")) return; + expandComposer(); + }, + [expandComposer] + ); + const collapsedStatus = useMemo(() => { if (isEaseCurveNode) { return (connectedInputs?.videos.length ?? 0) >= 1 @@ -970,36 +984,36 @@ export function GenerationComposer() { className="hidden" /> {isComposerCollapsed ? ( - - - + + + {modeLabel} {isProcessNode ? ( {collapsedStatus} ) : ( - canChooseModel && setModelDialogOpen(true)} - disabled={!canChooseModel} - aria-label={t("composer.selectModel")} - className="min-w-0 truncate rounded-md text-left text-sm text-neutral-100 transition-colors hover:text-cyan-200 disabled:text-neutral-500" - title={t("composer.selectModelTitle", { model: getComposerModelLabel(draft.selectedModel) })} + {getComposerModelLabel(draft.selectedModel)} - + )} - + {!isProcessNode && ( - + {collapsedStatus} - + )} - +