From d1a388a3f3e57c82701cbb797733ba57ddf1e47a Mon Sep 17 00:00:00 2001 From: Dotta Date: Fri, 24 Apr 2026 08:20:04 -0500 Subject: [PATCH] PAP-2118 address greptile markdown followups Co-Authored-By: Paperclip --- ui/src/components/InlineEditor.test.tsx | 17 +++++++++++++++++ ui/src/components/InlineEditor.tsx | 2 ++ ui/src/components/MarkdownBody.test.tsx | 8 ++++++++ ui/src/lib/issue-reference.ts | 2 +- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/ui/src/components/InlineEditor.test.tsx b/ui/src/components/InlineEditor.test.tsx index f41a31cc690..5977733d141 100644 --- a/ui/src/components/InlineEditor.test.tsx +++ b/ui/src/components/InlineEditor.test.tsx @@ -207,6 +207,23 @@ describe("InlineEditor", () => { }); }); + it("marks multiline preview textboxes as multiline", () => { + const onSave = vi.fn().mockResolvedValue(undefined); + const root = createRoot(container); + + act(() => { + root.render(); + }); + + const preview = container.querySelector('[role="textbox"]'); + expect(preview).not.toBeNull(); + expect(preview?.getAttribute("aria-multiline")).toBe("true"); + + act(() => { + root.unmount(); + }); + }); + it("syncs a new multiline value while focused when the user has not edited locally", () => { const onSave = vi.fn().mockResolvedValue(undefined); const root = createRoot(container); diff --git a/ui/src/components/InlineEditor.tsx b/ui/src/components/InlineEditor.tsx index de45ee2a826..3fe8a42ad7b 100644 --- a/ui/src/components/InlineEditor.tsx +++ b/ui/src/components/InlineEditor.tsx @@ -238,6 +238,7 @@ export function InlineEditor({ if (!showEditor) { const enterEditMode = () => { + if (multilineEditing) return; justEnteredEditRef.current = true; setMultilineEditing(true); }; @@ -254,6 +255,7 @@ export function InlineEditor({ }} onDragEnter={() => enterEditMode()} role="textbox" + aria-multiline="true" aria-label={placeholder} > diff --git a/ui/src/components/MarkdownBody.test.tsx b/ui/src/components/MarkdownBody.test.tsx index a267dee0e0d..6350f660eaa 100644 --- a/ui/src/components/MarkdownBody.test.tsx +++ b/ui/src/components/MarkdownBody.test.tsx @@ -187,6 +187,14 @@ describe("MarkdownBody", () => { expect(html).toContain("text-green-600"); }); + it("does not auto-link non-issue internal route paths", () => { + const html = renderMarkdown("Use /issues/new for the creation form and /api/issues for data."); + + expect(html).toContain("Use /issues/new for the creation form and /api/issues for data."); + expect(html).not.toContain('href="/issues/new"'); + expect(html).not.toContain('data-mention-kind="issue"'); + }); + it("rewrites issue scheme links to internal issue links", () => { const html = renderMarkdown("See issue://PAP-1310 and issue://:PAP-1311.", [ { identifier: "PAP-1310", status: "done" }, diff --git a/ui/src/lib/issue-reference.ts b/ui/src/lib/issue-reference.ts index 1596766079e..2566c1e8fdd 100644 --- a/ui/src/lib/issue-reference.ts +++ b/ui/src/lib/issue-reference.ts @@ -7,7 +7,7 @@ type MarkdownNode = { const BARE_ISSUE_IDENTIFIER_RE = /^[A-Z][A-Z0-9]+-\d+$/i; const ISSUE_SCHEME_RE = /^issue:\/\/:?([^?#\s]+)(?:[?#].*)?$/i; -const ISSUE_REFERENCE_TOKEN_RE = /issue:\/\/:?[^\s<>()]+|https?:\/\/[^\s<>()]+|\/[^\s<>()]+|\b[A-Z][A-Z0-9]+-\d+\b/gi; +const ISSUE_REFERENCE_TOKEN_RE = /issue:\/\/:?[^\s<>()]+|https?:\/\/[^\s<>()]+|\/(?:[^\s<>()/]+\/)*issues\/[A-Z][A-Z0-9]+-\d+\b|\b[A-Z][A-Z0-9]+-\d+\b/gi; export function parseIssuePathIdFromPath(pathOrUrl: string | null | undefined): string | null { if (!pathOrUrl) return null;