mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Add "Reviewed by you" filter for pull requests (#22927)
This includes pull requests that you approved, requested changes or commented on. Currently such pull requests are not visible in any of the filters on /pulls, while they may need further action like merging, or prodding the author or reviewers. Especially when working with a large team on a repository it's helpful to get a full overview of pull requests that may need your attention, without having to sift through the complete list.
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							843f81113e
						
					
				
				
					commit
					10cdcb9ea8
				
			| @@ -1148,6 +1148,7 @@ type IssuesOptions struct { //nolint | |||||||
| 	PosterID           int64 | 	PosterID           int64 | ||||||
| 	MentionedID        int64 | 	MentionedID        int64 | ||||||
| 	ReviewRequestedID  int64 | 	ReviewRequestedID  int64 | ||||||
|  | 	ReviewedID         int64 | ||||||
| 	SubscriberID       int64 | 	SubscriberID       int64 | ||||||
| 	MilestoneIDs       []int64 | 	MilestoneIDs       []int64 | ||||||
| 	ProjectID          int64 | 	ProjectID          int64 | ||||||
| @@ -1262,6 +1263,10 @@ func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) { | |||||||
| 		applyReviewRequestedCondition(sess, opts.ReviewRequestedID) | 		applyReviewRequestedCondition(sess, opts.ReviewRequestedID) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if opts.ReviewedID > 0 { | ||||||
|  | 		applyReviewedCondition(sess, opts.ReviewedID) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if opts.SubscriberID > 0 { | 	if opts.SubscriberID > 0 { | ||||||
| 		applySubscribedCondition(sess, opts.SubscriberID) | 		applySubscribedCondition(sess, opts.SubscriberID) | ||||||
| 	} | 	} | ||||||
| @@ -1432,6 +1437,36 @@ func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64) | |||||||
| 			reviewRequestedID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, reviewRequestedID) | 			reviewRequestedID, ReviewTypeApprove, ReviewTypeReject, ReviewTypeRequest, reviewRequestedID) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func applyReviewedCondition(sess *xorm.Session, reviewedID int64) *xorm.Session { | ||||||
|  | 	// Query for pull requests where you are a reviewer or commenter, excluding | ||||||
|  | 	// any pull requests already returned by the the review requested filter. | ||||||
|  | 	notPoster := builder.Neq{"issue.poster_id": reviewedID} | ||||||
|  | 	reviewed := builder.In("issue.id", builder. | ||||||
|  | 		Select("issue_id"). | ||||||
|  | 		From("review"). | ||||||
|  | 		Where(builder.And( | ||||||
|  | 			builder.Neq{"type": ReviewTypeRequest}, | ||||||
|  | 			builder.Or( | ||||||
|  | 				builder.Eq{"reviewer_id": reviewedID}, | ||||||
|  | 				builder.In("reviewer_team_id", builder. | ||||||
|  | 					Select("team_id"). | ||||||
|  | 					From("team_user"). | ||||||
|  | 					Where(builder.Eq{"uid": reviewedID}), | ||||||
|  | 				), | ||||||
|  | 			), | ||||||
|  | 		)), | ||||||
|  | 	) | ||||||
|  | 	commented := builder.In("issue.id", builder. | ||||||
|  | 		Select("issue_id"). | ||||||
|  | 		From("comment"). | ||||||
|  | 		Where(builder.And( | ||||||
|  | 			builder.Eq{"poster_id": reviewedID}, | ||||||
|  | 			builder.In("type", CommentTypeComment, CommentTypeCode, CommentTypeReview), | ||||||
|  | 		)), | ||||||
|  | 	) | ||||||
|  | 	return sess.And(notPoster, builder.Or(reviewed, commented)) | ||||||
|  | } | ||||||
|  |  | ||||||
| func applySubscribedCondition(sess *xorm.Session, subscriberID int64) *xorm.Session { | func applySubscribedCondition(sess *xorm.Session, subscriberID int64) *xorm.Session { | ||||||
| 	return sess.And( | 	return sess.And( | ||||||
| 		builder. | 		builder. | ||||||
| @@ -1586,6 +1621,7 @@ type IssueStats struct { | |||||||
| 	CreateCount            int64 | 	CreateCount            int64 | ||||||
| 	MentionCount           int64 | 	MentionCount           int64 | ||||||
| 	ReviewRequestedCount   int64 | 	ReviewRequestedCount   int64 | ||||||
|  | 	ReviewedCount          int64 | ||||||
| } | } | ||||||
|  |  | ||||||
| // Filter modes. | // Filter modes. | ||||||
| @@ -1595,6 +1631,7 @@ const ( | |||||||
| 	FilterModeCreate | 	FilterModeCreate | ||||||
| 	FilterModeMention | 	FilterModeMention | ||||||
| 	FilterModeReviewRequested | 	FilterModeReviewRequested | ||||||
|  | 	FilterModeReviewed | ||||||
| 	FilterModeYourRepositories | 	FilterModeYourRepositories | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -1608,6 +1645,7 @@ type IssueStatsOptions struct { | |||||||
| 	MentionedID       int64 | 	MentionedID       int64 | ||||||
| 	PosterID          int64 | 	PosterID          int64 | ||||||
| 	ReviewRequestedID int64 | 	ReviewRequestedID int64 | ||||||
|  | 	ReviewedID        int64 | ||||||
| 	IsPull            util.OptionalBool | 	IsPull            util.OptionalBool | ||||||
| 	IssueIDs          []int64 | 	IssueIDs          []int64 | ||||||
| } | } | ||||||
| @@ -1646,6 +1684,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) { | |||||||
| 		accum.CreateCount += stats.CreateCount | 		accum.CreateCount += stats.CreateCount | ||||||
| 		accum.OpenCount += stats.MentionCount | 		accum.OpenCount += stats.MentionCount | ||||||
| 		accum.ReviewRequestedCount += stats.ReviewRequestedCount | 		accum.ReviewRequestedCount += stats.ReviewRequestedCount | ||||||
|  | 		accum.ReviewedCount += stats.ReviewedCount | ||||||
| 		i = chunk | 		i = chunk | ||||||
| 	} | 	} | ||||||
| 	return accum, nil | 	return accum, nil | ||||||
| @@ -1703,6 +1742,10 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats, | |||||||
| 			applyReviewRequestedCondition(sess, opts.ReviewRequestedID) | 			applyReviewRequestedCondition(sess, opts.ReviewRequestedID) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		if opts.ReviewedID > 0 { | ||||||
|  | 			applyReviewedCondition(sess, opts.ReviewedID) | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		switch opts.IsPull { | 		switch opts.IsPull { | ||||||
| 		case util.OptionalBoolTrue: | 		case util.OptionalBoolTrue: | ||||||
| 			sess.And("issue.is_pull=?", true) | 			sess.And("issue.is_pull=?", true) | ||||||
| @@ -1843,6 +1886,19 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) { | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
|  | 	case FilterModeReviewed: | ||||||
|  | 		stats.OpenCount, err = applyReviewedCondition(sess(cond), opts.UserID). | ||||||
|  | 			And("issue.is_closed = ?", false). | ||||||
|  | 			Count(new(Issue)) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		stats.ClosedCount, err = applyReviewedCondition(sess(cond), opts.UserID). | ||||||
|  | 			And("issue.is_closed = ?", true). | ||||||
|  | 			Count(new(Issue)) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cond = cond.And(builder.Eq{"issue.is_closed": opts.IsClosed}) | 	cond = cond.And(builder.Eq{"issue.is_closed": opts.IsClosed}) | ||||||
| @@ -1871,6 +1927,11 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) { | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	stats.ReviewedCount, err = applyReviewedCondition(sess(cond), opts.UserID).Count(new(Issue)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return stats, nil | 	return stats, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1323,6 +1323,7 @@ issues.filter_type.assigned_to_you = Assigned to you | |||||||
| issues.filter_type.created_by_you = Created by you | issues.filter_type.created_by_you = Created by you | ||||||
| issues.filter_type.mentioning_you = Mentioning you | issues.filter_type.mentioning_you = Mentioning you | ||||||
| issues.filter_type.review_requested = Review requested | issues.filter_type.review_requested = Review requested | ||||||
|  | issues.filter_type.reviewed_by_you = Reviewed by you | ||||||
| issues.filter_sort = Sort | issues.filter_sort = Sort | ||||||
| issues.filter_sort.latest = Newest | issues.filter_sort.latest = Newest | ||||||
| issues.filter_sort.oldest = Oldest | issues.filter_sort.oldest = Oldest | ||||||
|   | |||||||
| @@ -92,6 +92,10 @@ func SearchIssues(ctx *context.APIContext) { | |||||||
| 	//   in: query | 	//   in: query | ||||||
| 	//   description: filter pulls requesting your review, default is false | 	//   description: filter pulls requesting your review, default is false | ||||||
| 	//   type: boolean | 	//   type: boolean | ||||||
|  | 	// - name: reviewed | ||||||
|  | 	//   in: query | ||||||
|  | 	//   description: filter pulls reviewed by you, default is false | ||||||
|  | 	//   type: boolean | ||||||
| 	// - name: owner | 	// - name: owner | ||||||
| 	//   in: query | 	//   in: query | ||||||
| 	//   description: filter by owner | 	//   description: filter by owner | ||||||
| @@ -266,6 +270,9 @@ func SearchIssues(ctx *context.APIContext) { | |||||||
| 		if ctx.FormBool("review_requested") { | 		if ctx.FormBool("review_requested") { | ||||||
| 			issuesOpt.ReviewRequestedID = ctxUserID | 			issuesOpt.ReviewRequestedID = ctxUserID | ||||||
| 		} | 		} | ||||||
|  | 		if ctx.FormBool("reviewed") { | ||||||
|  | 			issuesOpt.ReviewedID = ctxUserID | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if issues, err = issues_model.Issues(ctx, issuesOpt); err != nil { | 		if issues, err = issues_model.Issues(ctx, issuesOpt); err != nil { | ||||||
| 			ctx.Error(http.StatusInternalServerError, "Issues", err) | 			ctx.Error(http.StatusInternalServerError, "Issues", err) | ||||||
|   | |||||||
| @@ -138,7 +138,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti | |||||||
| 	var err error | 	var err error | ||||||
| 	viewType := ctx.FormString("type") | 	viewType := ctx.FormString("type") | ||||||
| 	sortType := ctx.FormString("sort") | 	sortType := ctx.FormString("sort") | ||||||
| 	types := []string{"all", "your_repositories", "assigned", "created_by", "mentioned", "review_requested"} | 	types := []string{"all", "your_repositories", "assigned", "created_by", "mentioned", "review_requested", "reviewed_by"} | ||||||
| 	if !util.SliceContainsString(types, viewType, true) { | 	if !util.SliceContainsString(types, viewType, true) { | ||||||
| 		viewType = "all" | 		viewType = "all" | ||||||
| 	} | 	} | ||||||
| @@ -148,6 +148,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti | |||||||
| 		posterID          = ctx.FormInt64("poster") | 		posterID          = ctx.FormInt64("poster") | ||||||
| 		mentionedID       int64 | 		mentionedID       int64 | ||||||
| 		reviewRequestedID int64 | 		reviewRequestedID int64 | ||||||
|  | 		reviewedID        int64 | ||||||
| 		forceEmpty        bool | 		forceEmpty        bool | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| @@ -161,6 +162,8 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti | |||||||
| 			assigneeID = ctx.Doer.ID | 			assigneeID = ctx.Doer.ID | ||||||
| 		case "review_requested": | 		case "review_requested": | ||||||
| 			reviewRequestedID = ctx.Doer.ID | 			reviewRequestedID = ctx.Doer.ID | ||||||
|  | 		case "reviewed_by": | ||||||
|  | 			reviewedID = ctx.Doer.ID | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -208,6 +211,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti | |||||||
| 			MentionedID:       mentionedID, | 			MentionedID:       mentionedID, | ||||||
| 			PosterID:          posterID, | 			PosterID:          posterID, | ||||||
| 			ReviewRequestedID: reviewRequestedID, | 			ReviewRequestedID: reviewRequestedID, | ||||||
|  | 			ReviewedID:        reviewedID, | ||||||
| 			IsPull:            isPullOption, | 			IsPull:            isPullOption, | ||||||
| 			IssueIDs:          issueIDs, | 			IssueIDs:          issueIDs, | ||||||
| 		}) | 		}) | ||||||
| @@ -255,6 +259,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti | |||||||
| 			PosterID:          posterID, | 			PosterID:          posterID, | ||||||
| 			MentionedID:       mentionedID, | 			MentionedID:       mentionedID, | ||||||
| 			ReviewRequestedID: reviewRequestedID, | 			ReviewRequestedID: reviewRequestedID, | ||||||
|  | 			ReviewedID:        reviewedID, | ||||||
| 			MilestoneIDs:      mileIDs, | 			MilestoneIDs:      mileIDs, | ||||||
| 			ProjectID:         projectID, | 			ProjectID:         projectID, | ||||||
| 			IsClosed:          util.OptionalBoolOf(isShowClosed), | 			IsClosed:          util.OptionalBoolOf(isShowClosed), | ||||||
| @@ -2425,6 +2430,9 @@ func SearchIssues(ctx *context.Context) { | |||||||
| 		if ctx.FormBool("review_requested") { | 		if ctx.FormBool("review_requested") { | ||||||
| 			issuesOpt.ReviewRequestedID = ctxUserID | 			issuesOpt.ReviewRequestedID = ctxUserID | ||||||
| 		} | 		} | ||||||
|  | 		if ctx.FormBool("reviewed") { | ||||||
|  | 			issuesOpt.ReviewedID = ctxUserID | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if issues, err = issues_model.Issues(ctx, issuesOpt); err != nil { | 		if issues, err = issues_model.Issues(ctx, issuesOpt); err != nil { | ||||||
| 			ctx.Error(http.StatusInternalServerError, "Issues", err.Error()) | 			ctx.Error(http.StatusInternalServerError, "Issues", err.Error()) | ||||||
|   | |||||||
| @@ -385,6 +385,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { | |||||||
| 		filterMode = issues_model.FilterModeMention | 		filterMode = issues_model.FilterModeMention | ||||||
| 	case "review_requested": | 	case "review_requested": | ||||||
| 		filterMode = issues_model.FilterModeReviewRequested | 		filterMode = issues_model.FilterModeReviewRequested | ||||||
|  | 	case "reviewed_by": | ||||||
|  | 		filterMode = issues_model.FilterModeReviewed | ||||||
| 	case "your_repositories": | 	case "your_repositories": | ||||||
| 		fallthrough | 		fallthrough | ||||||
| 	default: | 	default: | ||||||
| @@ -453,6 +455,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { | |||||||
| 		opts.MentionedID = ctx.Doer.ID | 		opts.MentionedID = ctx.Doer.ID | ||||||
| 	case issues_model.FilterModeReviewRequested: | 	case issues_model.FilterModeReviewRequested: | ||||||
| 		opts.ReviewRequestedID = ctx.Doer.ID | 		opts.ReviewRequestedID = ctx.Doer.ID | ||||||
|  | 	case issues_model.FilterModeReviewed: | ||||||
|  | 		opts.ReviewedID = ctx.Doer.ID | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// keyword holds the search term entered into the search field. | 	// keyword holds the search term entered into the search field. | ||||||
|   | |||||||
| @@ -171,10 +171,11 @@ | |||||||
| 								<a class="{{if eq .ViewType "all"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=all&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.all_issues"}}</a> | 								<a class="{{if eq .ViewType "all"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=all&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.all_issues"}}</a> | ||||||
| 								<a class="{{if eq .ViewType "assigned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=assigned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.assigned_to_you"}}</a> | 								<a class="{{if eq .ViewType "assigned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=assigned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.assigned_to_you"}}</a> | ||||||
| 								<a class="{{if eq .ViewType "created_by"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=created_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.created_by_you"}}</a> | 								<a class="{{if eq .ViewType "created_by"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=created_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.created_by_you"}}</a> | ||||||
| 								<a class="{{if eq .ViewType "mentioned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=mentioned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.mentioning_you"}}</a> |  | ||||||
| 								{{if .PageIsPullList}} | 								{{if .PageIsPullList}} | ||||||
| 									<a class="{{if eq .ViewType "review_requested"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=review_requested&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.review_requested"}}</a> | 									<a class="{{if eq .ViewType "review_requested"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=review_requested&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.review_requested"}}</a> | ||||||
|  | 									<a class="{{if eq .ViewType "reviewed_by"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=reviewed_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.reviewed_by_you"}}</a> | ||||||
| 								{{end}} | 								{{end}} | ||||||
|  | 								<a class="{{if eq .ViewType "mentioned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=mentioned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&project={{$.ProjectID}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.mentioning_you"}}</a> | ||||||
| 							</div> | 							</div> | ||||||
| 						</div> | 						</div> | ||||||
| 					{{end}} | 					{{end}} | ||||||
|   | |||||||
| @@ -111,8 +111,9 @@ | |||||||
| 								<a class="{{if eq .ViewType "all"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=all&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.all_issues"}}</a> | 								<a class="{{if eq .ViewType "all"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=all&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.all_issues"}}</a> | ||||||
| 								<a class="{{if eq .ViewType "assigned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=assigned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.assigned_to_you"}}</a> | 								<a class="{{if eq .ViewType "assigned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=assigned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.assigned_to_you"}}</a> | ||||||
| 								<a class="{{if eq .ViewType "created_by"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=created_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.created_by_you"}}</a> | 								<a class="{{if eq .ViewType "created_by"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=created_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.created_by_you"}}</a> | ||||||
| 								<a class="{{if eq .ViewType "mentioned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=mentioned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.mentioning_you"}}</a> |  | ||||||
| 								<a class="{{if eq .ViewType "review_requested"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=review_requested&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.review_requested"}}</a> | 								<a class="{{if eq .ViewType "review_requested"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=review_requested&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.review_requested"}}</a> | ||||||
|  | 								<a class="{{if eq .ViewType "reviewed_by"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=reviewed_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.reviewed_by_you"}}</a> | ||||||
|  | 								<a class="{{if eq .ViewType "mentioned"}}active {{end}}item" href="{{$.Link}}?q={{$.Keyword}}&type=mentioned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}&poster={{$.PosterID}}">{{.locale.Tr "repo.issues.filter_type.mentioning_you"}}</a> | ||||||
| 							</div> | 							</div> | ||||||
| 						</div> | 						</div> | ||||||
| 					{{end}} | 					{{end}} | ||||||
|   | |||||||
| @@ -2366,6 +2366,12 @@ | |||||||
|             "name": "review_requested", |             "name": "review_requested", | ||||||
|             "in": "query" |             "in": "query" | ||||||
|           }, |           }, | ||||||
|  |           { | ||||||
|  |             "type": "boolean", | ||||||
|  |             "description": "filter pulls reviewed by you, default is false", | ||||||
|  |             "name": "reviewed", | ||||||
|  |             "in": "query" | ||||||
|  |           }, | ||||||
|           { |           { | ||||||
|             "type": "string", |             "type": "string", | ||||||
|             "description": "filter by owner", |             "description": "filter by owner", | ||||||
|   | |||||||
| @@ -17,16 +17,20 @@ | |||||||
| 						{{.locale.Tr "repo.issues.filter_type.created_by_you"}} | 						{{.locale.Tr "repo.issues.filter_type.created_by_you"}} | ||||||
| 						<strong class="ui right">{{CountFmt .IssueStats.CreateCount}}</strong> | 						<strong class="ui right">{{CountFmt .IssueStats.CreateCount}}</strong> | ||||||
| 					</a> | 					</a> | ||||||
| 					<a class="{{if eq .ViewType "mentioned"}}ui basic primary button{{end}} item" href="{{.Link}}?type=mentioned&repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state={{.State}}"> |  | ||||||
| 						{{.locale.Tr "repo.issues.filter_type.mentioning_you"}} |  | ||||||
| 						<strong class="ui right">{{CountFmt .IssueStats.MentionCount}}</strong> |  | ||||||
| 					</a> |  | ||||||
| 					{{if .PageIsPulls}} | 					{{if .PageIsPulls}} | ||||||
| 						<a class="{{if eq .ViewType "review_requested"}}ui basic primary button{{end}} item" href="{{.Link}}?type=review_requested&repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state={{.State}}"> | 						<a class="{{if eq .ViewType "review_requested"}}ui basic primary button{{end}} item" href="{{.Link}}?type=review_requested&repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state={{.State}}"> | ||||||
| 							{{.locale.Tr "repo.issues.filter_type.review_requested"}} | 							{{.locale.Tr "repo.issues.filter_type.review_requested"}} | ||||||
| 							<strong class="ui right">{{CountFmt .IssueStats.ReviewRequestedCount}}</strong> | 							<strong class="ui right">{{CountFmt .IssueStats.ReviewRequestedCount}}</strong> | ||||||
| 						</a> | 						</a> | ||||||
|  | 						<a class="{{if eq .ViewType "reviewed_by"}}ui basic primary button{{end}} item" href="{{.Link}}?type=reviewed_by&repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state={{.State}}"> | ||||||
|  | 							{{.locale.Tr "repo.issues.filter_type.reviewed_by_you"}} | ||||||
|  | 							<strong class="ui right">{{CountFmt .IssueStats.ReviewedCount}}</strong> | ||||||
|  | 						</a> | ||||||
| 					{{end}} | 					{{end}} | ||||||
|  | 					<a class="{{if eq .ViewType "mentioned"}}ui basic primary button{{end}} item" href="{{.Link}}?type=mentioned&repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state={{.State}}"> | ||||||
|  | 						{{.locale.Tr "repo.issues.filter_type.mentioning_you"}} | ||||||
|  | 						<strong class="ui right">{{CountFmt .IssueStats.MentionCount}}</strong> | ||||||
|  | 					</a> | ||||||
| 					<div class="ui divider"></div> | 					<div class="ui divider"></div> | ||||||
| 					<a class="{{if not $.RepoIDs}}ui basic primary button{{end}} repo name item" href="{{$.Link}}?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&q={{$.Keyword}}"> | 					<a class="{{if not $.RepoIDs}}ui basic primary button{{end}} repo name item" href="{{$.Link}}?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&q={{$.Keyword}}"> | ||||||
| 						<span class="text truncate">All</span> | 						<span class="text truncate">All</span> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user