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;