diff --git a/.changeset/fn-8031-planning-summary-markdown.md b/.changeset/fn-8031-planning-summary-markdown.md new file mode 100644 index 0000000000..876bc276b7 --- /dev/null +++ b/.changeset/fn-8031-planning-summary-markdown.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Planning summary description now renders formatted markdown by default. +category: feature +dev: Initializes the Planning summary renderMarkdown state to true. diff --git a/packages/dashboard/app/components/PlanningModeModal.tsx b/packages/dashboard/app/components/PlanningModeModal.tsx index c5dd01378d..a7bb9965d8 100644 --- a/packages/dashboard/app/components/PlanningModeModal.tsx +++ b/packages/dashboard/app/components/PlanningModeModal.tsx @@ -3018,7 +3018,11 @@ function SummaryView({ const { t } = useTranslation("app"); const summary = normalizePlanningSummary(rawSummary); const [isExpanded, setIsExpanded] = useState(false); - const [renderMarkdown, setRenderMarkdown] = useState(false); + /* + FNXC:PlanningSummaryDescription 2026-07-15-12:00: + Planning summaries must show formatted Markdown on first display. The existing toggle switches to raw Plain text for editing and back to the preview. + */ + const [renderMarkdown, setRenderMarkdown] = useState(true); const [selectedDependencies, setSelectedDependencies] = useState( summary.suggestedDependencies ); diff --git a/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx b/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx index 38abe9014a..10300589a0 100644 --- a/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx +++ b/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx @@ -977,8 +977,17 @@ describe("PlanningModeModal", () => { it("toggles description between plain textarea and formatted markdown preview", async () => { const { container } = await renderPlanningSummary("## Heading\n\n- item\n\n**bold**"); - expect(container.querySelector(".planning-textarea")).not.toBeNull(); - expect(container.querySelector(".planning-description-preview")).toBeNull(); + expect(container.querySelector(".planning-description-preview")).not.toBeNull(); + expect(container.querySelector(".planning-textarea")).toBeNull(); + expect(screen.getByRole("heading", { level: 2, name: "Heading" })).toBeDefined(); + expect(container.querySelector("strong")?.textContent).toBe("bold"); + + fireEvent.click(screen.getByTestId("planning-description-markdown-toggle")); + + await waitFor(() => { + expect(container.querySelector(".planning-textarea")).not.toBeNull(); + expect(container.querySelector(".planning-description-preview")).toBeNull(); + }); fireEvent.click(screen.getByTestId("planning-description-markdown-toggle")); @@ -987,12 +996,6 @@ describe("PlanningModeModal", () => { expect(screen.getByRole("heading", { level: 2, name: "Heading" })).toBeDefined(); expect(container.querySelector("strong")?.textContent).toBe("bold"); }); - - fireEvent.click(screen.getByTestId("planning-description-markdown-toggle")); - - await waitFor(() => { - expect(container.querySelector(".planning-textarea")).not.toBeNull(); - }); }); it.each([ @@ -1002,6 +1005,7 @@ describe("PlanningModeModal", () => { mockViewport(viewport); const user = userEvent.setup(); await renderPlanningSummary("Generated summary with existing words"); + fireEvent.click(screen.getByTestId("planning-description-markdown-toggle")); const textarea = screen.getByLabelText("Description") as HTMLTextAreaElement; textarea.focus(); @@ -1028,6 +1032,11 @@ describe("PlanningModeModal", () => { expect(markdownToggle.closest("label")).toBeNull(); expect(expandButton.closest("label")).toBeNull(); + expect(container.querySelector(".planning-description-preview")).not.toBeNull(); + expect(container.querySelector(".planning-textarea")).toBeNull(); + + fireEvent.click(markdownToggle); + const textarea = container.querySelector(".planning-textarea"); expect(textarea).not.toBeNull(); expect(textarea?.classList.contains("expanded")).toBe(false);