LoginForm.jsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. class LoginForm extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.isRegistrationEnabled = false;
  8. this.isLocalStrategySetup = false;
  9. this.isLdapStrategySetup = false;
  10. this.objOfIsExternalAuthEnableds = {};
  11. this.renderLocalOrLdapLoginForm = this.renderLocalOrLdapLoginForm.bind(this);
  12. this.renderExternalAuthLoginForm = this.renderExternalAuthLoginForm.bind(this);
  13. this.renderExternalAuthInput = this.renderExternalAuthInput.bind(this);
  14. }
  15. componentWillMount() {
  16. // [TODO][GW-1913] get params from server with axios
  17. this.isRegistrationEnabled = true;
  18. this.isLocalStrategySetup = true;
  19. this.isLdapStrategySetup = true;
  20. this.objOfIsExternalAuthEnableds = {
  21. google: true,
  22. github: true,
  23. facebook: true,
  24. twitter: true,
  25. oidc: true,
  26. saml: true,
  27. basic: true,
  28. };
  29. }
  30. renderLocalOrLdapLoginForm() {
  31. const { t } = this.props;
  32. return (
  33. <form role="form" action="/login" method="post">
  34. <div className="input-group mb-3">
  35. <div className="input-group-prepend">
  36. <span className="input-group-text"><i className="icon-user"></i></span>
  37. </div>
  38. <input type="text" className="form-control" placeholder="Username or E-mail" name="loginForm[username]" />
  39. {this.isLdapStrategySetup && (
  40. <div className="input-group-append">
  41. <small className="input-group-text text-success">
  42. <i className="icon-fw icon-check"></i> LDAP
  43. </small>
  44. </div>
  45. )}
  46. </div>
  47. <div className="input-group mb-3">
  48. <div className="input-group-prepend">
  49. <span className="input-group-text"><i className="icon-lock"></i></span>
  50. </div>
  51. <input type="password" className="form-control" placeholder="Password" name="loginForm[password]" />
  52. </div>
  53. <div className="input-group justify-content-center d-flex mt-5">
  54. <input type="hidden" name="_csrf" value="{{ csrf() }}" />
  55. <button type="submit" id="login" className="btn btn-fill login px-0 py-2">
  56. <div className="eff"></div>
  57. <span className="btn-label p-3"><i className="icon-login"></i></span>
  58. <span className="btn-label-text p-3">{ t('Sign in') }</span>
  59. </button>
  60. </div>
  61. </form>
  62. );
  63. }
  64. renderExternalAuthInput(auth) {
  65. const { t } = this.props;
  66. return (
  67. <div key={auth} className="input-group justify-content-center d-flex mt-5">
  68. {/* [TODO][GW-1913] use onClick, and delete form tag */}
  69. <form role="form" action={`/passport/${auth}`} className="d-inline-flex flex-column">
  70. <input type="hidden" name="_csrf" value="{{ csrf() }}" />
  71. <button type="submit" className="btn btn-fill px-0 py-2" id={auth}>
  72. <div className="eff"></div>
  73. <span className="btn-label p-3"><i className={`fa fa-${auth}`}></i></span>
  74. <span className="btn-label-text p-3">{ t('Sign in') }</span>
  75. </button>
  76. <div className="small text-center">by {auth} Account</div>
  77. </form>
  78. </div>
  79. );
  80. }
  81. renderExternalAuthLoginForm() {
  82. const isExternalAuthCollapsible = this.isLocalStrategySetup || this.isLdapStrategySetup;
  83. const collapsibleClass = isExternalAuthCollapsible ? 'collapse collapse-external-auth collapse-anchor' : '';
  84. return (
  85. <>
  86. <div className="border-bottom"></div>
  87. <div id="external-auth" className={`external-auth ${collapsibleClass}`}>
  88. <div className="spacer"></div>
  89. <div className="d-flex flex-row justify-content-between flex-wrap">
  90. {Object.keys(this.objOfIsExternalAuthEnableds).map((auth) => {
  91. if (!this.objOfIsExternalAuthEnableds[auth]) {
  92. return;
  93. }
  94. return this.renderExternalAuthInput(auth);
  95. })}
  96. </div>
  97. <div className="spacer"></div>
  98. </div>
  99. <div className="border-bottom"></div>
  100. <div className="text-center">
  101. <button
  102. type="button"
  103. className="collapse-anchor btn btn-xs btn-collapse-external-auth mb-3"
  104. data-toggle={isExternalAuthCollapsible ? 'collapse' : ''}
  105. data-target="#external-auth"
  106. aria-expanded="false"
  107. aria-controls="external-auth"
  108. >
  109. External Auth
  110. </button>
  111. </div>
  112. </>
  113. );
  114. }
  115. render() {
  116. const { t, isRegistering } = this.props;
  117. const isLocalOrLdapStrategiesEnabled = this.isLocalStrategySetup || this.isLdapStrategySetup;
  118. const registerFormClass = isRegistering ? 'to-flip' : '';
  119. const isSomeExternalAuthEnabled = Object.values(this.objOfIsExternalAuthEnableds).some(elem => elem);
  120. return (
  121. <div className={`login-dialog mx-auto flipper ${registerFormClass}`} id="login-dialog">
  122. <div className="row mx-0">
  123. <div className="col-12">
  124. <div className="front">
  125. { isLocalOrLdapStrategiesEnabled && this.renderLocalOrLdapLoginForm() }
  126. { isSomeExternalAuthEnabled && this.renderExternalAuthLoginForm() }
  127. </div>
  128. {/* [TODO][GW-1863] render register form here */}
  129. </div>
  130. </div>
  131. {this.isRegistrationEnabled && (
  132. <div className="row">
  133. <div className="col-12 text-right py-2">
  134. <a href="#register" id="register" className="link-switch">
  135. <i className="ti-check-box"></i> { t('Sign up is here') }
  136. </a>
  137. </div>
  138. </div>
  139. )}
  140. </div>
  141. );
  142. }
  143. }
  144. LoginForm.propTypes = {
  145. // i18next
  146. t: PropTypes.func.isRequired,
  147. isRegistering: PropTypes.bool,
  148. csrf: PropTypes.string,
  149. };
  150. export default withTranslation()(LoginForm);