Folder.jsx 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import React from 'react'
  2. import { translate } from 'react-i18next'
  3. import PropTypes from 'prop-types'
  4. import classnames from 'classnames'
  5. import FileItem from './FileItem.jsx'
  6. // import PopupExtandedAction from '../../container/PopupExtandedAction.jsx'
  7. import BtnExtandedAction from './BtnExtandedAction.jsx'
  8. class Folder extends React.Component {
  9. constructor (props) {
  10. super(props)
  11. this.state = {
  12. open: false
  13. }
  14. }
  15. handleClickToggleFolder = () => {
  16. !this.state.open && this.props.folderData.content.length === 0 && this.props.onClickFolder(this.props.folderData.id)
  17. this.setState({open: !this.state.open})
  18. }
  19. handleClickNewFile = e => {
  20. e.stopPropagation() // because we have a link inside a link (togler and newFile)
  21. console.log('new file') // @TODO
  22. }
  23. render () {
  24. const {
  25. app,
  26. folderData,
  27. onClickItem,
  28. onClickExtendedAction,
  29. onClickFolder,
  30. isLast,
  31. t
  32. } = this.props
  33. return (
  34. <div className={classnames('folder', {'active': this.state.open, 'item-last': isLast})}>
  35. <div className='folder__header align-items-center' onClick={this.handleClickToggleFolder}>
  36. <div className='folder__header__triangleborder'>
  37. <div className='folder__header__triangleborder__triangle' />
  38. </div>
  39. <div className='col-2 col-sm-2 col-md-2 col-lg-2 col-xl-1'>
  40. <div className='folder__header__name__icon'>
  41. <i className={classnames('fa', {'fa-folder-open-o': this.state.open, 'fa-folder-o': !this.state.open})} />
  42. </div>
  43. </div>
  44. <div className='col-10 col-sm-10 col-md-8 col-lg-8 col-xl-9'>
  45. <div className='folder__header__name align-items-center justify-content-between'>
  46. <div className='folder__header__name__text'>
  47. { folderData.title }
  48. </div>
  49. <div className='folder__header__name__button d-flex align-items-center '>
  50. <div
  51. className='folder__header__name__button__addbtn mx-4'
  52. onClick={this.handleClickNewFile}
  53. >
  54. <button className='addbtn__text btn btn-outline-primary dropdown-toggle' type='button' id='dropdownMenuButton' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'>
  55. {t('Folder.create')} ...
  56. </button>
  57. <div className='addbtn__subdropdown dropdown-menu' aria-labelledby='dropdownMenuButton'>
  58. <div className='subdropdown__link dropdown-item'>
  59. <div className='subdropdown__link__folder d-flex align-items-center'>
  60. <div className='subdropdown__link__folder__icon mr-3'>
  61. <i className='fa fa-fw fa-folder-o' />
  62. </div>
  63. <div className='subdropdown__link__folder__text'>
  64. Créer un dossier
  65. </div>
  66. </div>
  67. </div>
  68. <div className='subdropdown__link dropdown-item'>
  69. <div className='subdropdown__link__apphtml d-flex align-items-center'>
  70. <div className='subdropdown__link__apphtml__icon mr-3'>
  71. <i className='fa fa-fw fa-file-text-o' />
  72. </div>
  73. <div className='subdropdown__link__apphtml__text'>
  74. Rédiger un document
  75. </div>
  76. </div>
  77. </div>
  78. <div className='subdropdown__link dropdown-item'>
  79. <div className='subdropdown__link__appfile d-flex align-items-center'>
  80. <div className='subdropdown__link__appfile__icon mr-3'>
  81. <i className='fa fa-fw fa-file-image-o' />
  82. </div>
  83. <div className='subdropdown__link__appfile__text'>
  84. Importer un fichier
  85. </div>
  86. </div>
  87. </div>
  88. <div className='subdropdown__link dropdown-item'>
  89. <div className='subdropdown__link__appmarkdown d-flex align-items-center'>
  90. <div className='subdropdown__link__appmarkdown__icon mr-3'>
  91. <i className='fa fa-fw fa-file-code-o' />
  92. </div>
  93. <div className='subdropdown__link__appmarkdown__text'>
  94. Rédiger un document markdown
  95. </div>
  96. </div>
  97. </div>
  98. <div className='subdropdown__link dropdown-item'>
  99. <div className='subdropdown__link__appthread d-flex align-items-center'>
  100. <div className='subdropdown__link__appthread__icon mr-3'>
  101. <i className='fa fa-fw fa-comments-o' />
  102. </div>
  103. <div className='subdropdown__link__appthread__text'>
  104. Lancer une discussion
  105. </div>
  106. </div>
  107. </div>
  108. <div className='subdropdown__link dropdown-item'>
  109. <div className='subdropdown__link__apptask d-flex align-items-center'>
  110. <div className='subdropdown__link__apptask__icon mr-3'>
  111. <i className='fa fa-fw fa-list-ul' />
  112. </div>
  113. <div className='subdropdown__link__apptask__text'>
  114. Créer une tâche
  115. </div>
  116. </div>
  117. </div>
  118. <div className='subdropdown__link dropdown-item'>
  119. <div className='subdropdown__link__appissue d-flex align-items-center'>
  120. <div className='subdropdown__link__appissue__icon mr-3'>
  121. <i className='fa fa-fw fa-ticket' />
  122. </div>
  123. <div className='subdropdown__link__appissue__text'>
  124. Ouvrir un ticket
  125. </div>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. <div className='d-none d-md-flex'>
  131. <BtnExtandedAction onClickExtendedAction={{
  132. edit: e => onClickExtendedAction.edit(e, folderData),
  133. move: e => onClickExtendedAction.move(e, folderData),
  134. download: e => onClickExtendedAction.download(e, folderData),
  135. archive: e => onClickExtendedAction.archive(e, folderData),
  136. delete: e => onClickExtendedAction.delete(e, folderData)
  137. }} />
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. <div className='col-0 col-sm-0 col-md-2 col-lg-2 col-xl-2' />
  143. </div>
  144. <div className='folder__content'>
  145. { folderData.content.map((c, i) => c.type === 'folder'
  146. ? <Folder
  147. app={app}
  148. folderData={c}
  149. onClickItem={onClickItem}
  150. onClickExtendedAction={onClickExtendedAction}
  151. onClickFolder={onClickFolder}
  152. isLast={isLast}
  153. t={t}
  154. key={c.id}
  155. />
  156. : <FileItem
  157. icon={(app[c.type] || {icon: ''}).icon}
  158. name={c.title}
  159. type={c.type}
  160. status={c.status}
  161. onClickItem={() => onClickItem(c)}
  162. onClickExtendedAction={{
  163. // we have to use the event here because it is the only place where we also have the content (c)
  164. edit: e => onClickExtendedAction.edit(e, c),
  165. move: e => onClickExtendedAction.move(e, c),
  166. download: e => onClickExtendedAction.download(e, c),
  167. archive: e => onClickExtendedAction.archive(e, c),
  168. delete: e => onClickExtendedAction.delete(e, c)
  169. }}
  170. isLast={isLast && i === folderData.content.length - 1}
  171. key={c.id}
  172. />
  173. )}
  174. </div>
  175. </div>
  176. )
  177. }
  178. }
  179. export default translate()(Folder)
  180. Folder.propTypes = {
  181. folderData: PropTypes.shape({
  182. title: PropTypes.string.isRequired,
  183. content: PropTypes.array
  184. }),
  185. app: PropTypes.object,
  186. onClickItem: PropTypes.func.isRequired,
  187. onClickFolder: PropTypes.func.isRequired,
  188. isLast: PropTypes.bool.isRequired
  189. }