diff --git a/e2e/USER_STORIES.md b/e2e/USER_STORIES.md
index 2c9078db..2ef3d86e 100644
--- a/e2e/USER_STORIES.md
+++ b/e2e/USER_STORIES.md
@@ -682,8 +682,10 @@ Acceptance:
- Creating a thread from a room's compose menu files it under that room's board
and posts a quote of it into the room's chat.
-- Creating a thread from the top-level Threads page files it under a "General"
- board, or under whichever board is picked from its board selector.
+- Each board on the Threads page has its own create button, and a thread started
+ from it is filed under that board.
+- The "General" board is always present, so a thread belonging to no room can be
+ started from the Threads page.
- Each board row shows the topic title, author, reply count, and last-post time.
### US-043 — Reply to a thread and to a specific post
diff --git a/e2e/specs/articles-threads.spec.ts b/e2e/specs/articles-threads.spec.ts
index 0ce99535..839508c6 100644
--- a/e2e/specs/articles-threads.spec.ts
+++ b/e2e/specs/articles-threads.spec.ts
@@ -676,7 +676,13 @@ test("US-042 start a thread and see it filed under its room", async ({seed, as})
await shortDate(page, at(4, HOUR) + 60),
)
- await pageBar(page).getByRole("button", {name: "Create", exact: true}).click()
+ const general = page
+ .locator("section")
+ .filter({has: page.getByRole("heading", {name: "General", exact: true})})
+
+ // Each board creates its own threads, so the room comes from the button that was clicked rather
+ // than from a picker.
+ await general.getByRole("button", {name: "Create", exact: true}).click()
const fromThreads = modal(page, "Create a Thread")
@@ -686,18 +692,12 @@ test("US-042 start a thread and see it filed under its room", async ({seed, as})
await expect(page.getByRole("heading", {name: "Create a Thread"})).toHaveCount(0)
- const general = page
- .locator("section")
- .filter({has: page.getByRole("heading", {name: "General", exact: true})})
-
await expect(general.getByRole("row").filter({hasText: "Open floor"})).toBeVisible()
- // The threads page has no room of its own, so the form offers one.
- await pageBar(page).getByRole("button", {name: "Create", exact: true}).click()
+ await lounge.getByRole("button", {name: "Create", exact: true}).click()
const toLounge = modal(page, "Create a Thread")
- await toLounge.getByRole("combobox").selectOption({label: "Lounge"})
await toLounge.getByPlaceholder("What is this thread about?").fill("Carpet swatches")
await editorOf(toLounge).pressSequentially("Beige is a choice.")
await toLounge.getByRole("button", {name: "Create Thread"}).click()
diff --git a/src/app/components/ThreadBoard.svelte b/src/app/components/ThreadBoard.svelte
index 610e88aa..43b2e3a1 100644
--- a/src/app/components/ThreadBoard.svelte
+++ b/src/app/components/ThreadBoard.svelte
@@ -1,9 +1,14 @@
@@ -25,12 +32,20 @@
General
{/if}
-
- {threads.length}
- {threads.length === 1 ? "Topic" : "Topics"}
-
+