Users.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import PasswordResetModal from './PasswordResetModal';
  5. import PaginationWrapper from '../../PaginationWrapper';
  6. import InviteUserControl from './InviteUserControl';
  7. import UserTable from './UserTable';
  8. import { createSubscribedElement } from '../../UnstatedUtils';
  9. import AppContainer from '../../../services/AppContainer';
  10. class UserPage extends React.Component {
  11. constructor(props) {
  12. super();
  13. this.state = {
  14. userForPasswordResetModal: null,
  15. users: [],
  16. activePage: 1,
  17. pagingLimit: Infinity,
  18. isPasswordResetModalShown: false,
  19. isUserInviteModalShown: false,
  20. };
  21. this.showPasswordResetModal = this.showPasswordResetModal.bind(this);
  22. this.hidePasswordResetModal = this.hidePasswordResetModal.bind(this);
  23. this.toggleUserInviteModal = this.toggleUserInviteModal.bind(this);
  24. }
  25. // TODO unstatedContainerを作ってそこにリファクタすべき
  26. componentDidMount() {
  27. const data = document.getElementById('admin-user-page');
  28. const users = JSON.parse(data.getAttribute('users'));
  29. this.setState({
  30. users,
  31. });
  32. }
  33. /**
  34. * passwordリセットモーダルが開き、userが渡される
  35. * @param {object} user
  36. *
  37. */
  38. showPasswordResetModal(user) {
  39. this.setState({
  40. isPasswordResetModalShown: true,
  41. userForPasswordResetModal: user,
  42. });
  43. }
  44. hidePasswordResetModal() {
  45. this.setState({ isPasswordResetModalShown: false });
  46. }
  47. /**
  48. * user招待モーダルを開閉する
  49. */
  50. toggleUserInviteModal() {
  51. this.setState({ isUserInviteModalShown: !this.state.isUserInviteModalShown });
  52. }
  53. render() {
  54. const { t } = this.props;
  55. return (
  56. <Fragment>
  57. { this.state.userForPasswordResetModal && (
  58. <PasswordResetModal
  59. user={this.state.userForPasswordResetModal}
  60. show={this.state.isPasswordResetModalShown}
  61. onHideModal={this.hidePasswordResetModal}
  62. />
  63. ) }
  64. <p>
  65. <InviteUserControl toggleUserInviteModal={this.toggleUserInviteModal} />
  66. <a className="btn btn-default btn-outline ml-2" href="/admin/users/external-accounts">
  67. <i className="icon-user-follow" aria-hidden="true"></i>
  68. { t('user_management.external_account') }
  69. </a>
  70. </p>
  71. <UserTable
  72. users={this.state.users}
  73. onPasswordResetClicked={this.showPasswordResetModal}
  74. />
  75. <PaginationWrapper
  76. activePage={this.state.activePage}
  77. changePage={this.handlePage}
  78. totalItemsCount={this.state.totalUsers}
  79. pagingLimit={this.state.pagingLimit}
  80. >
  81. </PaginationWrapper>
  82. </Fragment>
  83. );
  84. }
  85. }
  86. const UserPageWrapper = (props) => {
  87. return createSubscribedElement(UserPage, props, [AppContainer]);
  88. };
  89. UserPage.propTypes = {
  90. t: PropTypes.func.isRequired, // i18next
  91. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  92. };
  93. export default withTranslation()(UserPageWrapper);