feat: move unfinished tickets between releases
- Bulk editing gets «Release…» (open releases or none), and the list view a release filter, also reachable from each release («Ver en la lista», ?release=). - Archiving a release asks where its unfinished tickets go, as closing a sprint does: ReleaseArchivedEvent carries `moveTo` (an open release of the same project, or none) and the saga moves them there; finished ones stay. In GraphQL, REST and the MCP's archive_release. - Chapter 10 lists the next features and the ideas to weigh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -104,9 +104,12 @@ export class GraphqlReleasesGateway extends ReleasesGateway {
|
||||
.pipe(map((d) => toCommandResult(d.publishRelease)));
|
||||
}
|
||||
|
||||
archive(releaseId: string): Observable<CommandResult> {
|
||||
archive(
|
||||
releaseId: string,
|
||||
moveTo: string | null = null,
|
||||
): Observable<CommandResult> {
|
||||
return this.gql
|
||||
.mutate(ArchiveReleaseDocument, { releaseId })
|
||||
.mutate(ArchiveReleaseDocument, { releaseId, moveTo })
|
||||
.pipe(map((d) => toCommandResult(d.archiveRelease)));
|
||||
}
|
||||
|
||||
|
||||
@@ -255,6 +255,8 @@ export class GraphqlIssuesGateway extends IssuesGateway {
|
||||
assigneeId: change.assigneeId ?? null,
|
||||
noSprint: change.sprintId === null ? true : null,
|
||||
sprintId: change.sprintId ?? null,
|
||||
noRelease: change.releaseId === null ? true : null,
|
||||
releaseId: change.releaseId ?? null,
|
||||
priority: (change.priority ?? null) as never,
|
||||
addLabels: change.addLabels ?? null,
|
||||
},
|
||||
|
||||
@@ -1676,6 +1676,7 @@ export type PublishReleaseMutation = {
|
||||
|
||||
export type ArchiveReleaseMutationVariables = Exact<{
|
||||
releaseId: string;
|
||||
moveTo?: string | null | undefined;
|
||||
}>;
|
||||
|
||||
export type ArchiveReleaseMutation = {
|
||||
@@ -10488,6 +10489,14 @@ export const ArchiveReleaseDocument = {
|
||||
type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } },
|
||||
},
|
||||
},
|
||||
{
|
||||
kind: 'VariableDefinition',
|
||||
variable: {
|
||||
kind: 'Variable',
|
||||
name: { kind: 'Name', value: 'moveTo' },
|
||||
},
|
||||
type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } },
|
||||
},
|
||||
],
|
||||
selectionSet: {
|
||||
kind: 'SelectionSet',
|
||||
@@ -10504,6 +10513,14 @@ export const ArchiveReleaseDocument = {
|
||||
name: { kind: 'Name', value: 'releaseId' },
|
||||
},
|
||||
},
|
||||
{
|
||||
kind: 'Argument',
|
||||
name: { kind: 'Name', value: 'moveTo' },
|
||||
value: {
|
||||
kind: 'Variable',
|
||||
name: { kind: 'Name', value: 'moveTo' },
|
||||
},
|
||||
},
|
||||
],
|
||||
selectionSet: {
|
||||
kind: 'SelectionSet',
|
||||
|
||||
@@ -24,8 +24,8 @@ mutation PublishRelease($releaseId: ID!, $force: Boolean!) {
|
||||
}
|
||||
}
|
||||
|
||||
mutation ArchiveRelease($releaseId: ID!) {
|
||||
archiveRelease(releaseId: $releaseId) {
|
||||
mutation ArchiveRelease($releaseId: ID!, $moveTo: ID) {
|
||||
archiveRelease(releaseId: $releaseId, moveTo: $moveTo) {
|
||||
...CommandResultFields
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user