AssociateModal.jsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import {
  5. Modal,
  6. ModalHeader,
  7. ModalBody,
  8. ModalFooter,
  9. } from 'reactstrap';
  10. import { toastSuccess, toastError } from '../../util/apiNotification';
  11. import { withUnstatedContainers } from '../UnstatedUtils';
  12. import AppContainer from '../../services/AppContainer';
  13. import PersonalContainer from '../../services/PersonalContainer';
  14. import LdapAuthTest from '../Admin/Security/LdapAuthTest';
  15. class AssociateModal extends React.Component {
  16. constructor(props) {
  17. super(props);
  18. this.state = {
  19. username: '',
  20. password: '',
  21. };
  22. this.onChangeUsername = this.onChangeUsername.bind(this);
  23. this.onChangePassword = this.onChangePassword.bind(this);
  24. this.onClickAddBtn = this.onClickAddBtn.bind(this);
  25. }
  26. /**
  27. * Change username
  28. */
  29. onChangeUsername(username) {
  30. this.setState({ username });
  31. }
  32. /**
  33. * Change password
  34. */
  35. onChangePassword(password) {
  36. this.setState({ password });
  37. }
  38. async onClickAddBtn() {
  39. const { t, personalContainer } = this.props;
  40. const { username, password } = this.state;
  41. try {
  42. await personalContainer.associateLdapAccount({ username, password });
  43. this.props.onClose();
  44. toastSuccess(t('security_setting.updated_general_security_setting'));
  45. }
  46. catch (err) {
  47. toastError(err);
  48. }
  49. try {
  50. await personalContainer.retrieveExternalAccounts();
  51. }
  52. catch (err) {
  53. toastError(err);
  54. }
  55. }
  56. render() {
  57. const { t } = this.props;
  58. return (
  59. <Modal isOpen={this.props.isOpen} toggle={this.props.onClose} size="lg">
  60. <ModalHeader className="bg-primary text-light" toggle={this.props.onClose}>
  61. { t('admin:user_management.create_external_account') }
  62. </ModalHeader>
  63. <ModalBody>
  64. <ul className="nav nav-tabs passport-settings mb-2" role="tablist">
  65. <li className="nav-item active">
  66. <a href="#passport-ldap" className="nav-link active" data-toggle="tab" role="tab">
  67. <i className="fa fa-sitemap"></i> LDAP
  68. </a>
  69. </li>
  70. <li className="nav-item">
  71. <a href="#github-tbd" className="nav-link" data-toggle="tab" role="tab">
  72. <i className="fa fa-github"></i> (TBD) GitHub
  73. </a>
  74. </li>
  75. <li className="nav-item">
  76. <a href="#google-tbd" className="nav-link" data-toggle="tab" role="tab">
  77. <i className="fa fa-google"></i> (TBD) Google OAuth
  78. </a>
  79. </li>
  80. <li className="nav-item">
  81. <a href="#facebook-tbd" className="nav-link" data-toggle="tab" role="tab">
  82. <i className="fa fa-facebook"></i> (TBD) Facebook
  83. </a>
  84. </li>
  85. <li className="nav-item">
  86. <a href="#twitter-tbd" className="nav-link" data-toggle="tab" role="tab">
  87. <i className="fa fa-twitter"></i> (TBD) Twitter
  88. </a>
  89. </li>
  90. </ul>
  91. <div className="tab-content">
  92. <div id="passport-ldap" className="tab-pane active">
  93. <LdapAuthTest
  94. username={this.state.username}
  95. password={this.state.password}
  96. onChangeUsername={this.onChangeUsername}
  97. onChangePassword={this.onChangePassword}
  98. />
  99. </div>
  100. <div id="github-tbd" className="tab-pane" role="tabpanel">TBD</div>
  101. <div id="google-tbd" className="tab-pane" role="tabpanel">TBD</div>
  102. <div id="facebook-tbd" className="tab-pane" role="tabpanel">TBD</div>
  103. <div id="twitter-tbd" className="tab-pane" role="tabpanel">TBD</div>
  104. </div>
  105. </ModalBody>
  106. <ModalFooter className="border-top-0">
  107. <button type="button" className="btn btn-primary mt-3" onClick={this.onClickAddBtn}>
  108. <i className="fa fa-plus-circle" aria-hidden="true"></i>
  109. {t('add')}
  110. </button>
  111. </ModalFooter>
  112. </Modal>
  113. );
  114. }
  115. }
  116. const AssociateModalWrapper = withUnstatedContainers(AssociateModal, [AppContainer, PersonalContainer]);
  117. AssociateModal.propTypes = {
  118. t: PropTypes.func.isRequired, // i18next
  119. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  120. personalContainer: PropTypes.instanceOf(PersonalContainer).isRequired,
  121. isOpen: PropTypes.bool.isRequired,
  122. onClose: PropTypes.func.isRequired,
  123. };
  124. export default withTranslation()(AssociateModalWrapper);