Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
d110343e
Unverified
Commit
d110343e
authored
Aug 13, 2018
by
Marcus Efraimsson
Committed by
GitHub
Aug 13, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #12838 from grafana/12476-show-teams-on-profile
show teams on profile
parents
bdd9af08
535bab1b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
121 additions
and
41 deletions
+121
-41
docs/sources/http_api/user.md
+33
-0
pkg/api/api.go
+1
-0
pkg/api/user.go
+15
-0
public/app/features/org/partials/profile.html
+62
-41
public/app/features/org/profile_ctrl.ts
+10
-0
No files found.
docs/sources/http_api/user.md
View file @
d110343e
...
@@ -363,6 +363,39 @@ Content-Type: application/json
...
@@ -363,6 +363,39 @@ Content-Type: application/json
]
]
```
```
## Teams that the actual User is member of
`GET /api/user/teams`
Return a list of all teams that the current user is member of.
**Example Request**
:
```
http
GET
/api/user/teams
HTTP
/
1.1
Accept
:
application/json
Content-Type
:
application/json
Authorization
:
Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
```
**Example Response**
:
```
http
HTTP/1.1 200
Content-Type: application/json
[
{
"id": 1,
"orgId": 1,
"name": "MyTestTeam",
"email": "",
"avatarUrl": "\/avatar\/3f49c15916554246daa714b9bd0ee398",
"memberCount": 1
}
]
```
## Star a dashboard
## Star a dashboard
`POST /api/user/stars/dashboard/:dashboardId`
`POST /api/user/stars/dashboard/:dashboardId`
...
...
pkg/api/api.go
View file @
d110343e
...
@@ -120,6 +120,7 @@ func (hs *HTTPServer) registerRoutes() {
...
@@ -120,6 +120,7 @@ func (hs *HTTPServer) registerRoutes() {
userRoute
.
Put
(
"/"
,
bind
(
m
.
UpdateUserCommand
{}),
Wrap
(
UpdateSignedInUser
))
userRoute
.
Put
(
"/"
,
bind
(
m
.
UpdateUserCommand
{}),
Wrap
(
UpdateSignedInUser
))
userRoute
.
Post
(
"/using/:id"
,
Wrap
(
UserSetUsingOrg
))
userRoute
.
Post
(
"/using/:id"
,
Wrap
(
UserSetUsingOrg
))
userRoute
.
Get
(
"/orgs"
,
Wrap
(
GetSignedInUserOrgList
))
userRoute
.
Get
(
"/orgs"
,
Wrap
(
GetSignedInUserOrgList
))
userRoute
.
Get
(
"/teams"
,
Wrap
(
GetSignedInUserTeamList
))
userRoute
.
Post
(
"/stars/dashboard/:id"
,
Wrap
(
StarDashboard
))
userRoute
.
Post
(
"/stars/dashboard/:id"
,
Wrap
(
StarDashboard
))
userRoute
.
Delete
(
"/stars/dashboard/:id"
,
Wrap
(
UnstarDashboard
))
userRoute
.
Delete
(
"/stars/dashboard/:id"
,
Wrap
(
UnstarDashboard
))
...
...
pkg/api/user.go
View file @
d110343e
...
@@ -111,6 +111,21 @@ func GetSignedInUserOrgList(c *m.ReqContext) Response {
...
@@ -111,6 +111,21 @@ func GetSignedInUserOrgList(c *m.ReqContext) Response {
return
getUserOrgList
(
c
.
UserId
)
return
getUserOrgList
(
c
.
UserId
)
}
}
// GET /api/user/teams
func
GetSignedInUserTeamList
(
c
*
m
.
ReqContext
)
Response
{
query
:=
m
.
GetTeamsByUserQuery
{
OrgId
:
c
.
OrgId
,
UserId
:
c
.
UserId
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
return
Error
(
500
,
"Failed to get user teams"
,
err
)
}
for
_
,
team
:=
range
query
.
Result
{
team
.
AvatarUrl
=
dtos
.
GetGravatarUrlWithDefault
(
team
.
Email
,
team
.
Name
)
}
return
JSON
(
200
,
query
.
Result
)
}
// GET /api/user/:id/orgs
// GET /api/user/:id/orgs
func
GetUserOrgList
(
c
*
m
.
ReqContext
)
Response
{
func
GetUserOrgList
(
c
*
m
.
ReqContext
)
Response
{
return
getUserOrgList
(
c
.
ParamsInt64
(
":id"
))
return
getUserOrgList
(
c
.
ParamsInt64
(
":id"
))
...
...
public/app/features/org/partials/profile.html
View file @
d110343e
...
@@ -3,53 +3,74 @@
...
@@ -3,53 +3,74 @@
<div
class=
"page-container page-body"
>
<div
class=
"page-container page-body"
>
<h3
class=
"page-sub-heading"
>
User Profile
</h3>
<h3
class=
"page-sub-heading"
>
User Profile
</h3>
<form
name=
"ctrl.userForm"
class=
"gf-form-group"
>
<form
name=
"ctrl.userForm"
class=
"gf-form-group"
>
<div
class=
"gf-form max-width-30"
>
<div
class=
"gf-form max-width-30"
>
<span
class=
"gf-form-label width-8"
>
Name
</span>
<span
class=
"gf-form-label width-8"
>
Name
</span>
<input
class=
"gf-form-input max-width-22"
type=
"text"
required
ng-model=
"ctrl.user.name"
>
<input
class=
"gf-form-input max-width-22"
type=
"text"
required
ng-model=
"ctrl.user.name"
>
</div>
</div>
<div
class=
"gf-form max-width-30"
>
<div
class=
"gf-form max-width-30"
>
<span
class=
"gf-form-label width-8"
>
Email
</span>
<span
class=
"gf-form-label width-8"
>
Email
</span>
<input
class=
"gf-form-input max-width-22"
type=
"email"
ng-readonly=
"ctrl.readonlyLoginFields"
required
ng-model=
"ctrl.user.email"
>
<input
class=
"gf-form-input max-width-22"
type=
"email"
ng-readonly=
"ctrl.readonlyLoginFields"
required
ng-model=
"ctrl.user.email"
>
<i
ng-if=
"ctrl.readonlyLoginFields"
class=
"fa fa-lock gf-form-icon--right-absolute"
bs-tooltip=
"'Login Details Locked - managed in another system.'"
></i>
<i
ng-if=
"ctrl.readonlyLoginFields"
class=
"fa fa-lock gf-form-icon--right-absolute"
bs-tooltip=
"'Login Details Locked - managed in another system.'"
></i>
</div>
</div>
<div
class=
"gf-form max-width-30"
>
<div
class=
"gf-form max-width-30"
>
<span
class=
"gf-form-label width-8"
>
Username
</span>
<span
class=
"gf-form-label width-8"
>
Username
</span>
<input
class=
"gf-form-input max-width-22"
type=
"text"
ng-readonly=
"ctrl.readonlyLoginFields"
required
ng-model=
"ctrl.user.login"
>
<input
class=
"gf-form-input max-width-22"
type=
"text"
ng-readonly=
"ctrl.readonlyLoginFields"
required
ng-model=
"ctrl.user.login"
>
<i
ng-if=
"ctrl.readonlyLoginFields"
class=
"fa fa-lock gf-form-icon--right-absolute"
bs-tooltip=
"'Login Details Locked - managed in another system.'"
></i>
<i
ng-if=
"ctrl.readonlyLoginFields"
class=
"fa fa-lock gf-form-icon--right-absolute"
bs-tooltip=
"'Login Details Locked - managed in another system.'"
></i>
</div>
</div>
<div
class=
"gf-form-button-row"
>
<div
class=
"gf-form-button-row"
>
<button
type=
"submit"
class=
"btn btn-success"
ng-click=
"ctrl.update()"
>
Save
</button>
<button
type=
"submit"
class=
"btn btn-success"
ng-click=
"ctrl.update()"
>
Save
</button>
</div>
</div>
</form>
</form>
<prefs-control
mode=
"user"
></prefs-control>
<prefs-control
mode=
"user"
></prefs-control>
<h3
class=
"page-heading"
ng-show=
"ctrl.showOrgsList"
>
Organizations
</h3>
<h3
class=
"page-heading"
ng-show=
"ctrl.showTeamsList"
>
Teams
</h3>
<div
class=
"gf-form-group"
ng-show=
"ctrl.showOrgsList"
>
<div
class=
"gf-form-group"
ng-show=
"ctrl.showTeamsList"
>
<table
class=
"filter-table form-inline"
>
<table
class=
"filter-table form-inline"
>
<thead>
<thead>
<tr>
<tr>
<th>
Name
</th>
<th></th>
<th>
Role
</th>
<th>
Name
</th>
<th></th>
<th>
Email
</th>
</tr>
<th>
Members
</th>
</thead>
</tr>
<tbody>
</thead>
<tr
ng-repeat=
"org in ctrl.orgs"
>
<tbody>
<td>
{{org.name}}
</td>
<tr
ng-repeat=
"team in ctrl.teams"
>
<td>
{{org.role}}
</td>
<td
class=
"width-4 text-center"
><img
class=
"filter-table__avatar"
src=
{{team.avatarUrl}}
></td>
<td
class=
"text-right"
>
<td>
{{team.name}}
</td>
<span
class=
"btn btn-primary btn-mini"
ng-show=
"org.orgId === contextSrv.user.orgId"
>
<td>
{{team.email}}
</td>
Current
<td>
{{team.memberCount}}
</td>
</span>
</tr>
<a
ng-click=
"ctrl.setUsingOrg(org)"
class=
"btn btn-inverse btn-mini"
ng-show=
"org.orgId !== contextSrv.user.orgId"
>
</tbody>
Select
</table>
</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h3
class=
"page-heading"
ng-show=
"ctrl.showOrgsList"
>
Organizations
</h3>
<div
class=
"gf-form-group"
ng-show=
"ctrl.showOrgsList"
>
<table
class=
"filter-table form-inline"
>
<thead>
<tr>
<th>
Name
</th>
<th>
Role
</th>
<th></th>
</tr>
</thead>
<tbody>
<tr
ng-repeat=
"org in ctrl.orgs"
>
<td>
{{org.name}}
</td>
<td>
{{org.role}}
</td>
<td
class=
"text-right"
>
<span
class=
"btn btn-primary btn-mini"
ng-show=
"org.orgId === contextSrv.user.orgId"
>
Current
</span>
<a
ng-click=
"ctrl.setUsingOrg(org)"
class=
"btn btn-inverse btn-mini"
ng-show=
"org.orgId !== contextSrv.user.orgId"
>
Select
</a>
</td>
</tr>
</tbody>
</table>
</div>
public/app/features/org/profile_ctrl.ts
View file @
d110343e
...
@@ -4,8 +4,10 @@ import { coreModule } from 'app/core/core';
...
@@ -4,8 +4,10 @@ import { coreModule } from 'app/core/core';
export
class
ProfileCtrl
{
export
class
ProfileCtrl
{
user
:
any
;
user
:
any
;
old_theme
:
any
;
old_theme
:
any
;
teams
:
any
=
[];
orgs
:
any
=
[];
orgs
:
any
=
[];
userForm
:
any
;
userForm
:
any
;
showTeamsList
=
false
;
showOrgsList
=
false
;
showOrgsList
=
false
;
readonlyLoginFields
=
config
.
disableLoginForm
;
readonlyLoginFields
=
config
.
disableLoginForm
;
navModel
:
any
;
navModel
:
any
;
...
@@ -13,6 +15,7 @@ export class ProfileCtrl {
...
@@ -13,6 +15,7 @@ export class ProfileCtrl {
/** @ngInject **/
/** @ngInject **/
constructor
(
private
backendSrv
,
private
contextSrv
,
private
$location
,
navModelSrv
)
{
constructor
(
private
backendSrv
,
private
contextSrv
,
private
$location
,
navModelSrv
)
{
this
.
getUser
();
this
.
getUser
();
this
.
getUserTeams
();
this
.
getUserOrgs
();
this
.
getUserOrgs
();
this
.
navModel
=
navModelSrv
.
getNav
(
'profile'
,
'profile-settings'
,
0
);
this
.
navModel
=
navModelSrv
.
getNav
(
'profile'
,
'profile-settings'
,
0
);
}
}
...
@@ -24,6 +27,13 @@ export class ProfileCtrl {
...
@@ -24,6 +27,13 @@ export class ProfileCtrl {
});
});
}
}
getUserTeams
()
{
this
.
backendSrv
.
get
(
'/api/user/teams'
).
then
(
teams
=>
{
this
.
teams
=
teams
;
this
.
showTeamsList
=
this
.
teams
.
length
>
0
;
});
}
getUserOrgs
()
{
getUserOrgs
()
{
this
.
backendSrv
.
get
(
'/api/user/orgs'
).
then
(
orgs
=>
{
this
.
backendSrv
.
get
(
'/api/user/orgs'
).
then
(
orgs
=>
{
this
.
orgs
=
orgs
;
this
.
orgs
=
orgs
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment