diff options
author | Christopher Speller <crspeller@gmail.com> | 2017-09-06 23:04:13 -0700 |
---|---|---|
committer | Christopher Speller <crspeller@gmail.com> | 2017-09-06 23:11:58 -0700 |
commit | d8bd57901e33a7057e26e782e295099ffcc0da89 (patch) | |
tree | e12dfc8cad42b1576756d19d7fbfd82646a009bf /webapp/components/admin_console/system_users | |
parent | 7bc8e9a08dfde56387f946fdf5086252aa4d0491 (diff) | |
download | chat-d8bd57901e33a7057e26e782e295099ffcc0da89.tar.gz chat-d8bd57901e33a7057e26e782e295099ffcc0da89.tar.bz2 chat-d8bd57901e33a7057e26e782e295099ffcc0da89.zip |
Removing webapp
Diffstat (limited to 'webapp/components/admin_console/system_users')
4 files changed, 0 insertions, 1227 deletions
diff --git a/webapp/components/admin_console/system_users/index.js b/webapp/components/admin_console/system_users/index.js deleted file mode 100644 index 261a11d7e..000000000 --- a/webapp/components/admin_console/system_users/index.js +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import {connect} from 'react-redux'; -import {bindActionCreators} from 'redux'; -import {getTeams, getTeamStats} from 'mattermost-redux/actions/teams'; -import {getUser, getUserAccessToken} from 'mattermost-redux/actions/users'; - -import {getTeamsList} from 'mattermost-redux/selectors/entities/teams'; - -import SystemUsers from './system_users.jsx'; - -function mapStateToProps(state, ownProps) { - return { - teams: getTeamsList(state), - ...ownProps - }; -} - -function mapDispatchToProps(dispatch) { - return { - actions: bindActionCreators({ - getTeams, - getTeamStats, - getUser, - getUserAccessToken - }, dispatch) - }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(SystemUsers); diff --git a/webapp/components/admin_console/system_users/system_users.jsx b/webapp/components/admin_console/system_users/system_users.jsx deleted file mode 100644 index db8400217..000000000 --- a/webapp/components/admin_console/system_users/system_users.jsx +++ /dev/null @@ -1,372 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import React from 'react'; -import PropTypes from 'prop-types'; -import {FormattedMessage} from 'react-intl'; - -import { - loadProfiles, - loadProfilesAndTeamMembers, - loadProfilesWithoutTeam, - searchUsers -} from 'actions/user_actions.jsx'; - -import AnalyticsStore from 'stores/analytics_store.jsx'; -import TeamStore from 'stores/team_store.jsx'; -import UserStore from 'stores/user_store.jsx'; - -import {reloadIfServerVersionChanged} from 'actions/global_actions.jsx'; -import {getStandardAnalytics} from 'actions/admin_actions.jsx'; -import {Constants, StatTypes, UserSearchOptions} from 'utils/constants.jsx'; -import * as Utils from 'utils/utils.jsx'; - -import SystemUsersList from './system_users_list.jsx'; - -import store from 'stores/redux_store.jsx'; -import {searchProfiles, searchProfilesInTeam} from 'mattermost-redux/selectors/entities/users'; - -const ALL_USERS = ''; -const NO_TEAM = 'no_team'; - -const USER_ID_LENGTH = 26; -const USERS_PER_PAGE = 50; - -export default class SystemUsers extends React.Component { - static propTypes = { - - /* - * Array of team objects - */ - teams: PropTypes.arrayOf(PropTypes.object).isRequired, - - actions: PropTypes.shape({ - - /* - * Function to get teams - */ - getTeams: PropTypes.func.isRequired, - - /* - * Function to get statistics for a team - */ - getTeamStats: PropTypes.func.isRequired, - - /* - * Function to get a user - */ - getUser: PropTypes.func.isRequired, - - /* - * Function to get a user access token - */ - getUserAccessToken: PropTypes.func.isRequired - }).isRequired - } - - constructor(props) { - super(props); - - this.updateTotalUsersFromStore = this.updateTotalUsersFromStore.bind(this); - this.updateUsersFromStore = this.updateUsersFromStore.bind(this); - - this.loadDataForTeam = this.loadDataForTeam.bind(this); - this.loadComplete = this.loadComplete.bind(this); - - this.handleTeamChange = this.handleTeamChange.bind(this); - this.handleTermChange = this.handleTermChange.bind(this); - this.nextPage = this.nextPage.bind(this); - - this.doSearch = this.doSearch.bind(this); - this.search = this.search.bind(this); - this.getUserById = this.getUserById.bind(this); - - this.renderFilterRow = this.renderFilterRow.bind(this); - - this.state = { - totalUsers: AnalyticsStore.getAllSystem()[StatTypes.TOTAL_USERS], - users: UserStore.getProfileList(), - - teamId: ALL_USERS, - term: '', - loading: true, - searching: false - }; - } - - componentDidMount() { - AnalyticsStore.addChangeListener(this.updateTotalUsersFromStore); - TeamStore.addStatsChangeListener(this.updateTotalUsersFromStore); - - UserStore.addChangeListener(this.updateUsersFromStore); - UserStore.addInTeamChangeListener(this.updateUsersFromStore); - UserStore.addWithoutTeamChangeListener(this.updateUsersFromStore); - - this.loadDataForTeam(this.state.teamId); - this.props.actions.getTeams(0, 1000).then(reloadIfServerVersionChanged); - } - - componentWillUpdate(nextProps, nextState) { - const nextTeamId = nextState.teamId; - - if (this.state.teamId !== nextTeamId) { - this.updateTotalUsersFromStore(nextTeamId); - this.updateUsersFromStore(nextTeamId, nextState.term); - - this.loadDataForTeam(nextTeamId); - } - } - - componentWillUnmount() { - AnalyticsStore.removeChangeListener(this.updateTotalUsersFromStore); - TeamStore.removeStatsChangeListener(this.updateTotalUsersFromStore); - - UserStore.removeChangeListener(this.updateUsersFromStore); - UserStore.removeInTeamChangeListener(this.updateUsersFromStore); - UserStore.removeWithoutTeamChangeListener(this.updateUsersFromStore); - } - - updateTotalUsersFromStore(teamId = this.state.teamId) { - if (teamId === ALL_USERS) { - this.setState({ - totalUsers: AnalyticsStore.getAllSystem()[StatTypes.TOTAL_USERS] - }); - } else if (teamId === NO_TEAM) { - this.setState({ - totalUsers: 0 - }); - } else { - this.setState({ - totalUsers: TeamStore.getStats(teamId).total_member_count - }); - } - } - - updateUsersFromStore(teamId = this.state.teamId, term = this.state.term) { - if (term) { - let users; - if (teamId) { - users = searchProfilesInTeam(store.getState(), teamId, term); - } else { - users = searchProfiles(store.getState(), term); - } - - if (users.length === 0 && UserStore.hasProfile(term)) { - users = [UserStore.getProfile(term)]; - } - - this.setState({users}); - return; - } - - if (teamId === ALL_USERS) { - this.setState({users: UserStore.getProfileList(false, true)}); - } else if (teamId === NO_TEAM) { - this.setState({users: UserStore.getProfileListWithoutTeam()}); - } else { - this.setState({users: UserStore.getProfileListInTeam(this.state.teamId)}); - } - } - - loadDataForTeam(teamId) { - if (this.state.term) { - this.search(this.state.term, teamId); - return; - } - - if (teamId === ALL_USERS) { - loadProfiles(0, Constants.PROFILE_CHUNK_SIZE, this.loadComplete); - getStandardAnalytics(); - } else if (teamId === NO_TEAM) { - loadProfilesWithoutTeam(0, Constants.PROFILE_CHUNK_SIZE, this.loadComplete); - } else { - loadProfilesAndTeamMembers(0, Constants.PROFILE_CHUNK_SIZE, teamId, this.loadComplete); - this.props.actions.getTeamStats(teamId); - } - } - - loadComplete() { - this.setState({loading: false}); - } - - handleTeamChange(e) { - this.setState({teamId: e.target.value}); - } - - handleTermChange(term) { - this.setState({term}); - } - - nextPage(page) { - // Paging isn't supported while searching - - if (this.state.teamId === ALL_USERS) { - loadProfiles(page, USERS_PER_PAGE, this.loadComplete); - } else if (this.state.teamId === NO_TEAM) { - loadProfilesWithoutTeam(page + 1, USERS_PER_PAGE, this.loadComplete); - } else { - loadProfilesAndTeamMembers(page + 1, USERS_PER_PAGE, this.state.teamId, this.loadComplete); - } - } - - search(term, teamId = this.state.teamId) { - if (term === '') { - this.updateUsersFromStore(teamId, term); - - this.setState({ - loading: false - }); - - this.searchTimeoutId = ''; - return; - } - - this.doSearch(teamId, term); - } - - doSearch(teamId, term, now = false) { - clearTimeout(this.searchTimeoutId); - this.term = term; - - this.setState({loading: true}); - - const options = { - [UserSearchOptions.ALLOW_INACTIVE]: true - }; - if (teamId === NO_TEAM) { - options[UserSearchOptions.WITHOUT_TEAM] = true; - } - - this.searchTimeoutId = setTimeout( - () => { - searchUsers( - term, - teamId, - options, - (users) => { - if (users.length === 0 && term.length === USER_ID_LENGTH) { - // This term didn't match any users name, but it does look like it might be a user's ID - this.getUserByTokenOrId(term); - } else { - this.setState({loading: false}); - } - }, - () => { - this.setState({loading: false}); - } - ); - }, - now ? 0 : Constants.SEARCH_TIMEOUT_MILLISECONDS - ); - } - - getUserById(id) { - if (UserStore.hasProfile(id)) { - this.setState({loading: false}); - return; - } - - this.props.actions.getUser(id).then( - () => { - this.setState({ - loading: false - }); - } - ); - } - - getUserByTokenOrId = async (id) => { - if (global.window.mm_config.EnableUserAccessTokens === 'true') { - const {data} = await this.props.actions.getUserAccessToken(id); - - if (data) { - this.term = data.user_id; - this.setState({term: data.user_id}); - this.updateUsersFromStore(this.state.teamId, data.user_id); - this.getUserById(data.user_id); - return; - } - } - - this.getUserById(id); - } - - renderFilterRow(doSearch) { - const teams = this.props.teams.map((team) => { - return ( - <option - key={team.id} - value={team.id} - > - {team.display_name} - </option> - ); - }); - - return ( - <div className='system-users__filter-row'> - <div className='system-users__filter'> - <input - id='searchUsers' - ref='filter' - className='form-control filter-textbox' - placeholder={Utils.localizeMessage('filtered_user_list.search', 'Search users')} - onInput={doSearch} - /> - </div> - <label> - <span className='system-users__team-filter-label'> - <FormattedMessage - id='filtered_user_list.show' - defaultMessage='Filter:' - /> - </span> - <select - className='form-control system-users__team-filter' - onChange={this.handleTeamChange} - value={this.state.teamId} - > - <option value={ALL_USERS}>{Utils.localizeMessage('admin.system_users.allUsers', 'All Users')}</option> - <option value={NO_TEAM}>{Utils.localizeMessage('admin.system_users.noTeams', 'No Teams')}</option> - {teams} - </select> - </label> - </div> - ); - } - - render() { - let users = null; - if (!this.state.loading) { - users = this.state.users; - } - - return ( - <div className='wrapper--fixed'> - <h3 className='admin-console-header'> - <FormattedMessage - id='admin.system_users.title' - defaultMessage='{siteName} Users' - values={{ - siteName: global.mm_config.SiteName - }} - /> - </h3> - <div className='more-modal__list member-list-holder'> - <SystemUsersList - renderFilterRow={this.renderFilterRow} - search={this.search} - nextPage={this.nextPage} - users={users} - usersPerPage={USERS_PER_PAGE} - total={this.state.totalUsers} - teams={this.props.teams} - teamId={this.state.teamId} - term={this.state.term} - onTermChange={this.handleTermChange} - /> - </div> - </div> - ); - } -} diff --git a/webapp/components/admin_console/system_users/system_users_dropdown.jsx b/webapp/components/admin_console/system_users/system_users_dropdown.jsx deleted file mode 100644 index 79ccc8b31..000000000 --- a/webapp/components/admin_console/system_users/system_users_dropdown.jsx +++ /dev/null @@ -1,529 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import ConfirmModal from 'components/confirm_modal.jsx'; - -import TeamStore from 'stores/team_store.jsx'; -import UserStore from 'stores/user_store.jsx'; - -import Constants from 'utils/constants.jsx'; -import * as Utils from 'utils/utils.jsx'; -import {updateActive} from 'actions/user_actions.jsx'; -import {adminResetMfa} from 'actions/admin_actions.jsx'; -import * as UserUtils from 'mattermost-redux/utils/user_utils'; - -import {FormattedMessage} from 'react-intl'; - -import PropTypes from 'prop-types'; - -import React from 'react'; - -export default class SystemUsersDropdown extends React.Component { - static propTypes = { - - /* - * User to manage with dropdown - */ - user: PropTypes.object.isRequired, - - /* - * Function to open password reset, takes user as an argument - */ - doPasswordReset: PropTypes.func.isRequired, - - /* - * Function to open manage teams, takes user as an argument - */ - doManageTeams: PropTypes.func.isRequired, - - /* - * Function to open manage roles, takes user as an argument - */ - doManageRoles: PropTypes.func.isRequired, - - /* - * Function to open manage tokens, takes user as an argument - */ - doManageTokens: PropTypes.func.isRequired - }; - - constructor(props) { - super(props); - - this.state = { - serverError: null, - showDemoteModal: false, - showDeactivateMemberModal: false, - user: null, - role: null - }; - } - - handleMakeActive = (e) => { - e.preventDefault(); - updateActive(this.props.user.id, true, null, - (err) => { - this.setState({serverError: err.message}); - } - ); - } - - handleManageTeams = (e) => { - e.preventDefault(); - - this.props.doManageTeams(this.props.user); - } - - handleManageRoles = (e) => { - e.preventDefault(); - - this.props.doManageRoles(this.props.user); - } - - handleManageTokens = (e) => { - e.preventDefault(); - - this.props.doManageTokens(this.props.user); - } - - handleResetPassword = (e) => { - e.preventDefault(); - this.props.doPasswordReset(this.props.user); - } - - handleResetMfa = (e) => { - e.preventDefault(); - - adminResetMfa(this.props.user.id, - null, - (err) => { - this.setState({serverError: err.message}); - } - ); - } - - handleDemoteSystemAdmin = (user, role) => { - this.setState({ - serverError: this.state.serverError, - showDemoteModal: true, - user, - role - }); - } - - handleDemoteCancel = () => { - this.setState({ - serverError: null, - showDemoteModal: false, - user: null, - role: null - }); - } - - handleDemoteSubmit = () => { - if (this.state.role === 'member') { - this.doMakeMember(); - } - - const teamUrl = TeamStore.getCurrentTeamUrl(); - if (teamUrl) { - // the channel is added to the URL cause endless loading not being fully fixed - window.location.href = teamUrl + '/channels/town-square'; - } else { - window.location.href = '/'; - } - } - - handleShowDeactivateMemberModal = (e) => { - e.preventDefault(); - - this.setState({showDeactivateMemberModal: true}); - } - - handleDeactivateMember = () => { - updateActive(this.props.user.id, false, null, - (err) => { - this.setState({serverError: err.message}); - } - ); - - this.setState({showDeactivateMemberModal: false}); - } - - handleDeactivateCancel = () => { - this.setState({showDeactivateMemberModal: false}); - } - - renderDeactivateMemberModal = () => { - const title = ( - <FormattedMessage - id='deactivate_member_modal.title' - defaultMessage='Deactivate {username}' - values={{ - username: this.props.user.username - }} - /> - ); - - const message = ( - <FormattedMessage - id='deactivate_member_modal.desc' - defaultMessage='This action deactivates {username}. They will be logged out and not have access to any teams or channels on this system. Are you sure you want to deactivate {username}?' - values={{ - username: this.props.user.username - }} - /> - ); - - const confirmButtonClass = 'btn btn-danger'; - const deactivateMemberButton = ( - <FormattedMessage - id='deactivate_member_modal.deactivate' - defaultMessage='Deactivate' - /> - ); - - return ( - <ConfirmModal - show={this.state.showDeactivateMemberModal} - title={title} - message={message} - confirmButtonClass={confirmButtonClass} - confirmButtonText={deactivateMemberButton} - onConfirm={this.handleDeactivateMember} - onCancel={this.handleDeactivateCancel} - /> - ); - } - - renderAccessToken = () => { - const userAccessTokensEnabled = global.window.mm_config.EnableUserAccessTokens === 'true'; - if (!userAccessTokensEnabled) { - return null; - } - - const user = this.props.user; - const hasPostAllRole = UserUtils.hasPostAllRole(user.roles); - const hasPostAllPublicRole = UserUtils.hasPostAllPublicRole(user.roles); - const hasUserAccessTokenRole = UserUtils.hasUserAccessTokenRole(user.roles); - const isSystemAdmin = UserUtils.isSystemAdmin(user.roles); - - let messageId = ''; - if (hasUserAccessTokenRole || isSystemAdmin) { - if (hasPostAllRole) { - messageId = 'admin.user_item.userAccessTokenPostAll'; - } else if (hasPostAllPublicRole) { - messageId = 'admin.user_item.userAccessTokenPostAllPublic'; - } else { - messageId = 'admin.user_item.userAccessTokenYes'; - } - } - - if (!messageId) { - return null; - } - - return ( - <div className='light margin-top half'> - <FormattedMessage - key='admin.user_item.userAccessToken' - id={messageId} - /> - </div> - ); - } - - 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; - if (!user) { - return <div/>; - } - let currentRoles = ( - <FormattedMessage - id='admin.user_item.member' - defaultMessage='Member' - /> - ); - - if (user.roles.length > 0 && Utils.isSystemAdmin(user.roles)) { - currentRoles = ( - <FormattedMessage - id='team_members_dropdown.systemAdmin' - defaultMessage='System Admin' - /> - ); - } - - const me = UserStore.getCurrentUser(); - let showMakeActive = false; - let showMakeNotActive = !Utils.isSystemAdmin(user.roles); - let showManageTeams = true; - const mfaEnabled = global.window.mm_license.IsLicensed === 'true' && global.window.mm_license.MFA === 'true' && global.window.mm_config.EnableMultifactorAuthentication === 'true'; - const showMfaReset = mfaEnabled && user.mfa_active; - - if (user.delete_at > 0) { - currentRoles = ( - <FormattedMessage - id='admin.user_item.inactive' - defaultMessage='Inactive' - /> - ); - showMakeActive = true; - showMakeNotActive = false; - showManageTeams = false; - } - - let disableActivationToggle = false; - if (user.auth_service === Constants.LDAP_SERVICE) { - disableActivationToggle = true; - } - - let menuClass = ''; - if (disableActivationToggle) { - menuClass = 'disabled'; - } - - let makeActive = null; - if (showMakeActive) { - makeActive = ( - <li - role='presentation' - className={menuClass} - > - <a - id='activate' - role='menuitem' - href='#' - onClick={this.handleMakeActive} - > - <FormattedMessage - id='admin.user_item.makeActive' - defaultMessage='Activate' - /> - </a> - </li> - ); - } - - let makeNotActive = null; - if (showMakeNotActive) { - makeNotActive = ( - <li - role='presentation' - className={menuClass} - > - <a - id='deactivate' - role='menuitem' - href='#' - onClick={this.handleShowDeactivateMemberModal} - > - <FormattedMessage - id='admin.user_item.makeInactive' - defaultMessage='Deactivate' - /> - </a> - </li> - ); - } - - let manageTeams = null; - if (showManageTeams) { - manageTeams = ( - <li role='presentation'> - <a - id='manageTeams' - role='menuitem' - href='#' - onClick={this.handleManageTeams} - > - <FormattedMessage - id='admin.user_item.manageTeams' - defaultMessage='Manage Teams' - /> - </a> - </li> - ); - } - - let mfaReset = null; - if (showMfaReset) { - mfaReset = ( - <li role='presentation'> - <a - id='removeMFA' - role='menuitem' - href='#' - onClick={this.handleResetMfa} - > - <FormattedMessage - id='admin.user_item.resetMfa' - defaultMessage='Remove MFA' - /> - </a> - </li> - ); - } - - let passwordReset; - if (user.auth_service) { - passwordReset = ( - <li role='presentation'> - <a - id='switchEmailPassword' - role='menuitem' - href='#' - onClick={this.handleResetPassword} - > - <FormattedMessage - id='admin.user_item.switchToEmail' - defaultMessage='Switch to Email/Password' - /> - </a> - </li> - ); - } else { - passwordReset = ( - <li role='presentation'> - <a - id='resetPassword' - role='menuitem' - href='#' - onClick={this.handleResetPassword} - > - <FormattedMessage - id='admin.user_item.resetPwd' - defaultMessage='Reset Password' - /> - </a> - </li> - ); - } - - let manageTokens; - if (global.window.mm_config.EnableUserAccessTokens === 'true') { - manageTokens = ( - <li role='presentation'> - <a - id='manageTokens' - role='menuitem' - href='#' - onClick={this.handleManageTokens} - > - <FormattedMessage - id='admin.user_item.manageTokens' - defaultMessage='Manage Tokens' - /> - </a> - </li> - ); - } - - let makeDemoteModal = null; - if (this.props.user.id === me.id) { - const title = ( - <FormattedMessage - id='admin.user_item.confirmDemoteRoleTitle' - defaultMessage='Confirm demotion from System Admin role' - /> - ); - - const message = ( - <div> - <FormattedMessage - 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." - /> - <br/> - <br/> - <FormattedMessage - id='admin.user_item.confirmDemotionCmd' - defaultMessage='platform roles system_admin {username}' - values={{ - username: me.username - }} - /> - {serverError} - </div> - ); - - const confirmButton = ( - <FormattedMessage - id='admin.user_item.confirmDemotion' - defaultMessage='Confirm Demotion' - /> - ); - - makeDemoteModal = ( - <ConfirmModal - show={this.state.showDemoteModal} - title={title} - message={message} - confirmButtonText={confirmButton} - onConfirm={this.handleDemoteSubmit} - onCancel={this.handleDemoteCancel} - /> - ); - } - - const deactivateMemberModal = this.renderDeactivateMemberModal(); - - let displayedName = Utils.getDisplayName(user); - if (displayedName !== user.username) { - displayedName += ' (@' + user.username + ')'; - } - - return ( - <div className='dropdown member-drop text-right'> - <a - id='memberDropdown' - href='#' - className='dropdown-toggle theme' - type='button' - data-toggle='dropdown' - aria-expanded='true' - > - <span>{currentRoles} </span> - <span className='caret'/> - </a> - {this.renderAccessToken()} - <ul - className='dropdown-menu member-menu' - role='menu' - > - {makeActive} - {makeNotActive} - <li role='presentation'> - <a - id='manageRoles' - role='menuitem' - href='#' - onClick={this.handleManageRoles} - > - <FormattedMessage - id='admin.user_item.manageRoles' - defaultMessage='Manage Roles' - /> - </a> - </li> - {manageTeams} - {manageTokens} - {mfaReset} - {passwordReset} - </ul> - {makeDemoteModal} - {deactivateMemberModal} - {serverError} - </div> - ); - } -} diff --git a/webapp/components/admin_console/system_users/system_users_list.jsx b/webapp/components/admin_console/system_users/system_users_list.jsx deleted file mode 100644 index 8a7f30e1b..000000000 --- a/webapp/components/admin_console/system_users/system_users_list.jsx +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import React from 'react'; -import PropTypes from 'prop-types'; -import {FormattedMessage, FormattedHTMLMessage} from 'react-intl'; - -import ManageTeamsModal from 'components/admin_console/manage_teams_modal/manage_teams_modal.jsx'; -import ManageRolesModal from 'components/admin_console/manage_roles_modal'; -import ManageTokensModal from 'components/admin_console/manage_tokens_modal'; -import ResetPasswordModal from 'components/admin_console/reset_password_modal.jsx'; -import SearchableUserList from 'components/searchable_user_list/searchable_user_list.jsx'; - -import store from 'stores/redux_store.jsx'; -const dispatch = store.dispatch; -const getState = store.getState; - -import {getUser} from 'mattermost-redux/actions/users'; -import {Constants} from 'utils/constants.jsx'; -import * as Utils from 'utils/utils.jsx'; - -import SystemUsersDropdown from './system_users_dropdown.jsx'; - -export default class SystemUsersList extends React.Component { - static propTypes = { - users: PropTypes.arrayOf(PropTypes.object), - usersPerPage: PropTypes.number, - total: PropTypes.number, - nextPage: PropTypes.func, - search: PropTypes.func.isRequired, - focusOnMount: PropTypes.bool, - renderFilterRow: PropTypes.func, - - teamId: PropTypes.string.isRequired, - term: PropTypes.string.isRequired, - onTermChange: PropTypes.func.isRequired - }; - - constructor(props) { - super(props); - - this.state = { - page: 0, - - showManageTeamsModal: false, - showManageRolesModal: false, - showManageTokensModal: false, - showPasswordModal: false, - user: null - }; - } - - componentWillReceiveProps(nextProps) { - if (nextProps.teamId !== this.props.teamId) { - this.setState({page: 0}); - } - } - - nextPage = () => { - this.setState({page: this.state.page + 1}); - - this.props.nextPage(this.state.page + 1); - } - - previousPage = () => { - this.setState({page: this.state.page - 1}); - } - - search = (term) => { - this.props.search(term); - - if (term !== '') { - this.setState({page: 0}); - } - } - - doManageTeams = (user) => { - this.setState({ - showManageTeamsModal: true, - user - }); - } - - doManageRoles = (user) => { - this.setState({ - showManageRolesModal: true, - user - }); - } - - doManageTokens = (user) => { - this.setState({ - showManageTokensModal: true, - user - }); - } - - doManageTeamsDismiss = () => { - this.setState({ - showManageTeamsModal: false, - user: null - }); - } - - doManageRolesDismiss = () => { - this.setState({ - showManageRolesModal: false, - user: null - }); - } - - doManageTokensDismiss = () => { - this.setState({ - showManageTokensModal: false, - user: null - }); - } - - doPasswordReset = (user) => { - this.setState({ - showPasswordModal: true, - user - }); - } - - doPasswordResetDismiss = () => { - this.setState({ - showPasswordModal: false, - user: null - }); - } - - doPasswordResetSubmit = (user) => { - getUser(user.id)(dispatch, getState); - - this.setState({ - showPasswordModal: false, - user: null - }); - } - - getInfoForUser(user) { - const info = []; - - if (user.auth_service) { - let service; - if (user.auth_service === Constants.LDAP_SERVICE || user.auth_service === Constants.SAML_SERVICE) { - service = user.auth_service.toUpperCase(); - } else { - service = Utils.toTitleCase(user.auth_service); - } - - info.push( - <FormattedHTMLMessage - key='admin.user_item.authServiceNotEmail' - id='admin.user_item.authServiceNotEmail' - defaultMessage='<strong>Sign-in Method:</strong> {service}' - values={{ - service - }} - /> - ); - } else { - info.push( - <FormattedHTMLMessage - key='admin.user_item.authServiceEmail' - id='admin.user_item.authServiceEmail' - defaultMessage='<strong>Sign-in Method:</strong> Email' - /> - ); - } - - const mfaEnabled = global.window.mm_license.IsLicensed === 'true' && - global.window.mm_license.MFA === 'true' && - global.window.mm_config.EnableMultifactorAuthentication === 'true'; - if (mfaEnabled) { - info.push(', '); - - if (user.mfa_active) { - info.push( - <FormattedHTMLMessage - key='admin.user_item.mfaYes' - id='admin.user_item.mfaYes' - defaultMessage='<strong>MFA</strong>: Yes' - /> - ); - } else { - info.push( - <FormattedHTMLMessage - key='admin.user_item.mfaNo' - id='admin.user_item.mfaNo' - defaultMessage='<strong>MFA</strong>: No' - /> - ); - } - } - - return info; - } - - renderCount(count, total, startCount, endCount, isSearch) { - if (total) { - if (isSearch) { - return ( - <FormattedMessage - id='system_users_list.countSearch' - defaultMessage='{count, number} {count, plural, one {user} other {users}} of {total, number} total' - values={{ - count, - total - }} - /> - ); - } else if (startCount !== 0 || endCount !== total) { - return ( - <FormattedMessage - id='system_users_list.countPage' - defaultMessage='{startCount, number} - {endCount, number} {count, plural, one {user} other {users}} of {total, number} total' - values={{ - count, - startCount: startCount + 1, - endCount, - total - }} - /> - ); - } - - return ( - <FormattedMessage - id='system_users_list.count' - defaultMessage='{count, number} {count, plural, one {user} other {users}}' - values={{ - count - }} - /> - ); - } - - return null; - } - - render() { - const extraInfo = {}; - if (this.props.users) { - for (const user of this.props.users) { - extraInfo[user.id] = this.getInfoForUser(user); - } - } - - return ( - <div> - <SearchableUserList - {...this.props} - renderCount={this.renderCount} - extraInfo={extraInfo} - actions={[SystemUsersDropdown]} - actionProps={{ - doPasswordReset: this.doPasswordReset, - doManageTeams: this.doManageTeams, - doManageRoles: this.doManageRoles, - doManageTokens: this.doManageTokens - }} - nextPage={this.nextPage} - previousPage={this.previousPage} - search={this.search} - page={this.state.page} - term={this.props.term} - onTermChange={this.props.onTermChange} - /> - <ManageTeamsModal - user={this.state.user} - show={this.state.showManageTeamsModal} - onModalDismissed={this.doManageTeamsDismiss} - /> - <ManageRolesModal - user={this.state.user} - show={this.state.showManageRolesModal} - onModalDismissed={this.doManageRolesDismiss} - /> - <ManageTokensModal - user={this.state.user} - show={this.state.showManageTokensModal} - onModalDismissed={this.doManageTokensDismiss} - /> - <ResetPasswordModal - user={this.state.user} - show={this.state.showPasswordModal} - onModalSubmit={this.doPasswordResetSubmit} - onModalDismissed={this.doPasswordResetDismiss} - /> - </div> - ); - } -} |