feat: tickets I follow, and more news for followers
"Que sigo" on the home page lists the open tickets I follow, whoever works on them; `watching` filters my issues (REST, GraphQL, MCP) and a project's search (none without a session). Followers now also hear when a ticket's priority or due date changes, and when it enters or leaves a sprint. Smaller edits (title, labels…) still do not notify. Docs (with the REPLIED row the replies change missed), Word and PDF updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -508,6 +508,13 @@ export class IssueFilterInput {
|
||||
@IsOptional()
|
||||
@IsBoolean()
|
||||
noSprint?: boolean;
|
||||
@Field({
|
||||
nullable: true,
|
||||
description: 'Only the tickets I follow (none when anonymous)',
|
||||
})
|
||||
@IsOptional()
|
||||
@IsBoolean()
|
||||
watching?: boolean;
|
||||
@Field({
|
||||
nullable: true,
|
||||
description: 'Due on or after this day (YYYY-MM-DD)',
|
||||
|
||||
@@ -98,6 +98,11 @@ export class IssueResolver {
|
||||
myIssues(
|
||||
@CurrentUser() me: User,
|
||||
@Args('assignedToMe', { defaultValue: true }) assignedToMe: boolean,
|
||||
@Args('watching', {
|
||||
defaultValue: false,
|
||||
description: 'Only the tickets I follow',
|
||||
})
|
||||
watching: boolean,
|
||||
@Args('statuses', { type: () => [String], nullable: true })
|
||||
statuses: string[] | undefined,
|
||||
@Args('categories', { type: () => [StatusCategory], nullable: true })
|
||||
@@ -113,6 +118,7 @@ export class IssueResolver {
|
||||
) {
|
||||
return this.issuesService.mine(me.id, {
|
||||
assignedToMe,
|
||||
watching,
|
||||
statuses: statuses ?? undefined,
|
||||
categories: categories ?? undefined,
|
||||
search: search ?? undefined,
|
||||
|
||||
@@ -389,6 +389,16 @@ export class MyIssuesQueryDto extends PageQueryDto {
|
||||
@IsBoolean()
|
||||
assignedToMe = true;
|
||||
|
||||
@ApiPropertyOptional({
|
||||
type: Boolean,
|
||||
description:
|
||||
'Only the tickets I follow (with assignedToMe=false, whoever they are assigned to)',
|
||||
})
|
||||
@IsOptional()
|
||||
@Transform(toBoolean)
|
||||
@IsBoolean()
|
||||
watching?: boolean;
|
||||
|
||||
@ApiPropertyOptional({
|
||||
type: [String],
|
||||
description: 'Status ids. Repeat the parameter or separate with commas',
|
||||
@@ -509,6 +519,15 @@ export class IssueSearchQueryDto extends PageQueryDto {
|
||||
@IsBoolean()
|
||||
noSprint?: boolean;
|
||||
|
||||
@ApiPropertyOptional({
|
||||
type: Boolean,
|
||||
description: 'Only the tickets I follow (none without a token)',
|
||||
})
|
||||
@IsOptional()
|
||||
@Transform(toBoolean)
|
||||
@IsBoolean()
|
||||
watching?: boolean;
|
||||
|
||||
@ApiPropertyOptional({
|
||||
format: 'date',
|
||||
description: 'Due on or after this day',
|
||||
|
||||
@@ -128,6 +128,7 @@ export class IssuesController {
|
||||
async mine(@CurrentUser() me: User, @Query() query: MyIssuesQueryDto) {
|
||||
const page = await this.issues.mine(me.id, {
|
||||
assignedToMe: query.assignedToMe,
|
||||
watching: query.watching,
|
||||
statuses: query.status,
|
||||
categories: query.category,
|
||||
search: query.search,
|
||||
@@ -164,6 +165,7 @@ export class IssuesController {
|
||||
labels: query.label,
|
||||
sprintId: query.sprintId,
|
||||
noSprint: query.noSprint,
|
||||
watching: query.watching,
|
||||
dueFrom: query.dueFrom,
|
||||
dueTo: query.dueTo,
|
||||
sort: query.sort,
|
||||
|
||||
Reference in New Issue
Block a user