MemberList.jsx 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import React from 'react'
  2. import PropTypes from 'prop-types'
  3. // import { Checkbox } from 'tracim_frontend_lib'
  4. require('./MemberList.styl')
  5. export class MemberList extends React.Component {
  6. constructor (props) {
  7. super(props)
  8. this.state = {
  9. displayNewMemberList: true
  10. }
  11. }
  12. handleClickAddMemberBtn = () => this.setState({displayNewMemberList: false})
  13. handleClickCloseAddMemberBtn = () => this.setState({displayNewMemberList: true})
  14. handleClickCheckboxCreateAccount = e => {
  15. e.preventDefault()
  16. e.stopPropagation()
  17. this.props.onChangeCreateAccount(!this.props.createAccount)
  18. }
  19. handleClickBtnValidate = () => {
  20. this.props.onClickValidateNewMember()
  21. this.setState({displayNewMemberList: true})
  22. }
  23. render () {
  24. const { props, state } = this
  25. return (
  26. <div className='memberlist'>
  27. <div className='memberlist__title subTitle'>
  28. {props.t('Member List')}
  29. </div>
  30. <div className='memberlist__wrapper'>
  31. {state.displayNewMemberList
  32. ? (
  33. <div>
  34. <ul className='memberlist__list'>
  35. {props.memberList.map(m =>
  36. <li className='memberlist__list__item' key={m.id}>
  37. <div className='memberlist__list__item__avatar'>
  38. <img src={m.avatarUrl} />
  39. </div>
  40. <div className='memberlist__list__item__info mr-auto'>
  41. <div className='memberlist__list__item__info__name'>
  42. {m.publicName}
  43. </div>
  44. <div className='memberlist__list__item__info__role'>
  45. {props.roleList.find(r => r.slug === m.role).label}
  46. </div>
  47. </div>
  48. <div className='memberlist__list__item__delete'>
  49. <i className='fa fa-trash-o' />
  50. </div>
  51. </li>
  52. )}
  53. </ul>
  54. <div className='memberlist__btnadd' onClick={this.handleClickAddMemberBtn}>
  55. <div className='memberlist__btnadd__button'>
  56. <div className='memberlist__btnadd__button__avatar'>
  57. <div className='memberlist__btnadd__button__avatar__icon'>
  58. <i className='fa fa-plus' />
  59. </div>
  60. </div>
  61. <div className='memberlist__btnadd__button__text'>
  62. {props.t('Add a member')}
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. )
  68. : (
  69. <div className='memberlist__form'>
  70. <div className='memberlist__form__close d-flex justify-content-end'>
  71. <i className='fa fa-times' onClick={this.handleClickCloseAddMemberBtn} />
  72. </div>
  73. <div className='memberlist__form__member'>
  74. <div className='memberlist__form__member__name'>
  75. <label className='name__label' htmlFor='addmember'>
  76. {props.t('Enter the name or email of the member')}
  77. </label>
  78. <input
  79. type='text'
  80. className='name__input form-control'
  81. id='addmember'
  82. placeholder='Nom ou Email'
  83. value={props.nameOrEmail}
  84. onChange={e => props.onChangeNameOrEmail(e.target.value)}
  85. autoComplete='off'
  86. />
  87. {props.searchedKnownMemberList.length > 0 &&
  88. <div className='autocomplete primaryColorBorder'>
  89. {props.searchedKnownMemberList.filter((u, i) => i < 5).map(u => // only displays the first 5
  90. <div
  91. className='autocomplete__item primaryColorBgHover'
  92. onClick={() => props.onClickKnownMember(u)}
  93. key={u.user_id}
  94. >
  95. <div className='autocomplete__item__avatar primaryColorBorder'>
  96. <img src={u.avatar_url} />
  97. </div>
  98. <div className='autocomplete__item__name'>
  99. {u.public_name}
  100. </div>
  101. </div>
  102. )}
  103. </div>
  104. }
  105. </div>
  106. {/*
  107. // @TODO validate with DA that this checkbox is useless since the backend handle everything
  108. <div className='memberlist__form__member__create'>
  109. <div className='memberlist__form__member__create__checkbox mr-3'>
  110. <Checkbox
  111. name='createAccountCheckbox'
  112. onClickCheckbox={e => this.handleClickCheckboxCreateAccount(e)}
  113. checked={state.createAccountCheckbox}
  114. />
  115. </div>
  116. <div className='create__text'>
  117. {props.t('Create an account')}
  118. </div>
  119. </div>
  120. */}
  121. </div>
  122. <div className='memberlist__form__role'>
  123. <div className='memberlist__form__role__text'>
  124. {props.t('Choose the role of the member')}
  125. </div>
  126. <ul className='memberlist__form__role__list'>
  127. {props.roleList.map(r =>
  128. <li key={r.slug}>
  129. <label className='memberlist__form__role__list__item' htmlFor={r.slug}>
  130. <div className='item__radiobtn mr-3'>
  131. <input
  132. id={r.slug}
  133. type='radio'
  134. name='role'
  135. value={r.slug}
  136. checked={r.slug === props.role}
  137. onChange={() => props.onChangeRole(r.slug)}
  138. />
  139. </div>
  140. <div className='item__text'>
  141. <div className='item__text__icon mr-2' style={{color: r.hexcolor}}>
  142. <i className={`fa fa-${r.faIcon}`} />
  143. </div>
  144. <div className='item__text__name'>
  145. {r.label}
  146. </div>
  147. </div>
  148. </label>
  149. </li>
  150. )}
  151. </ul>
  152. </div>
  153. <div className='memberlist__form__submitbtn'>
  154. <button className='btn btn-outline-primary' onClick={this.handleClickBtnValidate}>
  155. {props.t('Validate')}
  156. </button>
  157. </div>
  158. </div>
  159. )
  160. }
  161. </div>
  162. </div>
  163. )
  164. }
  165. }
  166. export default MemberList
  167. MemberList.propTypes = {
  168. memberList: PropTypes.array.isRequired,
  169. onChangeName: PropTypes.func
  170. }