MemberList.jsx 7.3KB

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