Repository navigation
Copy a milestone, on its own or with its tasks - #564
Merged
doomlab merged 2 commits intoOct 9, 2026
Merged
Conversation
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This was referenced Oct 9, 2026
Closed
doomlab
added a commit
that referenced
this pull request
Oct 9, 2026
…n-checks Copy a milestone, on its own or with its tasks (gets #564 onto dev)
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.
Closes #533
Stacked on #563 (the combined server-side access checks), because the new endpoint uses its
requireManagerOfhelper. Merge #563 intodevfirst; this will then retarget todev(retarget it by hand if it doesn't). Do not merge this intofix/server-side-notification-checksand consider it done: it would not reachdev.What
A Copy Milestone button on the milestone page (project managers only, like Edit and Delete). It opens a dialog with the choice:
<name> (Copy), with the same description, tags and dates. Its tasks stay with the original, because a task can belong to only one milestone ("Update Tasks" moves them).Either way you land on the new milestone, ready to rename.
How copied tasks behave
Same as when a whole project is copied: new tasks with the same name, description, dates, tags, form, roles, column and settings, placed at the end of their column, back to "not completed", created by the person copying. Nobody is assigned, and no logs, responses, comments or notifications are copied, so a copy never carries someone else's progress. Tasks keep their original names (they sit under the copied milestone), so on the board they look like the originals until renamed. The whole copy happens in one database transaction, so a failure part-way doesn't leave a half-copied milestone.
Access
copyMilestonerequires the caller to be a project manager of the milestone's project, with or without tasks. It is in the shared "refuses outsiders and plain contributors" test.Testing
copyMilestone.test.ts(5): milestone-only copies details and touches no tasks; with tasks each task is copied unassigned, reset, under the copy and at the end of its column (ordering checked across two columns); empty fields and no tasks; stops without copying tasks if the caller has no member row; non-managers refused both ways.CopyMilestoneButton.test.tsx(7): the dialog, each choice calls the right option and opens the copy, singular/plural label, disabled with no tasks, cancel, failure stays on the page.mutationAccess.test.ts(both variants refused for an outsider and a contributor).getJsonSchema.test.tserrors), lint and the full suite (292 tests, run twice) pass.🤖 Generated with Claude Code