{{ctx.Locale.Tr "org.teams.leave.detail" (HTMLFormat `` "name")}}
-diff --git a/models/organization/team_list.go b/models/organization/team_list.go index 0274f9c5ba4..5629cec3661 100644 --- a/models/organization/team_list.go +++ b/models/organization/team_list.go @@ -88,7 +88,7 @@ func SearchTeam(ctx context.Context, opts *SearchTeamOptions) (TeamList, int64, sess = db.SetSessionPagination(sess, opts) teams := make([]*Team, 0, opts.PageSize) - count, err := sess.Where(cond).OrderBy("lower_name").FindAndCount(&teams) + count, err := sess.Where(cond).OrderBy("CASE WHEN name=? THEN '' ELSE lower_name END", OwnerTeamName).FindAndCount(&teams) if err != nil { return nil, 0, err } diff --git a/options/locale/locale_en-US.json b/options/locale/locale_en-US.json index 7e3ace5be17..343a672dc01 100644 --- a/options/locale/locale_en-US.json +++ b/options/locale/locale_en-US.json @@ -2826,7 +2826,7 @@ "org.teams.manage_team_member_prompt": "Members are managed through teams. Add users to a team to invite them to this organization.", "org.teams.update_settings": "Update Settings", "org.teams.delete_team": "Delete Team", - "org.teams.add_team_member": "Add Team Member", + "org.teams.add_team_member": "Add team member", "org.teams.invite_team_member": "Invite to %s", "org.teams.invite_team_member.list": "Pending Invitations", "org.teams.delete_team_title": "Delete Team", diff --git a/routers/web/org/home.go b/routers/web/org/home.go index e18a8de40f6..262b001e6a2 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -98,8 +98,10 @@ func home(ctx *context.Context, viewRepositories bool) { ctx.ServerError("FindOrgMembers", err) return } - ctx.Data["Members"] = members - ctx.Data["Teams"] = ctx.Org.Teams + + const orgOverviewTeamsLimit = 5 + ctx.Data["OrgOverviewMembers"] = members + ctx.Data["OrgOverviewTeams"] = ctx.Org.Teams[:min(len(ctx.Org.Teams), orgOverviewTeamsLimit)] ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull ctx.Data["ShowMemberAndTeamTab"] = ctx.Org.IsMember || len(members) > 0 diff --git a/routers/web/org/teams.go b/routers/web/org/teams.go index 1e22a670320..10803c9fbf5 100644 --- a/routers/web/org/teams.go +++ b/routers/web/org/teams.go @@ -22,6 +22,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" shared_user "code.gitea.io/gitea/routers/web/shared/user" "code.gitea.io/gitea/services/context" @@ -54,13 +55,54 @@ func Teams(ctx *context.Context) { ctx.Data["Title"] = org.FullName ctx.Data["PageIsOrgTeams"] = true - for _, t := range ctx.Org.Teams { + keyword := ctx.FormTrim("q") + page := max(ctx.FormInt("page"), 1) + pagingNum := setting.UI.MembersPagingNum + + searchTeams := func() (teams []*org_model.Team, count int64, err error) { + if keyword == "" { + // fast path, use existing teams in context if no need to filter from database + count = int64(len(ctx.Org.Teams)) + start := (page - 1) * pagingNum + if start > len(ctx.Org.Teams) { + return nil, count, nil + } + end := min(start+pagingNum, len(ctx.Org.Teams)) + return ctx.Org.Teams[start:end], count, nil + } + + shouldSeeAllOrgTeams, err := context.UserShouldSeeAllOrgTeams(ctx) + if err != nil { + return nil, 0, err + } + opts := &org_model.SearchTeamOptions{ + OrgID: org.ID, + UserID: util.Iif(shouldSeeAllOrgTeams, 0, ctx.Doer.ID), + Keyword: keyword, + IncludeDesc: true, + ListOptions: db.ListOptions{Page: page, PageSize: pagingNum}, + } + return org_model.SearchTeam(ctx, opts) + } + + teams, count, err := searchTeams() + if err != nil { + ctx.ServerError("SearchTeam", err) + return + } + + for _, t := range teams { if err := t.LoadMembers(ctx); err != nil { ctx.ServerError("GetMembers", err) return } } - ctx.Data["Teams"] = ctx.Org.Teams + + ctx.Data["OrgListTeams"] = teams + ctx.Data["Keyword"] = keyword + pager := context.NewPagination(count, setting.UI.MembersPagingNum, page, 5) + pager.AddParamFromRequest(ctx.Req) + ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, tplTeams) } @@ -213,7 +255,7 @@ func checkIsOrgMemberAndRedirect(ctx *context.Context, defaultRedirect string) { if isOrgMember, err := org_model.IsOrganizationMember(ctx, ctx.Org.Organization.ID, ctx.Doer.ID); err != nil { ctx.ServerError("IsOrganizationMember", err) return - } else if !isOrgMember { + } else if !isOrgMember && !ctx.Doer.IsAdmin { if ctx.Org.Organization.Visibility.IsPrivate() { defaultRedirect = setting.AppSubURL + "/" } else { diff --git a/services/context/org.go b/services/context/org.go index bd20d807efc..96be5bcaa69 100644 --- a/services/context/org.go +++ b/services/context/org.go @@ -174,23 +174,12 @@ func OrgAssignment(orgAssignmentOpts OrgAssignmentOptions) func(ctx *Context) { } // Team. + shouldSeeAllTeams, err := UserShouldSeeAllOrgTeams(ctx) + if err != nil { + ctx.ServerError("UserShouldSeeAllOrgTeams", err) + return + } if ctx.Org.IsMember { - shouldSeeAllTeams := false - if ctx.Org.IsOwner { - shouldSeeAllTeams = true - } else { - teams, err := org.GetUserTeams(ctx, ctx.Doer.ID) - if err != nil { - ctx.ServerError("GetUserTeams", err) - return - } - for _, team := range teams { - if team.IncludesAllRepositories && team.HasAdminAccess() { - shouldSeeAllTeams = true - break - } - } - } if shouldSeeAllTeams { ctx.Org.Teams, err = org.LoadTeams(ctx) if err != nil { @@ -255,3 +244,25 @@ func OrgAssignment(orgAssignmentOpts OrgAssignmentOptions) func(ctx *Context) { } } } + +// UserShouldSeeAllOrgTeams tells if a user has permission to view all teams in the org. +func UserShouldSeeAllOrgTeams(ctx *Context) (bool, error) { + if !ctx.Org.IsMember { + return false, nil + } + + if ctx.Org.IsOwner { + return true, nil + } + + teams, err := ctx.Org.Organization.GetUserTeams(ctx, ctx.Doer.ID) + if err != nil { + return false, err + } + for _, team := range teams { + if team.IncludesAllRepositories && team.HasAdminAccess() { + return true, nil + } + } + return false, nil +} diff --git a/templates/org/home.tmpl b/templates/org/home.tmpl index b7d037c9e1c..7132743d0c8 100644 --- a/templates/org/home.tmpl +++ b/templates/org/home.tmpl @@ -60,10 +60,9 @@ {{.NumMembers}} {{svg "octicon-chevron-right"}}
diff --git a/templates/org/team/new.tmpl b/templates/org/team/new.tmpl index abf728fc544..f8785bb466a 100644 --- a/templates/org/team/new.tmpl +++ b/templates/org/team/new.tmpl @@ -20,7 +20,7 @@
{{ctx.Locale.Tr "org.teams.leave.detail" (HTMLFormat `` "name")}}
-{{ctx.Locale.Tr "org.teams.leave.detail" (HTMLFormat `` "name")}}
-