UserMenu.jsx 4.1 KB

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