UserMenu.jsx 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { toastSuccess, toastError } from '../../../util/apiNotification';
  5. import StatusActivateForm from './StatusActivateForm';
  6. import StatusSuspendedForm from './StatusSuspendedForm';
  7. import RemoveUserButton from './UserRemoveButton';
  8. import RemoveAdminForm from './RemoveAdminForm';
  9. import GiveAdminForm from './GiveAdminForm';
  10. import { createSubscribedElement } from '../../UnstatedUtils';
  11. import AppContainer from '../../../services/AppContainer';
  12. class UserMenu extends React.Component {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. };
  17. this.onPasswordResetClicked = this.onPasswordResetClicked.bind(this);
  18. }
  19. onPasswordResetClicked() {
  20. this.props.onPasswordResetClicked(this.props.user);
  21. }
  22. async removeUser() {
  23. const { appContainer, user } = this.props;
  24. try {
  25. const response = await appContainer.apiv3.delete(`/users/${user._id}/remove`);
  26. const { username } = response.data.userData;
  27. toastSuccess(`Delete ${username} success`);
  28. }
  29. catch (err) {
  30. toastError(err);
  31. }
  32. }
  33. render() {
  34. const { t, user } = this.props;
  35. return (
  36. <Fragment>
  37. <div className="btn-group admin-user-menu">
  38. <button type="button" className="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown">
  39. <i className="icon-settings"></i> <span className="caret"></span>
  40. </button>
  41. <ul className="dropdown-menu" role="menu">
  42. <li className="dropdown-header">{ t('user_management.edit_menu') }</li>
  43. <li onClick={this.onPasswordResetClicked}>
  44. <a>
  45. <i className="icon-fw icon-key"></i>{ t('user_management.reset_password') }
  46. </a>
  47. </li>
  48. <li className="divider"></li>
  49. <li className="dropdown-header">{ t('status') }</li>
  50. <li>
  51. {(user.status === 1 || user.status === 3) && <StatusActivateForm user={user} />}
  52. {user.status === 2 && <StatusSuspendedForm user={user} />}
  53. {(user.status === 1 || user.status === 3 || user.status === 5) && <RemoveUserButton user={user} removeUser={() => { this.removeUser() }} />}
  54. </li>
  55. <li className="divider pl-0"></li>
  56. <li className="dropdown-header">{ t('user_management.administrator_menu') }</li>
  57. <li>
  58. {user.status === 2 && user.admin === true && <RemoveAdminForm user={user} />}
  59. {user.status === 2 && user.admin === false && <GiveAdminForm user={user} />}
  60. </li>
  61. </ul>
  62. </div>
  63. </Fragment>
  64. );
  65. }
  66. }
  67. const UserMenuWrapper = (props) => {
  68. return createSubscribedElement(UserMenu, props, [AppContainer]);
  69. };
  70. UserMenu.propTypes = {
  71. t: PropTypes.func.isRequired, // i18next
  72. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  73. user: PropTypes.object.isRequired,
  74. onPasswordResetClicked: PropTypes.func.isRequired,
  75. };
  76. export default withTranslation()(UserMenuWrapper);