Przeglądaj źródła

Merge branch 'team_member_count' of https://github.com/bergquist/grafana into develop

Torkel Ödegaard 8 lat temu
rodzic
commit
8905c8e5fb

+ 1 - 1
pkg/api/team_test.go

@@ -13,7 +13,7 @@ import (
 func TestTeamApiEndpoint(t *testing.T) {
 	Convey("Given two teams", t, func() {
 		mockResult := models.SearchTeamQueryResult{
-			Teams: []*models.Team{
+			Teams: []*models.SearchTeamDto{
 				{Name: "team1"},
 				{Name: "team2"},
 			},

+ 11 - 4
pkg/models/team.go

@@ -60,9 +60,16 @@ type SearchTeamsQuery struct {
 	Result SearchTeamQueryResult
 }
 
+type SearchTeamDto struct {
+	Id          int64  `json:"id"`
+	OrgId       int64  `json:"orgId"`
+	Name        string `json:"name"`
+	MemberCount int64  `json:"memberCount"`
+}
+
 type SearchTeamQueryResult struct {
-	TotalCount int64   `json:"totalCount"`
-	Teams      []*Team `json:"teams"`
-	Page       int     `json:"page"`
-	PerPage    int     `json:"perPage"`
+	TotalCount int64            `json:"totalCount"`
+	Teams      []*SearchTeamDto `json:"teams"`
+	Page       int              `json:"page"`
+	PerPage    int              `json:"perPage"`
 }

+ 30 - 12
pkg/services/sqlstore/team.go

@@ -1,6 +1,7 @@
 package sqlstore
 
 import (
+	"bytes"
 	"fmt"
 	"time"
 
@@ -114,37 +115,54 @@ func isTeamNameTaken(name string, existingId int64, sess *DBSession) (bool, erro
 
 func SearchTeams(query *m.SearchTeamsQuery) error {
 	query.Result = m.SearchTeamQueryResult{
-		Teams: make([]*m.Team, 0),
+		Teams: make([]*m.SearchTeamDto, 0),
 	}
 	queryWithWildcards := "%" + query.Query + "%"
 
-	sess := x.Table("team")
-	sess.Where("org_id=?", query.OrgId)
+	var sql bytes.Buffer
+	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 != "" {
-		sess.Where("name LIKE ?", queryWithWildcards)
+		sql.WriteString(` and team.name ` + dialect.LikeStr() + ` ?`)
+		params = append(params, queryWithWildcards)
 	}
+
 	if query.Name != "" {
-		sess.Where("name=?", 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)
+		params = append(params, query.Limit, offset)
 	}
-	sess.Asc("name")
 
-	offset := query.Limit * (query.Page - 1)
-	sess.Limit(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
 	}
 
 	team := m.Team{}
-
 	countSess := x.Table("team")
 	if query.Query != "" {
-		countSess.Where("name LIKE ?", queryWithWildcards)
+		countSess.Where(`name `+dialect.LikeStr()+` ?`, queryWithWildcards)
 	}
+
 	if query.Name != "" {
 		countSess.Where("name=?", query.Name)
 	}
+
 	count, err := countSess.Count(&team)
 	query.Result.TotalCount = count
 

+ 24 - 21
public/app/features/org/partials/team_details.html

@@ -15,33 +15,36 @@
   </form>
 
   <div class="gf-form-group">
+
     <h3 class="page-heading">Team Members</h3>
 
     <form name="ctrl.addMemberForm" class="gf-form-group">
       <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>
       </div>
     </form>
 
     <table class="filter-table" ng-show="ctrl.teamMembers.length > 0">
-      <tr>
-        <th>Username</th>
-        <th>Email</th>
-        <th></th>
-      </tr>
-      <tr ng-repeat="member in ctrl.teamMembers">
-        <td>{{member.login}}</td>
-        <td>{{member.email}}</td>
-        <td style="width: 1%">
-          <a ng-click="ctrl.removeTeamMember(member)" class="btn btn-danger btn-mini">
-            <i class="fa fa-remove"></i>
-          </a>
-        </td>
-      </tr>
-    </table>
-    <div>
-      <em class="muted" ng-hide="ctrl.teamMembers.length > 0">
-        This team has no members yet.
-      </em>
-    </div>
+			<thead>
+				<tr>
+					<th>Username</th>
+					<th>Email</th>
+					<th></th>
+				</tr>
+			</thead>
+			<tr ng-repeat="member in ctrl.teamMembers">
+				<td>{{member.login}}</td>
+				<td>{{member.email}}</td>
+				<td style="width: 1%">
+					<a ng-click="ctrl.removeTeamMember(member)" class="btn btn-danger btn-mini">
+						<i class="fa fa-remove"></i>
+					</a>
+				</td>
+			</tr>
+		</table>
+		<div>
+			<em class="muted" ng-hide="ctrl.teamMembers.length > 0">
+				This team has no members yet.
+			</em>
+		</div>

+ 1 - 1
public/app/features/org/partials/teams.html

@@ -29,7 +29,7 @@
             <a href="org/teams/edit/{{team.id}}">{{team.name}}</a>
           </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 class="text-right">
             <a ng-click="ctrl.deleteTeam(team)" class="btn btn-danger btn-small">