A Rally Custom HTML Widget that lets you select user stories from one iteration and copy them into another — optionally including child tasks.
Legacy source: code-viewer/dist/apps-html/bulk-copy-stories-between-iterations-App-20260412-213615.html
Warning: This widget writes to Rally in live mode. Each copy operation creates new user stories (and optionally tasks) in your workspace. Copies cannot be undone from the widget — use Rally to delete unwanted duplicates.
- Source iteration — Choose an iteration from the current project. Its user stories load immediately.
- Select stories — Check one or more stories using the checkbox list. Use "Select all" / "Clear" for bulk selection.
- Destination project — Pick a destination project (defaults to the current workspace).
- Destination iteration — Pick an iteration within the destination project.
- Copy — Each selected story is cloned into the destination iteration with the same Name, Description, and Plan Estimate. When "Copy tasks" is enabled in widget settings, child tasks are duplicated (reset to Defined state with original estimates).
- Results — A summary table shows each story's outcome — new FormattedID on success, error message on failure.
| Legacy behavior | This widget |
|---|---|
Single project picker (ExtJS rallyprojectpicker) |
ProjectPicker from @customagile/widget-ai |
| Auto-selects first story on row click | Checkbox per story, select-all / clear toolbar |
| Silent success (console.log only) | ResultSummary panel with per-story status |
Copies all fields (Rally SDK copyRecord) |
Copies Name, Description, PlanEstimate, Iteration, Project; optionally Tasks |
| No progress indicator | Progress bar during copy operation |
| Setting | Default | Description |
|---|---|---|
| Copy tasks | true |
When enabled, child tasks are copied to the new story (State reset to Defined) |
| Additional filter | (empty) | Optional WSAPI query applied to the source story list (e.g. (ScheduleState = "Defined")) |
cd examples/bulk-copy-stories-between-iterations
npm run dev # http://localhost:5175 — mock data by defaultFor live Rally data, create auth.json:
{
"server": "https://rally1.rallydev.com",
"apiKey": "_your_api_key_here"
}Then open http://localhost:5175?live=true.
See docs/setup-guide.md for full auth and deploy instructions.
npm run build # dist/app.js — live Rally data
npm run build:mock # dist/app.js — mock/demo data