diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go index a57976b4ca8f4..fa0394e6e8cc5 100644 --- a/routers/web/repo/projects.go +++ b/routers/web/repo/projects.go @@ -62,6 +62,7 @@ func Projects(ctx *context.Context) { keyword := ctx.FormTrim("q") repo := ctx.Repo.Repository page := max(ctx.FormInt("page"), 1) + ownerID := repo.OwnerID ctx.Data["OpenCount"] = repo.NumOpenProjects ctx.Data["ClosedCount"] = repo.NumClosedProjects @@ -73,22 +74,71 @@ func Projects(ctx *context.Context) { total = repo.NumClosedProjects } - projects, count, err := db.FindAndCount[project_model.Project](ctx, project_model.SearchOptions{ + projects := make([]*project_model.Project, 0, total) + + repoProjects, count, err := db.FindAndCount[project_model.Project](ctx, project_model.SearchOptions{ ListOptions: db.ListOptions{ PageSize: setting.UI.IssuePagingNum, Page: page, }, - RepoID: repo.ID, IsClosed: optional.Some(isShowClosed), OrderBy: project_model.GetSearchOrderByBySortType(sortType), Type: project_model.TypeRepository, Title: keyword, }) if err != nil { - ctx.ServerError("GetProjects", err) + ctx.ServerError("GetRepoProjects", err) + return + } + projects = append(projects, repoProjects...) + + openOrgProjects, openCountForOrgProjects, err := db.FindAndCount[project_model.Project](ctx, project_model.SearchOptions{ + ListOptions: db.ListOptions{ + PageSize: setting.UI.IssuePagingNum, + Page: page, + }, + OwnerID: ownerID, + IsClosed: optional.Some(false), + OrderBy: project_model.GetSearchOrderByBySortType(sortType), + Type: project_model.TypeOrganization, + Title: keyword, + }) + if err != nil { + ctx.ServerError("GetOrgProjects", err) + return + } + + closeOrgProjects, closeCountForOrgProjects, err := db.FindAndCount[project_model.Project](ctx, project_model.SearchOptions{ + ListOptions: db.ListOptions{ + PageSize: setting.UI.IssuePagingNum, + Page: page, + }, + OwnerID: ownerID, + IsClosed: optional.Some(true), + OrderBy: project_model.GetSearchOrderByBySortType(sortType), + Type: project_model.TypeOrganization, + Title: keyword, + }) + if err != nil { + ctx.ServerError("GetOrgProjects", err) return } + if isShowClosed { + count += closeCountForOrgProjects + total += int(closeCountForOrgProjects) + projects = append(projects, closeOrgProjects...) + } else { + count += openCountForOrgProjects + total += int(openCountForOrgProjects) + projects = append(projects, openOrgProjects...) + } + + totalOpenCount := repo.NumOpenProjects + int(openCountForOrgProjects) + totalCloseCount := repo.NumClosedProjects + int(closeCountForOrgProjects) + ctx.Data["OpenCount"] = totalOpenCount + ctx.Data["ClosedCount"] = totalCloseCount + if err := project_service.LoadIssueNumbersForProjects(ctx, projects, ctx.Doer); err != nil { ctx.ServerError("LoadIssueNumbersForProjects", err) return