mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Merge branch 'team_member_count' of https://github.com/bergquist/grafana into develop
This commit is contained in:
@@ -13,7 +13,7 @@ import (
|
|||||||
func TestTeamApiEndpoint(t *testing.T) {
|
func TestTeamApiEndpoint(t *testing.T) {
|
||||||
Convey("Given two teams", t, func() {
|
Convey("Given two teams", t, func() {
|
||||||
mockResult := models.SearchTeamQueryResult{
|
mockResult := models.SearchTeamQueryResult{
|
||||||
Teams: []*models.Team{
|
Teams: []*models.SearchTeamDto{
|
||||||
{Name: "team1"},
|
{Name: "team1"},
|
||||||
{Name: "team2"},
|
{Name: "team2"},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -60,9 +60,16 @@ type SearchTeamsQuery struct {
|
|||||||
Result SearchTeamQueryResult
|
Result SearchTeamQueryResult
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SearchTeamDto struct {
|
||||||
|
Id int64 `json:"id"`
|
||||||
|
OrgId int64 `json:"orgId"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
MemberCount int64 `json:"memberCount"`
|
||||||
|
}
|
||||||
|
|
||||||
type SearchTeamQueryResult struct {
|
type SearchTeamQueryResult struct {
|
||||||
TotalCount int64 `json:"totalCount"`
|
TotalCount int64 `json:"totalCount"`
|
||||||
Teams []*Team `json:"teams"`
|
Teams []*SearchTeamDto `json:"teams"`
|
||||||
Page int `json:"page"`
|
Page int `json:"page"`
|
||||||
PerPage int `json:"perPage"`
|
PerPage int `json:"perPage"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package sqlstore
|
package sqlstore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -114,37 +115,54 @@ func isTeamNameTaken(name string, existingId int64, sess *DBSession) (bool, erro
|
|||||||
|
|
||||||
func SearchTeams(query *m.SearchTeamsQuery) error {
|
func SearchTeams(query *m.SearchTeamsQuery) error {
|
||||||
query.Result = m.SearchTeamQueryResult{
|
query.Result = m.SearchTeamQueryResult{
|
||||||
Teams: make([]*m.Team, 0),
|
Teams: make([]*m.SearchTeamDto, 0),
|
||||||
}
|
}
|
||||||
queryWithWildcards := "%" + query.Query + "%"
|
queryWithWildcards := "%" + query.Query + "%"
|
||||||
|
|
||||||
sess := x.Table("team")
|
var sql bytes.Buffer
|
||||||
sess.Where("org_id=?", query.OrgId)
|
params := make([]interface{}, 0)
|
||||||
|
|
||||||
|
sql.WriteString(`select
|
||||||
|
team.id as id,
|
||||||
|
team.name as name,
|
||||||
|
(select count(*) from team_member where team_member.team_id = team.id) as member_count
|
||||||
|
from team as team
|
||||||
|
where team.org_id = ?`)
|
||||||
|
|
||||||
|
params = append(params, query.OrgId)
|
||||||
|
|
||||||
if query.Query != "" {
|
if query.Query != "" {
|
||||||
sess.Where("name LIKE ?", queryWithWildcards)
|
sql.WriteString(` and team.name ` + dialect.LikeStr() + ` ?`)
|
||||||
|
params = append(params, queryWithWildcards)
|
||||||
}
|
}
|
||||||
if query.Name != "" {
|
|
||||||
sess.Where("name=?", query.Name)
|
|
||||||
}
|
|
||||||
sess.Asc("name")
|
|
||||||
|
|
||||||
|
if query.Name != "" {
|
||||||
|
sql.WriteString(` and team.name = ?`)
|
||||||
|
params = append(params, query.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
sql.WriteString(` order by team.name asc`)
|
||||||
|
|
||||||
|
if query.Limit != 0 {
|
||||||
|
sql.WriteString(` limit ? offset ?`)
|
||||||
offset := query.Limit * (query.Page - 1)
|
offset := query.Limit * (query.Page - 1)
|
||||||
sess.Limit(query.Limit, offset)
|
params = append(params, query.Limit, offset)
|
||||||
sess.Cols("id", "name")
|
}
|
||||||
if err := sess.Find(&query.Result.Teams); err != nil {
|
|
||||||
|
if err := x.Sql(sql.String(), params...).Find(&query.Result.Teams); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
team := m.Team{}
|
team := m.Team{}
|
||||||
|
|
||||||
countSess := x.Table("team")
|
countSess := x.Table("team")
|
||||||
if query.Query != "" {
|
if query.Query != "" {
|
||||||
countSess.Where("name LIKE ?", queryWithWildcards)
|
countSess.Where(`name `+dialect.LikeStr()+` ?`, queryWithWildcards)
|
||||||
}
|
}
|
||||||
|
|
||||||
if query.Name != "" {
|
if query.Name != "" {
|
||||||
countSess.Where("name=?", query.Name)
|
countSess.Where("name=?", query.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
count, err := countSess.Count(&team)
|
count, err := countSess.Count(&team)
|
||||||
query.Result.TotalCount = count
|
query.Result.TotalCount = count
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,24 @@
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div class="gf-form-group">
|
<div class="gf-form-group">
|
||||||
|
|
||||||
<h3 class="page-heading">Team Members</h3>
|
<h3 class="page-heading">Team Members</h3>
|
||||||
|
|
||||||
<form name="ctrl.addMemberForm" class="gf-form-group">
|
<form name="ctrl.addMemberForm" class="gf-form-group">
|
||||||
<div class="gf-form">
|
<div class="gf-form">
|
||||||
<span class="gf-form-label width-10">User</span>
|
<span class="gf-form-label width-10">Add member</span>
|
||||||
<user-picker user-picked="ctrl.userPicked($user)"></user-picker>
|
<user-picker user-picked="ctrl.userPicked($user)"></user-picker>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<table class="filter-table" ng-show="ctrl.teamMembers.length > 0">
|
<table class="filter-table" ng-show="ctrl.teamMembers.length > 0">
|
||||||
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Username</th>
|
<th>Username</th>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
|
</thead>
|
||||||
<tr ng-repeat="member in ctrl.teamMembers">
|
<tr ng-repeat="member in ctrl.teamMembers">
|
||||||
<td>{{member.login}}</td>
|
<td>{{member.login}}</td>
|
||||||
<td>{{member.email}}</td>
|
<td>{{member.email}}</td>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
<a href="org/teams/edit/{{team.id}}">{{team.name}}</a>
|
<a href="org/teams/edit/{{team.id}}">{{team.name}}</a>
|
||||||
</td>
|
</td>
|
||||||
<td class="link-td">
|
<td class="link-td">
|
||||||
<a href="org/teams/edit/{{team.id}}">#Count</a>
|
<a href="org/teams/edit/{{team.id}}">{{team.memberCount}}</a>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<a ng-click="ctrl.deleteTeam(team)" class="btn btn-danger btn-small">
|
<a ng-click="ctrl.deleteTeam(team)" class="btn btn-danger btn-small">
|
||||||
|
|||||||
Reference in New Issue
Block a user