Skip to content

Copy a set of tasks once per interview or dataset - #565

Merged
doomlab merged 1 commit into
feat/533-copy-milestonefrom
feat/534-copy-task-sets
Oct 9, 2026
Merged

doomlab merged 1 commit into
feat/533-copy-milestonefrom
feat/534-copy-task-sets

Conversation

@doomlab

@doomlab doomlab commented Oct 9, 2026

Copy link
Copy Markdown
Member

Closes #534

Stacked on #564 (copy milestone), which is stacked on #563 (server-side access checks). It reuses the access helper and a task-copy helper that #564's copy already uses (now shared). Merge in order #563, #564, then this; each must reach dev, not just the branch below it (that is how #559 to #561 earlier merged into each other without reaching dev). Retarget to dev as each merges if GitHub does not.

What

A Copy Set of Tasks button next to "Create New Task" on the project's Tasks page (project managers only). It opens a dialog:

  1. Tick the tasks that make up the set, e.g. steps 1 to 4 of a pipeline.
  2. One label per line, e.g. Interview 2, Interview 3.
  3. Optionally put each set in its own new milestone, named after the label.
  4. A preview says how many tasks (and milestones) will be created and what the first is called. Create copies makes them.

Each label gets its own full copy of the set, named <task> - <label> (e.g. Transcribe - Interview 2). Tasks are copied in the order they were created, so step 1, 2, 3, 4 stays in that order, and the copies go to the end of their column on the board. The boards and lists refresh afterwards.

How copies behave

Same rules as copying a milestone with its tasks (now one shared helper, taskCopyData): same details, dates, tags, form, roles, column and settings, back to "not completed", created by the person copying, nobody assigned and no logs, responses, comments or notifications. Without the milestone option the copies are not in any milestone (rather than guessing the original's). Everything happens in one transaction.

Limits and access

  • At most 50 labels, 100 tasks per set and 500 new tasks in one go (checked on the server and shown in the dialog).
  • Project managers of that project only. Every chosen task must belong to that project (a task id from another project is refused). Added to the shared "refuses outsiders and plain contributors" test.

Testing

  • copyTaskSet.test.ts (8): names and ordering across labels and columns, new unassigned tasks, milestone per set, cross-project task refused, missing task / no member row, non-managers refused, size limit, empty input.
  • CopyTaskSetButton.test.tsx (7): the dialog, enabling rules, preview text, the exact payload sent, milestone option, too many, cancel, failure stays open.
  • copyTaskSetInput.test.ts (4): label parsing and naming.
  • copyMilestone still passes unchanged after moving to the shared helper.
  • Typecheck (apart from the existing getJsonSchema.test.ts errors), lint and the full suite (314 tests, run twice) pass.
  • Not yet checked in a browser: please try it with a real pipeline of tasks, look at the board and the new milestones.

Not included: saving a set as a reusable template to apply later (that would be a larger feature of its own).

🤖 Generated with Claude Code

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@doomlab
doomlab merged commit a09d3d6 into feat/533-copy-milestone Oct 9, 2026
1 check passed
doomlab added a commit that referenced this pull request Oct 9, 2026
Copy a set of tasks once per interview or dataset (gets #565 onto dev)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant