UserMenu.jsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import {
  5. UncontrolledDropdown, DropdownToggle, DropdownMenu,
  6. } from 'reactstrap';
  7. import StatusActivateButton from './StatusActivateButton';
  8. import StatusSuspendedButton from './StatusSuspendedButton';
  9. import RemoveUserButton from './UserRemoveButton';
  10. import RemoveAdminButton from './RemoveAdminButton';
  11. import GiveAdminButton from './GiveAdminButton';
  12. import { withUnstatedContainers } from '../../UnstatedUtils';
  13. import AppContainer from '../../../services/AppContainer';
  14. import AdminUsersContainer from '../../../services/AdminUsersContainer';
  15. class UserMenu extends React.Component {
  16. constructor(props) {
  17. super(props);
  18. this.state = {
  19. };
  20. this.onPasswordResetClicked = this.onPasswordResetClicked.bind(this);
  21. }
  22. onPasswordResetClicked() {
  23. this.props.adminUsersContainer.showPasswordResetModal(this.props.user);
  24. }
  25. renderEditMenu() {
  26. const { t } = this.props;
  27. return (
  28. <Fragment>
  29. <li className="dropdown-divider"></li>
  30. <li className="dropdown-header">{t('admin:user_management.user_table.edit_menu')}</li>
  31. <li>
  32. <button className="dropdown-item" type="button" onClick={this.onPasswordResetClicked}>
  33. <i className="icon-fw icon-key"></i>{ t('admin:user_management.reset_password') }
  34. </button>
  35. </li>
  36. </Fragment>
  37. );
  38. }
  39. renderStatusMenu() {
  40. const { t, user } = this.props;
  41. return (
  42. <Fragment>
  43. <li className="dropdown-divider"></li>
  44. <li className="dropdown-header">{t('status')}</li>
  45. <li>
  46. {(user.status === 1 || user.status === 3) && <StatusActivateButton user={user} />}
  47. {user.status === 2 && <StatusSuspendedButton user={user} />}
  48. {(user.status === 1 || user.status === 3 || user.status === 5) && <RemoveUserButton user={user} />}
  49. </li>
  50. </Fragment>
  51. );
  52. }
  53. renderAdminMenu() {
  54. const { t, user } = this.props;
  55. return (
  56. <Fragment>
  57. <li className="dropdown-divider pl-0"></li>
  58. <li className="dropdown-header">{t('admin:user_management.user_table.administrator_menu')}</li>
  59. <li>
  60. {user.admin === true && <RemoveAdminButton user={user} />}
  61. {user.admin === false && <GiveAdminButton user={user} />}
  62. </li>
  63. </Fragment>
  64. );
  65. }
  66. render() {
  67. const { user } = this.props;
  68. return (
  69. <UncontrolledDropdown id="userMenu" size="sm">
  70. <DropdownToggle caret color="secondary" outline>
  71. <i className="icon-settings" />
  72. {(!user.isInvitationEmailSended && user.status === 5) && <i className="fa fa-circle text-danger grw-usermenu-notification-icon" />}
  73. </DropdownToggle>
  74. <DropdownMenu positionFixed>
  75. {this.renderEditMenu()}
  76. {user.status !== 4 && this.renderStatusMenu()}
  77. {user.status === 2 && this.renderAdminMenu()}
  78. </DropdownMenu>
  79. </UncontrolledDropdown>
  80. );
  81. }
  82. }
  83. const UserMenuWrapper = withUnstatedContainers(UserMenu, [AppContainer, AdminUsersContainer]);
  84. UserMenu.propTypes = {
  85. t: PropTypes.func.isRequired, // i18next
  86. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  87. adminUsersContainer: PropTypes.instanceOf(AdminUsersContainer).isRequired,
  88. user: PropTypes.object.isRequired,
  89. };
  90. export default withTranslation()(UserMenuWrapper);