diff --git a/models/issues/issue_stats.go b/models/issues/issue_stats.go index 99ca19f8044b8..8055aef5bcebe 100644 --- a/models/issues/issue_stats.go +++ b/models/issues/issue_stats.go @@ -33,6 +33,7 @@ const ( FilterModeMention FilterModeReviewRequested FilterModeReviewed + FilterModeSearch FilterModeYourRepositories ) diff --git a/models/repo/user_repo.go b/models/repo/user_repo.go index dd2ef6220116b..4eb63955a2a89 100644 --- a/models/repo/user_repo.go +++ b/models/repo/user_repo.go @@ -163,12 +163,17 @@ func GetIssuePostersWithSearch(ctx context.Context, repo *Repository, isPull boo if isShowFullName { prefixCond = prefixCond.Or(builder.Like{"full_name", "%" + search + "%"}) } - - cond := builder.In("`user`.id", - builder.Select("poster_id").From("issue").Where( - builder.Eq{"repo_id": repo.ID}. - And(builder.Eq{"is_pull": isPull}), - ).GroupBy("poster_id")).And(prefixCond) + var cond builder.Cond + if repo != nil { + cond = builder.In("`user`.id", + builder.Select("poster_id").From("issue").Where( + builder.Eq{"repo_id": repo.ID}. + And(builder.Eq{"is_pull": isPull}), + ).GroupBy("poster_id")).And(prefixCond) + } else { + cond = builder.In("`user`.id", + builder.Select("poster_id").From("issue").GroupBy("poster_id")).And(prefixCond) + } return users, db.GetEngine(ctx). Where(cond). diff --git a/routers/web/user/home.go b/routers/web/user/home.go index 44920817c98f9..a3f6e5bbb2cf8 100644 --- a/routers/web/user/home.go +++ b/routers/web/user/home.go @@ -415,6 +415,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { filterMode = issues_model.FilterModeReviewRequested case "reviewed_by": filterMode = issues_model.FilterModeReviewed + case "search": + filterMode = issues_model.FilterModeSearch case "your_repositories": fallthrough default: @@ -495,6 +497,18 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { opts.AllPublic = true } + // Get filter by author id + filterByAuthorID, errorParsingAuthorID := strconv.ParseInt(ctx.FormString("author"), 10, 64) + if errorParsingAuthorID != nil { + filterByAuthorID = 0 + } + + // Get filter by assignee id + filterByAssigneeID, errorParsingAssigneeID := strconv.ParseInt(ctx.FormString("assignee"), 10, 64) + if errorParsingAssigneeID != nil { + filterByAssigneeID = 0 + } + switch filterMode { case issues_model.FilterModeAll: case issues_model.FilterModeYourRepositories: @@ -508,6 +522,9 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { opts.ReviewRequestedID = ctx.Doer.ID case issues_model.FilterModeReviewed: opts.ReviewedID = ctx.Doer.ID + case issues_model.FilterModeSearch: + opts.PosterID = filterByAuthorID + opts.AssigneeID = filterByAssigneeID } // keyword holds the search term entered into the search field. @@ -625,6 +642,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { ctx.Data["SortType"] = sortType ctx.Data["IsShowClosed"] = isShowClosed ctx.Data["SelectLabels"] = selectedLabels + ctx.Data["FilterByAuthorID"] = filterByAuthorID + ctx.Data["FilterByAssigneeID"] = filterByAssigneeID if isShowClosed { ctx.Data["State"] = "closed" @@ -639,7 +658,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { pager.AddParam(ctx, "state", "State") pager.AddParam(ctx, "labels", "SelectLabels") pager.AddParam(ctx, "milestone", "MilestoneID") - pager.AddParam(ctx, "assignee", "AssigneeID") + pager.AddParam(ctx, "assignee", "FilterByAssigneeID") + pager.AddParam(ctx, "author", "FilterByAuthorID") ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, tplIssues) @@ -764,19 +784,6 @@ func UsernameSubRoute(ctx *context.Context) { func getUserIssueStats(ctx *context.Context, ctxUser *user_model.User, filterMode int, opts *issue_indexer.SearchOptions) (*issues_model.IssueStats, error) { doerID := ctx.Doer.ID - opts = opts.Copy(func(o *issue_indexer.SearchOptions) { - // If the doer is the same as the context user, which means the doer is viewing his own dashboard, - // it's not enough to show the repos that the doer owns or has been explicitly granted access to, - // because the doer may create issues or be mentioned in any public repo. - // So we need search issues in all public repos. - o.AllPublic = doerID == ctxUser.ID - o.AssigneeID = nil - o.PosterID = nil - o.MentionID = nil - o.ReviewRequestedID = nil - o.ReviewedID = nil - }) - var ( err error ret = &issues_model.IssueStats{} @@ -799,6 +806,9 @@ func getUserIssueStats(ctx *context.Context, ctxUser *user_model.User, filterMod openClosedOpts.ReviewRequestedID = &doerID case issues_model.FilterModeReviewed: openClosedOpts.ReviewedID = &doerID + case issues_model.FilterModeSearch: + openClosedOpts.PosterID = opts.PosterID + openClosedOpts.AssigneeID = opts.AssigneeID } openClosedOpts.IsClosed = util.OptionalBoolFalse ret.OpenCount, err = issue_indexer.CountIssues(ctx, openClosedOpts) diff --git a/routers/web/web.go b/routers/web/web.go index 92cf5132b45b6..ea8c3361f4847 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -495,10 +495,15 @@ func registerRoutes(m *web.Route) { }, ignExploreSignIn) m.Group("/issues", func() { m.Get("", user.Issues) + m.Get("/posters", repo.IssuePosters) + m.Get("/filter", user.Issues) m.Get("/search", repo.SearchIssues) }, reqSignIn) - m.Get("/pulls", reqSignIn, user.Pulls) + m.Group("/pulls", func() { + m.Get("", user.Pulls) + m.Get("/posters", repo.IssuePosters) + }, reqSignIn) m.Get("/milestones", reqSignIn, reqMilestonesDashboardPageEnabled, user.Milestones) // ***** START: User ***** diff --git a/templates/user/dashboard/issues.tmpl b/templates/user/dashboard/issues.tmpl index 82622366e73bc..1157357320e7c 100644 --- a/templates/user/dashboard/issues.tmpl +++ b/templates/user/dashboard/issues.tmpl @@ -1,6 +1,7 @@ {{template "base/head" .}}