2015-10-08 12:27:09 -04:00
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
2015-09-23 12:49:28 -07:00
// See License.txt for license information.
2015-11-19 21:12:56 -05:00
import * as Client from '../../utils/client.jsx' ;
import * as Utils from '../../utils/utils.jsx' ;
2016-01-24 23:54:49 +09:00
import UserStore from '../../stores/user_store.jsx' ;
2016-01-26 23:05:26 +09:00
import ConfirmModal from '../confirm_modal.jsx' ;
2016-01-27 20:49:33 +09:00
import TeamStore from '../../stores/team_store.jsx' ;
2015-09-23 12:49:28 -07:00
2016-01-30 02:19:41 +09:00
import { injectIntl , intlShape , defineMessages , FormattedMessage } from 'mm-intl' ;
2016-01-31 22:03:30 -03:00
var holders = defineMessages ( {
2016-01-30 02:19:41 +09:00
confirmDemoteRoleTitle : {
id : 'admin.user_item.confirmDemoteRoleTitle' ,
defaultMessage : 'Confirm demotion from System Admin role'
} ,
confirmDemotion : {
id : 'admin.user_item.confirmDemotion' ,
defaultMessage : 'Confirm Demotion'
} ,
confirmDemoteDescription : {
id : 'admin.user_item.confirmDemoteDescription' ,
defaultMessage : 'If you demote yourself from the System Admin role and there is not another user with System Admin privileges, you\'ll need to re-assign a System Admin by accessing the Mattermost server through a terminal and running the following command.'
2016-01-31 22:03:30 -03:00
} ,
confirmDemotionCmd : {
id : 'admin.user_item.confirmDemotionCmd' ,
defaultMessage : 'platform -assign_role -team_name="yourteam" -email="name@yourcompany.com" -role="system_admin"'
2016-01-30 02:19:41 +09:00
}
} ) ;
2016-01-27 15:49:26 -03:00
2015-09-23 12:49:28 -07:00
export default class UserItem extends React . Component {
constructor ( props ) {
super ( props ) ;
this . handleMakeMember = this . handleMakeMember . bind ( this ) ;
this . handleMakeActive = this . handleMakeActive . bind ( this ) ;
this . handleMakeNotActive = this . handleMakeNotActive . bind ( this ) ;
this . handleMakeAdmin = this . handleMakeAdmin . bind ( this ) ;
2015-09-23 15:16:48 -07:00
this . handleMakeSystemAdmin = this . handleMakeSystemAdmin . bind ( this ) ;
2015-09-23 12:49:28 -07:00
this . handleResetPassword = this . handleResetPassword . bind ( this ) ;
2016-01-26 23:05:26 +09:00
this . handleDemote = this . handleDemote . bind ( this ) ;
this . handleDemoteSubmit = this . handleDemoteSubmit . bind ( this ) ;
this . handleDemoteCancel = this . handleDemoteCancel . bind ( this ) ;
2015-09-23 12:49:28 -07:00
2016-01-24 23:54:49 +09:00
this . state = {
serverError : null ,
showDemoteModal : false ,
user : null ,
role : null
} ;
2015-09-23 12:49:28 -07:00
}
handleMakeMember ( e ) {
e . preventDefault ( ) ;
2016-01-27 21:02:21 +09:00
const me = UserStore . getCurrentUser ( ) ;
2016-01-24 23:54:49 +09:00
if ( this . props . user . id === me . id ) {
2016-01-26 23:05:26 +09:00
this . handleDemote ( this . props . user , '' ) ;
2016-01-24 23:54:49 +09:00
} else {
const data = {
user _id : this . props . user . id ,
new _roles : ''
} ;
2015-09-23 12:49:28 -07:00
2016-01-24 23:54:49 +09:00
Client . updateRoles ( data ,
( ) => {
this . props . refreshProfiles ( ) ;
} ,
( err ) => {
this . setState ( { serverError : err . message } ) ;
}
) ;
}
2015-09-23 12:49:28 -07:00
}
handleMakeActive ( e ) {
e . preventDefault ( ) ;
Client . updateActive ( this . props . user . id , true ,
( ) => {
this . props . refreshProfiles ( ) ;
} ,
( err ) => {
this . setState ( { serverError : err . message } ) ;
}
) ;
}
handleMakeNotActive ( e ) {
e . preventDefault ( ) ;
Client . updateActive ( this . props . user . id , false ,
( ) => {
this . props . refreshProfiles ( ) ;
} ,
( err ) => {
this . setState ( { serverError : err . message } ) ;
}
) ;
}
handleMakeAdmin ( e ) {
e . preventDefault ( ) ;
2016-01-27 21:02:21 +09:00
const me = UserStore . getCurrentUser ( ) ;
2016-01-24 23:54:49 +09:00
if ( this . props . user . id === me . id ) {
2016-01-26 23:05:26 +09:00
this . handleDemote ( this . props . user , 'admin' ) ;
2016-01-24 23:54:49 +09:00
} else {
const data = {
user _id : this . props . user . id ,
new _roles : 'admin'
} ;
2015-09-23 12:49:28 -07:00
2016-01-24 23:54:49 +09:00
Client . updateRoles ( data ,
( ) => {
this . props . refreshProfiles ( ) ;
} ,
( err ) => {
this . setState ( { serverError : err . message } ) ;
}
) ;
}
2015-09-23 12:49:28 -07:00
}
2015-09-23 15:16:48 -07:00
handleMakeSystemAdmin ( e ) {
e . preventDefault ( ) ;
const data = {
user _id : this . props . user . id ,
new _roles : 'system_admin'
} ;
Client . updateRoles ( data ,
( ) => {
this . props . refreshProfiles ( ) ;
} ,
( err ) => {
this . setState ( { serverError : err . message } ) ;
}
) ;
}
2015-09-23 12:49:28 -07:00
handleResetPassword ( e ) {
e . preventDefault ( ) ;
this . props . doPasswordReset ( this . props . user ) ;
}
2016-01-26 23:05:26 +09:00
handleDemote ( user , role ) {
2016-01-24 23:54:49 +09:00
this . setState ( {
serverError : this . state . serverError ,
showDemoteModal : true ,
user ,
role
} ) ;
}
2016-01-26 23:05:26 +09:00
handleDemoteCancel ( ) {
2016-01-24 23:54:49 +09:00
this . setState ( {
2016-01-26 23:05:26 +09:00
serverError : null ,
2016-01-24 23:54:49 +09:00
showDemoteModal : false ,
user : null ,
role : null
} ) ;
}
2016-01-26 23:05:26 +09:00
handleDemoteSubmit ( ) {
const data = {
user _id : this . props . user . id ,
2016-01-27 20:49:33 +09:00
new _roles : this . state . role
2016-01-26 23:05:26 +09:00
} ;
Client . updateRoles ( data ,
( ) => {
this . setState ( {
serverError : null ,
showDemoteModal : false ,
user : null ,
role : null
} ) ;
2016-01-27 20:49:33 +09:00
2016-01-27 21:02:21 +09:00
const teamUrl = TeamStore . getCurrentTeamUrl ( ) ;
2016-01-27 20:49:33 +09:00
if ( teamUrl ) {
window . location . href = teamUrl ;
} else {
window . location . href = '/' ;
}
2016-01-26 23:05:26 +09:00
} ,
( err ) => {
this . setState ( {
serverError : err . message
} ) ;
}
) ;
2016-01-24 23:54:49 +09:00
}
2015-09-23 12:49:28 -07:00
render ( ) {
let serverError = null ;
if ( this . state . serverError ) {
serverError = (
< div className = 'has-error' >
< label className = 'has-error control-label' > { this . state . serverError } < / label >
< / div >
) ;
}
const user = this . props . user ;
2016-01-27 15:49:26 -03:00
let currentRoles = (
< FormattedMessage
id = 'admin.user_item.member'
defaultMessage = 'Member'
/ >
) ;
2015-09-23 12:49:28 -07:00
if ( user . roles . length > 0 ) {
2015-10-13 13:20:56 +03:00
if ( Utils . isSystemAdmin ( user . roles ) ) {
2016-01-27 15:49:26 -03:00
currentRoles = (
< FormattedMessage
id = 'admin.user_item.sysAdmin'
defaultMessage = 'System Admin'
/ >
) ;
2015-10-13 13:20:56 +03:00
} else if ( Utils . isAdmin ( user . roles ) ) {
2016-01-27 15:49:26 -03:00
currentRoles = (
< FormattedMessage
id = 'admin.user_item.teamAdmin'
defaultMessage = 'Team Admin'
/ >
) ;
2015-09-23 12:49:28 -07:00
} else {
currentRoles = user . roles . charAt ( 0 ) . toUpperCase ( ) + user . roles . slice ( 1 ) ;
}
}
const email = user . email ;
2015-09-23 15:16:48 -07:00
let showMakeMember = user . roles === 'admin' || user . roles === 'system_admin' ;
let showMakeAdmin = user . roles === '' || user . roles === 'system_admin' ;
let showMakeSystemAdmin = user . roles === '' || user . roles === 'admin' ;
2015-09-23 12:49:28 -07:00
let showMakeActive = false ;
let showMakeNotActive = user . roles !== 'system_admin' ;
if ( user . delete _at > 0 ) {
2016-01-27 15:49:26 -03:00
currentRoles = (
< FormattedMessage
id = 'admin.user_item.inactive'
defaultMessage = 'Inactive'
/ >
) ;
2015-09-23 12:49:28 -07:00
showMakeMember = false ;
showMakeAdmin = false ;
2015-09-23 15:16:48 -07:00
showMakeSystemAdmin = false ;
2015-09-23 12:49:28 -07:00
showMakeActive = true ;
showMakeNotActive = false ;
}
2015-09-23 15:16:48 -07:00
let makeSystemAdmin = null ;
if ( showMakeSystemAdmin ) {
makeSystemAdmin = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleMakeSystemAdmin }
>
2016-01-27 15:49:26 -03:00
< FormattedMessage
id = 'admin.user_item.makeSysAdmin'
defaultMessage = 'Make System Admin'
/ >
2015-09-23 15:16:48 -07:00
< / a >
< / li >
) ;
}
2015-09-23 12:49:28 -07:00
let makeAdmin = null ;
if ( showMakeAdmin ) {
makeAdmin = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleMakeAdmin }
>
2016-01-27 15:49:26 -03:00
< FormattedMessage
id = 'admin.user_item.makeTeamAdmin'
defaultMessage = 'Make Team Admin'
/ >
2015-09-23 12:49:28 -07:00
< / a >
< / li >
) ;
}
let makeMember = null ;
if ( showMakeMember ) {
makeMember = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleMakeMember }
>
2016-01-27 15:49:26 -03:00
< FormattedMessage
id = 'admin.user_item.makeMember'
defaultMessage = 'Make Member'
/ >
2015-09-23 12:49:28 -07:00
< / a >
< / li >
) ;
}
let makeActive = null ;
if ( showMakeActive ) {
makeActive = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleMakeActive }
>
2016-01-27 15:49:26 -03:00
< FormattedMessage
id = 'admin.user_item.makeActive'
defaultMessage = 'Make Active'
/ >
2015-09-23 12:49:28 -07:00
< / a >
< / li >
) ;
}
let makeNotActive = null ;
if ( showMakeNotActive ) {
makeNotActive = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleMakeNotActive }
>
2016-01-27 15:49:26 -03:00
< FormattedMessage
id = 'admin.user_item.makeInactive'
defaultMessage = 'Make Inactive'
/ >
2015-09-23 12:49:28 -07:00
< / a >
< / li >
) ;
}
2016-01-27 21:02:21 +09:00
const me = UserStore . getCurrentUser ( ) ;
2016-01-31 22:03:30 -03:00
const { formatMessage } = this . props . intl ;
2016-01-24 23:54:49 +09:00
let makeDemoteModal = null ;
if ( this . props . user . id === me . id ) {
makeDemoteModal = (
2016-01-26 23:05:26 +09:00
< ConfirmModal
2016-01-24 23:54:49 +09:00
show = { this . state . showDemoteModal }
2016-01-31 22:03:30 -03:00
title = { formatMessage ( holders . confirmDemoteRoleTitle ) }
message = { [ formatMessage ( holders . confirmDemoteDescription ) , React . createElement ( 'br' ) , React . createElement ( 'br' ) , formatMessage ( holders . confirmDemotionCmd ) , serverError ] }
confirm _button = { formatMessage ( holders . confirmDemotion ) }
2016-01-26 23:05:26 +09:00
onConfirm = { this . handleDemoteSubmit }
onCancel = { this . handleDemoteCancel }
2016-01-24 23:54:49 +09:00
/ >
) ;
}
2015-09-23 12:49:28 -07:00
return (
2015-11-05 21:43:41 +05:00
< tr >
< td className = 'row member-div' >
< img
className = 'post-profile-img pull-left'
src = { ` /api/v1/users/ ${ user . id } /image?time= ${ user . update _at } & ${ Utils . getSessionIndex ( ) } ` }
height = '36'
width = '36'
/ >
< span className = 'member-name' > { Utils . getDisplayName ( user ) } < / span >
< span className = 'member-email' > { email } < / span >
< div className = 'dropdown member-drop' >
< a
href = '#'
className = 'dropdown-toggle theme'
type = 'button'
data - toggle = 'dropdown'
aria - expanded = 'true'
>
< span > { currentRoles } < / span >
< span className = 'caret' > < / span >
< / a >
< ul
className = 'dropdown-menu member-menu'
role = 'menu'
>
{ makeAdmin }
{ makeMember }
{ makeActive }
{ makeNotActive }
{ makeSystemAdmin }
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleResetPassword }
>
2016-01-27 15:49:26 -03:00
< FormattedMessage
id = 'admin.user_item.resetPwd'
defaultMessage = 'Reset Password'
/ >
2015-11-05 21:43:41 +05:00
< / a >
< / li >
< / ul >
< / div >
2016-01-24 23:54:49 +09:00
{ makeDemoteModal }
2015-11-05 21:43:41 +05:00
{ serverError }
< / td >
< / tr >
2015-09-23 12:49:28 -07:00
) ;
}
}
UserItem . propTypes = {
2016-01-30 02:19:41 +09:00
intl : intlShape . isRequired ,
2015-09-23 12:49:28 -07:00
user : React . PropTypes . object . isRequired ,
refreshProfiles : React . PropTypes . func . isRequired ,
doPasswordReset : React . PropTypes . func . isRequired
} ;
2016-01-30 02:19:41 +09:00
export default injectIntl ( UserItem ) ;