summaryrefslogtreecommitdiffstats
path: root/webapp/components/admin_console/user_item.jsx
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2016-10-19 14:49:25 -0400
committerGitHub <noreply@github.com>2016-10-19 14:49:25 -0400
commit365b8b465e8a53ebb2da2bf3aef659ac81a2bc6a (patch)
tree643b2dd52b478c2c0b049ac28798d870b9dfd397 /webapp/components/admin_console/user_item.jsx
parent0512bd26ee85473aa47206d5f207a9a506019138 (diff)
downloadchat-365b8b465e8a53ebb2da2bf3aef659ac81a2bc6a.tar.gz
chat-365b8b465e8a53ebb2da2bf3aef659ac81a2bc6a.tar.bz2
chat-365b8b465e8a53ebb2da2bf3aef659ac81a2bc6a.zip
Merging performance branch into master (#4268)
* improve performance on sendNotifications * Fix SQL queries * Remove get direct profiles, not needed anymore * Add raw data to error details if AppError fails to decode * men * Fix decode (#4052) * Fixing json decode * Adding unit test * Initial work for client scaling (#4051) * Begin adding paging to profiles API * Added more paging functionality * Finish hooking up admin console user lists * Add API for searching users and add searching to all user lists * Add lazy loading of profiles * Revert config.json * Fix unit tests and some style issues * Add GetProfilesFromList to Go driver and fix web unit test * Update etag for GetProfiles * Updating ui for filters and pagination (#4044) * Updating UI for pagination * Adjusting margins for filter row * Adjusting margin for specific modals * Adding relative padding to system console * Adjusting responsive view * Update client user tests * Minor fixes for direct messages modal (#4056) * Remove some unneeded initial load calls (#4057) * UX updates to user lists, added smart counts and bug fixes (#4059) * Improved getExplicitMentions and unit tests (#4064) * Refactor getting posts to lazy load profiles correctly (#4062) * Comment out SetActiveChannel test (#4066) * Profiler cpu, block, and memory profiler. (#4081) * Fix TestSetActiveChannel unit test (#4071) * Fixing build failure caused by dependancies updating (#4076) * Adding profiler * Fix admin_team_member_dropdown eslint errors * Bumping session cache size (#4077) * Bumping session cache size * Bumping status cache * Refactor how the client handles channel members to be large team friendly (#4106) * Refactor how the client handles channel members to be large team friendly * Change Id to ChannelId in ChannelStats model * Updated getChannelMember and getProfilesByIds routes to match proposal * Performance improvements (#4100) * Performance improvements * Fixing re-connect issue * Fixing error message * Some other minor perf tweaks * Some other minor perf tweaks * Fixing config file * Fixing buffer size * Fixing web socket send message * adding some error logging * fix getMe to be user required * Fix websocket event for new user * Fixing shutting down * Reverting web socket changes * Fixing logging lvl * Adding caching to GetMember * Adding some logging * Fixing caching * Fixing caching invalidate * Fixing direct message caching * Fixing caching * Fixing caching * Remove GetDirectProfiles from initial load * Adding logging and fixing websocket client * Adding back caching from bad merge. * Explicitly close go driver requests (#4162) * Refactored how the client handles team members to be more large team friendly (#4159) * Refactor getProfilesForDirectMessageList API into getAllProfiles API * Refactored how the client handles team members to be more large team friendly * Fix js error when receiving a notification * Fix JS error caused by current user being overwritten with sanitized version (#4165) * Adding error message to status failure (#4167) * Fix a few bugs caused by client scaling refactoring (#4170) * When there is no read replica, don't open a second set of connections to the master database (#4173) * Adding connection tacking to stats (#4174) * Reduce DB writes for statuses and other status related changes (#4175) * Fix bug preventing opening of DM channels from more modal (#4181) * Fixing socket timing error (#4183) * Fixing ping/pong handler * Fixing socket timing error * Commenting out status broadcasting * Removing user status changes * Removing user status changes * Removing user status changes * Removing user status changes * Adding DoPreComputeJson() * Performance improvements (#4194) * * Fix System Console Analytics queries * Add db.SetConnMaxLifetime to 15 minutes * Add "net/http/pprof" for profiling * Add FreeOSMemory() to manually release memory on reload config * Add flag to enable http profiler * Fix memory leak (#4197) * Fix memory leak * removed unneeded nil assignment * Fixing go routine leak (#4208) * Merge fixes * Merge fix * Refactored statuses to be queried by the client rather than broadcast by the server (#4212) * Refactored server code to reduce status broadcasts and to allow getting statuses by IDs * Refactor client code to periodically fetch statuses * Add store unit test for getting statuses by ids * Fix status unit test * Add getStatusesByIds REST API and move the client over to use that instead of the WebSocket * Adding multiple threads to websocket hub (#4230) * Adding multiple threads to websocket hub * Fixing unit tests * Fixing so websocket connections from the same user end up in the sameā€¦ (#4240) * Fixing so websocket connections from the same user end up in the same list * Removing old comment * Refactor user autocomplete to query the server (#4239) * Add API for autocompleting users * Converted at mention autocomplete to query server * Converted user search autocomplete to query server * Switch autocomplete API naming to use term instead of username * Split autocomplete API into two, one for channels and for teams * Fix copy/paste error * Some final client scaling fixes (#4246) * Add lazy loading of profiles to integration pages * Add lazy loading of profiles to emoji page * Fix JS error when receiving post in select team menu and also clean up channel store
Diffstat (limited to 'webapp/components/admin_console/user_item.jsx')
-rw-r--r--webapp/components/admin_console/user_item.jsx595
1 files changed, 0 insertions, 595 deletions
diff --git a/webapp/components/admin_console/user_item.jsx b/webapp/components/admin_console/user_item.jsx
deleted file mode 100644
index ac548afe0..000000000
--- a/webapp/components/admin_console/user_item.jsx
+++ /dev/null
@@ -1,595 +0,0 @@
-// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import Client from 'client/web_client.jsx';
-import Constants from 'utils/constants.jsx';
-import * as Utils from 'utils/utils.jsx';
-import UserStore from 'stores/user_store.jsx';
-import ConfirmModal from '../confirm_modal.jsx';
-import TeamStore from 'stores/team_store.jsx';
-
-import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
-
-import React from 'react';
-
-export default class UserItem extends React.Component {
- constructor(props) {
- super(props);
-
- this.handleMakeMember = this.handleMakeMember.bind(this);
- this.handleRemoveFromTeam = this.handleRemoveFromTeam.bind(this);
- this.handleMakeActive = this.handleMakeActive.bind(this);
- this.handleMakeNotActive = this.handleMakeNotActive.bind(this);
- this.handleMakeTeamAdmin = this.handleMakeTeamAdmin.bind(this);
- this.handleMakeSystemAdmin = this.handleMakeSystemAdmin.bind(this);
- this.handleResetPassword = this.handleResetPassword.bind(this);
- this.handleResetMfa = this.handleResetMfa.bind(this);
- this.handleDemoteSystemAdmin = this.handleDemoteSystemAdmin.bind(this);
- this.handleDemoteSubmit = this.handleDemoteSubmit.bind(this);
- this.handleDemoteCancel = this.handleDemoteCancel.bind(this);
- this.doMakeMember = this.doMakeMember.bind(this);
- this.doMakeTeamAdmin = this.doMakeTeamAdmin.bind(this);
-
- this.state = {
- serverError: null,
- showDemoteModal: false,
- user: null,
- role: null
- };
- }
-
- doMakeMember() {
- Client.updateUserRoles(
- this.props.user.id,
- 'system_user',
- () => {
- this.props.refreshProfiles();
- },
- (err) => {
- this.setState({serverError: err.message});
- }
- );
- Client.updateTeamMemberRoles(
- this.props.team.id,
- this.props.user.id,
- 'team_user',
- () => {
- this.props.refreshProfiles();
- },
- (err) => {
- this.setState({serverError: err.message});
- }
- );
- }
-
- handleMakeMember(e) {
- e.preventDefault();
- const me = UserStore.getCurrentUser();
- if (this.props.user.id === me.id) {
- this.handleDemoteSystemAdmin(this.props.user, 'member');
- } else {
- this.doMakeMember();
- }
- }
-
- handleRemoveFromTeam() {
- Client.removeUserFromTeam(
- this.props.team.id,
- this.props.user.id,
- () => {
- this.props.refreshProfiles();
- },
- (err) => {
- this.setState({serverError: err.message});
- }
- );
- }
-
- 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});
- }
- );
- }
-
- doMakeTeamAdmin() {
- Client.updateTeamMemberRoles(
- this.props.team.id,
- this.props.user.id,
- 'team_user team_admin',
- () => {
- this.props.refreshProfiles();
- },
- (err) => {
- this.setState({serverError: err.message});
- }
- );
- }
-
- handleMakeTeamAdmin(e) {
- e.preventDefault();
- const me = UserStore.getCurrentUser();
- if (this.props.user.id === me.id) {
- this.handleDemoteSystemAdmin(this.props.user, 'teamadmin');
- } else {
- this.doMakeTeamAdmin();
- }
- }
-
- handleMakeSystemAdmin(e) {
- e.preventDefault();
-
- Client.updateUserRoles(
- this.props.user.id,
- 'system_user system_admin',
- () => {
- this.props.refreshProfiles();
- },
- (err) => {
- this.setState({serverError: err.message});
- }
- );
- }
-
- handleResetPassword(e) {
- e.preventDefault();
- this.props.doPasswordReset(this.props.user);
- }
-
- handleResetMfa(e) {
- e.preventDefault();
-
- Client.adminResetMfa(this.props.user.id,
- () => {
- this.props.refreshProfiles();
- },
- (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();
- } else {
- this.doMakeTeamAdmin();
- }
-
- 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 = '/';
- }
- }
-
- 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 teamMember = this.props.teamMember;
- const user = this.props.user;
- if (!user || !teamMember) {
- return <div/>;
- }
- let currentRoles = (
- <FormattedMessage
- id='admin.user_item.member'
- defaultMessage='Member'
- />
- );
-
- if (teamMember.roles.length > 0 && Utils.isAdmin(teamMember.roles)) {
- currentRoles = (
- <FormattedMessage
- id='team_members_dropdown.teamAdmin'
- defaultMessage='Team Admin'
- />
- );
- }
-
- if (user.roles.length > 0 && Utils.isSystemAdmin(user.roles)) {
- currentRoles = (
- <FormattedMessage
- id='team_members_dropdown.systemAdmin'
- defaultMessage='System Admin'
- />
- );
- }
-
- const me = UserStore.getCurrentUser();
- const email = user.email;
- let showMakeMember = Utils.isAdmin(teamMember.roles) || Utils.isSystemAdmin(user.roles);
- let showMakeAdmin = !Utils.isAdmin(teamMember.roles) && !Utils.isSystemAdmin(user.roles);
- let showMakeSystemAdmin = !Utils.isSystemAdmin(user.roles);
- let showMakeActive = false;
- let showMakeNotActive = !Utils.isSystemAdmin(user.roles);
- 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'
- />
- );
- showMakeMember = false;
- showMakeAdmin = false;
- showMakeSystemAdmin = false;
- showMakeActive = true;
- showMakeNotActive = false;
- }
-
- let disableActivationToggle = false;
- if (user.auth_service === Constants.LDAP_SERVICE) {
- disableActivationToggle = true;
- }
-
- let makeSystemAdmin = null;
- if (showMakeSystemAdmin) {
- makeSystemAdmin = (
- <li role='presentation'>
- <a
- role='menuitem'
- href='#'
- onClick={this.handleMakeSystemAdmin}
- >
- <FormattedMessage
- id='admin.user_item.makeSysAdmin'
- defaultMessage='Make System Admin'
- />
- </a>
- </li>
- );
- }
-
- let makeAdmin = null;
- if (showMakeAdmin) {
- makeAdmin = (
- <li role='presentation'>
- <a
- role='menuitem'
- href='#'
- onClick={this.handleMakeTeamAdmin}
- >
- <FormattedMessage
- id='admin.user_item.makeTeamAdmin'
- defaultMessage='Make Team Admin'
- />
- </a>
- </li>
- );
- }
-
- let makeMember = null;
- if (showMakeMember) {
- makeMember = (
- <li role='presentation'>
- <a
- role='menuitem'
- href='#'
- onClick={this.handleMakeMember}
- >
- <FormattedMessage
- id='admin.user_item.makeMember'
- defaultMessage='Make Member'
- />
- </a>
- </li>
- );
- }
-
- let removeFromTeam = null;
- if (this.props.user.id !== me.id) {
- removeFromTeam = (
- <li role='presentation'>
- <a
- role='menuitem'
- href='#'
- onClick={this.handleRemoveFromTeam}
- >
- <FormattedMessage
- id='team_members_dropdown.leave_team'
- defaultMessage='Remove From Team'
- />
- </a>
- </li>
- );
- }
-
- let menuClass = '';
- if (disableActivationToggle) {
- menuClass = 'disabled';
- }
-
- let makeActive = null;
- if (showMakeActive) {
- makeActive = (
- <li
- role='presentation'
- className={menuClass}
- >
- <a
- role='menuitem'
- href='#'
- onClick={this.handleMakeActive}
- >
- <FormattedMessage
- id='admin.user_item.makeActive'
- defaultMessage='Make Active'
- />
- </a>
- </li>
- );
- }
-
- let makeNotActive = null;
- if (showMakeNotActive) {
- makeNotActive = (
- <li
- role='presentation'
- className={menuClass}
- >
- <a
- role='menuitem'
- href='#'
- onClick={this.handleMakeNotActive}
- >
- <FormattedMessage
- id='admin.user_item.makeInactive'
- defaultMessage='Make Inactive'
- />
- </a>
- </li>
- );
- }
-
- 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;
- let passwordReset;
- if (user.auth_service) {
- const service = (user.auth_service === Constants.LDAP_SERVICE || user.auth_service === Constants.SAML_SERVICE) ? user.auth_service.toUpperCase() : Utils.toTitleCase(user.auth_service);
- authServiceText = (
- <FormattedHTMLMessage
- id='admin.user_item.authServiceNotEmail'
- defaultMessage=', <strong>Sign-in Method:</strong> {service}'
- values={{
- service
- }}
- />
- );
-
- passwordReset = (
- <li role='presentation'>
- <a
- role='menuitem'
- href='#'
- onClick={this.handleResetPassword}
- >
- <FormattedMessage
- id='admin.user_item.switchToEmail'
- defaultMessage='Switch to Email/Password'
- />
- </a>
- </li>
- );
- } else {
- authServiceText = (
- <FormattedHTMLMessage
- id='admin.user_item.authServiceEmail'
- defaultMessage=', <strong>Sign-in Method:</strong> Email'
- />
- );
-
- 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;
- }
-
- 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 -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'
- />
- );
-
- makeDemoteModal = (
- <ConfirmModal
- show={this.state.showDemoteModal}
- title={title}
- message={message}
- confirmButton={confirmButton}
- onConfirm={this.handleDemoteSubmit}
- onCancel={this.handleDemoteCancel}
- />
- );
- }
-
- let displayedName = Utils.getDisplayName(user);
- if (displayedName !== user.username) {
- displayedName += ' (@' + user.username + ')';
- }
-
- return (
- <div className='more-modal__row'>
- <img
- className='more-modal__image pull-left'
- src={`${Client.getUsersRoute()}/${user.id}/image?time=${user.update_at}`}
- height='36'
- width='36'
- />
- <div className='more-modal__details'>
- <div className='more-modal__name'>{displayedName}</div>
- <div className='more-modal__description'>
- <FormattedHTMLMessage
- id='admin.user_item.emailTitle'
- defaultMessage='<strong>Email:</strong> {email}'
- values={{
- email
- }}
- />
- {authServiceText}
- {mfaActiveText}
- </div>
- {serverError}
- </div>
- <div className='more-modal__actions'>
- <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'/>
- </a>
- <ul
- className='dropdown-menu member-menu'
- role='menu'
- >
- {removeFromTeam}
- {makeAdmin}
- {makeMember}
- {makeActive}
- {makeNotActive}
- {makeSystemAdmin}
- {mfaReset}
- {passwordReset}
- </ul>
- </div>
- </div>
- {makeDemoteModal}
- </div>
- );
- }
-}
-
-UserItem.propTypes = {
- team: React.PropTypes.object.isRequired,
- user: React.PropTypes.object.isRequired,
- teamMember: React.PropTypes.object.isRequired,
- refreshProfiles: React.PropTypes.func.isRequired,
- doPasswordReset: React.PropTypes.func.isRequired
-};