Repository navigation
[5/10] Threaded replies in project and task discussions - #357
Merged
Merged
Conversation
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 21, 2026 13:15
7926aff to
a4b0f18
Compare
hturnbull93
force-pushed
the
threaded-replies
branch
from
October 21, 2026 13:15
9101906 to
ad3162c
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 22, 2026 17:17
a4b0f18 to
d4ec93e
Compare
hturnbull93
force-pushed
the
threaded-replies
branch
from
October 22, 2026 17:17
ad3162c to
016e1f5
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 22, 2026 17:36
d4ec93e to
56ce373
Compare
hturnbull93
force-pushed
the
threaded-replies
branch
from
October 22, 2026 17:36
016e1f5 to
025b56b
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 23, 2026 09:02
56ce373 to
cddd7d9
Compare
hturnbull93
force-pushed
the
threaded-replies
branch
from
October 23, 2026 09:02
025b56b to
24beed6
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 23, 2026 09:16
cddd7d9 to
59d5ef9
Compare
hturnbull93
force-pushed
the
threaded-replies
branch
from
October 23, 2026 09:16
24beed6 to
337bd4b
Compare
hturnbull93
force-pushed
the
join-by-claiming
branch
from
October 23, 2026 09:17
59d5ef9 to
ca9ea27
Compare
hturnbull93
force-pushed
the
threaded-replies
branch
from
October 23, 2026 09:17
337bd4b to
1521bfe
Compare
… person replied to A reply to a reply joins the same top-level thread but is still answered to its own author, who gets a comment_reply notification (in the Inbox, and by email unless they muted updates) in place of the plain new-comment notice. A mention of them still wins. Threads of more than four replies show the first and last two until "Show N more replies"; a permalink to a hidden reply opens its thread. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hturnbull93
force-pushed
the
threaded-replies
branch
from
October 23, 2026 15:09
1521bfe to
e4fc1e5
Compare
…mment A reply only ever named who it answered in the Reply button's accessible name; the posted reply itself showed nothing, so a thread with crosstalk left other readers unable to tell which earlier reply a given one was actually responding to. Each reply now carries the comment it replied to, via a new replied_to_id column distinct from parent_id (which keeps grouping every reply under its thread's root). It's set only when that's a reply to a reply — a reply straight to the thread's top-level comment already sits under it, so quoting it back would say nothing new. The list response resolves it to the target's author and a plain-text snippet, cut to 140 characters, or marks it removed if the target has since been deleted. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Each folded thread already had its own "Show N more replies" button, but with several long threads on one page there was no way to open them all at once. The new button only appears while at least one thread is still folded, and expands every thread with more than COLLAPSE_ABOVE replies in one click. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The byline previously showed a plain name. It now shows the author's
initials in a small circle before their name, with the name linking to
/volunteers/{id} (PersonInitials gains an 'xs' size for this). The byline
also moves above the comment body, matching the layout of chat apps like
Discord and Slack rather than sitting underneath it.
The quote shown above a reply to a reply gets the same avatar, an "up and
right" arrow marking it as a quote, and now renders above the replier's
own byline rather than below it, so the thing being answered reads before
who's answering it.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… icon The quote above a reply loses its left border, and its arrow is an SVG drawn like the copy-link icon rather than the ↱ character. Copy link, Reply, Edit and Delete move from the author line to a row under the message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #356.
Screenshots: https://fedora.taila91c66.ts.net:8444/docs/20261021-134117-pr-357-threaded-replies.html
Discussions on projects, tasks and quick tasks could already hold one level of replies. This PR lets people reply to any comment, quotes the specific reply answered, folds long threads, and tells the person being replied to.
API (
workItemComments.add)replied_to_idcolumn, distinct fromparent_id, records the specific comment a reply answers. It's set only when that's a reply to a reply — a reply straight to the thread's own top-level comment already sits under it, so quoting it back would say nothing new.workItemComments.listresolves it to the target's author and a plain-text snippet (mentions stripped, cut to 140 characters), or marks it removed if the target has since been deleted.comment_replynotification: "X replied to your comment on …". It links to#comment-{id}and is sent by email unless they have muted the Updates category. The preference label already says "comments and replies".UI (
CommentThreadView)<ul>named "Replies to ".Tests
07-project-management-owner.spec.ts: the owner replies, the reply nests under the comment, and the admin sees the reply notification and opens it. The test then seeds a long thread through the API, checks that it folds, and expands it. Snapshots:reply box open,long thread folded.Decisions
CommentThreadand the same router. Bug report threads stay flat (BugReportCommentThreaddoesn't passcanReply): they are a back-and-forth between the reporter and admins, on a separate model.parent_id:parent_idgroups a reply under its thread's root, which the existing fold/notification logic depends on staying flat.replied_to_idis purely who-answered-whom display information layered on top, so it doesn't disturb that.Data impact: a new nullable
replied_to_idcolumn, backfilled as empty (no way to recover which reply an existing reply answered). No change toparent_idordeleted_at.Closes #339
🤖 Generated with Claude Code