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.
2016-04-21 22:37:01 -07:00
import Client from 'utils/web_client.jsx' ;
2016-03-14 08:50:46 -04:00
import * as Utils from 'utils/utils.jsx' ;
import UserStore from 'stores/user_store.jsx' ;
2016-01-26 23:05:26 +09:00
import ConfirmModal from '../confirm_modal.jsx' ;
2016-03-14 08:50:46 -04:00
import TeamStore from 'stores/team_store.jsx' ;
2015-09-23 12:49:28 -07:00
2016-04-21 22:37:01 -07:00
import { FormattedMessage , FormattedHTMLMessage } from 'react-intl' ;
2016-03-14 08:50:46 -04:00
import React from 'react' ;
2016-03-24 11:05:13 -04:00
import { browserHistory } from 'react-router' ;
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-04-21 22:37:01 -07:00
this . handleResetMfa = this . handleResetMfa . 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 {
2016-04-21 22:37:01 -07:00
Client . updateRoles (
2016-05-06 11:28:22 -07:00
this . props . team . id ,
2016-04-21 22:37:01 -07:00
this . props . user . id ,
'' ,
2016-01-24 23:54:49 +09:00
( ) => {
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 {
2016-04-21 22:37:01 -07:00
Client . updateRoles (
2016-05-06 11:28:22 -07:00
this . props . team . id ,
2016-04-21 22:37:01 -07:00
this . props . user . id ,
'admin' ,
2016-01-24 23:54:49 +09:00
( ) => {
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 ( ) ;
2016-04-21 22:37:01 -07:00
Client . updateRoles (
2016-05-06 11:28:22 -07:00
this . props . team . id ,
2016-04-21 22:37:01 -07:00
this . props . user . id ,
'system_admin' ,
2015-09-23 15:16:48 -07:00
( ) => {
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-04-21 22:37:01 -07:00
handleResetMfa ( e ) {
e . preventDefault ( ) ;
Client . adminResetMfa ( this . props . user . id ,
( ) => {
this . props . refreshProfiles ( ) ;
} ,
( err ) => {
this . setState ( { serverError : err . message } ) ;
}
) ;
}
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 ( ) {
2016-04-21 22:37:01 -07:00
Client . updateRoles (
2016-05-06 11:28:22 -07:00
this . props . team . id ,
2016-04-21 22:37:01 -07:00
this . props . user . id ,
this . state . role ,
2016-01-26 23:05:26 +09:00
( ) => {
2016-05-06 11:28:22 -07:00
this . props . refreshProfiles ( ) ;
2016-01-26 23:05:26 +09:00
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 ) {
2016-03-24 11:05:13 -04:00
browserHistory . push ( teamUrl ) ;
2016-01-27 20:49:33 +09:00
} else {
2016-03-24 11:05:13 -04:00
browserHistory . push ( '/' ) ;
2016-01-27 20:49:33 +09:00
}
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 >
) ;
}
2016-05-06 11:28:22 -07:00
const teamMember = this . props . teamMember ;
2015-09-23 12:49:28 -07:00
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
2016-05-06 11:28:22 -07:00
if ( teamMember . roles . length > 0 && Utils . isAdmin ( teamMember . roles ) ) {
currentRoles = (
< FormattedMessage
id = 'team_members_dropdown.teamAdmin'
defaultMessage = 'Team Admin'
/ >
) ;
}
2016-04-21 22:37:01 -07:00
2016-05-06 11:28:22 -07:00
if ( user . roles . length > 0 && Utils . isSystemAdmin ( user . roles ) ) {
currentRoles = (
< FormattedMessage
id = 'team_members_dropdown.systemAdmin'
defaultMessage = 'System Admin'
/ >
) ;
}
2016-04-21 22:37:01 -07:00
2016-05-06 11:28:22 -07:00
const email = user . email ;
let showMakeMember = teamMember . roles === 'admin' || user . roles === 'system_admin' ;
let showMakeAdmin = teamMember . roles === '' && user . roles !== 'system_admin' ;
2015-09-23 15:16:48 -07:00
let showMakeSystemAdmin = user . roles === '' || user . roles === 'admin' ;
2015-09-23 12:49:28 -07:00
let showMakeActive = false ;
let showMakeNotActive = user . roles !== 'system_admin' ;
2016-04-21 22:37:01 -07:00
let mfaEnabled = global . window . mm _license . IsLicensed === 'true' && global . window . mm _license . MFA === 'true' && global . window . mm _config . EnableMultifactorAuthentication === 'true' ;
let showMfaReset = mfaEnabled && user . mfa _active ;
2015-09-23 12:49:28 -07:00
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-04-21 22:37:01 -07:00
let mfaReset = null ;
if ( showMfaReset ) {
mfaReset = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleResetMfa }
>
< FormattedMessage
id = 'admin.user_item.resetMfa'
defaultMessage = 'Remove MFA'
/ >
< / a >
< / li >
) ;
}
let mfaActiveText ;
if ( mfaEnabled ) {
if ( user . mfa _active ) {
mfaActiveText = (
< FormattedHTMLMessage
id = 'admin.user_item.mfaYes'
defaultMessage = ', <strong>MFA</strong>: Yes'
/ >
) ;
} else {
mfaActiveText = (
< FormattedHTMLMessage
id = 'admin.user_item.mfaNo'
defaultMessage = ', <strong>MFA</strong>: No'
/ >
) ;
}
}
let authServiceText ;
2016-05-05 16:36:42 -04:00
let passwordReset ;
2016-04-21 22:37:01 -07:00
if ( user . auth _service ) {
authServiceText = (
< FormattedHTMLMessage
id = 'admin.user_item.authServiceNotEmail'
defaultMessage = ', <strong>Sign-in Method:</strong> {service}'
values = { {
service : Utils . toTitleCase ( user . auth _service )
} }
/ >
) ;
2016-05-05 16:36:42 -04:00
passwordReset = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleResetPassword }
>
< FormattedMessage
id = 'admin.user_item.switchToEmail'
defaultMessage = 'Switch to Email/Password'
/ >
< / a >
< / li >
) ;
2016-04-21 22:37:01 -07:00
} else {
authServiceText = (
< FormattedHTMLMessage
id = 'admin.user_item.authServiceEmail'
defaultMessage = ', <strong>Sign-in Method:</strong> Email'
/ >
) ;
2016-05-05 16:36:42 -04:00
passwordReset = (
< li role = 'presentation' >
< a
role = 'menuitem'
href = '#'
onClick = { this . handleResetPassword }
>
< FormattedMessage
id = 'admin.user_item.resetPwd'
defaultMessage = 'Reset Password'
/ >
< / a >
< / li >
) ;
}
if ( global . window . mm _config . EnableSignInWithEmail !== 'true' ) {
passwordReset = null ;
2016-04-21 22:37:01 -07:00
}
2016-01-27 21:02:21 +09:00
const me = UserStore . getCurrentUser ( ) ;
2016-01-24 23:54:49 +09:00
let makeDemoteModal = null ;
if ( this . props . user . id === me . id ) {
2016-03-02 17:11:51 -05:00
const title = (
< FormattedMessage
id = 'admin.user_item.confirmDemoteRoleTitle'
defaultMessage = 'Confirm demotion from System Admin role'
/ >
) ;
const message = (
< div >
< FormattedMessage
id = 'admin.user_item.confirmDemoteDescription'
2016-03-31 14:46:29 -03:00
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-03-02 17:11:51 -05:00
/ >
< br / >
< br / >
< FormattedMessage
id = 'admin.user_item.confirmDemotionCmd'
defaultMessage = 'platform -assign_role -team_name="yourteam" -email="name@yourcompany.com" -role="system_admin"'
/ >
{ serverError }
< / div >
) ;
const confirmButton = (
< FormattedMessage
id = 'admin.user_item.confirmDemotion'
defaultMessage = 'Confirm Demotion'
/ >
) ;
2016-01-24 23:54:49 +09:00
makeDemoteModal = (
2016-01-26 23:05:26 +09:00
< ConfirmModal
2016-01-24 23:54:49 +09:00
show = { this . state . showDemoteModal }
2016-03-02 17:11:51 -05:00
title = { title }
message = { message }
confirmButton = { confirmButton }
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 (
2016-04-05 22:20:10 +05:00
< div className = 'more-modal__row' >
< img
className = 'more-modal__image pull-left'
2016-04-21 22:37:01 -07:00
src = { ` ${ Client . getUsersRoute ( ) } / ${ user . id } /image?time= ${ user . update _at } ` }
2016-04-05 22:20:10 +05:00
height = '36'
width = '36'
/ >
< div className = 'more-modal__details' >
< div className = 'more-modal__name' > { Utils . getDisplayName ( user ) } < / div >
2016-04-21 22:37:01 -07:00
< div className = 'more-modal__description' >
< FormattedHTMLMessage
id = 'admin.user_item.emailTitle'
defaultMessage = '<strong>Email:</strong> {email}'
values = { {
email
} }
/ >
{ authServiceText }
{ mfaActiveText }
< / div >
2016-04-05 22:20:10 +05:00
< / div >
< div className = 'more-modal__actions' >
2015-11-05 21:43:41 +05:00
< 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 }
2016-04-21 22:37:01 -07:00
{ mfaReset }
2016-05-05 16:36:42 -04:00
{ passwordReset }
2015-11-05 21:43:41 +05:00
< / ul >
< / div >
2016-04-05 22:20:10 +05:00
< / div >
{ makeDemoteModal }
{ serverError }
< / div >
2015-09-23 12:49:28 -07:00
) ;
}
}
UserItem . propTypes = {
2016-05-06 11:28:22 -07:00
team : React . PropTypes . object . isRequired ,
2015-09-23 12:49:28 -07:00
user : React . PropTypes . object . isRequired ,
2016-05-06 11:28:22 -07:00
teamMember : React . PropTypes . object . isRequired ,
2015-09-23 12:49:28 -07:00
refreshProfiles : React . PropTypes . func . isRequired ,
doPasswordReset : React . PropTypes . func . isRequired
} ;