Dashboard.jsx 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. import React from 'react'
  2. import { connect } from 'react-redux'
  3. import Sidebar from './Sidebar.jsx'
  4. import imgProfil from '../img/imgProfil.png'
  5. import { translate } from 'react-i18next'
  6. import Radium from 'radium'
  7. import color from 'color'
  8. import {
  9. PageWrapper,
  10. PageTitle,
  11. PageContent
  12. } from 'tracim_frontend_lib'
  13. import {
  14. getWorkspaceDetail,
  15. getWorkspaceMemberList
  16. } from '../action-creator.async.js'
  17. import {
  18. addFlashMessage,
  19. setWorkspaceDetail,
  20. setWorkspaceMemberList
  21. } from '../action-creator.sync.js'
  22. class Dashboard extends React.Component {
  23. constructor (props) {
  24. super(props)
  25. this.state = {
  26. workspaceIdInUrl: props.match.params.idws ? parseInt(props.match.params.idws) : null, // this is used to avoid handling the parseInt everytime
  27. displayNewMemberDashboard: false,
  28. displayNotifBtn: false,
  29. displayWebdavBtn: false,
  30. displayCalendarBtn: false
  31. }
  32. }
  33. async componentDidMount () {
  34. const { props, state } = this
  35. const fetchWorkspaceDetail = await props.dispatch(getWorkspaceDetail(props.user, state.workspaceIdInUrl))
  36. switch (fetchWorkspaceDetail.status) {
  37. case 200:
  38. props.dispatch(setWorkspaceDetail(fetchWorkspaceDetail.json))
  39. break
  40. case 400:
  41. case 500:
  42. props.dispatch(addFlashMessage(props.t('An error has happened'), 'warning'))
  43. break
  44. }
  45. const fetchWorkspaceMemberList = await props.dispatch(getWorkspaceMemberList(props.user, state.workspaceIdInUrl))
  46. switch (fetchWorkspaceMemberList.status) {
  47. case 200:
  48. props.dispatch(setWorkspaceMemberList(fetchWorkspaceMemberList.json))
  49. break
  50. case 400:
  51. case 500:
  52. props.dispatch(addFlashMessage(props.t('An error has happened'), 'warning'))
  53. break
  54. }
  55. }
  56. handleToggleNewMemberDashboard = () => this.setState(prevState => ({
  57. displayNewMemberDashboard: !prevState.displayNewMemberDashboard
  58. }))
  59. handleToggleNotifBtn = () => this.setState(prevState => ({
  60. displayNotifBtn: !prevState.displayNotifBtn
  61. }))
  62. handleToggleWebdavBtn = () => this.setState(prevState => ({
  63. displayWebdavBtn: !prevState.displayWebdavBtn
  64. }))
  65. handleToggleCalendarBtn = () => this.setState(prevState => ({
  66. displayCalendarBtn: !prevState.displayCalendarBtn
  67. }))
  68. render () {
  69. const { props, state } = this
  70. return (
  71. <div className='sidebarpagecontainer'>
  72. <Sidebar />
  73. <PageWrapper customeClass='dashboard'>
  74. <PageTitle
  75. parentClass='dashboard__header'
  76. title={props.t('Dashboard')}
  77. subtitle={''}
  78. >
  79. <div className='dashboard__header__advancedmode mr-3'>
  80. <button type='button' className='btn btn-primary'>
  81. {props.t('Active advanced Dashboard')}
  82. </button>
  83. </div>
  84. </PageTitle>
  85. <PageContent>
  86. <div className='dashboard__workspace-wrapper'>
  87. <div className='dashboard__workspace'>
  88. <div className='dashboard__workspace__title'>
  89. {props.curWs.label}
  90. </div>
  91. <div className='dashboard__workspace__detail'>
  92. {props.curWs.description}
  93. </div>
  94. </div>
  95. <div className='dashboard__userstatut'>
  96. <div className='dashboard__userstatut__role'>
  97. <div className='dashboard__userstatut__role__msg'>
  98. {props.t(`Hi ! ${props.user.public_name}, vous êtes actuellement`)}
  99. </div>
  100. <div className='dashboard__userstatut__role__definition'>
  101. <div className='dashboard__userstatut__role__definition__icon'>
  102. <i className='fa fa-graduation-cap' />
  103. </div>
  104. <div className='dashboard__userstatut__role__definition__text'>
  105. {(member => member ? member.role : '')(props.curWs.member.find(m => m.id === props.user.user_id))}
  106. </div>
  107. </div>
  108. </div>
  109. <div className='dashboard__userstatut__notification'>
  110. <div className='dashboard__userstatut__notification__text'>
  111. {props.t("You have subscribed to this workspace's notifications")} (nyi)
  112. </div>
  113. {state.displayNotifBtn
  114. ? (
  115. <div className='dashboard__userstatut__notification__subscribe dropdown'>
  116. <button
  117. className='dashboard__userstatut__notification__subscribe__btn btn btn-outline-primary dropdown-toggle'
  118. type='button'
  119. id='dropdownMenuButton'
  120. data-toggle='dropdown'
  121. aria-haspopup='true'
  122. aria-expanded='false'
  123. >
  124. Abonné(e)
  125. </button>
  126. <div className='dashboard__userstatut__notification__subscribe__submenu dropdown-menu'>
  127. <div className='dashboard__userstatut__notification__subscribe__submenu__item dropdown-item'>
  128. {props.t('subscriber')}
  129. </div>
  130. <div className='dashboard__userstatut__notification__subscribe__submenu__item dropdown-item dropdown-item'>
  131. {props.t('unsubscribed')}
  132. </div>
  133. </div>
  134. </div>
  135. )
  136. : (
  137. <div
  138. className='dashboard__userstatut__notification__btn btn btn-outline-primary'
  139. onClick={this.handleToggleNotifBtn}
  140. >
  141. {props.t('Change your status')}
  142. </div>
  143. )
  144. }
  145. </div>
  146. </div>
  147. </div>
  148. <div className='dashboard__calltoaction justify-content-xl-center'>
  149. {props.contentType.map(ct =>
  150. <div
  151. className='dashboard__calltoaction__button btnaction'
  152. style={{
  153. backgroundColor: ct.hexcolor,
  154. ':hover': {
  155. backgroundColor: color(ct.hexcolor).darken(0.15).hexString()
  156. }
  157. }}
  158. key={ct.label}
  159. >
  160. <div className='dashboard__calltoaction__button__text'>
  161. <div className='dashboard__calltoaction__button__text__icon'>
  162. <i className={`fa fa-${ct.faIcon}`} />
  163. </div>
  164. <div className='dashboard__calltoaction__button__text__title'>
  165. {ct.creationLabel}
  166. </div>
  167. </div>
  168. </div>
  169. )}
  170. </div>
  171. <div className='dashboard__wksinfo'>
  172. <div className='dashboard__activity'>
  173. <div className='dashboard__activity__header'>
  174. <div className='dashboard__activity__header__title subTitle'>
  175. {this.props.t('Recent activity')}
  176. </div>
  177. <div className='dashboard__activity__header__allread btn btn-outline-primary'>
  178. {this.props.t('Mark everything as read')}
  179. </div>
  180. </div>
  181. <div className='dashboard__activity__wrapper'>
  182. <div className='dashboard__activity__workspace'>
  183. <div className='dashboard__activity__workspace__icon'>
  184. <i className='fa fa-comments-o' />
  185. </div>
  186. <div className='dashboard__activity__workspace__name'>
  187. <span>Développement Tracim</span>
  188. </div>
  189. </div>
  190. <div className='dashboard__activity__more d-flex flex-row-reverse'>
  191. <div className='dashboard__activity__more__btn btn btn-outline-primary'>
  192. {this.props.t('See more')}
  193. </div>
  194. </div>
  195. </div>
  196. </div>
  197. <div className='dashboard__memberlist'>
  198. <div className='dashboard__memberlist__title subTitle'>
  199. {this.props.t('Member List')}
  200. </div>
  201. <div className='dashboard__memberlist__wrapper'>
  202. {this.state.displayNewMemberDashboard === false &&
  203. <div>
  204. <ul className='dashboard__memberlist__list'>
  205. <li className='dashboard__memberlist__list__item'>
  206. <div className='dashboard__memberlist__list__item__avatar'>
  207. <img src={imgProfil} alt='avatar' />
  208. </div>
  209. <div className='dashboard__memberlist__list__item__info mr-auto'>
  210. <div className='dashboard__memberlist__list__item__info__name'>
  211. Jean Dupont
  212. </div>
  213. <div className='dashboard__memberlist__list__item__info__role'>
  214. Responsable
  215. </div>
  216. </div>
  217. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  218. <i className='fa fa-trash-o' />
  219. </div>
  220. </li>
  221. </ul>
  222. <div
  223. className='dashboard__memberlist__btnadd'
  224. onClick={this.handleToggleNewMemberDashboard}
  225. >
  226. <div className='dashboard__memberlist__btnadd__button'>
  227. <div className='dashboard__memberlist__btnadd__button__avatar'>
  228. <div className='dashboard__memberlist__btnadd__button__avatar__icon'>
  229. <i className='fa fa-plus' />
  230. </div>
  231. </div>
  232. <div
  233. className='dashboard__memberlist__btnadd__button__text'
  234. >
  235. {this.props.t('Add a member')}
  236. </div>
  237. </div>
  238. </div>
  239. </div>
  240. }
  241. {this.state.displayNewMemberDashboard === true &&
  242. <form className='dashboard__memberlist__form'>
  243. <div
  244. className='dashboard__memberlist__form__close d-flex justify-content-end'
  245. >
  246. <i className='fa fa-times' onClick={this.handleToggleNewMemberDashboard} />
  247. </div>
  248. <div className='dashboard__memberlist__form__member'>
  249. <div className='dashboard__memberlist__form__member__name'>
  250. <label className='name__label' htmlFor='addmember'>
  251. {this.props.t('Enter the name or email of the member')}
  252. </label>
  253. <input type='text' id='addmember' className='name__input form-control' placeholder='Nom ou Email' />
  254. </div>
  255. <div className='dashboard__memberlist__form__member__create'>
  256. <div className='create__radiobtn mr-3'>
  257. <input type='radio' />
  258. </div>
  259. <div className='create__text'>
  260. {this.props.t('Create an account')}
  261. </div>
  262. </div>
  263. </div>
  264. <div className='dashboard__memberlist__form__role'>
  265. <div className='dashboard__memberlist__form__role__text'>
  266. {this.props.t('Choose the role of the member')}
  267. </div>
  268. <ul className='dashboard__memberlist__form__role__list'>
  269. <li className='dashboard__memberlist__form__role__list__item'>
  270. <div className='item__radiobtn mr-3'>
  271. <input type='radio' name='role' value='responsable' />
  272. </div>
  273. <div className='item__text'>
  274. <div className='item_text_icon mr-2'>
  275. <i className='fa fa-gavel' />
  276. </div>
  277. <div className='item__text__name'>
  278. {this.props.t('Supervisor')}
  279. </div>
  280. </div>
  281. </li>
  282. </ul>
  283. </div>
  284. <div className='dashboard__memberlist__form__submitbtn'>
  285. <button className='btn btn-outline-primary'>
  286. {this.props.t('Validate')}
  287. </button>
  288. </div>
  289. </form>
  290. }
  291. </div>
  292. </div>
  293. </div>
  294. <div className='dashboard__moreinfo'>
  295. <div className='dashboard__moreinfo__webdav genericBtnInfoDashboard'>
  296. <div
  297. className='dashboard__moreinfo__webdav__btn genericBtnInfoDashboard__btn'
  298. onClick={this.handleToggleWebdavBtn}
  299. >
  300. <div className='dashboard__moreinfo__webdav__btn__icon genericBtnInfoDashboard__btn__icon'>
  301. <i className='fa fa-windows' />
  302. </div>
  303. <div className='dashboard__moreinfo__webdav__btn__text genericBtnInfoDashboard__btn__text'>
  304. {this.props.t('Implement Tracim in your explorer')}
  305. </div>
  306. </div>
  307. {this.state.displayWebdavBtn === true &&
  308. <div>
  309. <div className='dashboard__moreinfo__webdav__information genericBtnInfoDashboard__info'>
  310. <div className='dashboard__moreinfo__webdav__information__text genericBtnInfoDashboard__info__text'>
  311. {this.props.t('Find all your documents deposited online directly on your computer via the workstation, without going through the software.')}'
  312. </div>
  313. <div className='dashboard__moreinfo__webdav__information__link genericBtnInfoDashboard__info__link'>
  314. http://algoo.trac.im/webdav/
  315. </div>
  316. </div>
  317. </div>
  318. }
  319. </div>
  320. <div className='dashboard__moreinfo__calendar genericBtnInfoDashboard'>
  321. <div className='dashboard__moreinfo__calendar__wrapperBtn'>
  322. <div
  323. className='dashboard__moreinfo__calendar__btn genericBtnInfoDashboard__btn'
  324. onClick={this.handleToggleCalendarBtn}
  325. >
  326. <div className='dashboard__moreinfo__calendar__btn__icon genericBtnInfoDashboard__btn__icon'>
  327. <i className='fa fa-calendar' />
  328. </div>
  329. <div className='dashboard__moreinfo__calendar__btn__text genericBtnInfoDashboard__btn__text'>
  330. {this.props.t('Workspace Calendar')}
  331. </div>
  332. </div>
  333. </div>
  334. <div className='dashboard__moreinfo__calendar__wrapperText'>
  335. {this.state.displayCalendarBtn === true &&
  336. <div>
  337. <div className='dashboard__moreinfo__calendar__information genericBtnInfoDashboard__info'>
  338. <div className='dashboard__moreinfo__calendar__information__text genericBtnInfoDashboard__info__text'>
  339. {this.props.t('Each workspace has its own calendar.')}
  340. </div>
  341. <div className='dashboard__moreinfo__calendar__information__link genericBtnInfoDashboard__info__link'>
  342. http://algoo.trac.im/calendar/
  343. </div>
  344. </div>
  345. </div>
  346. }
  347. </div>
  348. </div>
  349. </div>
  350. </PageContent>
  351. </PageWrapper>
  352. </div>
  353. )
  354. }
  355. }
  356. const mapStateToProps = ({ user, contentType, currentWorkspace }) => ({ user, contentType, curWs: currentWorkspace })
  357. export default connect(mapStateToProps)(translate()(Radium(Dashboard)))