Dashboard.jsx 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  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 {
  6. getAppList,
  7. getContentTypeList, getWorkspaceList
  8. } from '../action-creator.async.js'
  9. import {
  10. setAppList,
  11. setContentTypeList, setWorkspaceListIsOpenInSidebar, updateWorkspaceListData
  12. } from '../action-creator.sync.js'
  13. class Dashboard extends React.Component {
  14. constructor (props) {
  15. super(props)
  16. this.state = {
  17. workspaceIdInUrl: props.match.params.idws ? parseInt(props.match.params.idws) : null, // this is used to avoid handling the parseInt everytime
  18. displayNewMemberDashboard: false,
  19. displayNotifBtn: false,
  20. displayWebdavBtn: false,
  21. displayCalendarBtn: false
  22. }
  23. }
  24. async componentDidMount () {
  25. const { workspaceIdInUrl } = this.state
  26. const { user, workspaceList, app, contentType, dispatch } = this.props
  27. console.log('<Dashboard> componentDidMount')
  28. if (app.length === 0) {
  29. const fetchGetAppList = await dispatch(getAppList())
  30. if (fetchGetAppList.status === 200) dispatch(setAppList(fetchGetAppList.json))
  31. }
  32. if (contentType.length === 0) {
  33. const fetchGetContentTypeList = await dispatch(getContentTypeList())
  34. if (fetchGetContentTypeList.status === 200) dispatch(setContentTypeList(fetchGetContentTypeList.json))
  35. }
  36. if (user.user_id !== -1 && workspaceList.length === 0) {
  37. const fetchGetWorkspaceList = await dispatch(getWorkspaceList(user.user_id))
  38. if (fetchGetWorkspaceList.status === 200) {
  39. dispatch(updateWorkspaceListData(fetchGetWorkspaceList.json))
  40. dispatch(setWorkspaceListIsOpenInSidebar(workspaceIdInUrl || fetchGetWorkspaceList.json[0].workspace_id, true))
  41. }
  42. }
  43. }
  44. handleToggleNewMemberDashboard = () => this.setState(prevState => ({
  45. displayNewMemberDashboard: !prevState.displayNewMemberDashboard
  46. }))
  47. handleToggleNotifBtn = () => this.setState(prevState => ({
  48. displayNotifBtn: !prevState.displayNotifBtn
  49. }))
  50. handleToggleWebdavBtn = () => this.setState(prevState => ({
  51. displayWebdavBtn: !prevState.displayWebdavBtn
  52. }))
  53. handleToggleCalendarBtn = () => this.setState(prevState => ({
  54. displayCalendarBtn: !prevState.displayCalendarBtn
  55. }))
  56. render () {
  57. return (
  58. <div className='sidebarpagecontainer'>
  59. <Sidebar />
  60. <div className='dashboard'>
  61. <div className='container-fluid nopadding'>
  62. <div className='dashboard__header mb-5'>
  63. <div className='pageTitleGeneric dashboard__header__title d-flex align-items-center'>
  64. <div className='pageTitleGeneric__title dashboard__header__title__text mr-3'>
  65. Dashboard
  66. </div>
  67. <div className='dashboard__header__acces' />
  68. </div>
  69. <div className='dashboard__header__advancedmode mr-3'>
  70. <button type='button' className='btn btn-primary'>Activer édition avancé</button>
  71. </div>
  72. </div>
  73. <div className='dashboard__wkswrapper'>
  74. <div className='dashboard__workspace'>
  75. <div className='dashboard__workspace__title'>
  76. Développement tracim
  77. </div>
  78. <div className='dashboard__workspace__detail'>
  79. Ligne directive pour le prochain design de Tracim et des futurs fonctionnalités.
  80. </div>
  81. </div>
  82. <div className='dashboard__userstatut'>
  83. <div className='dashboard__userstatut__role'>
  84. <div className='dashboard__userstatut__role__text'>
  85. Hi ! Alexi, vous êtes actuellement
  86. </div>
  87. <div className='dashboard__userstatut__role__rank'>
  88. <div className='dashboard__userstatut__role__rank__icon'>
  89. <i className='fa fa-graduation-cap' />
  90. </div>
  91. <div className='dashboard__userstatut__role__rank__rolename'>
  92. Gestionnaire de projet
  93. </div>
  94. </div>
  95. </div>
  96. <div className='dashboard__userstatut__notification'>
  97. <div className='dashboard__userstatut__notification__text'>
  98. Vous êtes abonné(e) aux notifications de ce workspace
  99. </div>
  100. {this.state.displayNotifBtn === false &&
  101. <div
  102. className='dashboard__userstatut__notification__btn btn btn-outline-primary'
  103. onClick={this.handleToggleNotifBtn}
  104. >
  105. Changer de statut
  106. </div>
  107. }
  108. {this.state.displayNotifBtn === true &&
  109. <div className='dashboard__userstatut__notification__subscribe dropdown'>
  110. <button className='dashboard__userstatut__notification__subscribe__btn btn btn-outline-primary dropdown-toggle' type='button' id='dropdownMenuButton' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'>
  111. Abonné(e)
  112. </button>
  113. <div className='dashboard__userstatut__notification__subscribe__submenu dropdown-menu'>
  114. <div className='dashboard__userstatut__notification__subscribe__submenu__item dropdown-item'>Abonné(e)
  115. </div>
  116. <div className='dashboard__userstatut__notification__subscribe__submenu__item dropdown-item dropdown-item'>Non Abonné(e)
  117. </div>
  118. </div>
  119. </div>
  120. }
  121. </div>
  122. </div>
  123. </div>
  124. <div className='dashboard__calltoaction'>
  125. <div className='dashboard__calltoaction__button btnaction thread'>
  126. <div className='dashboard__calltoaction__button__text'>
  127. <div className='dashboard__calltoaction__button__text__icon'>
  128. <i className='fa fa-comments-o' />
  129. </div>
  130. <div className='dashboard__calltoaction__button__text__title'>
  131. Débuter une nouvelle discussion
  132. </div>
  133. </div>
  134. </div>
  135. <div className='dashboard__calltoaction__button btnaction writefile'>
  136. <div className='dashboard__calltoaction__button__text'>
  137. <div className='dashboard__calltoaction__button__text__icon'>
  138. <i className='fa fa-file-text-o' />
  139. </div>
  140. <div className='dashboard__calltoaction__button__text__title'>
  141. Rédiger un document
  142. </div>
  143. </div>
  144. </div>
  145. <div className='dashboard__calltoaction__button btnaction importfile'>
  146. <div className='dashboard__calltoaction__button__text'>
  147. <div className='dashboard__calltoaction__button__text__icon'>
  148. <i className='fa fa-paperclip' />
  149. </div>
  150. <div className='dashboard__calltoaction__button__text__title'>
  151. Importer un fichier
  152. </div>
  153. </div>
  154. </div>
  155. <div className='dashboard__calltoaction__button btnaction visioconf'>
  156. <div className='dashboard__calltoaction__button__text'>
  157. <div className='dashboard__calltoaction__button__text__icon'>
  158. <i className='fa fa-video-camera' />
  159. </div>
  160. <div className='dashboard__calltoaction__button__text__title'>
  161. Débuter une visioconférence
  162. </div>
  163. </div>
  164. </div>
  165. <div className='dashboard__calltoaction__button btnaction calendar'>
  166. <div className='dashboard__calltoaction__button__text'>
  167. <div className='dashboard__calltoaction__button__text__icon'>
  168. <i className='fa fa-calendar' />
  169. </div>
  170. <div className='dashboard__calltoaction__button__text__title'>
  171. Voir le Calendrier
  172. </div>
  173. </div>
  174. </div>
  175. <div className='dashboard__calltoaction__button btnaction explore'>
  176. <div className='dashboard__calltoaction__button__text'>
  177. <div className='dashboard__calltoaction__button__text__icon'>
  178. <i className='fa fa-folder-open-o' />
  179. </div>
  180. <div className='dashboard__calltoaction__button__text__title'>
  181. Explorer le Workspace
  182. </div>
  183. </div>
  184. </div>
  185. </div>
  186. <div className='dashboard__wksinfo'>
  187. <div className='dashboard__activity'>
  188. <div className='dashboard__activity__header'>
  189. <div className='dashboard__activity__header__title subTitle'>
  190. Activité récente
  191. </div>
  192. <div className='dashboard__activity__header__allread btn btn-outline-primary'>
  193. Tout marquer comme lu
  194. </div>
  195. </div>
  196. <div className='dashboard__activity__wrapper'>
  197. <div className='dashboard__activity__workspace'>
  198. <div className='dashboard__activity__workspace__icon'>
  199. <i className='fa fa-comments-o' />
  200. </div>
  201. <div className='dashboard__activity__workspace__name'>
  202. <span>Développement Tracim</span>
  203. </div>
  204. </div>
  205. <div className='dashboard__activity__workspace'>
  206. <div className='dashboard__activity__workspace__icon'>
  207. <i className='fa fa-list-ul' />
  208. </div>
  209. <div className='dashboard__activity__workspace__name'>
  210. Mission externe
  211. </div>
  212. </div>
  213. <div className='dashboard__activity__workspace'>
  214. <div className='dashboard__activity__workspace__icon'>
  215. <i className='fa fa-list-ul' />
  216. </div>
  217. <div className='dashboard__activity__workspace__name'>
  218. Recherche et developpement
  219. </div>
  220. </div>
  221. <div className='dashboard__activity__workspace'>
  222. <div className='dashboard__activity__workspace__icon'>
  223. <i className='fa fa-file-text-o' />
  224. </div>
  225. <div className='dashboard__activity__workspace__name'>
  226. <span>Marketing</span>
  227. </div>
  228. </div>
  229. <div className='dashboard__activity__workspace'>
  230. <div className='dashboard__activity__workspace__icon'>
  231. <i className='fa fa-comments-o' />
  232. </div>
  233. <div className='dashboard__activity__workspace__name'>
  234. <span>Évolution</span>
  235. </div>
  236. </div>
  237. <div className='dashboard__activity__workspace'>
  238. <div className='dashboard__activity__workspace__icon'>
  239. <i className='fa fa-file-text-o' />
  240. </div>
  241. <div className='dashboard__activity__workspace__name'>
  242. Commercialisation
  243. </div>
  244. </div>
  245. <div className='dashboard__activity__more d-flex flex-row-reverse'>
  246. <div className='dashboard__activity__more__btn btn btn-outline-primary'>
  247. Voir plus
  248. </div>
  249. </div>
  250. </div>
  251. </div>
  252. <div className='dashboard__memberlist'>
  253. <div className='dashboard__memberlist__title subTitle'>
  254. Liste des membres
  255. </div>
  256. <div className='dashboard__memberlist__wrapper'>
  257. {this.state.displayNewMemberDashboard === false &&
  258. <div>
  259. <ul className='dashboard__memberlist__list'>
  260. <li className='dashboard__memberlist__list__item'>
  261. <div className='dashboard__memberlist__list__item__avatar'>
  262. <img src={imgProfil} alt='avatar' />
  263. </div>
  264. <div className='dashboard__memberlist__list__item__info mr-auto'>
  265. <div className='dashboard__memberlist__list__item__info__name'>
  266. Jean Dupont
  267. </div>
  268. <div className='dashboard__memberlist__list__item__info__role'>
  269. Responsable
  270. </div>
  271. </div>
  272. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  273. <i className='fa fa-trash-o' />
  274. </div>
  275. </li>
  276. <li className='dashboard__memberlist__list__item'>
  277. <div className='dashboard__memberlist__list__item__avatar'>
  278. <img src={imgProfil} alt='avatar' />
  279. </div>
  280. <div className='dashboard__memberlist__list__item__info mr-auto'>
  281. <div className='dashboard__memberlist__list__item__info__name'>
  282. Aldwin Vinel
  283. </div>
  284. <div className='dashboard__memberlist__list__item__info__role'>
  285. Lecteur
  286. </div>
  287. </div>
  288. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  289. <i className='fa fa-trash-o' />
  290. </div>
  291. </li>
  292. <li className='dashboard__memberlist__list__item'>
  293. <div className='dashboard__memberlist__list__item__avatar'>
  294. <img src={imgProfil} alt='avatar' />
  295. </div>
  296. <div className='dashboard__memberlist__list__item__info mr-auto'>
  297. <div className='dashboard__memberlist__list__item__info__name'>
  298. William Himme
  299. </div>
  300. <div className='dashboard__memberlist__list__item__info__role'>
  301. Contributeur
  302. </div>
  303. </div>
  304. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  305. <i className='fa fa-trash-o' />
  306. </div>
  307. </li>
  308. <li className='dashboard__memberlist__list__item'>
  309. <div className='dashboard__memberlist__list__item__avatar'>
  310. <img src={imgProfil} alt='avatar' />
  311. </div>
  312. <div className='dashboard__memberlist__list__item__info mr-auto'>
  313. <div className='dashboard__memberlist__list__item__info__name'>
  314. Yacine Lite
  315. </div>
  316. <div className='dashboard__memberlist__list__item__info__role'>
  317. Contributeur
  318. </div>
  319. </div>
  320. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  321. <i className='fa fa-trash-o' />
  322. </div>
  323. </li>
  324. <li className='dashboard__memberlist__list__item'>
  325. <div className='dashboard__memberlist__list__item__avatar'>
  326. <img src={imgProfil} alt='avatar' />
  327. </div>
  328. <div className='dashboard__memberlist__list__item__info mr-auto'>
  329. <div className='dashboard__memberlist__list__item__info__name'>
  330. Alexi Falcin
  331. </div>
  332. <div className='dashboard__memberlist__list__item__info__role'>
  333. Gestionnaire
  334. </div>
  335. </div>
  336. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  337. <i className='fa fa-trash-o' />
  338. </div>
  339. </li>
  340. <li className='dashboard__memberlist__list__item'>
  341. <div className='dashboard__memberlist__list__item__avatar'>
  342. <img src={imgProfil} alt='avatar' />
  343. </div>
  344. <div className='dashboard__memberlist__list__item__info mr-auto'>
  345. <div className='dashboard__memberlist__list__item__info__name'>
  346. Mickaël Fonati
  347. </div>
  348. <div className='dashboard__memberlist__list__item__info__role'>
  349. Gestionnaire
  350. </div>
  351. </div>
  352. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  353. <i className='fa fa-trash-o' />
  354. </div>
  355. </li>
  356. <li className='dashboard__memberlist__list__item'>
  357. <div className='dashboard__memberlist__list__item__avatar'>
  358. <img src={imgProfil} alt='avatar' />
  359. </div>
  360. <div className='dashboard__memberlist__list__item__info mr-auto'>
  361. <div className='dashboard__memberlist__list__item__info__name'>
  362. Eva Lonbard
  363. </div>
  364. <div className='dashboard__memberlist__list__item__info__role'>
  365. Gestionnaire
  366. </div>
  367. </div>
  368. <div className='dashboard__memberlist__list__item__delete d-flex justify-content-end'>
  369. <i className='fa fa-trash-o' />
  370. </div>
  371. </li>
  372. </ul>
  373. <div className='dashboard__memberlist__btnadd'>
  374. <div className='dashboard__memberlist__btnadd__button'>
  375. <div className='dashboard__memberlist__btnadd__button__avatar'>
  376. <div className='dashboard__memberlist__btnadd__button__avatar__icon'>
  377. <i className='fa fa-plus' />
  378. </div>
  379. </div>
  380. <div
  381. className='dashboard__memberlist__btnadd__button__text'
  382. onClick={this.handleToggleNewMemberDashboard}
  383. >
  384. Ajouter un membre
  385. </div>
  386. </div>
  387. </div>
  388. </div>
  389. }
  390. {this.state.displayNewMemberDashboard === true &&
  391. <form className='dashboard__memberlist__form'>
  392. <div
  393. className='dashboard__memberlist__form__close d-flex justify-content-end'
  394. onClick={this.handleToggleNewMemberDashboard}
  395. >
  396. <i className='fa fa-times' />
  397. </div>
  398. <div className='dashboard__memberlist__form__member'>
  399. <div className='dashboard__memberlist__form__member__name'>
  400. <label className='name__label' htmlFor='addmember'>Indiquer le nom ou l'email du membre</label>
  401. <input type='text' id='addmember' className='name__input form-control' placeholder='Nom ou Email' />
  402. </div>
  403. <div className='dashboard__memberlist__form__member__create'>
  404. <div className='create__radiobtn mr-3'>
  405. <input type='radio' />
  406. </div>
  407. <div className='create__text'>
  408. Créer un compte
  409. </div>
  410. </div>
  411. </div>
  412. <div className='dashboard__memberlist__form__role'>
  413. <div className='dashboard__memberlist__form__role__text'>
  414. Choisissez le rôle du membre
  415. </div>
  416. <ul className='dashboard__memberlist__form__role__list'>
  417. <li className='dashboard__memberlist__form__role__list__item'>
  418. <div className='item__radiobtn mr-3'>
  419. <input type='radio' name='role' value='responsable' />
  420. </div>
  421. <div className='item__text'>
  422. <div className='item_text_icon mr-2'>
  423. <i className='fa fa-gavel' />
  424. </div>
  425. <div className='item__text__name'>
  426. Responsable
  427. </div>
  428. </div>
  429. </li>
  430. <li className='dashboard__memberlist__form__role__list__item'>
  431. <div className='item__radiobtn mr-3'>
  432. <input type='radio' name='role' value='gestionnaire' />
  433. </div>
  434. <div className='item__text'>
  435. <div className='item_text_icon mr-2'>
  436. <i className='fa fa-graduation-cap' />
  437. </div>
  438. <div className='item__text__name'>
  439. Gestionnaire de contenu
  440. </div>
  441. </div>
  442. </li>
  443. <li className='dashboard__memberlist__form__role__list__item'>
  444. <div className='item__radiobtn mr-3'>
  445. <input type='radio' name='role' value='contributeur' />
  446. </div>
  447. <div className='item__text'>
  448. <div className='item_text_icon mr-2'>
  449. <i className='fa fa-pencil' />
  450. </div>
  451. <div className='item__text__name'>
  452. Contributeur
  453. </div>
  454. </div>
  455. </li>
  456. <li className='dashboard__memberlist__form__role__list__item'>
  457. <div className='item__radiobtn mr-3'>
  458. <input type='radio' name='role' value='lecteur' />
  459. </div>
  460. <div className='item__text'>
  461. <div className='item_text_icon mr-2'>
  462. <i className='fa fa-eye' />
  463. </div>
  464. <div className='item__text__name'>
  465. Lecteur
  466. </div>
  467. </div>
  468. </li>
  469. </ul>
  470. </div>
  471. <div className='dashboard__memberlist__form__submitbtn'>
  472. <button className='btn btn-outline-primary'>Valider</button>
  473. </div>
  474. </form>
  475. }
  476. </div>
  477. </div>
  478. </div>
  479. <div className='dashboard__moreinfo'>
  480. <div className='dashboard__moreinfo__webdav genericBtnInfoDashboard mr-5'>
  481. <div
  482. className='dashboard__moreinfo__webdav__btn genericBtnInfoDashboard__btn'
  483. onClick={this.handleToggleWebdavBtn}
  484. >
  485. <div className='dashboard__moreinfo__webdav__btn__icon genericBtnInfoDashboard__btn__icon'>
  486. <i className='fa fa-windows' />
  487. </div>
  488. <div className='dashboard__moreinfo__webdav__btn__text genericBtnInfoDashboard__btn__text'>
  489. Implémenter Tracim dans votre explorateur
  490. </div>
  491. </div>
  492. {this.state.displayWebdavBtn === true &&
  493. <div>
  494. <div className='dashboard__moreinfo__webdav__information genericBtnInfoDashboard__info'>
  495. <div className='dashboard__moreinfo__webdav__information__text genericBtnInfoDashboard__info__text'>
  496. Lorem ipsum dolore dolore laborum exercitation et deserunt ad ullamco nostrud dolore magna in proident elit amet do eu ut officia anim magna dolore adipisicing aliqua qui reprehenderit laborum labore tempor consectetur ut pariatur deserunt nostrud.
  497. </div>
  498. <div className='dashboard__moreinfo__webdav__information__link genericBtnInfoDashboard__info__link'>
  499. http://algoo.trac.im/webdav/
  500. </div>
  501. </div>
  502. </div>
  503. }
  504. </div>
  505. <div className='dashboard__moreinfo__calendar genericBtnInfoDashboard'>
  506. <div className='dashboard__moreinfo__calendar__wrapperBtn'>
  507. <div
  508. className='dashboard__moreinfo__calendar__btn genericBtnInfoDashboard__btn'
  509. onClick={this.handleToggleCalendarBtn}
  510. >
  511. <div className='dashboard__moreinfo__calendar__btn__icon genericBtnInfoDashboard__btn__icon'>
  512. <i className='fa fa-calendar' />
  513. </div>
  514. <div className='dashboard__moreinfo__calendar__btn__text genericBtnInfoDashboard__btn__text'>
  515. Calendrier de l'espace de travail
  516. </div>
  517. </div>
  518. </div>
  519. <div className='dashboard__moreinfo__calendar__wrapperText'>
  520. {this.state.displayCalendarBtn === true &&
  521. <div>
  522. <div className='dashboard__moreinfo__calendar__information genericBtnInfoDashboard__info'>
  523. <div className='dashboard__moreinfo__calendar__information__text genericBtnInfoDashboard__info__text'>
  524. Lorem ipsum dolore dolore laborum exercitation et deserunt ad ullamco nostrud dolore magna in proident elit amet do eu ut officia anim magna dolore adipisicing aliqua qui reprehenderit laborum labore tempor consectetur ut pariatur deserunt nostrud.
  525. </div>
  526. <div className='dashboard__moreinfo__calendar__information__link genericBtnInfoDashboard__info__link'>
  527. http://algoo.trac.im/calendar/
  528. </div>
  529. </div>
  530. </div>
  531. }
  532. </div>
  533. </div>
  534. </div>
  535. </div>
  536. </div>
  537. </div>
  538. )
  539. }
  540. }
  541. const mapStateToProps = ({ user, app, contentType, workspaceList }) => ({ user, app, contentType, workspaceList })
  542. export default connect(mapStateToProps)(Dashboard)