dashfolders: fix user group picker + cleanup

This commit is contained in:
Daniel Lee
2017-06-23 20:56:02 +02:00
parent 456225365f
commit 01ac3a49bd
7 changed files with 51 additions and 42 deletions
+1
View File
@@ -66,6 +66,7 @@ func SearchUserGroups(c *middleware.Context) Response {
Name: c.Query("name"), Name: c.Query("name"),
Page: page, Page: page,
Limit: perPage, Limit: perPage,
OrgId: c.OrgId,
} }
if err := bus.Dispatch(&query); err != nil { if err := bus.Dispatch(&query); err != nil {
+1
View File
@@ -55,6 +55,7 @@ type SearchUserGroupsQuery struct {
Name string Name string
Limit int Limit int
Page int Page int
OrgId int64
Result SearchUserGroupQueryResult Result SearchUserGroupQueryResult
} }
+5 -1
View File
@@ -119,12 +119,16 @@ func SearchUserGroups(query *m.SearchUserGroupsQuery) error {
queryWithWildcards := "%" + query.Query + "%" queryWithWildcards := "%" + query.Query + "%"
sess := x.Table("user_group") sess := x.Table("user_group")
sess.Where("org_id=?", query.OrgId)
if query.Query != "" { if query.Query != "" {
sess.Where("name LIKE ?", queryWithWildcards) sess.Where("name LIKE ?", queryWithWildcards)
} }
if query.Name != "" { if query.Name != "" {
sess.Where("name=?", query.Name) sess.Where("name=?", query.Name)
} }
sess.Asc("name")
offset := query.Limit * (query.Page - 1) offset := query.Limit * (query.Page - 1)
sess.Limit(query.Limit, offset) sess.Limit(query.Limit, offset)
sess.Cols("id", "name") sess.Cols("id", "name")
@@ -222,7 +226,7 @@ func GetUserGroupMembers(query *m.GetUserGroupMembersQuery) error {
sess.Join("INNER", "user", fmt.Sprintf("user_group_member.user_id=%s.id", x.Dialect().Quote("user"))) sess.Join("INNER", "user", fmt.Sprintf("user_group_member.user_id=%s.id", x.Dialect().Quote("user")))
sess.Where("user_group_member.user_group_id=?", query.UserGroupId) sess.Where("user_group_member.user_group_id=?", query.UserGroupId)
sess.Cols("user.org_id", "user_group_member.user_group_id", "user_group_member.user_id", "user.email", "user.login") sess.Cols("user.org_id", "user_group_member.user_group_id", "user_group_member.user_id", "user.email", "user.login")
sess.Asc("user.email", "user.login") sess.Asc("user.login", "user.email")
err := sess.Find(&query.Result) err := sess.Find(&query.Result)
return err return err
@@ -5,44 +5,45 @@
<h1>Edit User Group</h1> <h1>Edit User Group</h1>
</div> </div>
<form name="userGroupDetailsForm" class="gf-form-group"> <form name="userGroupDetailsForm" class="gf-form-group gf-form-inline">
<div class="gf-form"> <div class="gf-form">
<span class="gf-form-label width-10">Name</span> <span class="gf-form-label width-10">Name</span>
<input type="text" required ng-model="ctrl.userGroup.name" class="gf-form-input max-width-14" > <input type="text" required ng-model="ctrl.userGroup.name" class="gf-form-input max-width-14" >
</div> </div>
<div class="gf-form-button-row"> <div class="gf-form">
<button type="submit" class="btn btn-success" ng-click="ctrl.update()">Update</button> <button type="submit" class="btn btn-success" ng-click="ctrl.update()">Update</button>
</div> </div>
</form> </form>
<h3 class="page-heading">User Group Members</h3> <div class="gf-form-group">
<h3 class="page-heading">User Group 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">Name</span> <span class="gf-form-label width-10">User</span>
<user-picker user-id="ctrl.userId"></user-picker> <user-picker user-picked="ctrl.userPicked($user)"></user-picker>
</div> </div>
</form>
<div class="gf-form-button-row"> <table class="grafana-options-table" ng-show="ctrl.userGroupMembers.length > 0">
<button type="submit" class="btn btn-success" ng-click="ctrl.addMember()">Add</button> <tr>
</div> <th>Username</th>
</form> <th>Email</th>
<th></th>
<table class="grafana-options-table"> </tr>
<tr> <tr ng-repeat="member in ctrl.userGroupMembers">
<th>Username</th> <td>{{member.login}}</td>
<th>Email</th> <td>{{member.email}}</td>
<th></th> <td style="width: 1%">
</tr> <a ng-click="ctrl.removeUserGroupMember(member)" class="btn btn-danger btn-mini">
<tr ng-repeat="userGroup in ctrl.userGroupMembers"> <i class="fa fa-remove"></i>
<td>{{userGroup.login}}</td> </a>
<td>{{userGroup.email}}</td> </td>
<td style="width: 1%"> </tr>
<a ng-click="ctrl.removeUserGroupMember(userGroup)" class="btn btn-danger btn-mini"> </table>
<i class="fa fa-remove"></i> <div>
</a> <em class="muted" ng-hide="ctrl.userGroupMembers.length > 0">
</td> This user group has no members yet.
</tr> </em>
</table>
</div> </div>
@@ -16,7 +16,7 @@
</span> </span>
</div> </div>
<div class="admin-list-table"> <div class="admin-list-table">
<table class="filter-table form-inline"> <table class="filter-table form-inline" ng-show="ctrl.userGroups.length > 0">
<thead> <thead>
<tr> <tr>
<th>Id</th> <th>Id</th>
@@ -54,4 +54,8 @@
</li> </li>
</ol> </ol>
</div> </div>
<em class="muted" ng-hide="ctrl.userGroups.length > 0">
No User Groups found.
</em>
</div> </div>
@@ -21,18 +21,20 @@ var backendSrv = {
backendSrv: backendSrv, backendSrv: backendSrv,
$routeParams: {id: 1} $routeParams: {id: 1}
}); });
ctx.ctrl.userId = 1;
})); }));
describe('when user is chosen to be added to user group', () => { describe('when user is chosen to be added to user group', () => {
beforeEach(() => { beforeEach(() => {
ctx.ctrl.addMemberForm = {$valid: true}; const userItem = {
ctx.ctrl.addMember(); id: 2,
login: 'user2',
};
ctx.ctrl.userPicked(userItem);
}); });
it('should parse the result and save to db', () => { it('should parse the result and save to db', () => {
expect(backendSrv.post.getCall(0).args[0]).to.eql('/api/user-groups/1/members'); expect(backendSrv.post.getCall(0).args[0]).to.eql('/api/user-groups/1/members');
expect(backendSrv.post.getCall(0).args[1].userId).to.eql(1); expect(backendSrv.post.getCall(0).args[1].userId).to.eql(2);
}); });
it('should refresh the list after saving.', () => { it('should refresh the list after saving.', () => {
@@ -6,9 +6,7 @@ import _ from 'lodash';
export default class UserGroupDetailsCtrl { export default class UserGroupDetailsCtrl {
userGroup: UserGroup; userGroup: UserGroup;
userGroupMembers: User[] = []; userGroupMembers: User[] = [];
userId: number;
navModel: any; navModel: any;
addMemberForm: any;
constructor(private $scope, private $http, private backendSrv, private $routeParams, navModelSrv) { constructor(private $scope, private $http, private backendSrv, private $routeParams, navModelSrv) {
this.navModel = navModelSrv.getOrgNav(3); this.navModel = navModelSrv.getOrgNav(3);
@@ -51,11 +49,9 @@ export default class UserGroupDetailsCtrl {
this.backendSrv.put('/api/user-groups/' + this.userGroup.id, {name: this.userGroup.name}); this.backendSrv.put('/api/user-groups/' + this.userGroup.id, {name: this.userGroup.name});
} }
addMember() { userPicked(user) {
if (!this.addMemberForm.$valid) { return; } this.backendSrv.post(`/api/user-groups/${this.$routeParams.id}/members`, {userId: user.id}).then(() => {
this.$scope.$broadcast('user-picker-reset');
this.backendSrv.post(`/api/user-groups/${this.$routeParams.id}/members`, {userId: this.userId}).then(() => {
this.userId = null;
this.get(); this.get();
}); });
} }