Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions options/locale/locale_en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -2811,6 +2811,7 @@
"org.teams.add_duplicate_users": "User is already a team member.",
"org.teams.repos.none": "No repositories could be accessed by this team.",
"org.teams.members.none": "No members on this team.",
"org.teams.no_teams": "No teams found.",
"org.teams.members.blocked_user": "Cannot add the user because it is blocked by the organization.",
"org.teams.specific_repositories": "Specific repositories",
"org.teams.specific_repositories_helper": "Members will only have access to repositories explicitly added to the team. Selecting this <strong>will not</strong> automatically remove repositories already added with <i>All repositories</i>.",
Expand Down
29 changes: 27 additions & 2 deletions routers/web/org/teams.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,38 @@ func Teams(ctx *context.Context) {
ctx.Data["Title"] = org.FullName
ctx.Data["PageIsOrgTeams"] = true

for _, t := range ctx.Org.Teams {
page := max(ctx.FormInt("page"), 1)
keyword := ctx.FormTrim("q")

opts := &org_model.SearchTeamOptions{
Keyword: keyword,
OrgID: org.ID,
IncludeDesc: true,
ListOptions: db.ListOptions{
Page: page,
PageSize: setting.UI.MembersPagingNum,
},
}

teams, total, err := org_model.SearchTeam(ctx, opts)
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["Teams"] = teams
ctx.Data["Keyword"] = keyword

pager := context.NewPagination(int(total), setting.UI.MembersPagingNum, page, 5)
pager.AddParamFromRequest(ctx.Req)
ctx.Data["Page"] = pager

ctx.HTML(http.StatusOK, tplTeams)
}
Expand Down
84 changes: 55 additions & 29 deletions templates/org/team/teams.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,70 @@
{{template "org/header" .}}
<div class="ui container">
{{template "base/alert" .}}
{{if .IsOrganizationOwner}}
<div class="flex-text-block tw-justify-end">
<a class="ui primary button" href="{{.OrgLink}}/teams/new">{{svg "octicon-plus"}} {{ctx.Locale.Tr "org.create_new_team"}}</a>

<div class="list-header">
<div class="small-menu-items ui compact tiny menu list-header-search">
<a class="{{if not .Keyword}}active {{end}}item" href="{{$.OrgLink}}/teams">{{ctx.Locale.Tr "all"}}</a>
</div>
<div class="divider"></div>
{{end}}
<form class="list-header-search ui small fluid action input">
<input type="text" name="q" value="{{.Keyword}}" placeholder="{{ctx.Locale.Tr "search.team_kind"}}">
{{template "shared/search/button"}}
</form>
{{if .IsOrganizationOwner}}
<a class="ui primary small button" href="{{.OrgLink}}/teams/new">{{svg "octicon-plus"}} {{ctx.Locale.Tr "org.create_new_team"}}</a>
{{end}}
</div>
<div class="divider"></div>

<div class="ui two column stackable grid">
<div class="flex-list">
{{range .Teams}}
<div class="column">
<div class="ui top attached header">
<a class="text black" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}"><strong>{{.Name}}</strong></a>
<div class="ui right">
<a class="ui primary tiny button" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}">{{ctx.Locale.Tr "view"}}</a>
{{if .IsMember ctx $.SignedUser.ID}}
<form>
<button class="ui red tiny button delete-button" data-modal-id="leave-team"
data-url="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/action/leave" data-datauid="{{$.SignedUser.ID}}"
data-name="{{.Name}}">{{ctx.Locale.Tr "org.teams.leave"}}</button>
</form>
{{else if $.IsOrganizationOwner}}
<form method="post" action="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/action/join">
<button type="submit" class="ui primary tiny button" name="uid" value="{{$.SignedUser.ID}}">{{ctx.Locale.Tr "org.teams.join"}}</button>
</form>
{{end}}
<div class="flex-item tw-items-start">
<div class="flex-item-main">
<div class="flex-item-header">
<div class="flex-item-title">
{{svg "octicon-people" 16}}
<a class="text black" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}"><strong>{{.Name}}</strong></a>
</div>
<div class="flex-item-trailing">
<a class="ui primary tiny button" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}">{{ctx.Locale.Tr "view"}}</a>
{{if .IsMember ctx $.SignedUser.ID}}
<form>
<button class="ui red tiny button delete-button" data-modal-id="leave-team"
data-url="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/action/leave" data-datauid="{{$.SignedUser.ID}}"
data-name="{{.Name}}">{{ctx.Locale.Tr "org.teams.leave"}}</button>
</form>
{{else if $.IsOrganizationOwner}}
<form method="post" action="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/action/join">
<button type="submit" class="ui primary tiny button" name="uid" value="{{$.SignedUser.ID}}">{{ctx.Locale.Tr "org.teams.join"}}</button>
</form>
{{end}}
</div>
</div>
</div>
<div class="ui attached segment members">
{{range .Members}}
{{template "shared/user/avatarlink" dict "user" .}}
{{if .Description}}
<div class="flex-item-body">
{{.Description}}
</div>
{{end}}
</div>
<div class="ui bottom attached header">
<p class="team-meta"><a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}">{{.NumMembers}} {{ctx.Locale.Tr "org.lower_members"}}</a> · <a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/repositories">{{.NumRepos}} {{ctx.Locale.Tr "org.lower_repositories"}}</a></p>
<div class="flex-item-body">
<a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}">{{.NumMembers}} {{ctx.Locale.Tr "org.lower_members"}}</a>
·
<a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/repositories">{{.NumRepos}} {{ctx.Locale.Tr "org.lower_repositories"}}</a>
</div>
<div class="flex-item-body">
{{range .Members}}
{{template "shared/user/avatarlink" dict "user" . "Size" 28}}
{{end}}
</div>
</div>
</div>
{{else}}
<div class="flex-item">
<span class="text grey">{{ctx.Locale.Tr "org.teams.no_teams"}}</span>
</div>
{{end}}
</div>

{{template "base/paginate" .}}
</div>
</div>
<div class="ui g-modal-confirm delete modal" id="leave-team">
Expand Down