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(user))
  30. if (fetchGetAppList.status === 200) dispatch(setAppList(fetchGetAppList.json))
  31. }
  32. if (contentType.length === 0) {
  33. const fetchGetContentTypeList = await dispatch(getContentTypeList(user))
  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))
  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. Retrouvez tous vos documents déposés en ligne directement sur votre ordinateur. Chaque fois qu'un document est déposé, celui-ci sera copié sur votre ordinateur. Consulter tous les documents d'un espace de travail sans passer par le logiciel.
  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. Chaque espace de travail possède son propre calendrier indépendant des autres. Les groupes peuvent s’organiser avec ses propres deadlines, l’information est simplifiée et centralisée dans chaque espace de travail.
  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)