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
96cb6d66
Unverified
Commit
96cb6d66
authored
May 10, 2020
by
Rotem Reiss
Committed by
GitHub
May 10, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Admin: Cleanup old admin users edit page, see #19139 (#24463)
parent
e333d61b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
0 additions
and
412 deletions
+0
-412
public/app/features/admin/AdminEditUserCtrl.ts
+0
-224
public/app/features/admin/index.ts
+0
-2
public/app/features/admin/partials/edit_user.html
+0
-186
No files found.
public/app/features/admin/AdminEditUserCtrl.ts
deleted
100644 → 0
View file @
e333d61b
import
_
from
'lodash'
;
import
{
getBackendSrv
}
from
'@grafana/runtime'
;
import
{
NavModelSrv
}
from
'app/core/core'
;
import
{
User
}
from
'app/core/services/context_srv'
;
import
{
UserSession
,
Scope
,
CoreEvents
,
AppEventEmitter
}
from
'app/types'
;
import
{
dateTimeFormatTimeAgo
,
dateTimeFormat
}
from
'@grafana/data'
;
import
{
promiseToDigest
}
from
'app/core/utils/promiseToDigest'
;
export
default
class
AdminEditUserCtrl
{
/** @ngInject */
constructor
(
$scope
:
Scope
&
AppEventEmitter
,
$routeParams
:
any
,
$location
:
any
,
navModelSrv
:
NavModelSrv
)
{
$scope
.
user
=
{};
$scope
.
sessions
=
[];
$scope
.
newOrg
=
{
name
:
''
,
role
:
'Editor'
};
$scope
.
permissions
=
{};
$scope
.
navModel
=
navModelSrv
.
getNav
(
'admin'
,
'global-users'
,
0
);
$scope
.
init
=
()
=>
{
if
(
$routeParams
.
id
)
{
promiseToDigest
(
$scope
)(
Promise
.
all
([
$scope
.
getUser
(
$routeParams
.
id
),
$scope
.
getUserSessions
(
$routeParams
.
id
),
$scope
.
getUserOrgs
(
$routeParams
.
id
),
])
);
}
};
$scope
.
getUser
=
(
id
:
number
)
=>
{
return
getBackendSrv
()
.
get
(
'/api/users/'
+
id
)
.
then
((
user
:
User
)
=>
{
$scope
.
user
=
user
;
$scope
.
user_id
=
id
;
$scope
.
permissions
.
isGrafanaAdmin
=
user
.
isGrafanaAdmin
;
});
};
$scope
.
getUserSessions
=
(
id
:
number
)
=>
{
return
getBackendSrv
()
.
get
(
'/api/admin/users/'
+
id
+
'/auth-tokens'
)
.
then
((
sessions
:
UserSession
[])
=>
{
sessions
.
reverse
();
$scope
.
sessions
=
sessions
.
map
((
session
:
UserSession
)
=>
{
return
{
id
:
session
.
id
,
isActive
:
session
.
isActive
,
seenAt
:
dateTimeFormatTimeAgo
(
session
.
seenAt
),
createdAt
:
dateTimeFormat
(
session
.
createdAt
,
{
format
:
'MMMM DD, YYYY'
}),
clientIp
:
session
.
clientIp
,
browser
:
session
.
browser
,
browserVersion
:
session
.
browserVersion
,
os
:
session
.
os
,
osVersion
:
session
.
osVersion
,
device
:
session
.
device
,
};
});
});
};
$scope
.
revokeUserSession
=
(
tokenId
:
number
)
=>
{
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
post
(
'/api/admin/users/'
+
$scope
.
user_id
+
'/revoke-auth-token'
,
{
authTokenId
:
tokenId
,
})
.
then
(()
=>
{
$scope
.
sessions
=
$scope
.
sessions
.
filter
((
session
:
UserSession
)
=>
{
if
(
session
.
id
===
tokenId
)
{
return
false
;
}
return
true
;
});
})
);
};
$scope
.
revokeAllUserSessions
=
(
tokenId
:
number
)
=>
{
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
post
(
'/api/admin/users/'
+
$scope
.
user_id
+
'/logout'
)
.
then
(()
=>
{
$scope
.
sessions
=
[];
})
);
};
$scope
.
setPassword
=
()
=>
{
if
(
!
$scope
.
passwordForm
.
$valid
)
{
return
;
}
const
payload
=
{
password
:
$scope
.
password
};
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
put
(
'/api/admin/users/'
+
$scope
.
user_id
+
'/password'
,
payload
)
.
then
(()
=>
{
$location
.
path
(
'/admin/users'
);
})
);
};
$scope
.
updatePermissions
=
()
=>
{
const
payload
=
$scope
.
permissions
;
getBackendSrv
().
put
(
'/api/admin/users/'
+
$scope
.
user_id
+
'/permissions'
,
payload
);
};
$scope
.
getUserOrgs
=
(
id
:
number
)
=>
{
return
getBackendSrv
()
.
get
(
'/api/users/'
+
id
+
'/orgs'
)
.
then
((
orgs
:
any
)
=>
{
$scope
.
orgs
=
orgs
;
});
};
$scope
.
update
=
()
=>
{
if
(
!
$scope
.
userForm
.
$valid
)
{
return
;
}
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
put
(
'/api/users/'
+
$scope
.
user_id
,
$scope
.
user
)
.
then
(()
=>
{
$location
.
path
(
'/admin/users'
);
})
);
};
$scope
.
updateOrgUser
=
(
orgUser
:
{
orgId
:
string
})
=>
{
promiseToDigest
(
$scope
)(
getBackendSrv
().
patch
(
'/api/orgs/'
+
orgUser
.
orgId
+
'/users/'
+
$scope
.
user_id
,
orgUser
)
);
};
$scope
.
removeOrgUser
=
(
orgUser
:
{
orgId
:
string
})
=>
{
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
delete
(
'/api/orgs/'
+
orgUser
.
orgId
+
'/users/'
+
$scope
.
user_id
)
.
then
(()
=>
Promise
.
all
([
$scope
.
getUser
(
$scope
.
user_id
),
$scope
.
getUserOrgs
(
$scope
.
user_id
)]))
);
};
$scope
.
orgsSearchCache
=
[];
$scope
.
searchOrgs
=
(
queryStr
:
any
,
callback
:
any
)
=>
{
if
(
$scope
.
orgsSearchCache
.
length
>
0
)
{
callback
(
_
.
map
(
$scope
.
orgsSearchCache
,
'name'
));
return
;
}
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
get
(
'/api/orgs'
,
{
query
:
''
})
.
then
((
result
:
any
)
=>
{
$scope
.
orgsSearchCache
=
result
;
callback
(
_
.
map
(
result
,
'name'
));
})
);
};
$scope
.
addOrgUser
=
()
=>
{
if
(
!
$scope
.
addOrgForm
.
$valid
)
{
return
;
}
const
orgInfo
:
any
=
_
.
find
(
$scope
.
orgsSearchCache
,
{
name
:
$scope
.
newOrg
.
name
,
});
if
(
!
orgInfo
)
{
return
;
}
$scope
.
newOrg
.
loginOrEmail
=
$scope
.
user
.
login
;
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
post
(
'/api/orgs/'
+
orgInfo
.
id
+
'/users/'
,
$scope
.
newOrg
)
.
then
(()
=>
Promise
.
all
([
$scope
.
getUser
(
$scope
.
user_id
),
$scope
.
getUserOrgs
(
$scope
.
user_id
)]))
);
};
$scope
.
deleteUser
=
(
user
:
any
)
=>
{
$scope
.
appEvent
(
CoreEvents
.
showConfirmModal
,
{
title
:
'Delete'
,
text
:
'Do you want to delete '
+
user
.
login
+
'?'
,
icon
:
'trash-alt'
,
yesText
:
'Delete'
,
onConfirm
:
()
=>
{
promiseToDigest
(
$scope
)(
getBackendSrv
()
.
delete
(
'/api/admin/users/'
+
user
.
id
)
.
then
(()
=>
{
$location
.
path
(
'/admin/users'
);
})
);
},
});
};
$scope
.
disableUser
=
(
event
:
any
)
=>
{
const
user
=
$scope
.
user
;
// External user can not be disabled
if
(
user
.
isExternal
)
{
event
.
preventDefault
();
event
.
stopPropagation
();
return
;
}
const
actionEndpoint
=
user
.
isDisabled
?
'/enable'
:
'/disable'
;
getBackendSrv
()
.
post
(
'/api/admin/users/'
+
user
.
id
+
actionEndpoint
)
.
then
(()
=>
$scope
.
init
());
};
$scope
.
init
();
}
}
public/app/features/admin/index.ts
View file @
96cb6d66
import
AdminEditUserCtrl
from
'./AdminEditUserCtrl'
;
import
AdminEditOrgCtrl
from
'./AdminEditOrgCtrl'
;
import
coreModule
from
'app/core/core_module'
;
...
...
@@ -13,6 +12,5 @@ class AdminHomeCtrl {
}
}
coreModule
.
controller
(
'AdminEditUserCtrl'
,
AdminEditUserCtrl
);
coreModule
.
controller
(
'AdminEditOrgCtrl'
,
AdminEditOrgCtrl
);
coreModule
.
controller
(
'AdminHomeCtrl'
,
AdminHomeCtrl
);
public/app/features/admin/partials/edit_user.html
deleted
100644 → 0
View file @
e333d61b
<page-header
model=
"navModel"
></page-header>
<div
class=
"page-container page-body"
>
<h3
class=
"page-sub-heading"
>
Edit User
</h3>
<form
name=
"userForm"
class=
"gf-form-group"
>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-10"
>
Name
</span>
<input
type=
"text"
required
ng-model=
"user.name"
class=
"gf-form-input max-width-25"
/>
</div>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-10"
>
Email
</span>
<input
type=
"email"
ng-model=
"user.email"
class=
"gf-form-input max-width-25"
/>
</div>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-10"
>
Username
</span>
<input
type=
"text"
ng-model=
"user.login"
class=
"gf-form-input max-width-25"
/>
</div>
<div
class=
"gf-form-button-row"
>
<button
type=
"submit"
class=
"btn btn-primary"
ng-click=
"update()"
ng-show=
"!createMode"
>
Update
</button>
</div>
</form>
<h3
class=
"page-heading"
>
Change password
</h3>
<form
name=
"passwordForm"
class=
"gf-form-group"
>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label width-10"
>
New password
</span>
<input
type=
"password"
required
ng-minlength=
"4"
ng-model=
"password"
class=
"gf-form-input max-width-25"
/>
</div>
<div
class=
"gf-form-button-row"
>
<button
type=
"submit"
class=
"btn btn-primary"
ng-click=
"setPassword()"
>
Update
</button>
</div>
</form>
<h3
class=
"page-heading"
>
Permissions
</h3>
<form
name=
"passwordForm"
class=
"gf-form-group"
>
<div
class=
"gf-form"
>
<gf-form-switch
class=
"gf-form"
label=
"Grafana Admin"
checked=
"permissions.isGrafanaAdmin"
switch-class=
"max-width-6"
on-change=
"updatePermissions()"
></gf-form-switch>
</div>
</form>
<h3
class=
"page-heading"
>
Organizations
</h3>
<form
name=
"addOrgForm"
class=
"gf-form-group"
>
<div
class=
"gf-form-inline"
>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label"
>
Add
</span>
<input
type=
"text"
ng-model=
"newOrg.name"
bs-typeahead=
"searchOrgs"
required
class=
"gf-form-input max-width-20"
placeholder=
"organization name"
/>
</div>
<div
class=
"gf-form"
>
<span
class=
"gf-form-label"
>
Role
</span>
<span
class=
"gf-form-select-wrapper"
>
<select
type=
"text"
ng-model=
"newOrg.role"
class=
"gf-form-input width-10"
ng-options=
"f for f in ['Viewer', 'Editor', 'Admin']"
></select>
</span>
</div>
<div
class=
"gf-form"
>
<button
class=
"btn btn-primary gf-form-btn"
ng-click=
"addOrgUser()"
>
Add
</button>
</div>
</div>
</form>
<div
class=
"gf-form-group"
>
<table
class=
"filter-table"
>
<thead>
<tr>
<th>
Name
</th>
<th>
Role
</th>
<th></th>
</tr>
</thead>
<tr
ng-repeat=
"org in orgs"
>
<td>
{{org.name}}
<span
class=
"label label-info"
ng-show=
"org.orgId === user.orgId"
>
Current
</span></td>
<td>
<div
class=
"gf-form"
>
<span
class=
"gf-form-select-wrapper"
>
<select
type=
"text"
ng-model=
"org.role"
class=
"gf-form-input max-width-12"
ng-options=
"f for f in ['Viewer', 'Editor', 'Admin']"
ng-change=
"updateOrgUser(org)"
>
</select>
</span>
</div>
</td>
<td
style=
"width: 1%"
>
<a
ng-click=
"removeOrgUser(org)"
class=
"btn btn-danger btn-small"
>
<icon
name=
"'times'"
style=
"margin-bottom: 0;"
></icon>
</a>
</td>
</tr>
</table>
</div>
<h3
class=
"page-heading"
>
Sessions
</h3>
<div
class=
"gf-form-group"
>
<div
class=
"gf-form"
>
<table
class=
"filter-table form-inline"
>
<thead>
<tr>
<th>
Last seen
</th>
<th>
Logged on
</th>
<th>
IP address
</th>
<th>
Browser
&
OS
</th>
<th></th>
</tr>
</thead>
<tbody>
<tr
ng-repeat=
"session in sessions"
>
<td
ng-if=
"session.isActive"
>
Now
</td>
<td
ng-if=
"!session.isActive"
>
{{session.seenAt}}
</td>
<td>
{{session.createdAt}}
</td>
<td>
{{session.clientIp}}
</td>
<td>
{{session.browser}} on {{session.os}} {{session.osVersion}}
</td>
<td>
<button
class=
"btn btn-danger btn-small"
ng-click=
"revokeUserSession(session.id)"
>
<icon
name=
"'power'"
style=
"margin-top: -2px;"
></icon>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<div
class=
"gf-form-button-row"
>
<button
ng-if=
"sessions.length"
class=
"btn btn-danger"
ng-click=
"revokeAllUserSessions()"
>
Logout user from all devices
</button>
</div>
</div>
<h3
class=
"page-heading"
>
User status
</h3>
<div
class=
"gf-form-group"
>
<div
class=
"gf-form-button-row"
>
<button
type=
"submit"
class=
"btn btn-danger"
ng-if=
"!user.isDisabled"
ng-click=
"disableUser($event)"
bs-tooltip=
"user.isExternal ? 'External user cannot be enabled or disabled' : ''"
ng-class=
"{'disabled': user.isExternal}"
>
Disable
</button>
<button
type=
"submit"
class=
"btn btn-primary"
ng-if=
"user.isDisabled"
ng-click=
"disableUser($event)"
bs-tooltip=
"user.isExternal ? 'External user cannot be enabled or disabled' : ''"
ng-class=
"{'disabled': user.isExternal}"
>
Enable
</button>
<button
type=
"submit"
class=
"btn btn-danger"
ng-click=
"deleteUser(user)"
ng-show=
"!createMode"
>
Delete User
</button>
</div>
</div>
</div>
<footer
/>
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